diff --git a/.hgignore b/.hgignore index 70ea36a52..45ecebc31 100644 --- a/.hgignore +++ b/.hgignore @@ -15,3 +15,7 @@ ^env/ \.DS_Store$ ~$ +^utils/.*3\.py$ +^distribute- +^tests/root/_build/* +^tests/root/generated/* diff --git a/AUTHORS b/AUTHORS index 10120c7b4..acee46279 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,26 +8,36 @@ Other contributors, listed alphabetically, are: * Andi Albrecht -- agogo theme * Henrique Bastos -- SVG support for graphviz extension * Daniel Bültmann -- todo extension +* Etienne Desautels -- apidoc module * Michael Droettboom -- inheritance_diagram extension * Charles Duffy -- original graphviz extension +* Kevin Dunn -- MathJax extension * Josip Dzolonga -- coverage builder * Horst Gutmann -- internationalization support * Martin Hans -- autodoc improvements +* Doug Hellmann -- graphviz improvements * Dave Kuhlman -- original LaTeX writer +* Blaise Laflamme -- pyramid theme * Thomas Lamb -- linkcheck builder +* Łukasz Langa -- partial support for autodoc +* Robert Lehmann -- gettext builder (GSOC project) * Dan MacKinlay -- metadata fixes * Martin Mahner -- nature theme * Will Maier -- directory HTML builder +* Jacob Mason -- websupport library (GSOC project) * Roland Meister -- epub builder * Ezio Melotti -- collapsible sidebar JavaScript -* Daniel Neuhäuser -- JavaScript domain +* Daniel Neuhäuser -- JavaScript domain, Python 3 support (GSOC) * Christopher Perkins -- autosummary integration * Benjamin Peterson -- unittests * T. Powers -- HTML output improvements * Stefan Seefeld -- toctree improvements +* Shibukawa Yoshiki -- pluggable search API and Japanese search * Antonio Valentino -- qthelp builder * Pauli Virtanen -- autodoc improvements, autosummary extension * Stefan van der Walt -- autosummary extension +* Thomas Waldmann -- apidoc module fixes +* John Waltman -- Texinfo builder * Barry Warsaw -- setup command improvements * Sebastian Wiesner -- image handling, distutils support diff --git a/CHANGES b/CHANGES index adbb86a6d..4f86c7691 100644 --- a/CHANGES +++ b/CHANGES @@ -1,10 +1,306 @@ Release 1.1 (in development) ============================ +Incompatible changes +-------------------- -Release 1.0.1 (in development) +* The :rst:dir:`py:module` directive doesn't output its ``platform`` option + value anymore. (It was the only thing that the directive did output, and + therefore quite inconsistent.) + +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: Add an :rst:role:`index` role, to make inline index entries. + - #454: Add more index markup capabilities: marking see/seealso entries, + and main entries for a given key. + - #460: Allow limiting the depth of section numbers for HTML using the + :rst:dir:`toctree`\'s ``numbered`` option. + - #586: Implemented improved :rst:dir:`glossary` markup which allows + multiple terms per definition. + - #478: Added :rst:dir:`py:decorator` directive to describe decorators. + - C++ domain now supports array definitions. + - Section headings in :rst:dir:`only` directives are now correctly + handled. + +* HTML builder: + + - Added ``pyramid`` theme. + - #559: :confval:`html_add_permalinks` is now a string giving the + text to display in permalinks. + - #259: HTML table rows now have even/odd CSS classes to enable + "Zebra styling". + - #554: Add theme option ``sidebarwidth`` to the basic theme. + +* Other builders: + + - #516: Added new value of the :confval:`latex_show_urls` option to + show the URLs in footnotes. + - #209: Added :confval:`text_newlines` and :confval:`text_sectionchars` + config values. + - Added :confval:`man_show_urls` config value. + - #472: linkcheck builder: Check links in parallel, use HTTP HEAD + requests and allow configuring the timeout. New config values: + :confval:`linkcheck_timeout` and :confval:`linkcheck_workers`. + - #521: Added :confval:`linkcheck_ignore` config value. + +* Configuration and extensibility: + + - #537: Added :confval:`nitpick_ignore`. + - #306: Added :event:`env-get-outdated` event. + +* Autodoc: + + - #564: Add :confval:`autodoc_docstring_signature`. When enabled (the + default), autodoc retrieves the signature from the first line of the + docstring, if it is found there. + - #176: Provide ``private-members`` option for autodoc directives. + - #520: Provide ``special-members`` option for autodoc directives. + - #431: Doc comments for attributes can now be given on the same line + as the assignment. + - #437: autodoc now shows values of class data attributes. + - autodoc now supports documenting the signatures of + ``functools.partial`` objects. + +* Other extensions: + + - Added the :mod:`sphinx.ext.mathjax` extension. + - #443: Allow referencing external graphviz files. + - Added ``inline`` option to graphviz directives, and fixed the + default (block-style) in LaTeX output. + - #590: Added ``caption`` option to graphviz directives. + - #553: Added :rst:dir:`testcleanup` blocks in the doctest extension. + - #594: :confval:`trim_doctest_flags` now also removes ```` + indicators. + - #367: Added automatic exclusion of hidden members in inheritance + diagrams, and an option to selectively enable it. + - Added :confval:`pngmath_add_tooltips`. + +* New locales: + + - #221: Added Swedish locale. + - #526: Added Iranian locale. + + +Release 1.0.8 (in development) ============================== + +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 :confval:`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 reportings 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.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. @@ -170,15 +466,12 @@ Features added - Added Danish translation, thanks to Hjorth Larsen. - Added Lithuanian translation, thanks to Dalius Dobravolskas. +* Bugs fixed: -Release 0.6.8 (in development) -============================== - -* #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. + - #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) diff --git a/EXAMPLES b/EXAMPLES index 52fce0e8b..8fe0ea98b 100644 --- a/EXAMPLES +++ b/EXAMPLES @@ -12,29 +12,34 @@ interesting examples. Documentation using the default theme ------------------------------------- -* APSW: http://apsw.googlecode.com/svn/publish/index.html +* APSW: http://apidoc.apsw.googlecode.com/hg/index.html * ASE: https://wiki.fysik.dtu.dk/ase/ * boostmpi: http://documen.tician.de/boostmpi/ -* Calibre: http://calibre.kovidgoyal.net/user_manual/ +* Calibre: http://calibre-ebook.com/user_manual/ * CodePy: http://documen.tician.de/codepy/ * Cython: http://docs.cython.org/ * C\\C++ Python language binding project: http://language-binding.net/index.html * Director: http://packages.python.org/director/ -* F2py: http://www.f2py.org/html/ +* Dirigible: http://www.projectdirigible.com/documentation/ +* F2py: http://f2py.sourceforge.net/docs/ * GeoDjango: http://geodjango.org/docs/ * gevent: http://www.gevent.org/ * Google Wave API: http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html * GSL Shell: http://www.nongnu.org/gsl-shell/ +* Heapkeeper: http://heapkeeper.org/ +* Hands-on Python Tutorial: http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/ * Hedge: http://documen.tician.de/hedge/ * Kaa: http://doc.freevo.org/api/kaa/ +* Leo: http://webpages.charter.net/edreamleo/front.html +* Lino: http://lino.saffre-rumma.net/ * MeshPy: http://documen.tician.de/meshpy/ * mpmath: http://mpmath.googlecode.com/svn/trunk/doc/build/index.html * OpenEXR: http://excamera.com/articles/26/doc/index.html * OpenGDA: http://www.opengda.org/gdadoc/html/ * openWNS: http://docs.openwns.org/ * Paste: http://pythonpaste.org/script/ -* Paver: http://www.blueskyonmars.com/projects/paver/ -* Pyccuracy: http://www.pyccuracy.org/ +* Paver: http://paver.github.com/paver/ +* Pyccuracy: https://github.com/heynemann/pyccuracy/wiki/ * PyCuda: http://documen.tician.de/pycuda/ * Pyevolve: http://pyevolve.sourceforge.net/ * Pylo: http://documen.tician.de/pylo/ @@ -66,16 +71,16 @@ Documentation using a customized version of the default theme * IFM: http://fluffybunny.memebot.com/ifm-docs/index.html * LEPL: http://www.acooke.org/lepl/ * Mayavi: http://code.enthought.com/projects/mayavi/docs/development/html/mayavi -* NOC: http://trac.nocproject.org/trac/wiki/NocGuide +* NOC: http://redmine.nocproject.org/projects/noc * NumPy: http://docs.scipy.org/doc/numpy/reference/ * Peach^3: http://peach3.nl/doc/latest/userdoc/ -* Py on Windows: http://timgolden.me.uk/python-on-windows/ * PyLit: http://pylit.berlios.de/ * Sage: http://sagemath.org/doc/ * SciPy: http://docs.scipy.org/doc/scipy/reference/ * simuPOP: http://simupop.sourceforge.net/manual_release/build/userGuide.html * Sprox: http://sprox.org/ * TurboGears: http://turbogears.org/2.0/docs/ +* Zentyal: http://doc.zentyal.org/ * Zope: http://docs.zope.org/zope2/index.html * zc.async: http://packages.python.org/zc.async/1.5.0/ @@ -83,20 +88,22 @@ Documentation using a customized version of the default theme Documentation using the sphinxdoc theme --------------------------------------- -* Fityk: http://www.unipress.waw.pl/fityk/ +* Fityk: http://fityk.nieto.pl/ * MapServer: http://mapserver.org/ * Matplotlib: http://matplotlib.sourceforge.net/ * Music21: http://mit.edu/music21/doc/html/contents.html * MyHDL: http://www.myhdl.org/doc/0.6/ * NetworkX: http://networkx.lanl.gov/ * Pweave: http://mpastell.com/pweave/ +* Pyre: http://docs.danse.us/pyre/sphinx/ * Pysparse: http://pysparse.sourceforge.net/ * PyTango: http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html -* Reteisi: http://docs.argolinux.org/reteisi/ -* Satchmo: http://www.satchmoproject.com/docs/svn/ +* Reteisi: http://www.reteisi.org/contents.html +* Satchmo: http://www.satchmoproject.com/docs/dev/ * Sphinx: http://sphinx.pocoo.org/ * Sqlkit: http://sqlkit.argolinux.org/ +* Tau: http://www.tango-controls.org/static/tau/latest/doc/html/index.html * Total Open Station: http://tops.berlios.de/ * WebFaction: http://docs.webfaction.com/ @@ -104,12 +111,13 @@ Documentation using the sphinxdoc theme Documentation using another builtin theme ----------------------------------------- -* C/C++ Development with Eclipse: http://book.dehlia.in/c-cpp-eclipse/ (agogo) +* C/C++ Development with Eclipse: http://eclipsebook.in/ (agogo) * Distribute: http://packages.python.org/distribute/ (nature) -* Jinja: http://jinja.pocoo.org/2/documentation/ (scrolls) +* Jinja: http://jinja.pocoo.org/ (scrolls) * pip: http://pip.openplans.org/ (nature) * Programmieren mit PyGTK und Glade (German): http://www.florian-diesch.de/doc/python-und-glade/online/ (agogo) +* pypol: http://pypol.altervista.org/ (nature) * Spring Python: http://springpython.webfactional.com/current/sphinx/index.html (nature) * sqlparse: http://python-sqlparse.googlecode.com/svn/docs/api/index.html @@ -134,16 +142,18 @@ Documentation using a custom theme/integrated in a site * Open ERP: http://doc.openerp.com/ * OpenLayers: http://docs.openlayers.org/ * PyEphem: http://rhodesmill.org/pyephem/ +* German Plone 4.0 user manual: http://www.hasecke.com/plone-benutzerhandbuch/4.0/ * Pylons: http://pylonshq.com/docs/en/0.9.7/ * PyMOTW: http://www.doughellmann.com/PyMOTW/ * qooxdoo: http://manual.qooxdoo.org/current * Roundup: http://www.roundup-tracker.org/ * Selenium: http://seleniumhq.org/docs/ * Self: http://selflanguage.org/ +* Tablib: http://tablib.org/ * SQLAlchemy: http://www.sqlalchemy.org/docs/ * tinyTiM: http://tinytim.sourceforge.net/docs/2.0/ * tipfy: http://www.tipfy.org/docs/ -* Werkzeug: http://werkzeug.pocoo.org/documentation/dev/ +* Werkzeug: http://werkzeug.pocoo.org/docs/ * WFront: http://discorporate.us/projects/WFront/ @@ -152,7 +162,22 @@ Homepages and other non-documentation sites * Applied Mathematics at the Stellenbosch University: http://dip.sun.ac.za/ * A personal page: http://www.dehlia.in/ -* Benoit Boissinot: http://perso.ens-lyon.fr/benoit.boissinot/ +* Benoit Boissinot: http://bboissin.appspot.com/ * lunarsite: http://lunaryorn.de/ * The Wine Cellar Book: http://www.thewinecellarbook.com/doc/en/ * VOR: http://www.vor-cycling.be/ + + +Books produced using Sphinx +--------------------------- + +* "The ``repoze.bfg`` Web Application Framework": + http://www.amazon.com/repoze-bfg-Web-Application-Framework-Version/dp/0615345379 +* A Theoretical Physics Reference book: http://theoretical-physics.net/ +* "Simple and Steady Way of Learning for Software Engineering" (in Japanese): + http://www.amazon.co.jp/dp/477414259X/ +* "Expert Python Programming" (Japanese translation): + http://www.amazon.co.jp/dp/4048686291/ +* "Pomodoro Technique Illustrated" (Japanese translation): + http://www.amazon.co.jp/dp/4048689525/ + diff --git a/LICENSE b/LICENSE index 468914934..fa1ef9950 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ License for Sphinx ================== -Copyright (c) 2007-2010 by the Sphinx team (see AUTHORS file). +Copyright (c) 2007-2011 by the Sphinx team (see AUTHORS file). All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/MANIFEST.in b/MANIFEST.in index 25cbc334f..cfc44c17e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,7 +7,7 @@ include TODO include babel.cfg include Makefile -include ez_setup.py +include distribute_setup.py include sphinx-autogen.py include sphinx-build.py include sphinx-quickstart.py diff --git a/Makefile b/Makefile index 7057a7152..128b2c809 100644 --- a/Makefile +++ b/Makefile @@ -1,36 +1,64 @@ PYTHON ?= python -export PYTHONPATH = $(shell echo "$$PYTHONPATH"):./sphinx +.PHONY: all check clean clean-pyc clean-patchfiles clean-backupfiles \ + clean-generated pylint reindent test covertest build convert-utils -.PHONY: all check clean clean-pyc clean-patchfiles pylint reindent test +DONT_CHECK = -i build -i dist -i sphinx/style/jquery.js \ + -i sphinx/pycode/pgen2 -i sphinx/util/smartypants.py \ + -i .ropeproject -i doc/_build -i tests/path.py \ + -i tests/coverage.py -i env -i utils/convert.py \ + -i sphinx/search/ja.py \ + -i utils/reindent3.py -i utils/check_sources3.py -i .tox -all: clean-pyc check test +all: clean-pyc clean-backupfiles check test +ifeq ($(PYTHON), python3) +check: convert-utils + @$(PYTHON) utils/check_sources3.py $(DONT_CHECK) . +else check: - @$(PYTHON) utils/check_sources.py -i build -i dist -i sphinx/style/jquery.js \ - -i sphinx/pycode/pgen2 -i sphinx/util/smartypants.py -i .ropeproject \ - -i doc/_build -i ez_setup.py -i tests/path.py -i tests/coverage.py \ - -i env -i .tox . + @$(PYTHON) utils/check_sources.py $(DONT_CHECK) . +endif -clean: clean-pyc clean-patchfiles +clean: clean-pyc clean-patchfiles clean-backupfiles clean-generated clean-pyc: find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + - find . -name '*~' -exec rm -f {} + clean-patchfiles: find . -name '*.orig' -exec rm -f {} + find . -name '*.rej' -exec rm -f {} + +clean-backupfiles: + find . -name '*~' -exec rm -f {} + + find . -name '*.bak' -exec rm -f {} + + +clean-generated: + rm -f utils/*3.py* + pylint: @pylint --rcfile utils/pylintrc sphinx +ifeq ($(PYTHON), python3) +reindent: convert-utils + @$(PYTHON) utils/reindent3.py -r -n . +else reindent: - @$(PYTHON) utils/reindent.py -r -B . + @$(PYTHON) utils/reindent.py -r -n . +endif -test: +test: build @cd tests; $(PYTHON) run.py -d -m '^[tT]est' $(TEST) -covertest: - @cd tests; $(PYTHON) run.py -d -m '^[tT]est' --with-coverage --cover-package=sphinx $(TEST) +covertest: build + @cd tests; $(PYTHON) run.py -d -m '^[tT]est' --with-coverage \ + --cover-package=sphinx $(TEST) + +build: + @$(PYTHON) setup.py build + +ifeq ($(PYTHON), python3) +convert-utils: + @python3 utils/convert.py -i utils/convert.py utils/ +endif diff --git a/README b/README index bb2dea9d6..e31d6b936 100644 --- a/README +++ b/README @@ -26,6 +26,18 @@ Then, direct your browser to ``_build/html/index.html``. Or read them online at . +Testing +======= + +To run the tests with the interpreter available as ``python``, use:: + + make test + +If you want to use a different interpreter, e.g. ``python3``, use:: + + PYTHON=python3 make test + + Contributing ============ diff --git a/custom_fixers/__init__.py b/custom_fixers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/custom_fixers/fix_alt_unicode.py b/custom_fixers/fix_alt_unicode.py new file mode 100644 index 000000000..55175e90f --- /dev/null +++ b/custom_fixers/fix_alt_unicode.py @@ -0,0 +1,12 @@ +from lib2to3.fixer_base import BaseFix +from lib2to3.fixer_util import Name + +class FixAltUnicode(BaseFix): + PATTERN = """ + func=funcdef< 'def' name='__unicode__' + parameters< '(' NAME ')' > any+ > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('__str__', prefix=name.prefix)) diff --git a/distribute_setup.py b/distribute_setup.py new file mode 100644 index 000000000..37117b34e --- /dev/null +++ b/distribute_setup.py @@ -0,0 +1,485 @@ +#!python +"""Bootstrap distribute installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from distribute_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import os +import sys +import time +import fnmatch +import tempfile +import tarfile +from distutils import log + +try: + from site import USER_SITE +except ImportError: + USER_SITE = None + +try: + import subprocess + + def _python_cmd(*args): + args = (sys.executable,) + args + return subprocess.call(args) == 0 + +except ImportError: + # will be used for python 2.3 + def _python_cmd(*args): + args = (sys.executable,) + args + # quoting arguments if windows + if sys.platform == 'win32': + def quote(arg): + if ' ' in arg: + return '"%s"' % arg + return arg + args = [quote(arg) for arg in args] + return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 + +DEFAULT_VERSION = "0.6.13" +DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" +SETUPTOOLS_FAKED_VERSION = "0.6c11" + +SETUPTOOLS_PKG_INFO = """\ +Metadata-Version: 1.0 +Name: setuptools +Version: %s +Summary: xxxx +Home-page: xxx +Author: xxx +Author-email: xxx +License: xxx +Description: xxx +""" % SETUPTOOLS_FAKED_VERSION + + +def _install(tarball): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # installing + log.warn('Installing Distribute') + if not _python_cmd('setup.py', 'install'): + log.warn('Something went wrong during the installation.') + log.warn('See the error message above.') + finally: + os.chdir(old_wd) + + +def _build_egg(egg, tarball, to_dir): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # building an egg + log.warn('Building a Distribute egg in %s', to_dir) + _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) + + finally: + os.chdir(old_wd) + # returning the result + log.warn(egg) + if not os.path.exists(egg): + raise IOError('Could not build the egg.') + + +def _do_download(version, download_base, to_dir, download_delay): + egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' + % (version, sys.version_info[0], sys.version_info[1])) + if not os.path.exists(egg): + tarball = download_setuptools(version, download_base, + to_dir, download_delay) + _build_egg(egg, tarball, to_dir) + sys.path.insert(0, egg) + import setuptools + setuptools.bootstrap_install_from = egg + + +def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, download_delay=15, no_fake=True): + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + was_imported = 'pkg_resources' in sys.modules or \ + 'setuptools' in sys.modules + try: + try: + import pkg_resources + if not hasattr(pkg_resources, '_distribute'): + if not no_fake: + _fake_setuptools() + raise ImportError + except ImportError: + return _do_download(version, download_base, to_dir, download_delay) + try: + pkg_resources.require("distribute>="+version) + return + except pkg_resources.VersionConflict: + e = sys.exc_info()[1] + if was_imported: + sys.stderr.write( + "The required version of distribute (>=%s) is not available,\n" + "and can't be installed while this script is running. Please\n" + "install a more recent version first, using\n" + "'easy_install -U distribute'." + "\n\n(Currently using %r)\n" % (version, e.args[0])) + sys.exit(2) + else: + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return _do_download(version, download_base, to_dir, + download_delay) + except pkg_resources.DistributionNotFound: + return _do_download(version, download_base, to_dir, + download_delay) + finally: + if not no_fake: + _create_fake_setuptools_pkg_info(to_dir) + +def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, delay=15): + """Download distribute from a specified location and return its filename + + `version` should be a valid distribute version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download + attempt. + """ + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + try: + from urllib.request import urlopen + except ImportError: + from urllib2 import urlopen + tgz_name = "distribute-%s.tar.gz" % version + url = download_base + tgz_name + saveto = os.path.join(to_dir, tgz_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + log.warn("Downloading %s", url) + src = urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = src.read() + dst = open(saveto, "wb") + dst.write(data) + finally: + if src: + src.close() + if dst: + dst.close() + return os.path.realpath(saveto) + +def _no_sandbox(function): + def __no_sandbox(*args, **kw): + try: + from setuptools.sandbox import DirectorySandbox + if not hasattr(DirectorySandbox, '_old'): + def violation(*args): + pass + DirectorySandbox._old = DirectorySandbox._violation + DirectorySandbox._violation = violation + patched = True + else: + patched = False + except ImportError: + patched = False + + try: + return function(*args, **kw) + finally: + if patched: + DirectorySandbox._violation = DirectorySandbox._old + del DirectorySandbox._old + + return __no_sandbox + +def _patch_file(path, content): + """Will backup the file then patch it""" + existing_content = open(path).read() + if existing_content == content: + # already patched + log.warn('Already patched.') + return False + log.warn('Patching...') + _rename_path(path) + f = open(path, 'w') + try: + f.write(content) + finally: + f.close() + return True + +_patch_file = _no_sandbox(_patch_file) + +def _same_content(path, content): + return open(path).read() == content + +def _rename_path(path): + new_name = path + '.OLD.%s' % time.time() + log.warn('Renaming %s into %s', path, new_name) + os.rename(path, new_name) + return new_name + +def _remove_flat_installation(placeholder): + if not os.path.isdir(placeholder): + log.warn('Unkown installation at %s', placeholder) + return False + found = False + for file in os.listdir(placeholder): + if fnmatch.fnmatch(file, 'setuptools*.egg-info'): + found = True + break + if not found: + log.warn('Could not locate setuptools*.egg-info') + return + + log.warn('Removing elements out of the way...') + pkg_info = os.path.join(placeholder, file) + if os.path.isdir(pkg_info): + patched = _patch_egg_dir(pkg_info) + else: + patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) + + if not patched: + log.warn('%s already patched.', pkg_info) + return False + # now let's move the files out of the way + for element in ('setuptools', 'pkg_resources.py', 'site.py'): + element = os.path.join(placeholder, element) + if os.path.exists(element): + _rename_path(element) + else: + log.warn('Could not find the %s element of the ' + 'Setuptools distribution', element) + return True + +_remove_flat_installation = _no_sandbox(_remove_flat_installation) + +def _after_install(dist): + log.warn('After install bootstrap.') + placeholder = dist.get_command_obj('install').install_purelib + _create_fake_setuptools_pkg_info(placeholder) + +def _create_fake_setuptools_pkg_info(placeholder): + if not placeholder or not os.path.exists(placeholder): + log.warn('Could not find the install location') + return + pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) + setuptools_file = 'setuptools-%s-py%s.egg-info' % \ + (SETUPTOOLS_FAKED_VERSION, pyver) + pkg_info = os.path.join(placeholder, setuptools_file) + if os.path.exists(pkg_info): + log.warn('%s already exists', pkg_info) + return + + log.warn('Creating %s', pkg_info) + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + + pth_file = os.path.join(placeholder, 'setuptools.pth') + log.warn('Creating %s', pth_file) + f = open(pth_file, 'w') + try: + f.write(os.path.join(os.curdir, setuptools_file)) + finally: + f.close() + +_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info) + +def _patch_egg_dir(path): + # let's check if it's already patched + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + if os.path.exists(pkg_info): + if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): + log.warn('%s already patched.', pkg_info) + return False + _rename_path(path) + os.mkdir(path) + os.mkdir(os.path.join(path, 'EGG-INFO')) + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + return True + +_patch_egg_dir = _no_sandbox(_patch_egg_dir) + +def _before_install(): + log.warn('Before install bootstrap.') + _fake_setuptools() + + +def _under_prefix(location): + if 'install' not in sys.argv: + return True + args = sys.argv[sys.argv.index('install')+1:] + for index, arg in enumerate(args): + for option in ('--root', '--prefix'): + if arg.startswith('%s=' % option): + top_dir = arg.split('root=')[-1] + return location.startswith(top_dir) + elif arg == option: + if len(args) > index: + top_dir = args[index+1] + return location.startswith(top_dir) + if arg == '--user' and USER_SITE is not None: + return location.startswith(USER_SITE) + return True + + +def _fake_setuptools(): + log.warn('Scanning installed packages') + try: + import pkg_resources + except ImportError: + # we're cool + log.warn('Setuptools or Distribute does not seem to be installed.') + return + ws = pkg_resources.working_set + try: + setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools', + replacement=False)) + except TypeError: + # old distribute API + setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools')) + + if setuptools_dist is None: + log.warn('No setuptools distribution found') + return + # detecting if it was already faked + setuptools_location = setuptools_dist.location + log.warn('Setuptools installation detected at %s', setuptools_location) + + # if --root or --preix was provided, and if + # setuptools is not located in them, we don't patch it + if not _under_prefix(setuptools_location): + log.warn('Not patching, --root or --prefix is installing Distribute' + ' in another location') + return + + # let's see if its an egg + if not setuptools_location.endswith('.egg'): + log.warn('Non-egg installation') + res = _remove_flat_installation(setuptools_location) + if not res: + return + else: + log.warn('Egg installation') + pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') + if (os.path.exists(pkg_info) and + _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): + log.warn('Already patched.') + return + log.warn('Patching...') + # let's create a fake egg replacing setuptools one + res = _patch_egg_dir(setuptools_location) + if not res: + return + log.warn('Patched done.') + _relaunch() + + +def _relaunch(): + log.warn('Relaunching...') + # we have to relaunch the process + # pip marker to avoid a relaunch bug + if sys.argv[:3] == ['-c', 'install', '--single-version-externally-managed']: + sys.argv[0] = 'setup.py' + args = [sys.executable] + sys.argv + sys.exit(subprocess.call(args)) + + +def _extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + import copy + import operator + from tarfile import ExtractError + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 448 # decimal for oct 0700 + self.extract(tarinfo, path) + + # Reverse sort directories. + if sys.version_info < (2, 4): + def sorter(dir1, dir2): + return cmp(dir1.name, dir2.name) + directories.sort(sorter) + directories.reverse() + else: + directories.sort(key=operator.attrgetter('name'), reverse=True) + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError: + e = sys.exc_info()[1] + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + tarball = download_setuptools() + _install(tarball) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/doc/Makefile b/doc/Makefile index 90fb5af25..47951316a 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -8,8 +8,9 @@ PAPER = PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) \ - $(SPHINXOPTS) $(O) . +ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) \ + $(SPHINXOPTS) $(O) . +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(O) . .PHONY: help clean html dirhtml singlehtml text man pickle json htmlhelp \ qthelp devhelp epub latex latexpdf changes linkcheck doctest @@ -29,6 +30,9 @@ help: @echo " epub to make an epub file" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run pdflatex" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" @echo " changes to make an overview over all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @@ -112,6 +116,11 @@ latexpdf: make -C _build/latex all-pdf @echo "pdflatex finished; the PDF files are in _build/latex." +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) _build/locale + @echo + @echo "Build finished. The message catalogs are in _build/locale." + changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes @echo @@ -125,3 +134,16 @@ linkcheck: doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) _build/texinfo + @echo + @echo "Build finished. The Texinfo files are in _build/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) _build/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C _build/texinfo info + @echo "makeinfo finished; the Info files are in _build/texinfo." diff --git a/doc/_static/pocoo.png b/doc/_static/pocoo.png new file mode 100644 index 000000000..297dcd5e0 Binary files /dev/null and b/doc/_static/pocoo.png differ diff --git a/doc/_templates/index.html b/doc/_templates/index.html index 524b2ffb6..34dead7e6 100644 --- a/doc/_templates/index.html +++ b/doc/_templates/index.html @@ -12,7 +12,7 @@

Sphinx is a tool that makes it easy to create intelligent and beautiful documentation, written by Georg Brandl and licensed under the BSD license.

-

It was originally created for the +

It was originally created for the new Python documentation, and it has excellent facilities for the documentation of Python projects, but C/C++ is already supported as well, and it is planned to add special support for other languages as well. Of diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index a268ec6ef..feafd9046 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -1,3 +1,6 @@ +

+

Download

{% if version.endswith('(hg)') %}

This documentation is for version {{ version }}, which is @@ -23,6 +26,6 @@ are also available.

-

or come to the #python-docs channel on FreeNode.

+

or come to the #pocoo channel on FreeNode.

You can also open an issue at the tracker.

diff --git a/doc/builders.rst b/doc/builders.rst index 6e90ccc62..71600137d 100644 --- a/doc/builders.rst +++ b/doc/builders.rst @@ -144,6 +144,26 @@ Note that a direct PDF builder using ReportLab is available in `rst2pdf .. versionadded:: 1.0 + +.. module:: sphinx.builders.texinfo +.. class:: TexinfoBuilder + + This builder produces Texinfo files that can be processed into Info files by + the :program:`makeinfo` program. You have to specify which documents are to + be included in which Texinfo files via the :confval:`texinfo_documents` + configuration value. + + The Info format is the basis of the on-line help system used by GNU Emacs and + the terminal-based program :program:`info`. See :ref:`texinfo-faq` for more + details. The Texinfo format is the official documentation system used by the + GNU project. More information on Texinfo can be found at + ``_. + + Its name is ``texinfo``. + + .. versionadded:: 1.1 + + .. currentmodule:: sphinx.builders.html .. class:: SerializingHTMLBuilder @@ -220,6 +240,18 @@ Note that a direct PDF builder using ReportLab is available in `rst2pdf .. versionadded:: 0.5 +.. module:: sphinx.builders.gettext +.. class:: MessageCatalogBuilder + + This builder produces gettext-style message catalogs. Each top-level file or + subdirectory grows a single ``.pot`` catalog template. + + See the documentation on :ref:`intl` for further reference. + + Its name is ``gettext``. + + .. versionadded:: 1.1 + .. module:: sphinx.builders.changes .. class:: ChangesBuilder @@ -255,11 +287,11 @@ 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 +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 +: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: @@ -290,7 +322,7 @@ like structure) with these keys: The special files are located in the root output directory. They are: -:attr:`SerializingHTMLBuilder.globalcontext_filename` +:attr:`.SerializingHTMLBuilder.globalcontext_filename` A pickled dict with these keys: ``project``, ``copyright``, ``release``, ``version`` @@ -309,7 +341,7 @@ The special files are located in the root output directory. They are: ``titles`` A dictionary of all documents' titles, as HTML strings. -:attr:`SerializingHTMLBuilder.searchindex_filename` +:attr:`.SerializingHTMLBuilder.searchindex_filename` An index that can be used for searching the documentation. It is a pickled list with these entries: diff --git a/doc/conf.py b/doc/conf.py index 8b76d23f1..19b952942 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -13,7 +13,7 @@ templates_path = ['_templates'] exclude_patterns = ['_build'] project = 'Sphinx' -copyright = '2007-2010, Georg Brandl' +copyright = '2007-2011, Georg Brandl' version = sphinx.__released__ release = version show_authors = True @@ -21,7 +21,6 @@ show_authors = True html_theme = 'sphinxdoc' modindex_common_prefix = ['sphinx.'] html_static_path = ['_static'] -html_index = 'index.html' html_sidebars = {'index': ['indexsidebar.html', 'searchbox.html']} html_additional_pages = {'index': 'index.html'} html_use_opensearch = 'http://sphinx.pocoo.org' @@ -47,6 +46,7 @@ latex_logo = '_static/sphinx.png' latex_elements = { 'fontpkg': '\\usepackage{palatino}', } +latex_show_urls = 'footnote' autodoc_member_order = 'groupwise' todo_include_todos = True @@ -66,6 +66,16 @@ man_pages = [ 'template generator', '', 1), ] +texinfo_documents = [ + ('contents', 'sphinx', 'Sphinx Documentation', 'Georg Brandl', + 'Sphinx', 'The Sphinx documentation builder.', 'Documentation tools', + 1), +] + +# We're not using intersphinx right now, but if we did, this would be part of +# the mapping: +intersphinx_mapping = {'python': ('http://docs.python.org/dev', None)} + # -- Extension interface ------------------------------------------------------- @@ -91,8 +101,12 @@ def parse_event(env, sig, signode): 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.add_description_unit('confval', 'confval', - objname='configuration value', - indextemplate='pair: %s; configuration value') - app.add_description_unit('event', 'event', 'pair: %s; event', parse_event) + 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/config.rst b/doc/config.rst index ea9b731ad..1260796a9 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -98,7 +98,7 @@ General configuration Example patterns: - ``'library/xml.rst'`` -- ignores the ``library/xml.rst`` file (replaces - entry in :confval:`unused_docs` + entry in :confval:`unused_docs`) - ``'library/xml'`` -- ignores the ``library/xml`` directory (replaces entry in :confval:`exclude_trees`) - ``'library/xml*'`` -- ignores all files and directories starting with @@ -143,20 +143,6 @@ General configuration .. deprecated:: 1.0 Use :confval:`exclude_patterns` instead. -.. confval:: locale_dirs - - .. versionadded:: 0.5 - - Directories in which to search for additional Sphinx message catalogs (see - :confval:`language`), relative to the source directory. The directories on - this path are searched by the standard :mod:`gettext` module for a text - domain of ``sphinx``; so if you add the directory :file:`./locale` to this - settting, the message catalogs (compiled from ``.po`` format using - :program:`msgfmt`) must be in - :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`. - - The default is ``[]``. - .. confval:: templates_path A list of paths that contain extra templates (or templates that overwrite @@ -246,6 +232,14 @@ General configuration .. versionadded:: 1.0 +.. confval:: nitpick_ignore + + A list of ``(type, target)`` tuples (by default empty) that should be ignored + when generating warnings in "nitpicky mode". Note that ``type`` should + include the domain name. An example entry would be ``('py:func', 'int')``. + + .. versionadded:: 1.1 + Project information ------------------- @@ -272,38 +266,6 @@ Project information If you don't need the separation provided between :confval:`version` and :confval:`release`, just set them both to the same value. -.. confval:: language - - The code for the language the docs are written in. Any text automatically - generated by Sphinx will be in that language. Also, in the LaTeX builder, a - suitable language will be selected as an option for the *Babel* package. - Default is ``None``, which means that no translation will be done. - - .. versionadded:: 0.5 - - Currently supported languages are: - - * ``ca`` -- Catalan - * ``cs`` -- Czech - * ``da`` -- Danish - * ``de`` -- German - * ``en`` -- English - * ``es`` -- Spanish - * ``fi`` -- Finnish - * ``fr`` -- French - * ``hr`` -- Croatian - * ``it`` -- Italian - * ``lt`` -- Lithuanian - * ``nl`` -- Dutch - * ``pl`` -- Polish - * ``pt_BR`` -- Brazilian Portuguese - * ``ru`` -- Russian - * ``sl`` -- Slovenian - * ``tr`` -- Turkish - * ``uk_UA`` -- Ukrainian - * ``zh_CN`` -- Simplified Chinese - * ``zh_TW`` -- Traditional Chinese - .. confval:: today today_fmt @@ -345,12 +307,12 @@ Project information 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:`function` directives. Default is ``True``. + defined), e.g. for :rst:dir:`py:function` directives. Default is ``True``. .. confval:: show_authors - A boolean that decides whether :rst:dir:`moduleauthor` and :rst:dir:`sectionauthor` - directives produce any output in the built files. + A boolean that decides whether :rst:dir:`codeauthor` and + :rst:dir:`sectionauthor` directives produce any output in the built files. .. confval:: modindex_common_prefix @@ -372,11 +334,78 @@ Project information .. confval:: trim_doctest_flags If true, doctest flags (comments looking like ``# doctest: FLAG, ...``) at - the ends of lines are removed for all code blocks showing interactive Python - sessions (i.e. doctests). Default is true. See the extension - :mod:`~sphinx.ext.doctest` for more possibilities of including doctests. + the ends of lines and ```` 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 ````. + + +.. _intl-options: + +Options for internationalization +-------------------------------- + +These options influence Sphinx' *Native Language Support*. See the +documentation on :ref:`intl` for details. + +.. confval:: language + + The code for the language the docs are written in. Any text automatically + generated by Sphinx will be in that language. Also, Sphinx will try to + substitute individual paragraphs from your documents with the translation + sets obtained from :confval:`locale_dirs`. In the LaTeX builder, a suitable + language will be selected as an option for the *Babel* package. Default is + ``None``, which means that no translation will be done. + + .. versionadded:: 0.5 + + Currently supported languages by Sphinx are: + + * ``bn`` -- Bengali + * ``ca`` -- Catalan + * ``cs`` -- Czech + * ``da`` -- Danish + * ``de`` -- German + * ``en`` -- English + * ``es`` -- Spanish + * ``fa`` -- Iranian + * ``fi`` -- Finnish + * ``fr`` -- French + * ``hr`` -- Croatian + * ``it`` -- Italian + * ``ja`` -- Japanese + * ``lt`` -- Lithuanian + * ``nl`` -- Dutch + * ``pl`` -- Polish + * ``pt_BR`` -- Brazilian Portuguese + * ``ru`` -- Russian + * ``sl`` -- Slovenian + * ``sv`` -- Swedish + * ``tr`` -- Turkish + * ``uk_UA`` -- Ukrainian + * ``zh_CN`` -- Simplified Chinese + * ``zh_TW`` -- Traditional Chinese + +.. confval:: locale_dirs + + .. versionadded:: 0.5 + + Directories in which to search for additional message catalogs (see + :confval:`language`), relative to the source directory. The directories on + this path are searched by the standard :mod:`gettext` module. + + Internal messages are fetched from a text domain of ``sphinx``; so if you + add the directory :file:`./locale` to this settting, the message catalogs + (compiled from ``.po`` format using :program:`msgfmt`) must be in + :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`. The text domain of + individual documents depends on their docname if they are top-level project + files and on their base directory otherwise. + + The default is ``[]``. .. _html-options: @@ -434,6 +463,14 @@ that use Sphinx' HTMLWriter class. .. versionadded:: 0.4 +.. 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` command-line option of ``sphinx-build``. + + .. versionadded:: 0.5 + .. confval:: html_logo If given, this must be the name of an image file that is the logo of the @@ -480,13 +517,19 @@ that use Sphinx' HTMLWriter class. .. confval:: html_add_permalinks - If true, Sphinx will add "permalinks" for each heading and description - environment as paragraph signs that become visible when the mouse hovers over - them. Default: ``True``. + Sphinx will add "permalinks" for each heading and description environment as + paragraph signs that become visible when the mouse hovers over them. + + This value determines the text for the permalink; it defaults to ``"¶"``. + Set it to ``None`` or the empty string to disable permalinks. .. versionadded:: 0.6 Previously, this was always activated. + .. versionchanged:: 1.1 + This can now be a string to select the actual text of the link. + Previously, only boolean values were accepted. + .. confval:: html_sidebars Custom sidebar templates, must be a dictionary that maps document names to @@ -552,19 +595,6 @@ that use Sphinx' HTMLWriter class. This will render the template ``customdownload.html`` as the page ``download.html``. - .. note:: - - Earlier versions of Sphinx had a value called :confval:`html_index` which - was a clumsy way of controlling the content of the "index" document. If - you used this feature, migrate it by adding an ``'index'`` key to this - setting, with your custom template as the value, and in your custom - template, use :: - - {% extend "defindex.html" %} - {% block tables %} - ... old template content ... - {% endblock %} - .. confval:: html_domain_indices If true, generate domain-specific indices in addition to the general index. @@ -682,6 +712,38 @@ that use Sphinx' HTMLWriter class. .. versionadded:: 1.0 +.. confval:: html_search_language + + Language to be used for generating the HTML full-text search index. This + defaults to the global language selected with :confval:`language`. If there + is no support for this language, ``"en"`` is used which selects the English + language. + + Support is present for these languages: + + * ``en`` -- English + * ``ja`` -- Japanese + + .. versionadded:: 1.1 + +.. confval:: html_search_options + + A dictionary with options for the search language support, empty by default. + The meaning of these options depends on the language selected. + + The English support has no options. + + The Japanese support has these options: + + * ``type`` -- ``'mecab'`` or ``'default'`` (selects either MeCab or + TinySegmenter word splitter algorithm) + * ``dic_enc`` -- the encoding for the MeCab algorithm + * ``dict`` -- the dictionary to use for the MeCab algorithm + * ``lib`` -- the library name for finding the MeCab library via ctypes if the + Python binding is not installed + + .. versionadded:: 1.1 + .. confval:: htmlhelp_basename Output file base name for HTML help builder. Default is ``'pydoc'``. @@ -767,6 +829,8 @@ the `Dublin Core metadata `_. The default value is ``()``. + .. versionadded:: 1.1 + .. confval:: epub_pre_files Additional files that should be inserted before the text generated by @@ -804,6 +868,7 @@ the `Dublin Core metadata `_. a chapter, but can be confusing because it mixes entries of differnet depth in one list. The default value is ``True``. + .. confval:: epub_fix_images This flag determines if sphinx should try to fix image formats that are not @@ -903,10 +968,18 @@ These options influence LaTeX output. .. confval:: latex_show_urls - If true, add URL addresses after links. This is very useful for printed - copies of the manual. Default is ``False``. + Control whether to display URL addresses. This is very useful for printed + copies of the manual. The setting can have the following values: + + * ``'no'`` -- do not display URLs (default) + * ``'footnote'`` -- display URLs in footnotes + * ``'inline'`` -- display URLs inline in parentheses .. versionadded:: 1.0 + .. versionchanged:: 1.1 + This value is now a string; previously it was a boolean value, and a true + value selected the ``'inline'`` display. For backwards compatibility, + ``True`` is still accepted. .. confval:: latex_elements @@ -1019,6 +1092,37 @@ These options influence LaTeX output. Use the ``'pointsize'`` key in the :confval:`latex_elements` value. +.. _text-options: + +Options for text output +----------------------- + +These options influence text output. + +.. confval:: text_newlines + + Determines which end-of-line character(s) are used in text output. + + * ``'unix'``: use Unix-style line endings (``\n``) + * ``'windows'``: use Windows-style line endings (``\r\n``) + * ``'native'``: use the line ending style of the platform the documentation + is built on + + Default: ``'unix'``. + + .. versionadded:: 1.1 + +.. confval:: text_sectionchars + + A string of 7 characters that should be used for underlining sections. + The first character is used for first-level headings, the second for + second-level headings and so on. + + The default is ``'*=-~"+`'``. + + .. versionadded:: 1.1 + + .. _man-options: Options for manual page output @@ -1041,14 +1145,121 @@ These options influence manual page output. well as the name of the manual page (in the NAME section). * *description*: description of the manual page. This is used in the NAME section. - * *authors*: A list of strings with authors, or a single string. Can be - an empty string or list if you do not want to automatically generate - an AUTHORS section in the manual page. + * *authors*: A list of strings with authors, or a single string. Can be an + empty string or list if you do not want to automatically generate an + AUTHORS section in the manual page. * *section*: The manual page section. Used for the output file name as well as in the manual page header. .. versionadded:: 1.0 +.. confval:: man_show_urls + + If true, add URL addresses after links. Default is ``False``. + + .. versionadded:: 1.1 + + +.. _texinfo-options: + +Options for Texinfo output +-------------------------- + +These options influence Texinfo output. + +.. confval:: texinfo_documents + + This value determines how to group the document tree into Texinfo source + files. It must be a list of tuples ``(startdocname, targetname, title, + author, dir_entry, description, category, toctree_only)``, where the items + are: + + * *startdocname*: document name that is the "root" of the Texinfo file. All + documents referenced by it in TOC trees will be included in the Texinfo + file too. (If you want only one Texinfo file, use your + :confval:`master_doc` here.) + * *targetname*: file name (no extension) of the Texinfo file in the output + directory. + * *title*: Texinfo document title. Can be empty to use the title of the + *startdoc*. + * *author*: Author for the Texinfo document. Use ``\and`` to separate + multiple authors, as in: ``'John \and 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_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'`` + Text inserted as is near the beginning of the file. + + * Keys that are set by other options and therefore should not be overridden + are: + + ``'filename'`` + ``'title'`` + ``'direntry'`` + + .. versionadded:: 1.1 + + +Options for the linkcheck builder +--------------------------------- + +.. confval:: linkcheck_ignore + + A list of regular expressions that match URIs that should not be checked + when doing a ``linkcheck`` build. Example:: + + linkcheck_ignore = [r'http://localhost:\d+/'] + + .. versionadded:: 1.1 + +.. confval:: linkcheck_timeout + + A timeout value, in seconds, for the linkcheck builder. **Only works in + Python 2.6 and higher.** The default is to use Python's global socket + timeout. + + .. versionadded:: 1.1 + +.. confval:: linkcheck_workers + + The number of worker threads to use when checking links. Default is 5 + threads. + + .. versionadded:: 1.1 + .. rubric:: Footnotes diff --git a/doc/contents.rst b/doc/contents.rst index 079f93f26..3bbc28350 100644 --- a/doc/contents.rst +++ b/doc/contents.rst @@ -14,9 +14,11 @@ Sphinx documentation contents domains builders config + intl theming templating extensions + websupport faq glossary diff --git a/doc/domains.rst b/doc/domains.rst index c64930a24..a1e7b98e3 100644 --- a/doc/domains.rst +++ b/doc/domains.rst @@ -52,10 +52,19 @@ flag ``:noindex:``. An example using a Python domain directive:: .. py:function:: spam(eggs) ham(eggs) - :noindex: 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) + :noindex: + +(This example also shows how to use the ``:noindex:`` 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 :: @@ -138,11 +147,12 @@ declarations: .. 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:`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`. + 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: @@ -221,6 +231,45 @@ The following directives are provided for module and class contents: .. versionadded:: 0.6 +.. rst:directive:: .. py:decorator:: name + .. py:decorator:: name(signature) + + Describes a decorator function. The signature should *not* represent the + signature of the actual function, but the usage as a decorator. For example, + given the functions + + .. code-block:: python + + def removename(func): + func.__name__ = '' + return func + + def setnewname(name): + def decorator(func): + func.__name__ = name + return func + return decorator + + the descriptions should look like this:: + + .. py:decorator:: removename + + Remove name of the decorated function. + + .. py:decorator:: setnewname(name) + + Set name of the decorated function to *name*. + + There is no ``py:deco`` role to link to a decorator that is marked up with + this directive; rather, use the :rst:role:`py:func` role. + +.. rst:directive:: .. py:decoratormethod:: name + .. py:decoratormethod:: name(signature) + + Same as :rst:dir:`py:decorator`, but for decorators that are methods. + + Refer to a decorator method using the :rst:role:`py:meth` role. + .. _signatures: @@ -278,11 +327,6 @@ explained by an example:: :type limit: integer or None :rtype: list of strings -It is also possible to combine parameter type and description, if the type is a -single word, like this:: - - :param integer limit: maximum number of stack frames to show - This will render like this: .. py:function:: format_exception(etype, value, tb[, limit=None]) @@ -297,6 +341,13 @@ This will render like this: :type limit: integer or None :rtype: list of strings +It is also possible to combine parameter type and description, if the type is a +single word, like this:: + + :param integer limit: maximum number of stack frames to show + + +.. _python-roles: Cross-referencing Python objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -363,6 +414,9 @@ 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 @@ -370,8 +424,9 @@ searched. For example, ``:py:meth:`.TarFile.close``` references the ``tarfile``. Since this can get ambiguous, if there is more than one possible match, you will get a warning from Sphinx. -A similar heuristic is used to determine whether the name is an attribute of the -currently documented class. +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: @@ -424,6 +479,8 @@ The C domain (name **c**) is suited for documentation of C API. .. c:var:: PyObject* PyClass_Type +.. _c-roles: + Cross-referencing C constructs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -508,6 +565,9 @@ The following directives are available: Select the current C++ namespace for the following objects. + +.. _cpp-roles: + These roles link to the given object types: .. rst:role:: cpp:class @@ -675,6 +735,8 @@ The JavaScript domain (name **js**) provides the following directives: Describes the attribute *name* of *object*. +.. _js-roles: + These roles are provided to refer to the described objects: .. rst:role:: js:func @@ -726,6 +788,8 @@ The reStructuredText domain (name **rst**) provides the following directives: Foo description. +.. _rst-roles: + These roles are provided to refer to the described objects: .. rst:role:: rst:dir @@ -739,4 +803,4 @@ The sphinx-contrib_ repository contains more domains available as extensions; currently a Ruby and an Erlang domain. -.. _sphinx-contrib: http://bitbucket.org/birkenfeld/sphinx-contrib/ +.. _sphinx-contrib: https://bitbucket.org/birkenfeld/sphinx-contrib/ diff --git a/doc/ext/appapi.rst b/doc/ext/appapi.rst index 402dd72f0..d43a90eb1 100644 --- a/doc/ext/appapi.rst +++ b/doc/ext/appapi.rst @@ -76,9 +76,9 @@ the following public API: Node visitor functions for the Sphinx HTML, LaTeX, text and manpage writers can be given as keyword arguments: the keyword must be one or more of - ``'html'``, ``'latex'``, ``'text'``, ``'man'``, the value a 2-tuple of - ``(visit, depart)`` methods. ``depart`` can be ``None`` if the ``visit`` - function raises :exc:`docutils.nodes.SkipNode`. Example: + ``'html'``, ``'latex'``, ``'text'``, ``'man'``, ``'texinfo'``, the value a + 2-tuple of ``(visit, depart)`` methods. ``depart`` can be ``None`` if the + ``visit`` function raises :exc:`docutils.nodes.SkipNode`. Example: .. code-block:: python @@ -163,7 +163,8 @@ the following public API: .. versionadded:: 0.6 -.. method:: Sphinx.add_object_type(directivename, rolename, indextemplate='', parse_node=None, ref_nodeclass=None, objname='') +.. method:: Sphinx.add_object_type(directivename, rolename, indextemplate='', parse_node=None, \ + ref_nodeclass=None, objname='', doc_field_types=[]) This method is a very convenient way to add a new :term:`object` type that can be cross-referenced. It will do this: @@ -210,7 +211,7 @@ the following public API: standard Sphinx roles (see :ref:`xref-syntax`). This method is also available under the deprecated alias - :meth:`add_description_unit`. + ``add_description_unit``. .. method:: Sphinx.add_crossref_type(directivename, rolename, indextemplate='', ref_nodeclass=None, objname='') @@ -246,7 +247,8 @@ the following public API: Add *filename* to the list of JavaScript files that the default HTML template will include. The filename must be relative to the HTML static path, see - :confval:`the docs for the config value `. + :confval:`the docs for the config value `. A full URI with + scheme, like ``http://example.org/foo.js``, is also supported. .. versionadded:: 0.5 @@ -272,6 +274,8 @@ the following public API: This allows to auto-document new types of objects. See the source of the autodoc module for examples on how to subclass :class:`Documenter`. + .. XXX add real docs for Documenter and subclassing + .. versionadded:: 0.6 .. method:: Sphinx.add_autodoc_attrgetter(type, getter) @@ -283,6 +287,15 @@ the following public API: .. versionadded:: 0.6 +.. method:: Sphinx.add_search_language(cls) + + Add *cls*, which must be a subclass of :class:`sphinx.search.SearchLanguage`, + as a support language for building the HTML full-text search index. The + class must have a *lang* attribute that indicates the language it should be + used for. See :confval:`html_search_language`. + + .. versionadded:: 1.1 + .. method:: Sphinx.connect(event, callback) Register *callback* to be called when *event* is emitted. For details on @@ -340,6 +353,15 @@ registered event handlers. Emitted when the builder object has been created. It is available as ``app.builder``. +.. event:: env-get-outdated (app, env, added, changed, removed) + + Emitted when the environment determines which source files have changed and + should be re-read. *added*, *changed* and *removed* are sets of docnames + that the environment has determined. You can return a list of docnames to + re-read in addition to these. + + .. versionadded:: 1.1 + .. event:: env-purge-doc (app, env, docname) Emitted when all traces of a source file should be cleaned from the diff --git a/doc/ext/autodoc.rst b/doc/ext/autodoc.rst index bd725cfaa..ab520f70c 100644 --- a/doc/ext/autodoc.rst +++ b/doc/ext/autodoc.rst @@ -27,20 +27,21 @@ two locations for documentation, while at the same time avoiding auto-generated-looking pure API documentation. :mod:`autodoc` provides several directives that are versions of the usual -:rst:dir:`module`, :rst:dir:`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:`module`, :rst:dir:`class` etc. -directive. +: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:`class` respects the current :rst:dir:`module`, :rst:dir:`autoclass` - will also do so, and likewise with :rst:dir:`method` and :rst:dir:`class`. + 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 + autoclass + autoexception Document a module, class or exception. All three directives will by default only insert the docstring of the object itself:: @@ -83,14 +84,17 @@ directive. will document all non-private member functions and properties (that is, those whose name doesn't start with ``_``). + For modules, ``__all__`` will be respected when looking for members; 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 - * If you want to make the ``members`` option the default, see - :confval:`autodoc_default_flags`. + * If you want to make the ``members`` option (or other flag options described + below) the default, see :confval:`autodoc_default_flags`. * Members without docstrings will be left out, unless you give the ``undoc-members`` flag option:: @@ -99,9 +103,26 @@ directive. :members: :undoc-members: + * "Private" members (that is, those named like ``_private`` or ``__private``) + will be included if the ``private-members`` flag option is given. + + .. versionadded:: 1.1 + + * Python "special" members (that is, those named like ``__special__``) will + be included if the ``special-members`` flag option is given:: + + .. autoclass:: my.Class + :members: + :private-members: + :special-members: + + would document both "private" and "special" members of the class. + + .. versionadded:: 1.1 + * For classes and exceptions, members inherited from base classes will be - left out, unless you give the ``inherited-members`` flag option, in - addition to ``members``:: + left out when documenting all members, unless you give the + ``inherited-members`` flag option, in addition to ``members``:: .. autoclass:: Noodle :members: @@ -127,28 +148,29 @@ directive. .. 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). + * 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 ``noindex`` flag option that has the - same effect as for standard :rst:dir:`function` etc. directives: no index - entries are generated for the documented object (and all autodocumented - members). + 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:`module` directive supports. + ``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 + * :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 @@ -168,29 +190,45 @@ directive. .. rst:directive:: autofunction - autodata - automethod - autoattribute + autodata + automethod + autoattribute These work exactly like :rst:dir:`autoclass` etc., but do not offer the options used for automatic member documentation. For module data members and class attributes, documentation can either be put - into a special-formatted comment *before* the attribute definition, or in a - docstring *after* the definition. This means that in the following class - definition, both attributes can be autodocumented:: + into a special-formatted comment, or in a docstring *after* the definition. + Comments need to be either on a line of their own *before* the definition, or + immediately after the assignment *on the same line*. The latter form is + restricted to one line only. + + This means that in the following class definition, all attributes can be + autodocumented:: class Foo: """Docstring for class Foo.""" - #: Doc comment for attribute Foo.bar. + #: Doc comment for class attribute Foo.bar. + #: It can have multiple lines. bar = 1 + flox = 1.5 #: Doc comment for Foo.flox. One line only. + baz = 2 - """Docstring for attribute Foo.baz.""" + """Docstring for class attribute Foo.baz.""" + + def __init__(self): + #: Doc comment for instance attribute qux. + self.qux = 3 + + self.spam = 4 + """Docstring for instance attribute spam.""" .. versionchanged:: 0.6 :rst:dir:`autodata` and :rst:dir:`autoattribute` can now extract docstrings. + .. versionchanged:: 1.1 + Comment docs are now allowed on the same line after an assignment. .. note:: @@ -213,8 +251,8 @@ There are also new config values that you can set: ``"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`. + 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. @@ -241,7 +279,8 @@ There are also new config values that you can set: This value is a list of autodoc directive flags that should be automatically applied to all autodoc directives. The supported flags are ``'members'``, - ``'undoc-members'``, ``'inherited-members'`` and ``'show-inheritance'``. + ``'undoc-members'``, ``'private-members'``, ``'special-members'``, + ``'inherited-members'`` and ``'show-inheritance'``. If you set one of these flags in this config value, you can use a negated form, :samp:`'no-{flag}'`, in an autodoc directive, to disable it once. @@ -255,6 +294,20 @@ There are also new config values that you can set: .. versionadded:: 1.0 +.. confval:: autodoc_docstring_signature + + Functions imported from C modules cannot be introspected, and therefore the + signature for such functions cannot be automatically determined. However, it + is an often-used convention to put the signature into the first line of the + function's docstring. + + If this boolean value is set to ``True`` (which is the default), autodoc will + look at the first line of the docstring for functions and methods, and if it + looks like a signature, use the line as the signature and remove it from the + docstring content. + + .. versionadded:: 1.1 + Docstring preprocessing ----------------------- diff --git a/doc/ext/coverage.rst b/doc/ext/coverage.rst index 13294f8bc..839478fe1 100644 --- a/doc/ext/coverage.rst +++ b/doc/ext/coverage.rst @@ -14,6 +14,7 @@ This extension features one additional builder, the :class:`CoverageBuilder`. .. todo:: Write this section. + Several new configuration values can be used to specify what the builder should check: @@ -28,3 +29,16 @@ should check: .. confval:: coverage_c_regexes .. confval:: coverage_ignore_c_items + +.. confval:: coverage_write_headline + + Set to ``False`` to not write headlines. + + .. versionadded:: 1.1 + +.. confval:: coverage_skip_undoc_in_source + + Skip objects that are not documented in the source with a docstring. + ``False`` by default. + + .. versionadded:: 1.1 diff --git a/doc/ext/doctest.rst b/doc/ext/doctest.rst index 20e747de1..554987ee4 100644 --- a/doc/ext/doctest.rst +++ b/doc/ext/doctest.rst @@ -45,6 +45,14 @@ names. but executed before the doctests of the group(s) it belongs to. +.. rst:directive:: .. testcleanup:: [group] + + A cleanup code block. This code is not shown in the output for other + builders, but executed after the doctests of the group(s) it belongs to. + + .. versionadded:: 1.1 + + .. rst:directive:: .. doctest:: [group] A doctest-style code block. You can use standard :mod:`doctest` flags for @@ -181,6 +189,14 @@ There are also these config values for customizing the doctest extension: .. versionadded:: 0.6 +.. confval:: doctest_global_cleanup + + Python code that is treated like it were put in a ``testcleanup`` directive + for *every* file that is tested, and for every group. You can use this to + e.g. remove any temporary files that the tests leave behind. + + .. versionadded:: 1.1 + .. confval:: doctest_test_doctest_blocks If this is a nonempty string (the default is ``'default'``), standard reST @@ -221,4 +237,4 @@ There are also these config values for customizing the doctest extension: will be interpreted as one block ending and another one starting. Also, removal of ```` and ``# doctest:`` options only works in :rst:dir:`doctest` blocks, though you may set :confval:`trim_doctest_flags` to - achieve the latter in all code blocks with Python console content. + achieve that in all code blocks with Python console content. diff --git a/doc/ext/extlinks.rst b/doc/ext/extlinks.rst index d4478c5b3..d8bcaa524 100644 --- a/doc/ext/extlinks.rst +++ b/doc/ext/extlinks.rst @@ -27,11 +27,11 @@ The extension adds one new config value: short alias names to a base URL and a *prefix*. For example, to create an alias for the above mentioned issues, you would add :: - extlinks = {'issue': ('http://bitbucket.org/birkenfeld/sphinx/issue/%s', + extlinks = {'issue': ('https://bitbucket.org/birkenfeld/sphinx/issue/%s', 'issue ')} Now, you can use the alias name as a new role, e.g. ``:issue:`123```. This - then inserts a link to http://bitbucket.org/birkenfeld/sphinx/issue/123. + then inserts a link to https://bitbucket.org/birkenfeld/sphinx/issue/123. As you can see, the target given in the role is substituted in the base URL in the place of ``%s``. diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst index 3741cec64..9b34b48fe 100644 --- a/doc/ext/graphviz.rst +++ b/doc/ext/graphviz.rst @@ -29,6 +29,17 @@ It adds these directives: :confval:`graphviz_output_format`). In LaTeX output, the code will be rendered to an embeddable PDF file. + You can also embed external dot files, by giving the file name as an + argument to :rst:dir:`graphviz` and no additional content:: + + .. graphviz:: external.dot + + As for all file references in Sphinx, if the filename is absolute, it is + taken as relative to the source directory. + + .. versionchanged:: 1.1 + Added support for external files. + .. rst:directive:: graph @@ -61,6 +72,16 @@ It adds these directives: alternate text for HTML output. If not given, the alternate text defaults to the graphviz code. +.. versionadded:: 1.1 + All three directives support an ``inline`` flag that controls paragraph + breaks in the output. When set, the graph is inserted into the current + paragraph. If the flag is not given, paragraph breaks are introduced before + and after the image (the default). + +.. versionadded:: 1.1 + All three directives support a ``caption`` option that can be used to give a + caption to the diagram. Naturally, diagrams marked as "inline" cannot have a + caption. There are also these new config values: diff --git a/doc/ext/inheritance.rst b/doc/ext/inheritance.rst index 76388a94c..5e0a76fcc 100644 --- a/doc/ext/inheritance.rst +++ b/doc/ext/inheritance.rst @@ -17,7 +17,7 @@ It adds this directive: 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:`module`). + 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 @@ -30,6 +30,13 @@ It adds this directive: ``lib.``, you can give ``:parts: 1`` to remove that prefix from the displayed node names.) + It also supports a ``private-bases`` flag option; if given, private base + classes (those whose name starts with ``_``) will be included. + + .. versionchanged:: 1.1 + Added ``private-bases`` option; previously, all bases were always + included. + New config values are: diff --git a/doc/ext/intersphinx.rst b/doc/ext/intersphinx.rst index bb2a5a8c4..7997472a7 100644 --- a/doc/ext/intersphinx.rst +++ b/doc/ext/intersphinx.rst @@ -84,7 +84,7 @@ linking: To add links to modules and objects in the Python standard library documentation, use:: - intersphinx_mapping = {'python': ('http://docs.python.org/', None)} + intersphinx_mapping = {'python': ('http://docs.python.org/3.2', 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 @@ -94,12 +94,12 @@ linking: A second example, showing the meaning of a non-``None`` value of the second tuple item:: - intersphinx_mapping = {'python': ('http://docs.python.org/', + intersphinx_mapping = {'python': ('http://docs.python.org/3.2', '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 - ``http://docs.python.org/``. It is up to you to update the inventory file as + ``http://docs.python.org/3.2``. It is up to you to update the inventory file as new objects are added to the Python documentation. .. confval:: intersphinx_cache_limit diff --git a/doc/ext/math.rst b/doc/ext/math.rst index b9f6ab12b..1c7332d6d 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -17,15 +17,15 @@ if possible, reuse that support too. .. note:: - :mod:`sphinx.ext.mathbase` is not meant to be added to the - :confval:`extensions` config value, instead, use either - :mod:`sphinx.ext.pngmath` or :mod:`sphinx.ext.jsmath` as described below. + :mod:`.mathbase` is not meant to be added to the :confval:`extensions` config + value, instead, use either :mod:`sphinx.ext.pngmath` or + :mod:`sphinx.ext.jsmath` as described below. 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. -:mod:`mathbase` defines these new markup elements: +:mod:`.mathbase` defines these new markup elements: .. rst:role:: math @@ -170,20 +170,58 @@ There are various config values you can set to influence how the images are buil Unfortunately, this only works when the `preview-latex package`_ is installed. Therefore, the default for this option is ``False``. +.. confval:: pngmath_add_tooltips + + Default: true. If false, do not add the LaTeX code as an "alt" attribute for + math images. + + .. versionadded:: 1.1 + + +:mod:`sphinx.ext.mathjax` -- Render math via JavaScript +------------------------------------------------------- + +.. module:: sphinx.ext.mathjax + :synopsis: Render math using JavaScript via MathJax. + +.. versionadded:: 1.1 + +This extension puts math as-is into the HTML files. The JavaScript package +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. You must install it yourself, and give Sphinx its path in this config +value: + +.. confval:: mathjax_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 ``MathJax/MathJax.js``. If you host more than one Sphinx + documentation set on one server, it is advisable to install MathJax in a + shared location. + + You can also give a full ``http://`` URL. Kevin Dunn maintains a MathJax + installation on a public server, which he offers for use by development and + production servers:: + + mathjax_path = 'http://mathjax.connectmv.com/MathJax.js' + :mod:`sphinx.ext.jsmath` -- Render math via JavaScript ------------------------------------------------------ .. module:: sphinx.ext.jsmath - :synopsis: Render math via JavaScript. + :synopsis: Render math using JavaScript via JSMath. -This extension puts math as-is into the HTML files. The JavaScript package -jsMath_ is then loaded and transforms the LaTeX markup to readable math live in -the browser. - -Because jsMath (and the necessary fonts) is very large, it is not included in -Sphinx. You must install it yourself, and give Sphinx its path in this config -value: +This extension works just as the MathJax extension does, but uses the older +package jsMath_. It provides this config value: .. confval:: jsmath_path @@ -200,6 +238,7 @@ value: .. _dvipng: http://savannah.nongnu.org/projects/dvipng/ +.. _MathJax: http://www.mathjax.org/ .. _jsMath: http://www.math.union.edu/~dpvc/jsmath/ .. _preview-latex package: http://www.gnu.org/software/auctex/preview-latex.html -.. _AmSMath LaTeX package: http://www.ams.org/tex/amslatex.html +.. _AmSMath LaTeX package: http://www.ams.org/publications/authors/tex/amslatex diff --git a/doc/extensions.rst b/doc/extensions.rst index 492247744..b93974486 100644 --- a/doc/extensions.rst +++ b/doc/extensions.rst @@ -59,14 +59,19 @@ These extensions are built in and can be activated by respective entries in the Third-party extensions ---------------------- -There are several extensions that are not (yet) maintained in the Sphinx -distribution. The `Wiki at BitBucket`_ maintains a list of those. +You can find several extensions contributed by users in the `Sphinx Contrib`_ +repository. It is open for anyone who wants to maintain an extension +publicly; just send a short message asking for write permissions. -If you write an extension that you think others will find useful, please write -to the project mailing list (`join here `_) -and we'll find the proper way of including or hosting it for the public. +There are also several extensions hosted elsewhere. The `Wiki at BitBucket`_ +maintains a list of those. -.. _Wiki at BitBucket: http://www.bitbucket.org/birkenfeld/sphinx/wiki/Home +If you write an extension that you think others will find useful or you think +should be included as a part of Sphinx, please write to the project mailing +list (`join here `_). + +.. _Wiki at BitBucket: https://www.bitbucket.org/birkenfeld/sphinx/wiki/Home +.. _Sphinx Contrib: https://www.bitbucket.org/birkenfeld/sphinx-contrib Where to put your own extensions? diff --git a/doc/faq.rst b/doc/faq.rst index 5869e3af8..334a3a4d4 100644 --- a/doc/faq.rst +++ b/doc/faq.rst @@ -52,7 +52,7 @@ Doxygen SCons Glenn Hutchings has written a SCons build script to build Sphinx - documentation; it is hosted here: http://bitbucket.org/zondo/sphinx-scons + documentation; it is hosted here: https://bitbucket.org/zondo/sphinx-scons PyPI Jannis Leidel wrote a `setuptools command @@ -60,10 +60,14 @@ PyPI Sphinx documentation to the PyPI package documentation area at http://packages.python.org/. -github pages - You can use `Michael Jones' sphinx-to-github tool - `_ to prepare - Sphinx HTML output. +GitHub Pages + Directories starting with underscores are ignored by default which breaks + static files in Sphinx. GitHub's preprocessor can be `disabled + `_ to support + Sphinx HTML output properly. + +MediaWiki + See https://bitbucket.org/kevindunn/sphinx-wiki, a project by Kevin Dunn. Google Analytics You can use a custom ``layout.html`` template, like this: @@ -148,3 +152,109 @@ some notes: .. _Calibre: http://calibre-ebook.com/ .. _FBreader: http://www.fbreader.org/ .. _Bookworm: http://bookworm.oreilly.com/ + + +.. _texinfo-faq: + +Texinfo info +------------ + +The Texinfo builder is currently in an experimental stage but has successfully +been used to build the documentation for both Sphinx and Python. The intended +use of this builder is to generate Texinfo that is then processed into Info +files. + +There are two main programs for reading Info files, ``info`` and GNU Emacs. The +``info`` program has less features but is available in most Unix environments +and can be quickly accessed from the terminal. Emacs provides better font and +color display and supports extensive customization (of course). + + +.. _texinfo-links: + +Displaying Links +~~~~~~~~~~~~~~~~ + +One noticeable problem you may encounter with the generated Info files is how +references are displayed. If you read the source of an Info file, a reference +to this section would look like:: + + * note Displaying Links: target-id + +In the stand-alone reader, ``info``, references are displayed just as they +appear in the source. Emacs, on the other-hand, will by default replace +``\*note:`` with ``see`` and hide the ``target-id``. For example: + + :ref:`texinfo-links` + +The exact behavior of how Emacs displays references is dependent on the variable +``Info-hide-note-references``. If set to the value of ``hide``, Emacs will hide +both the ``\*note:`` part and the ``target-id``. This is generally the best way +to view Sphinx-based documents since they often make frequent use of links and +do not take this limitation into account. However, changing this variable +affects how all Info documents are displayed and most due take this behavior +into account. + +If you want Emacs to display Info files produced by Sphinx using the value +``hide`` for ``Info-hide-note-references`` and the default value for all other +Info files, try adding the following Emacs Lisp code to your start-up file, +``~/.emacs.d/init.el``. + +:: + + (defadvice info-insert-file-contents (after + sphinx-info-insert-file-contents + activate) + "Hack to make `Info-hide-note-references' buffer-local and + automatically set to `hide' iff it can be determined that this file + was created from a Texinfo file generated by Docutils or Sphinx." + (set (make-local-variable 'Info-hide-note-references) + (default-value 'Info-hide-note-references)) + (save-excursion + (save-restriction + (widen) (goto-char (point-min)) + (when (re-search-forward + "^Generated by \\(Sphinx\\|Docutils\\)" + (save-excursion (search-forward "^_" 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. + +- Some characters cannot be properly escaped in menu entries and xrefs. The + following characters are replaced by spaces in these contexts: ``@``, ``{``, + ``}``, ``.``, ``,``, and ``:``. + +- In the HTML and Tex output, the word ``see`` is automatically inserted before + all xrefs. + +- Links to external Info files can be created using the somewhat official URI + scheme ``info``. For example:: + + info:Texinfo#makeinfo_options + + which produces: + + info:Texinfo#makeinfo_options + +- Inline markup appears as follows in Info: + + * strong -- \*strong\* + * emphasis -- _emphasis_ + * literal -- \`literal' + + It is possible to change this behavior using the Texinfo command + ``@definfoenclose``. For example, to make inline markup more closely resemble + reST, add the following to your :file:`conf.py`:: + + texinfo_elements = {'preamble': """\ + @definfoenclose strong,**,** + @definfoenclose emph,*,* + @definfoenclose code,`@w{}`,`@w{}` + """} diff --git a/doc/glossary.rst b/doc/glossary.rst index 2a82e20f2..8bc393eb7 100644 --- a/doc/glossary.rst +++ b/doc/glossary.rst @@ -23,7 +23,9 @@ Glossary A reStructuredText markup element that allows marking a block of content with special meaning. Directives are supplied not only by docutils, but Sphinx and custom extensions can add their own. The basic directive - syntax looks like this:: + syntax looks like this: + + .. sourcecode:: rst .. directivename:: argument ... :option: value diff --git a/doc/intl.rst b/doc/intl.rst new file mode 100644 index 000000000..6a5471c4f --- /dev/null +++ b/doc/intl.rst @@ -0,0 +1,69 @@ +.. _intl: + +Internationalization +==================== + +.. versionadded:: 1.1 + +Complementary to translations provided for Sphinx-generated messages such as +navigation bars, Sphinx provides mechanisms facilitating *document* translations +in itself. See the :ref:`intl-options` for details on configuration. + +.. figure:: translation.png + :width: 100% + + Workflow visualization of translations in Sphinx. (The stick-figure is taken + from an `XKCD comic `_.) + +**gettext** [1]_ is an established standard for internationalization and +localization. It naïvely maps messages in a program to a translated string. +Sphinx uses these facilities to translate whole documents. + +Initially project maintainers have to collect all translatable strings (also +referred to as *messages*) to make them known to translators. Sphinx extracts +these through invocation of ``sphinx-build -b gettext``. + +Every single element in the doctree will end up in a single message which +results in lists being equally split into different chunks while large +paragraphs will remain as coarsely-grained as they were in the original +document. This grants seamless document updates while still providing a little +bit of context for translators in free-text passages. It is the maintainer's +task to split up paragraphs which are too large as there is no sane automated +way to do that. + +After Sphinx successfully ran the +:class:`~sphinx.builders.gettext.MessageCatalogBuilder` you will find a collection +of ``.pot`` files in your output directory. These are **catalog templates** +and contain messages in your original language *only*. + +They can be delivered to translators which will transform them to ``.po`` files +--- so called **message catalogs** --- containing a mapping from the original +messages to foreign-language strings. + +Gettext compiles them into a binary format known as **binary catalogs** through +:program:`msgfmt` for efficiency reasons. If you make these files discoverable +with :confval:`locale_dirs` for your :confval:`language`, Sphinx will pick them +up automatically. + +An example: you have a document ``usage.rst`` in your Sphinx project. The +gettext builder will put its messages into ``usage.pot``. Image you have +Spanish translations [2]_ on your hands in ``usage.po`` --- for your builds to +be translated you need to follow these instructions: + +* Compile your message catalog to a locale directory, say ``translated``, so it + ends up in ``./translated/es/LC_MESSAGES/usage.mo`` in your source directory + (where ``es`` is the language code for Spanish.) :: + + msgfmt "usage.po" -o "translated/es/LC_MESSAGES/usage.mo" + +* Set :confval:`locale_dirs` to ``["translated/"]``. +* Set :confval:`language` to ``es`` (also possible via :option:`-D`). +* Run your desired build. + + +.. rubric:: Footnotes + +.. [1] See the `GNU gettext utilites + `_ + for details on that software suite. +.. [2] Because nobody expects the Spanish Inquisition! diff --git a/doc/intro.rst b/doc/intro.rst index 1a39e266c..0e6e5247a 100644 --- a/doc/intro.rst +++ b/doc/intro.rst @@ -25,7 +25,7 @@ to reStructuredText/Sphinx from other documentation systems. * Gerard Flanagan has written a script to convert pure HTML to reST; it can be found at `BitBucket - `_. + `_. * For converting the old Python docs to Sphinx, a converter was written which can be found at `the Python SVN repository @@ -45,15 +45,19 @@ See the :ref:`pertinent section in the FAQ list `. Prerequisites ------------- -Sphinx needs at least **Python 2.4** to run, as well as the docutils_ and -Jinja2_ libraries. Sphinx should work with docutils version 0.5 or some -(not broken) SVN trunk snapshot. If you like to have source code highlighting -support, you must also install the Pygments_ library. +Sphinx needs at least **Python 2.4** or **Python 3.1** to run, as well as the +docutils_ and Jinja2_ libraries. Sphinx should work with docutils version 0.5 +or some (not broken) SVN trunk snapshot. If you like to have source code +highlighting support, you must also install the Pygments_ library. + +If you use **Python 2.4** you also need uuid_. .. _reStructuredText: http://docutils.sf.net/rst.html .. _docutils: http://docutils.sf.net/ -.. _Jinja2: http://jinja.pocoo.org/2/ +.. _Jinja2: http://jinja.pocoo.org/ .. _Pygments: http://pygments.org/ +.. The given homepage is only a directory listing so I'm using the pypi site. +.. _uuid: http://pypi.python.org/pypi/uuid/ Usage diff --git a/doc/invocation.rst b/doc/invocation.rst index 6b8b9ee35..c8e9a61fc 100644 --- a/doc/invocation.rst +++ b/doc/invocation.rst @@ -40,9 +40,16 @@ The :program:`sphinx-build` script has several options: **man** Build manual pages in groff format for UNIX systems. + **texinfo** + Build Texinfo files that can be processed into Info files using + :program:`makeinfo`. + **text** Build plain text files. + **gettext** + Build gettext-style message catalogs (``.pot`` files). + **doctest** Run all doctests in the documentation, if the :mod:`~sphinx.ext.doctest` extension is enabled. diff --git a/doc/markup/index.rst b/doc/markup/index.rst index 9492456d0..ca70b9581 100644 --- a/doc/markup/index.rst +++ b/doc/markup/index.rst @@ -3,8 +3,8 @@ Sphinx Markup Constructs ======================== -Sphinx adds a lot of new directives and interpreted text roles to standard reST -markup. This section contains the reference material for these facilities. +Sphinx adds a lot of new directives and interpreted text roles to `standard reST +markup`_. This section contains the reference material for these facilities. .. toctree:: @@ -15,3 +15,5 @@ markup. This section contains the reference material for these facilities. misc More markup is added by :ref:`domains`. + +.. _standard reST markup: http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html diff --git a/doc/markup/inline.rst b/doc/markup/inline.rst index bb1ed68ec..69dd832fb 100644 --- a/doc/markup/inline.rst +++ b/doc/markup/inline.rst @@ -44,6 +44,18 @@ more versatile: tool-tip on mouse-hover) will always be the full target name. +Cross-referencing objects +------------------------- + +These roles are described with their respective domains: + +* :ref:`Python ` +* :ref:`C ` +* :ref:`C++ ` +* :ref:`JavaScript ` +* :ref:`ReST ` + + .. _ref-role: Cross-referencing arbitrary locations @@ -141,8 +153,50 @@ Referencing downloadable files suitable link generated to it. +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. The leading hyphen(s) must + be included. This generates a link to a :rst:dir:`option` directive, if it + exists. + + +The following role creates a cross-reference to the term in the glossary: + +.. rst:role:: term + + Reference to a term in the glossary. The 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. + + Other semantic markup ---------------------- +~~~~~~~~~~~~~~~~~~~~~ The following roles don't do anything special except formatting the text in a different style: @@ -260,13 +314,14 @@ in a different style: .. 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:dir:`file`. For + 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. If you don't need the "variable part" indication, use the standard ````code```` instead. +There is also an :rst:role:`index` role to generate index entries. The following roles generate external links: @@ -274,65 +329,25 @@ The following roles generate external links: 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. + 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```. .. 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. + 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```. Note that there are no special roles for including hyperlinks as you can use the standard reST markup for that purpose. -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. The leading hyphen(s) must - be included. This generates a link to a :rst:dir:`option` directive, if it - exists. - - -The following role creates a cross-reference to the term in the glossary: - -.. rst:role:: term - - Reference to a term in the glossary. The 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. - - .. _default-substitutions: Substitutions -------------- +~~~~~~~~~~~~~ The documentation system provides three substitutions that are defined by default. They are set in the build configuration file. diff --git a/doc/markup/misc.rst b/doc/markup/misc.rst index 6173589b3..f5eaac9ce 100644 --- a/doc/markup/misc.rst +++ b/doc/markup/misc.rst @@ -13,10 +13,12 @@ like this:: :fieldname: Field content -A field list at the very top of a file is parsed by docutils as the "docinfo", +A field list near the top of a file is parsed by docutils as the "docinfo" which is normally used to record the author, date of publication and other -metadata. *In Sphinx*, the docinfo is used as metadata, too, but not displayed -in the output. +metadata. *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; a field list appearing after the document title will be part of +the docinfo as normal and will be displayed in the output. At the moment, these metadata fields are recognized: @@ -62,6 +64,105 @@ Meta-information markup :confval:`show_authors` configuration value is True. +Index-generating markup +----------------------- + +Sphinx automatically creates index entries from all object descriptions (like +functions, classes or attributes) like discussed in :ref:`domains`. + +However, there is also explicit markup available, to make the index more +comprehensive and enable index entries in documents where information is not +mainly contained in information units, such as the language reference. + +.. rst:directive:: .. index:: + + This directive contains one or more index entries. Each entry consists of a + type and a value, separated by a colon. + + For example:: + + .. index:: + single: execution; context + module: __main__ + module: sys + triple: module; search; path + + The execution context + --------------------- + + ... + + This directive contains five entries, which will be converted to entries in + the generated index which link to the exact location of the index statement + (or, in case of offline media, the corresponding page number). + + Since index directives generate cross-reference targets at their location in + the source, it makes sense to put them *before* the thing they refer to -- + e.g. a heading, as in the example above. + + The possible entry types are: + + single + Creates a single index entry. Can be made a subentry by separating the + subentry text with a semicolon (this notation is also used below to + describe what entries are created). + pair + ``pair: loop; statement`` is a shortcut that creates two index entries, + namely ``loop; statement`` and ``statement; loop``. + triple + Likewise, ``triple: module; search; path`` is a shortcut that creates + three index entries, which are ``module; search path``, ``search; path, + module`` and ``path; module search``. + see + ``see: entry; other`` creates an index entry that refers from ``entry`` to + ``other``. + seealso + Like ``see``, but inserts "see also" instead of "see". + module, keyword, operator, object, exception, statement, builtin + These all create two index entries. For example, ``module: hashlib`` + creates the entries ``module; hashlib`` and ``hashlib; module``. (These + are Python-specific and therefore deprecated.) + + You can mark up "main" index entries by prefixing them with an exclamation + mark. The references to "main" entries are emphasized in the generated + index. For example, if two pages contain :: + + .. index:: Python + + and one page contains :: + + .. index:: ! Python + + then the backlink to the latter page is emphasized among the three backlinks. + + For index directives containing only "single" entries, there is a shorthand + notation:: + + .. index:: BNF, grammar, syntax, notation + + This creates four index entries. + + .. versionchanged:: 1.1 + Added ``see`` and ``seealso`` types, as well as marking main entries. + +.. rst:role:: index + + While the :rst:dir:`index` directive is a block-level markup and links to the + beginning of the next paragraph, there is also a corresponding role that sets + the link target directly where it is used. + + The content of the role can be a simple phrase, which is then kept in the + text and used as an index entry. It can also be a combination of text and + index entry, styled like with explicit targets of cross-references. In that + case, the "target" part can be a full entry as described for the directive + above. For example:: + + This is a normal reST :index:`paragraph` that contains several + :index:`index entries `. + + .. versionadded:: 1.1 + + .. _tags: Including content based on tags @@ -76,7 +177,7 @@ Including content based on tags Undefined tags are false, defined tags (via the ``-t`` command-line option or within :file:`conf.py`) are true. Boolean expressions, also using - parentheses (like ``html and (latex or draft)`` are supported. + parentheses (like ``html and (latex or draft)``) are supported. The format of the current builder (``html``, ``latex`` or ``text``) is always set as a tag. @@ -124,9 +225,16 @@ following directive exists: .. warning:: - Tables that contain literal blocks cannot be set with ``tabulary``. They are - therefore set with the standard LaTeX ``tabular`` environment. Also, the - verbatim environment used for literal blocks only works in ``p{width}`` - columns, which means that by default, Sphinx generates such column specs for - such tables. Use the :rst:dir:`tabularcolumns` directive to get finer control - over such tables. + Tables that contain list-like elements such as object descriptions, + blockquotes or any kind of lists cannot be set out of the box with + ``tabulary``. They are therefore set with the standard LaTeX ``tabular`` + environment if you don't give a ``tabularcolumns`` directive. If you do, the + table will be set with ``tabulary``, but you must use the ``p{width}`` + construct for the columns that contain these elements. + + Literal blocks do not work with ``tabulary`` at all, so tables containing a + literal block are always set with ``tabular``. Also, the verbatim + environment used for literal blocks only works in ``p{width}`` columns, which + means that by default, Sphinx generates such column specs for such tables. + Use the :rst:dir:`tabularcolumns` directive to get finer control over such + tables. diff --git a/doc/markup/para.rst b/doc/markup/para.rst index be06f6365..ced18d818 100644 --- a/doc/markup/para.rst +++ b/doc/markup/para.rst @@ -42,15 +42,25 @@ units as well as normal text: Example:: .. versionadded:: 2.5 - The `spam` parameter. + 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.). + 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. + -------------- @@ -102,6 +112,10 @@ units as well as normal text: .. centered:: LICENSE AGREEMENT + .. deprecated:: 1.1 + This presentation-only directive is a legacy from older versions. Use a + :rst:dir:`rst-class` directive instead and add an appropriate style. + .. rst:directive:: hlist @@ -134,76 +148,14 @@ For local tables of contents, use the standard reST :dudir:`contents directive `. -Index-generating markup ------------------------ - -Sphinx automatically creates index entries from all object descriptions (like -functions, classes or attributes) like discussed in :ref:`domains`. - -However, there is also an explicit directive available, to make the index more -comprehensive and enable index entries in documents where information is not -mainly contained in information units, such as the language reference. - -.. rst:directive:: .. index:: - - This directive contains one or more index entries. Each entry consists of a - type and a value, separated by a colon. - - For example:: - - .. index:: - single: execution; context - module: __main__ - module: sys - triple: module; search; path - - The execution context - --------------------- - - ... - - This directive contains five entries, which will be converted to entries in - the generated index which link to the exact location of the index statement - (or, in case of offline media, the corresponding page number). - - Since index directives generate cross-reference targets at their location in - the source, it makes sense to put them *before* the thing they refer to -- - e.g. a heading, as in the example above. - - The possible entry types are: - - single - Creates a single index entry. Can be made a subentry by separating the - subentry text with a semicolon (this notation is also used below to - describe what entries are created). - pair - ``pair: loop; statement`` is a shortcut that creates two index entries, - namely ``loop; statement`` and ``statement; loop``. - triple - Likewise, ``triple: module; search; path`` is a shortcut that creates - three index entries, which are ``module; search path``, ``search; path, - module`` and ``path; module search``. - module, keyword, operator, object, exception, statement, builtin - These all create two index entries. For example, ``module: hashlib`` - creates the entries ``module; hashlib`` and ``hashlib; module``. (These - are Python-specific and therefore deprecated.) - - For index directives containing only "single" entries, there is a shorthand - notation:: - - .. index:: BNF, grammar, syntax, notation - - This creates four index entries. - - Glossary -------- .. rst:directive:: .. glossary:: - This directive must contain a reST definition list with terms and - definitions. The definitions will then be referencable with the :rst:role:`term` - role. Example:: + This directive must contain a reST definition-list-like markup with terms and + definitions. The definitions will then be referencable with the + :rst:role:`term` role. Example:: .. glossary:: @@ -217,10 +169,25 @@ Glossary The directory which, including its subdirectories, contains all source files for one Sphinx project. + In contrast to regular definition lists, *multiple* terms per entry are + allowed, and inline markup is allowed in terms. You can link to all of the + terms. For example:: + + .. glossary:: + + term 1 + term 2 + Definition of both terms. + + (When the glossary is sorted, the first term determines the sort order.) + .. versionadded:: 0.6 You can now give the glossary directive a ``:sorted:`` flag that will automatically sort the entries alphabetically. + .. versionchanged:: 1.1 + Now supports multiple terms and inline markup in terms. + Grammar production displays --------------------------- diff --git a/doc/markup/toctree.rst b/doc/markup/toctree.rst index 474427d72..0b6a46c17 100644 --- a/doc/markup/toctree.rst +++ b/doc/markup/toctree.rst @@ -41,6 +41,8 @@ tables of contents. The ``toctree`` directive is the central element. document, the library index. From this information it generates "next chapter", "previous chapter" and "parent chapter" links. + **Entries** + Document titles in the :rst:dir:`toctree` will be automatically read from the title of the referenced document. If that isn't what you want, you can specify an explicit title and target using a similar syntax to reST @@ -59,8 +61,10 @@ tables of contents. The ``toctree`` directive is the central element. You can also add external links, by giving an HTTP URL instead of a document name. + **Section numbering** + If you want to have section numbers even in HTML output, give the toctree a - ``numbered`` flag option. For example:: + ``numbered`` option. For example:: .. toctree:: :numbered: @@ -71,6 +75,11 @@ tables of contents. The ``toctree`` directive is the central element. Numbering then starts at the heading of ``foo``. Sub-toctrees are automatically numbered (don't give the ``numbered`` flag to those). + Numbering up to a specific depth is also possible, by giving the depth as a + numeric argument to ``numbered``. + + **Additional options** + If you want only the titles of documents in the tree to show up, not other headings of the same level, you can use the ``titlesonly`` option:: @@ -133,6 +142,9 @@ tables of contents. The ``toctree`` directive is the central element. .. versionchanged:: 1.0 Added "titlesonly" option. + .. versionchanged:: 1.1 + Added numeric argument to "numbered". + Special names ------------- @@ -151,7 +163,7 @@ The special document names (and pages generated for them) are: :ref:`object descriptions `, and from :rst:dir:`index` directives. - The module index contains one entry per :rst:dir:`module` directive. + 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 diff --git a/doc/rest.rst b/doc/rest.rst index 2b6eee6b4..693075728 100644 --- a/doc/rest.rst +++ b/doc/rest.rst @@ -325,14 +325,15 @@ directives.) Looking at this example, :: .. function:: foo(x) foo(y, z) - :bar: no + :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 ``bar`` -(as you can see, options are given in the lines immediately following the -arguments and indicated by the colons). +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. diff --git a/doc/templating.rst b/doc/templating.rst index 6880663d3..193a90bd9 100644 --- a/doc/templating.rst +++ b/doc/templating.rst @@ -21,10 +21,10 @@ No. You have several other options: configuration value accordingly. * You can :ref:`write a custom builder ` that derives from - :class:`~sphinx.builders.StandaloneHTMLBuilder` and calls your template engine - of choice. + :class:`~sphinx.builders.html.StandaloneHTMLBuilder` and calls your template + engine of choice. -* You can use the :class:`~sphinx.builders.PickleHTMLBuilder` that produces +* You can use the :class:`~sphinx.builders.html.PickleHTMLBuilder` that produces pickle files with the page contents, and postprocess them using a custom tool, or use them in your Web application. @@ -261,9 +261,9 @@ in the future. .. data:: file_suffix - The value of the builder's :attr:`out_suffix` attribute, i.e. the file name - extension that the output files will get. For a standard HTML builder, this - is usually ``.html``. + 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 diff --git a/doc/themes/fullsize/pyramid.png b/doc/themes/fullsize/pyramid.png new file mode 100644 index 000000000..429a8b7e0 Binary files /dev/null and b/doc/themes/fullsize/pyramid.png differ diff --git a/doc/themes/pyramid.png b/doc/themes/pyramid.png new file mode 100644 index 000000000..b16095c99 Binary files /dev/null and b/doc/themes/pyramid.png differ diff --git a/doc/theming.rst b/doc/theming.rst index fc8ef236d..802b211f4 100644 --- a/doc/theming.rst +++ b/doc/theming.rst @@ -69,9 +69,9 @@ Builtin themes | | | | *traditional* | *nature* | +--------------------+--------------------+ -| |haiku| | | +| |haiku| | |pyramid| | | | | -| *haiku* | | +| *haiku* | *pyramid* | +--------------------+--------------------+ .. |default| image:: themes/default.png @@ -81,6 +81,7 @@ Builtin themes .. |traditional| image:: themes/traditional.png .. |nature| image:: themes/nature.png .. |haiku| image:: themes/haiku.png +.. |pyramid| image:: themes/pyramid.png Sphinx comes with a selection of themes to choose from. @@ -88,12 +89,15 @@ These themes are: * **basic** -- This is a basically unstyled layout used as the base for the other themes, and usable as the base for custom themes as well. The HTML - contains all important elements like sidebar and relation bar. There is one - option (which is inherited by the other themes): + contains all important elements like sidebar and relation bar. There are + these options (which are inherited by the other themes): - **nosidebar** (true or false): Don't include the sidebar. Defaults to false. + - **sidebarwidth** (an integer): Width of the sidebar in pixels. (Do not + include ``px`` in the value.) Defaults to 230 pixels. + * **default** -- This is the default theme, which looks like `the Python documentation `_. It can be customized via these options: @@ -119,6 +123,8 @@ These themes are: - **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. @@ -139,11 +145,11 @@ These themes are: - **headfont** (CSS font-family): Font for headings. * **sphinxdoc** -- The theme used for this documentation. It features a sidebar - on the right side. There are currently no options beyond *nosidebar*. + on the right side. There are currently no options beyond *nosidebar* and + *sidebarwidth*. * **scrolls** -- A more lightweight theme, based on `the Jinja documentation - `_. The following color options are - available: + `_. The following color options are available: - **headerbordercolor** - **subheadlinecolor** @@ -174,7 +180,11 @@ These themes are: is ``justify``. * **nature** -- A greenish theme. There are currently no options beyond - *nosidebar*. + *nosidebar* and *sidebarwidth*. + +* **pyramid** -- A theme from the Pyramid web framework project, designed by + Blaise Laflamme. There are currently no options beyond *nosidebar* and + *sidebarwidth*. * **haiku** -- A theme without sidebar inspired by the `Haiku OS user guide `_. The following @@ -188,7 +198,7 @@ These themes are: **hoverlinkcolor** (CSS colors): Colors for various body elements. * **traditional** -- A theme resembling the old Python documentation. There are - currently no options beyond *nosidebar*. + currently no options beyond *nosidebar* and *sidebarwidth*. * **epub** -- A theme for the epub builder. There are currently no options. This theme tries to save visual space which is a sparse resource on ebook @@ -204,7 +214,7 @@ name), containing the following: * A :file:`theme.conf` file, see below. * HTML templates, if needed. * A ``static/`` directory containing any static files that will be copied to the - output statid directory on build. These can be images, styles, script files. + output static directory on build. These can be images, styles, script files. The :file:`theme.conf` file is in INI format [1]_ (readable by the standard Python :mod:`ConfigParser` module) and has the following structure: diff --git a/doc/translation.png b/doc/translation.png new file mode 100644 index 000000000..aa368b67e Binary files /dev/null and b/doc/translation.png differ diff --git a/doc/web/api.rst b/doc/web/api.rst new file mode 100644 index 000000000..070cd3a21 --- /dev/null +++ b/doc/web/api.rst @@ -0,0 +1,65 @@ +.. _websupportapi: + +.. currentmodule:: sphinx.websupport + +The WebSupport Class +==================== + +.. class:: WebSupport + + The main API class for the web support package. All interactions with the + web support package should occur through this class. + + The class takes the following keyword arguments: + + srcdir + The directory containing reStructuredText source files. + + builddir + The directory that build data and static files should be placed in. This + should be used when creating a :class:`WebSupport` object that will be + used to build data. + + datadir + The directory that the web support data is in. This should be used when + creating a :class:`WebSupport` object that will be used to retrieve data. + + search + This may contain either a string (e.g. 'xapian') referencing a built-in + search adapter to use, or an instance of a subclass of + :class:`~.search.BaseSearch`. + + storage + This may contain either a string representing a database uri, or an + instance of a subclass of :class:`~.storage.StorageBackend`. If this is + not provided, a new sqlite database will be created. + + moderation_callback + A callable to be called when a new comment is added that is not + displayed. It must accept one argument: a dictionary representing the + comment that was added. + + staticdir + If static files are served from a location besides ``'/static'``, this + should be a string with the name of that location + (e.g. ``'/static_files'``). + + docroot + If the documentation is not served from the base path of a URL, this + should be a string specifying that path (e.g. ``'docs'``). + + +Methods +~~~~~~~ + +.. automethod:: sphinx.websupport.WebSupport.build + +.. automethod:: sphinx.websupport.WebSupport.get_document + +.. automethod:: sphinx.websupport.WebSupport.get_data + +.. automethod:: sphinx.websupport.WebSupport.add_comment + +.. automethod:: sphinx.websupport.WebSupport.process_vote + +.. automethod:: sphinx.websupport.WebSupport.get_search_results diff --git a/doc/web/quickstart.rst b/doc/web/quickstart.rst new file mode 100644 index 000000000..1bcd217ed --- /dev/null +++ b/doc/web/quickstart.rst @@ -0,0 +1,254 @@ +.. _websupportquickstart: + +Web Support Quick Start +======================= + +Building Documentation Data +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To make use of the web support package in your application you'll need to build +the data it uses. This data includes pickle files representing documents, +search indices, and node data that is used to track where comments and other +things are in a document. To do this you will need to create an instance of the +:class:`~.WebSupport` class and call its :meth:`~.WebSupport.build` method:: + + from sphinx.websupport import WebSupport + + support = WebSupport(srcdir='/path/to/rst/sources/', + builddir='/path/to/build/outdir', + search='xapian') + + support.build() + +This will read reStructuredText sources from `srcdir` and place the necessary +data in `builddir`. The `builddir` will contain two sub-directories: one named +"data" that contains all the data needed to display documents, search through +documents, and add comments to documents. The other directory will be called +"static" and contains static files that should be served from "/static". + +.. note:: + + If you wish to serve static files from a path other than "/static", you can + do so by providing the *staticdir* keyword argument when creating the + :class:`~.WebSupport` object. + + +Integrating Sphinx Documents Into Your Webapp +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now that the data is built, it's time to do something useful with it. Start off +by creating a :class:`~.WebSupport` object for your application:: + + from sphinx.websupport import WebSupport + + support = WebSupport(datadir='/path/to/the/data', + search='xapian') + +You'll only need one of these for each set of documentation you will be working +with. You can then call it's :meth:`~.WebSupport.get_document` method to access +individual documents:: + + contents = support.get_document('contents') + +This will return a dictionary containing the following items: + +* **body**: The main body of the document as HTML +* **sidebar**: The sidebar of the document as HTML +* **relbar**: A div containing links to related documents +* **title**: The title of the document +* **css**: Links to css files used by Sphinx +* **js**: Javascript containing comment options + +This dict can then be used as context for templates. The goal is to be easy to +integrate with your existing templating system. An example using `Jinja2 +`_ is: + +.. sourcecode:: html+jinja + + {%- extends "layout.html" %} + + {%- block title %} + {{ document.title }} + {%- endblock %} + + {% block css %} + {{ super() }} + {{ document.css|safe }} + + {% endblock %} + + {%- block js %} + {{ super() }} + {{ document.js|safe }} + {%- endblock %} + + {%- block relbar %} + {{ document.relbar|safe }} + {%- endblock %} + + {%- block body %} + {{ document.body|safe }} + {%- endblock %} + + {%- block sidebar %} + {{ document.sidebar|safe }} + {%- endblock %} + + +Authentication +-------------- + +To use certain features such as voting, it must be possible to authenticate +users. The details of the authentication are left to your application. Once a +user has been authenticated you can pass the user's details to certain +:class:`~.WebSupport` methods using the *username* and *moderator* keyword +arguments. The web support package will store the username with comments and +votes. The only caveat is that if you allow users to change their username you +must update the websupport package's data:: + + support.update_username(old_username, new_username) + +*username* should be a unique string which identifies a user, and *moderator* +should be a boolean representing whether the user has moderation privilieges. +The default value for *moderator* is *False*. + +An example `Flask `_ function that checks whether a +user is logged in and then retrieves a document is:: + + from sphinx.websupport.errors import * + + @app.route('/') + def doc(docname): + username = g.user.name if g.user else '' + moderator = g.user.moderator if g.user else False + try: + document = support.get_document(docname, username, moderator) + except DocumentNotFoundError: + abort(404) + return render_template('doc.html', document=document) + +The first thing to notice is that the *docname* is just the request path. This +makes accessing the correct document easy from a single view. If the user is +authenticated, then the username and moderation status are passed along with the +docname to :meth:`~.WebSupport.get_document`. The web support package will then +add this data to the ``COMMENT_OPTIONS`` that are used in the template. + +.. note:: + + This only works works if your documentation is served from your + document root. If it is served from another directory, you will + need to prefix the url route with that directory, and give the `docroot` + keyword argument when creating the web support object:: + + support = WebSupport(..., docroot='docs') + + @app.route('/docs/') + + +Performing Searches +~~~~~~~~~~~~~~~~~~~ + +To use the search form built-in to the Sphinx sidebar, create a function to +handle requests to the url 'search' relative to the documentation root. The +user's search query will be in the GET parameters, with the key `q`. Then use +the :meth:`~sphinx.websupport.WebSupport.get_search_results` method to retrieve +search results. In `Flask `_ that would be like this:: + + @app.route('/search') + def search(): + q = request.args.get('q') + document = support.get_search_results(q) + return render_template('doc.html', document=document) + +Note that we used the same template to render our search results as we did to +render our documents. That's because :meth:`~.WebSupport.get_search_results` +returns a context dict in the same format that :meth:`~.WebSupport.get_document` +does. + + +Comments & Proposals +~~~~~~~~~~~~~~~~~~~~ + +Now that this is done it's time to define the functions that handle the AJAX +calls from the script. You will need three functions. The first function is +used to add a new comment, and will call the web support method +:meth:`~.WebSupport.add_comment`:: + + @app.route('/docs/add_comment', methods=['POST']) + def add_comment(): + parent_id = request.form.get('parent', '') + node_id = request.form.get('node', '') + text = request.form.get('text', '') + proposal = request.form.get('proposal', '') + username = g.user.name if g.user is not None else 'Anonymous' + comment = support.add_comment(text, node_id='node_id', + parent_id='parent_id', + username=username, proposal=proposal) + return jsonify(comment=comment) + +You'll notice that both a `parent_id` and `node_id` are sent with the +request. If the comment is being attached directly to a node, `parent_id` +will be empty. If the comment is a child of another comment, then `node_id` +will be empty. Then next function handles the retrieval of comments for a +specific node, and is aptly named +:meth:`~sphinx.websupport.WebSupport.get_data`:: + + @app.route('/docs/get_comments') + def get_comments(): + username = g.user.name if g.user else None + moderator = g.user.moderator if g.user else False + node_id = request.args.get('node', '') + data = support.get_data(node_id, username, moderator) + return jsonify(**data) + +The final function that is needed will call :meth:`~.WebSupport.process_vote`, +and will handle user votes on comments:: + + @app.route('/docs/process_vote', methods=['POST']) + def process_vote(): + if g.user is None: + abort(401) + comment_id = request.form.get('comment_id') + value = request.form.get('value') + if value is None or comment_id is None: + abort(400) + support.process_vote(comment_id, g.user.id, value) + return "success" + + +Comment Moderation +~~~~~~~~~~~~~~~~~~ + +By default, all comments added through :meth:`~.WebSupport.add_comment` are +automatically displayed. If you wish to have some form of moderation, you can +pass the `displayed` keyword argument:: + + comment = support.add_comment(text, node_id='node_id', + parent_id='parent_id', + username=username, proposal=proposal, + displayed=False) + +You can then create a new view to handle the moderation of comments. It +will be called when a moderator decides a comment should be accepted and +displayed:: + + @app.route('/docs/accept_comment', methods=['POST']) + def accept_comment(): + moderator = g.user.moderator if g.user else False + comment_id = request.form.get('id') + support.accept_comment(comment_id, moderator=moderator) + return 'OK' + +Rejecting comments happens via comment deletion. + +To perform a custom action (such as emailing a moderator) when a new comment is +added but not displayed, you can pass callable to the :class:`~.WebSupport` +class when instantiating your support object:: + + def moderation_callback(comment): + """Do something...""" + + support = WebSupport(..., moderation_callback=moderation_callback) + +The moderation callback must take one argument, which will be the same comment +dict that is returned by :meth:`add_comment`. diff --git a/doc/web/searchadapters.rst b/doc/web/searchadapters.rst new file mode 100644 index 000000000..7d8634f71 --- /dev/null +++ b/doc/web/searchadapters.rst @@ -0,0 +1,45 @@ +.. _searchadapters: + +.. currentmodule:: sphinx.websupport.search + +Search Adapters +=============== + +To create a custom search adapter you will need to subclass the +:class:`BaseSearch` class. Then create an instance of the new class and pass +that as the `search` keyword argument when you create the :class:`~.WebSupport` +object:: + + support = WebSupport(srcdir=srcdir, + builddir=builddir, + search=MySearch()) + +For more information about creating a custom search adapter, please see the +documentation of the :class:`BaseSearch` class below. + +.. class:: BaseSearch + + Defines an interface for search adapters. + + +BaseSearch Methods +~~~~~~~~~~~~~~~~~~ + + The following methods are defined in the BaseSearch class. Some methods do + not need to be overridden, but some (:meth:`~BaseSearch.add_document` and + :meth:`~BaseSearch.handle_query`) must be overridden in your subclass. For a + working example, look at the built-in adapter for whoosh. + +.. automethod:: BaseSearch.init_indexing + +.. automethod:: BaseSearch.finish_indexing + +.. automethod:: BaseSearch.feed + +.. automethod:: BaseSearch.add_document + +.. automethod:: BaseSearch.query + +.. automethod:: BaseSearch.handle_query + +.. automethod:: BaseSearch.extract_context diff --git a/doc/web/storagebackends.rst b/doc/web/storagebackends.rst new file mode 100644 index 000000000..d191b43e5 --- /dev/null +++ b/doc/web/storagebackends.rst @@ -0,0 +1,44 @@ +.. _storagebackends: + +.. currentmodule:: sphinx.websupport.storage + +Storage Backends +================ + +To create a custom storage backend you will need to subclass the +:class:`StorageBackend` class. Then create an instance of the new class and +pass that as the `storage` keyword argument when you create the +:class:`~.WebSupport` object:: + + support = WebSupport(srcdir=srcdir, + builddir=builddir, + storage=MyStorage()) + +For more information about creating a custom storage backend, please see the +documentation of the :class:`StorageBackend` class below. + +.. class:: StorageBackend + + Defines an interface for storage backends. + + +StorageBackend Methods +~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: StorageBackend.pre_build + +.. automethod:: StorageBackend.add_node + +.. automethod:: StorageBackend.post_build + +.. automethod:: StorageBackend.add_comment + +.. automethod:: StorageBackend.delete_comment + +.. automethod:: StorageBackend.get_data + +.. automethod:: StorageBackend.process_vote + +.. automethod:: StorageBackend.update_username + +.. automethod:: StorageBackend.accept_comment diff --git a/doc/websupport.rst b/doc/websupport.rst new file mode 100644 index 000000000..3ccae2467 --- /dev/null +++ b/doc/websupport.rst @@ -0,0 +1,16 @@ +.. _websupport: + +Sphinx Web Support +================== + +.. versionadded:: 1.1 + +Sphinx provides a Python API to easily integrate Sphinx documentation into your +web application. To learn more read the :ref:`websupportquickstart`. + +.. toctree:: + + web/quickstart + web/api + web/searchadapters + web/storagebackends diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index d24e845e5..000000000 --- a/ez_setup.py +++ /dev/null @@ -1,276 +0,0 @@ -#!python -"""Bootstrap setuptools installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from ez_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import sys -DEFAULT_VERSION = "0.6c9" -DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] - -md5_data = { - 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', - 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', - 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', - 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', - 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', - 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', - 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', - 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', - 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', - 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', - 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', - 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', - 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', - 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', - 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', - 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', - 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', - 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', - 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', - 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', - 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', - 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', - 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', - 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', - 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', - 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', - 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', - 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', - 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', - 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', - 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', - 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', - 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', - 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', -} - -import sys, os -try: from hashlib import md5 -except ImportError: from md5 import md5 - -def _validate_md5(egg_name, data): - if egg_name in md5_data: - digest = md5(data).hexdigest() - if digest != md5_data[egg_name]: - print >>sys.stderr, ( - "md5 validation of %s failed! (Possible download problem?)" - % egg_name - ) - sys.exit(2) - return data - -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - download_delay=15 -): - """Automatically find/download setuptools and make it available on sys.path - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end with - a '/'). `to_dir` is the directory where setuptools will be downloaded, if - it is not already available. If `download_delay` is specified, it should - be the number of seconds that will be paused before initiating a download, - should one be required. If an older version of setuptools is installed, - this routine will print a message to ``sys.stderr`` and raise SystemExit in - an attempt to abort the calling script. - """ - was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules - def do_download(): - egg = download_setuptools(version, download_base, to_dir, download_delay) - sys.path.insert(0, egg) - import setuptools; setuptools.bootstrap_install_from = egg - try: - import pkg_resources - except ImportError: - return do_download() - try: - pkg_resources.require("setuptools>="+version); return - except pkg_resources.VersionConflict, e: - if was_imported: - print >>sys.stderr, ( - "The required version of setuptools (>=%s) is not available, and\n" - "can't be installed while this script is running. Please install\n" - " a more recent version first, using 'easy_install -U setuptools'." - "\n\n(Currently using %r)" - ) % (version, e.args[0]) - sys.exit(2) - else: - del pkg_resources, sys.modules['pkg_resources'] # reload ok - return do_download() - except pkg_resources.DistributionNotFound: - return do_download() - -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - delay = 15 -): - """Download setuptools from a specified location and return its filename - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download attempt. - """ - import urllib2, shutil - egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) - url = download_base + egg_name - saveto = os.path.join(to_dir, egg_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - from distutils import log - if delay: - log.warn(""" ---------------------------------------------------------------------------- -This script requires setuptools version %s to run (even to display -help). I will attempt to download it for you (from -%s), but -you may need to enable firewall access for this script first. -I will start the download in %d seconds. - -(Note: if this machine does not have network access, please obtain the file - - %s - -and place it in this directory before rerunning this script.) ----------------------------------------------------------------------------""", - version, download_base, delay, url - ); from time import sleep; sleep(delay) - log.warn("Downloading %s", url) - src = urllib2.urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = _validate_md5(egg_name, src.read()) - dst = open(saveto,"wb"); dst.write(data) - finally: - if src: src.close() - if dst: dst.close() - return os.path.realpath(saveto) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - try: - import setuptools - except ImportError: - egg = None - try: - egg = download_setuptools(version, delay=0) - sys.path.insert(0,egg) - from setuptools.command.easy_install import main - return main(list(argv)+[egg]) # we're done here - finally: - if egg and os.path.exists(egg): - os.unlink(egg) - else: - if setuptools.__version__ == '0.0.1': - print >>sys.stderr, ( - "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ) - sys.exit(2) - - req = "setuptools>="+version - import pkg_resources - try: - pkg_resources.require(req) - except pkg_resources.VersionConflict: - try: - from setuptools.command.easy_install import main - except ImportError: - from easy_install import main - main(list(argv)+[download_setuptools(delay=0)]) - sys.exit(0) # try to force an exit - else: - if argv: - from setuptools.command.easy_install import main - main(argv) - else: - print "Setuptools version",version,"or greater has been installed." - print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' - -def update_md5(filenames): - """Update our built-in md5 registry""" - - import re - - for name in filenames: - base = os.path.basename(name) - f = open(name,'rb') - md5_data[base] = md5(f.read()).hexdigest() - f.close() - - data = [" %r: %r,\n" % it for it in md5_data.items()] - data.sort() - repl = "".join(data) - - import inspect - srcfile = inspect.getsourcefile(sys.modules[__name__]) - f = open(srcfile, 'rb'); src = f.read(); f.close() - - match = re.search("\nmd5_data = {\n([^}]+)}", src) - if not match: - print >>sys.stderr, "Internal error!" - sys.exit(2) - - src = src[:match.start(1)] + repl + src[match.end(1):] - f = open(srcfile,'w') - f.write(src) - f.close() - - -if __name__=='__main__': - if len(sys.argv)>2 and sys.argv[1]=='--md5update': - update_md5(sys.argv[2:]) - else: - main(sys.argv[1:]) - - - - - - diff --git a/setup.py b/setup.py index 183fcceb1..c73facaa6 100644 --- a/setup.py +++ b/setup.py @@ -2,8 +2,8 @@ try: from setuptools import setup, find_packages except ImportError: - import ez_setup - ez_setup.use_setuptools() + import distribute_setup + distribute_setup.use_setuptools() from setuptools import setup, find_packages import os @@ -47,7 +47,7 @@ A development egg can be found `here requires = ['Pygments>=0.8', 'Jinja2>=2.2', 'docutils>=0.5'] if sys.version_info < (2, 4): - print 'ERROR: Sphinx requires at least Python 2.4 to run.' + print('ERROR: Sphinx requires at least Python 2.4 to run.') sys.exit(1) if sys.version_info < (2, 5): @@ -63,6 +63,9 @@ if sys.version_info < (2, 5): else: del requires[-1] + # The uuid module is new in the stdlib in 2.5 + requires.append('uuid>=1.30') + # Provide a "compile_catalog" command that also creates the translated # JavaScript files if Babel is available. @@ -190,6 +193,7 @@ setup( 'console_scripts': [ 'sphinx-build = sphinx:main', 'sphinx-quickstart = sphinx.quickstart:main', + 'sphinx-apidoc = sphinx.apidoc:main', 'sphinx-autogen = sphinx.ext.autosummary.generate:main', ], 'distutils.commands': [ @@ -198,4 +202,6 @@ setup( }, install_requires=requires, cmdclass=cmdclass, + use_2to3=True, + use_2to3_fixers=['custom_fixers'], ) diff --git a/sphinx-apidoc.py b/sphinx-apidoc.py new file mode 100755 index 000000000..9cafb497d --- /dev/null +++ b/sphinx-apidoc.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + Sphinx - Python documentation toolchain + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import sys + +if __name__ == '__main__': + from sphinx.apidoc import main + sys.exit(main(sys.argv)) diff --git a/sphinx-autogen.py b/sphinx-autogen.py index 621784196..b1e467e77 100755 --- a/sphinx-autogen.py +++ b/sphinx-autogen.py @@ -4,8 +4,8 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: 2007-2010 by Georg Brandl. - :license: BSD. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. """ import sys diff --git a/sphinx-build.py b/sphinx-build.py index 30f3f6e6b..70822d732 100755 --- a/sphinx-build.py +++ b/sphinx-build.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx-quickstart.py b/sphinx-quickstart.py index 99c0f0b37..5d7c15443 100755 --- a/sphinx-quickstart.py +++ b/sphinx-quickstart.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/__init__.py b/sphinx/__init__.py index 31c61a86a..468b3406a 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -5,14 +5,17 @@ The Sphinx documentation toolchain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# Keep this file executable as-is in Python 3! +# (Otherwise getting the version out of it from setup.py is impossible.) + import sys from os import path -__version__ = '1.1pre' +__version__ = '1.1pre' __released__ = '1.1 (hg)' # used when Sphinx builds its own docs package_dir = path.abspath(path.dirname(__file__)) @@ -34,14 +37,16 @@ if '+' in __version__ or 'pre' in __version__: def main(argv=sys.argv): + """Sphinx build "main" command-line entry.""" if sys.version_info[:3] < (2, 4, 0): - print >>sys.stderr, \ - 'Error: Sphinx requires at least Python 2.4 to run.' + sys.stderr.write('Error: Sphinx requires at least ' + 'Python 2.4 to run.\n') return 1 try: from sphinx import cmdline - except ImportError, err: + except ImportError: + err = sys.exc_info()[1] errstr = str(err) if errstr.lower().startswith('no module named'): whichmod = errstr[16:] @@ -54,14 +59,14 @@ def main(argv=sys.argv): whichmod = 'roman module (which is distributed with Docutils)' hint = ('This can happen if you upgraded docutils using\n' 'easy_install without uninstalling the old version' - 'first.') + 'first.\n') else: whichmod += ' module' - print >>sys.stderr, ('Error: The %s cannot be found. ' - 'Did you install Sphinx and its dependencies ' - 'correctly?' % whichmod) + sys.stderr.write('Error: The %s cannot be found. ' + 'Did you install Sphinx and its dependencies ' + 'correctly?\n' % whichmod) if hint: - print >> sys.stderr, hint + sys.stderr.write(hint) return 1 raise return cmdline.main(argv) diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py index 0a2f0f7f8..94f1d615f 100644 --- a/sphinx/addnodes.py +++ b/sphinx/addnodes.py @@ -5,109 +5,177 @@ Additional docutils nodes. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from docutils import nodes -# index markup -class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass + +class toctree(nodes.General, nodes.Element): + """Node for inserting a "TOC tree".""" + # domain-specific object descriptions (class, function etc.) -# parent node for signature and content -class desc(nodes.Admonition, nodes.Element): pass +class desc(nodes.Admonition, nodes.Element): + """Node for object descriptions. -# additional name parts (module name, class name) -class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass + This node is similar to a "definition list" with one definition. It + contains one or more ``desc_signature`` and a ``desc_content``. + """ + +class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for object signatures. + + The "term" part of the custom Sphinx definition list. + """ + + +# nodes to use within a desc_signature + +class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for additional name parts (module name, class name).""" # compatibility alias desc_classname = desc_addname -# return type (C); object type -class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass -# -> annotation (Python) + +class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for return types or object type names.""" + class desc_returns(desc_type): + """Node for a "returns" annotation (a la -> in Python).""" def astext(self): return ' -> ' + nodes.TextElement.astext(self) -# main name of object -class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass -# argument list -class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass + +class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for the main object name.""" + class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for a general parameter list.""" child_text_separator = ', ' -class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass + +class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for a single parameter.""" + class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for marking optional parts of the parameter list.""" child_text_separator = ', ' def astext(self): return '[' + nodes.TextElement.astext(self) + ']' -# annotation (not Python 3-style annotations) -class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass -# node for content -class desc_content(nodes.General, nodes.Element): pass +class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for signature annotations (not Python 3-style annotations).""" -# \versionadded, \versionchanged, \deprecated -class versionmodified(nodes.Admonition, nodes.TextElement): pass +class desc_content(nodes.General, nodes.Element): + """Node for object description content. -# seealso -class seealso(nodes.Admonition, nodes.Element): pass + This is the "definition" part of the custom Sphinx definition list. + """ -# productionlist -class productionlist(nodes.Admonition, nodes.Element): pass -class production(nodes.Part, nodes.Inline, nodes.TextElement): pass -# toc tree -class toctree(nodes.General, nodes.Element): pass +# new admonition-like constructs -# centered -class centered(nodes.Part, nodes.Element): pass +class versionmodified(nodes.Admonition, nodes.TextElement): + """Node for version change entries. -# pending xref -class pending_xref(nodes.Inline, nodes.Element): pass + Currently used for "versionadded", "versionchanged" and "deprecated" + directives. + """ -# compact paragraph -- never makes a

-class compact_paragraph(nodes.paragraph): pass +class seealso(nodes.Admonition, nodes.Element): + """Custom "see also" admonition.""" -# reference to a file to download -class download_reference(nodes.reference): pass +class productionlist(nodes.Admonition, nodes.Element): + """Node for grammar production lists. -# for the ACKS list -class acks(nodes.Element): pass + Contains ``production`` nodes. + """ -# for horizontal lists -class hlist(nodes.Element): pass -class hlistcol(nodes.Element): pass +class production(nodes.Part, nodes.Inline, nodes.TextElement): + """Node for a single grammar production rule.""" -# sets the highlighting language for literal blocks -class highlightlang(nodes.Element): pass -# like emphasis, but doesn't apply further text processors, e.g. smartypants -class literal_emphasis(nodes.emphasis): pass +# other directive-level nodes -# for abbreviations (with explanations) -class abbreviation(nodes.Inline, nodes.TextElement): pass +class index(nodes.Invisible, nodes.Inline, nodes.TextElement): + """Node for index entries. -# glossary -class glossary(nodes.Element): pass + This node is created by the ``index`` directive and has one attribute, + ``entries``. Its value is a list of 4-tuples of ``(entrytype, entryname, + target, ignored)``. -# start of a file, used in the LaTeX builder only -class start_of_file(nodes.Element): pass + *entrytype* is one of "single", "pair", "double", "triple". + """ -# tabular column specification, used for the LaTeX writer -class tabular_col_spec(nodes.Element): pass +class centered(nodes.Part, nodes.Element): + """Deprecated.""" -# only (in/exclusion based on tags) -class only(nodes.Element): pass +class acks(nodes.Element): + """Special node for "acks" lists.""" -# meta directive -- same as docutils' standard meta node, but pickleable -class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass +class hlist(nodes.Element): + """Node for "horizontal lists", i.e. lists that should be compressed to + take up less vertical space. + """ -# make them known to docutils. this is needed, because the HTML writer -# will choke at some point if these are not added -nodes._add_node_class_names("""index desc desc_content desc_signature - desc_type desc_returns desc_addname desc_name desc_parameterlist - desc_parameter desc_optional download_reference hlist hlistcol - centered versionmodified seealso productionlist production toctree - pending_xref compact_paragraph highlightlang literal_emphasis - abbreviation glossary acks module start_of_file tabular_col_spec - meta""".split()) +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

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.""" + +class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): + """Node for meta directive -- same as docutils' standard meta node, + but pickleable. + """ + + +# 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. + """ + +class download_reference(nodes.reference): + """Node for download references, similar to pending_xref.""" + +class literal_emphasis(nodes.emphasis): + """Node that behaves like `emphasis`, but further text processors are not + applied (e.g. smartypants for HTML output). + """ + +class abbreviation(nodes.Inline, nodes.TextElement): + """Node for abbreviations with explanations.""" + +class termsep(nodes.Structural, nodes.Element): + """Separates two terms within a node.""" + + +# make the new nodes known to docutils; needed because the HTML writer will +# choke at some point if these are not added +nodes._add_node_class_names(k for k in globals().keys() + if k != 'nodes' and k[0] != '_') diff --git a/sphinx/apidoc.py b/sphinx/apidoc.py new file mode 100644 index 000000000..86ed04d06 --- /dev/null +++ b/sphinx/apidoc.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +""" + sphinx.apidoc + ~~~~~~~~~~~~~ + + Parses a directory tree looking for Python modules and packages and creates + ReST files appropriately to create code documentation with Sphinx. It also + creates a modules index (named modules.). + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import os +import sys +import optparse +from os import path + +# automodule options +OPTIONS = [ + 'members', + 'undoc-members', + # 'inherited-members', # disabled because there's a bug in sphinx + 'show-inheritance', +] + +INITPY = '__init__.py' + +def makename(package, module): + """Join package and module with a dot.""" + # Both package and module can be None/empty. + if package: + name = package + if module: + name += '.' + module + else: + name = module + return name + +def write_file(name, text, opts): + """Write the output file for module/package .""" + fname = path.join(opts.destdir, "%s.%s" % (name, opts.suffix)) + if opts.dryrun: + print 'Would create file %s.' % fname + return + if not opts.force and path.isfile(fname): + print 'File %s already exists, skipping.' % fname + else: + print 'Creating file %s.' % fname + f = open(fname, 'w') + try: + f.write(text) + finally: + f.close() + +def format_heading(level, text): + """Create a heading of [1, 2 or 3 supported].""" + underlining = ['=', '-', '~', ][level-1] * len(text) + return '%s\n%s\n\n' % (text, underlining) + +def format_directive(module, package=None): + """Create the automodule directive and add the options.""" + directive = '.. automodule:: %s\n' % makename(package, module) + for option in OPTIONS: + directive += ' :%s:\n' % option + return directive + +def create_module_file(package, module, opts): + """Build the text of the file and write the file.""" + text = format_heading(1, '%s Module' % module) + #text += format_heading(2, ':mod:`%s` Module' % module) + text += format_directive(module, package) + write_file(makename(package, module), text, opts) + +def create_package_file(root, master_package, subroot, py_files, opts, subs): + """Build the text of the file and write the file.""" + package = path.split(root)[-1] + text = format_heading(1, '%s Package' % package) + # add each module in the package + for py_file in py_files: + if shall_skip(path.join(root, py_file)): + continue + is_package = py_file == INITPY + py_file = path.splitext(py_file)[0] + py_path = makename(subroot, py_file) + if is_package: + heading = ':mod:`%s` Package' % package + else: + heading = ':mod:`%s` Module' % py_file + text += format_heading(2, heading) + text += format_directive(is_package and subroot or py_path, + master_package) + text += '\n' + + # build a list of directories that are packages (contain an INITPY file) + subs = [sub for sub in subs if path.isfile(path.join(root, sub, INITPY))] + # if there are some package directories, add a TOC for theses subpackages + if subs: + text += format_heading(2, 'Subpackages') + text += '.. toctree::\n\n' + for sub in subs: + text += ' %s.%s\n' % (makename(master_package, subroot), sub) + text += '\n' + + write_file(makename(master_package, subroot), text, opts) + +def create_modules_toc_file(master_package, modules, opts, name='modules'): + """ + Create the module's index. + """ + text = format_heading(1, '%s Modules' % opts.header) + text += '.. toctree::\n' + text += ' :maxdepth: %s\n\n' % opts.maxdepth + + modules.sort() + prev_module = '' + for module in modules: + # look if the module is a subpackage and, if yes, ignore it + if module.startswith(prev_module + '.'): + continue + prev_module = module + text += ' %s\n' % module + + write_file(name, text, opts) + +def shall_skip(module): + """ + Check if we want to skip this module. + """ + # skip it, if there is nothing (or just \n or \r\n) in the file + return path.getsize(module) < 3 + +def recurse_tree(rootpath, excludes, opts): + """ + Look for every file in the directory tree and create the corresponding + ReST files. + """ + # check if the base directory is a package and get is name + if INITPY in os.listdir(rootpath): + package_name = path.abspath(rootpath).split(path.sep)[-1] + else: + package_name = None + + toc = [] + tree = os.walk(rootpath, False) + for root, subs, files in tree: + # keep only the Python script files + py_files = sorted([f for f in files if path.splitext(f)[1] == '.py']) + if INITPY in py_files: + py_files.remove(INITPY) + py_files.insert(0, INITPY) + # remove hidden ('.') and private ('_') directories + subs = sorted([sub for sub in subs if sub[0] not in ['.', '_']]) + # check if there are valid files to process + # TODO: could add check for windows hidden files + if "/." in root or "/_" in root \ + or not py_files \ + or is_excluded(root, excludes): + continue + if INITPY in py_files: + # we are in package ... + if (# ... with subpackage(s) + subs + or + # ... with some module(s) + len(py_files) > 1 + or + # ... with a not-to-be-skipped INITPY file + not shall_skip(path.join(root, INITPY)) + ): + subroot = root[len(rootpath):].lstrip(path.sep).\ + replace(path.sep, '.') + create_package_file(root, package_name, subroot, + py_files, opts, subs) + toc.append(makename(package_name, subroot)) + elif root == rootpath: + # if we are at the root level, we don't require it to be a package + for py_file in py_files: + if not shall_skip(path.join(rootpath, py_file)): + module = path.splitext(py_file)[0] + create_module_file(package_name, module, opts) + toc.append(makename(package_name, module)) + + # create the module's index + if not opts.notoc: + create_modules_toc_file(package_name, toc, opts) + +def normalize_excludes(rootpath, excludes): + """ + Normalize the excluded directory list: + * must be either an absolute path or start with rootpath, + * otherwise it is joined with rootpath + * with trailing slash + """ + sep = path.sep + f_excludes = [] + for exclude in excludes: + if not path.isabs(exclude) and not exclude.startswith(rootpath): + exclude = path.join(rootpath, exclude) + if not exclude.endswith(sep): + exclude += sep + f_excludes.append(exclude) + return f_excludes + +def is_excluded(root, excludes): + """ + Check if the directory is in the exclude list. + + Note: by having trailing slashes, we avoid common prefix issues, like + e.g. an exlude "foo" also accidentally excluding "foobar". + """ + sep = path.sep + if not root.endswith(sep): + root += sep + for exclude in excludes: + if root.startswith(exclude): + return True + return False + +def main(argv=sys.argv): + """ + Parse and check the command line arguments. + """ + parser = optparse.OptionParser( + usage="""\ +usage: %prog [options] -o [exclude_paths, ...] + +Look recursively in for Python modules and packages and create +a reST file with automodule directives per package in the . + +Note: By default this script will not overwrite already created files.""") + + parser.add_option('-o', '--output-dir', action='store', dest='destdir', + help='Directory to place all output', default='') + parser.add_option('-d', '--maxdepth', action='store', dest='maxdepth', + help='Maximum depth of submodules to show in the TOC ' + '(default: 4)', type='int', default=4) + parser.add_option('-f', '--force', action='store_true', dest='force', + help='Overwrite all the files') + parser.add_option('-n', '--dry-run', action='store_true', dest='dryrun', + help='Run the script without creating the files') + parser.add_option('-T', '--no-toc', action='store_true', dest='notoc', + help='Don\'t create the table of contents file') + parser.add_option('-H', '--doc-header', action='store', dest='header', + help='Documentation Header (default: Project)', + default='Project') + parser.add_option('-s', '--suffix', action='store', dest='suffix', + help='file suffix (default: rst)', default='rst') + + (opts, args) = parser.parse_args(argv[1:]) + + if not args: + parser.error('A package path is required.') + if not opts.destdir: + parser.error('An output directory is required.') + rootpath, excludes = args[0], args[1:] + if not path.isdir(rootpath): + print >>sys.stderr, '%s is not a directory.' % rootpath + sys.exit(1) + if not path.isdir(opts.destdir): + print '%s is not a valid output directory.' % opts.destdir + sys.exit(1) + excludes = normalize_excludes(rootpath, excludes) + recurse_tree(rootpath, excludes, opts) diff --git a/sphinx/application.py b/sphinx/application.py index 97778d3fb..840fc46b9 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -7,7 +7,7 @@ Gracefully adapted from the TextPress system by Armin. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -37,12 +37,10 @@ from sphinx.util.osutil import ENOENT from sphinx.util.console import bold -# Directive is either new-style or old-style -clstypes = (type, types.ClassType) - # List of all known core events. Maps name to arguments description. events = { 'builder-inited': '', + 'env-get-outdated': 'env, added, changed, removed', 'env-purge-doc': 'env, docname', 'source-read': 'docname, source text', 'doctree-read': 'the doctree before being pickled', @@ -136,9 +134,8 @@ class Sphinx(object): self._init_builder(buildername) def _init_i18n(self): - """ - Load translated strings from the configured localedirs if - enabled in the configuration. + """Load translated strings from the configured localedirs if enabled in + the configuration. """ if self.config.language is not None: self.info(bold('loading translations [%s]... ' % @@ -213,6 +210,12 @@ class Sphinx(object): self.builder.cleanup() def warn(self, message, location=None, prefix='WARNING: '): + if isinstance(location, tuple): + docname, lineno = location + if docname: + location = '%s:%s' % (self.env.doc2path(docname), lineno or '') + else: + location = None warntext = location and '%s: %s%s\n' % (location, prefix, message) or \ '%s%s\n' % (prefix, message) if self.warningiserror: @@ -362,6 +365,9 @@ class Sphinx(object): elif key == 'man': from sphinx.writers.manpage import ManualPageTranslator \ as translator + elif key == 'texinfo': + from sphinx.writers.texinfo import TexinfoTranslator \ + as translator else: # ignore invalid keys for compatibility continue @@ -426,13 +432,15 @@ class Sphinx(object): setattr(self.domains[domain], 'get_%s_index' % name, func) def add_object_type(self, directivename, rolename, indextemplate='', - parse_node=None, ref_nodeclass=None, objname=''): + parse_node=None, ref_nodeclass=None, objname='', + doc_field_types=[]): StandardDomain.object_types[directivename] = \ ObjType(objname or directivename, rolename) # create a subclass of GenericObject as the new directive new_directive = type(directivename, (GenericObject, object), {'indextemplate': indextemplate, - 'parse_node': staticmethod(parse_node)}) + 'parse_node': staticmethod(parse_node), + 'doc_field_types': doc_field_types}) StandardDomain.directives[directivename] = new_directive # XXX support more options? StandardDomain.roles[rolename] = XRefRole(innernodeclass=ref_nodeclass) @@ -456,8 +464,11 @@ class Sphinx(object): def add_javascript(self, filename): from sphinx.builders.html import StandaloneHTMLBuilder - StandaloneHTMLBuilder.script_files.append( - posixpath.join('_static', filename)) + if '://' in filename: + StandaloneHTMLBuilder.script_files.append(filename) + else: + StandaloneHTMLBuilder.script_files.append( + posixpath.join('_static', filename)) def add_stylesheet(self, filename): from sphinx.builders.html import StandaloneHTMLBuilder @@ -479,6 +490,11 @@ class Sphinx(object): from sphinx.ext import autodoc autodoc.AutoDirective._special_attrgetters[type] = getter + def add_search_language(self, cls): + from sphinx.search import languages, SearchLanguage + assert isinstance(cls, SearchLanguage) + languages[cls.lang] = cls + class TemplateBridge(object): """ @@ -487,8 +503,7 @@ class TemplateBridge(object): """ def init(self, builder, theme=None, dirs=None): - """ - Called by the builder to initialize the template system. + """Called by the builder to initialize the template system. *builder* is the builder object; you'll probably want to look at the value of ``builder.config.templates_path``. @@ -499,23 +514,20 @@ class TemplateBridge(object): raise NotImplementedError('must be implemented in subclasses') def newest_template_mtime(self): - """ - Called by the builder to determine if output files are outdated + """Called by the builder to determine if output files are outdated because of template changes. Return the mtime of the newest template file that was changed. The default implementation returns ``0``. """ return 0 def render(self, template, context): - """ - Called by the builder to render a template given as a filename with a - specified context (a Python dictionary). + """Called by the builder to render a template given as a filename with + a specified context (a Python dictionary). """ raise NotImplementedError('must be implemented in subclasses') def render_string(self, template, context): - """ - Called by the builder to render a template given as a string with a + """Called by the builder to render a template given as a string with a specified context (a Python dictionary). """ raise NotImplementedError('must be implemented in subclasses') diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index e345d570f..5240a1c73 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -5,7 +5,7 @@ Builder superclass for all builders. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,9 +31,12 @@ class Builder(object): name = '' # builder's output format, or '' if no document output is produced format = '' + # doctree versioning method + versioning_method = 'none' def __init__(self, app): self.env = app.env + self.env.set_versioning_method(self.versioning_method) self.srcdir = app.srcdir self.confdir = app.confdir self.outdir = app.outdir @@ -55,16 +58,13 @@ class Builder(object): # helper methods def init(self): - """ - Load necessary templates and perform initialization. The default + """Load necessary templates and perform initialization. The default implementation does nothing. """ pass def create_template_bridge(self): - """ - Return the template bridge configured. - """ + """Return the template bridge configured.""" if self.config.template_bridge: self.templates = self.app.import_object( self.config.template_bridge, 'template_bridge setting')() @@ -73,23 +73,23 @@ class Builder(object): self.templates = BuiltinTemplateLoader() def get_target_uri(self, docname, typ=None): - """ - Return the target URI for a document name (*typ* can be used to qualify - the link characteristic for individual builders). + """Return the target URI for a document name. + + *typ* can be used to qualify the link characteristic for individual + builders. """ raise NotImplementedError def get_relative_uri(self, from_, to, typ=None): - """ - Return a relative URI between two source filenames. May raise - environment.NoUri if there's no way to return a sensible URI. + """Return a relative URI between two source filenames. + + May raise environment.NoUri if there's no way to return a sensible URI. """ return relative_uri(self.get_target_uri(from_), self.get_target_uri(to, typ)) def get_outdated_docs(self): - """ - Return an iterable of output files that are outdated, or a string + """Return an iterable of output files that are outdated, or a string describing what an update build will build. If the builder does not output individual files corresponding to @@ -129,9 +129,7 @@ class Builder(object): supported_image_types = [] def post_process_images(self, doctree): - """ - Pick the best candidate for all image URIs. - """ + """Pick the best candidate for all image URIs.""" for node in doctree.traverse(nodes.image): if '?' in node['candidates']: # don't rewrite nonlocal image URIs @@ -198,9 +196,9 @@ class Builder(object): 'out of date' % len(to_build)) def build(self, docnames, summary=None, method='update'): - """ - Main build method. First updates the environment, and then - calls :meth:`write`. + """Main build method. + + First updates the environment, and then calls :meth:`write`. """ if summary: self.info(bold('building [%s]: ' % self.name), nonl=1) @@ -277,7 +275,8 @@ class Builder(object): # add all toctree-containing files that may have changed for docname in list(docnames): for tocdocname in self.env.files_to_rebuild.get(docname, []): - docnames.add(tocdocname) + if tocdocname in self.env.found_docs: + docnames.add(tocdocname) docnames.add(self.config.master_doc) self.info(bold('preparing documents... '), nonl=True) @@ -302,15 +301,18 @@ class Builder(object): raise NotImplementedError def finish(self): - """ - Finish the building process. The default implementation does nothing. + """Finish the building process. + + The default implementation does nothing. """ pass def cleanup(self): + """Cleanup any resources. + + The default implementation does nothing. """ - Cleanup any resources. The default implementation does nothing. - """ + pass BUILTIN_BUILDERS = { @@ -327,6 +329,9 @@ BUILTIN_BUILDERS = { 'latex': ('latex', 'LaTeXBuilder'), 'text': ('text', 'TextBuilder'), 'man': ('manpage', 'ManualPageBuilder'), + 'texinfo': ('texinfo', 'TexinfoBuilder'), 'changes': ('changes', 'ChangesBuilder'), 'linkcheck': ('linkcheck', 'CheckExternalLinksBuilder'), + 'websupport': ('websupport', 'WebSupportBuilder'), + 'gettext': ('gettext', 'MessageCatalogBuilder'), } diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py index 980ed7606..3e351e6cb 100644 --- a/sphinx/builders/changes.py +++ b/sphinx/builders/changes.py @@ -5,7 +5,7 @@ Changelog builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -30,7 +30,8 @@ class ChangesBuilder(Builder): def init(self): self.create_template_bridge() - Theme.init_themes(self) + Theme.init_themes(self.confdir, self.config.html_theme_path, + warn=self.warn) self.theme = Theme('default') self.templates.init(self, self.theme) diff --git a/sphinx/builders/devhelp.py b/sphinx/builders/devhelp.py index a5a0f280a..a1b419453 100644 --- a/sphinx/builders/devhelp.py +++ b/sphinx/builders/devhelp.py @@ -7,7 +7,7 @@ .. _Devhelp: http://live.gnome.org/devhelp - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -42,7 +42,6 @@ except ImportError: class DevhelpBuilder(StandaloneHTMLBuilder): """ Builder that also outputs GNOME Devhelp file. - """ name = 'devhelp' diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py index fbe88c3b2..3ee4de5f1 100644 --- a/sphinx/builders/epub.py +++ b/sphinx/builders/epub.py @@ -6,14 +6,15 @@ Build epub files. Originally derived from qthelp.py. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os import re -import codecs +import sys import time +import codecs import zipfile from os import path @@ -147,7 +148,8 @@ _refuri_re = re.compile("([^#:]*#)(.*)") # The epub publisher class EpubBuilder(StandaloneHTMLBuilder): - """Builder that outputs epub files. + """ + Builder that outputs epub files. It creates the metainfo files container.opf, toc.ncx, mimetype, and META-INF/container.xml. Afterwards, all necessary files are zipped to an @@ -186,7 +188,7 @@ class EpubBuilder(StandaloneHTMLBuilder): name = name.replace('<', '<') name = name.replace('>', '>') name = name.replace('"', '"') - name = name.replace('\'', ''') + name = name.replace('\'', ''') return name def get_refnodes(self, doctree, result): @@ -244,12 +246,12 @@ class EpubBuilder(StandaloneHTMLBuilder): }) def fix_fragment(self, prefix, fragment): - """Return a href/id attribute with colons replaced by hyphens. - """ + """Return a href/id attribute with colons replaced by hyphens.""" return prefix + fragment.replace(':', '-') def fix_ids(self, tree): """Replace colons with hyphens in href and id attributes. + Some readers crash because they interpret the part as a transport protocol specification. """ @@ -268,8 +270,7 @@ class EpubBuilder(StandaloneHTMLBuilder): node.attributes['ids'] = newids def add_visible_links(self, tree): - """Append visible link targets after external links. - """ + """Append visible link targets after external links.""" for node in tree.traverse(nodes.reference): uri = node.get('refuri', '') if (uri.startswith('http:') or uri.startswith('https:') or @@ -283,6 +284,7 @@ class EpubBuilder(StandaloneHTMLBuilder): def write_doc(self, docname, doctree): """Write one document file. + This method is overwritten in order to fix fragment identifiers and to add visible external links. """ @@ -291,22 +293,22 @@ class EpubBuilder(StandaloneHTMLBuilder): return StandaloneHTMLBuilder.write_doc(self, docname, doctree) def fix_genindex(self, tree): - """Fix href attributes for genindex pages. - """ + """Fix href attributes for genindex pages.""" # XXX: modifies tree inline # Logic modeled from themes/basic/genindex.html for key, columns in tree: for entryname, (links, subitems) in columns: - for (i, link) in enumerate(links): + for (i, (ismain, link)) in enumerate(links): m = _refuri_re.match(link) if m: - links[i] = self.fix_fragment(m.group(1), m.group(2)) + links[i] = (ismain, + self.fix_fragment(m.group(1), m.group(2))) for subentryname, subentrylinks in subitems: - for (i, link) in enumerate(subentrylinks): + for (i, (ismain, link)) in enumerate(subentrylinks): m = _refuri_re.match(link) if m: - subentrylinks[i] = \ - self.fix_fragment(m.group(1), m.group(2)) + subentrylinks[i] = (ismain, + self.fix_fragment(m.group(1), m.group(2))) def copy_image_files_pil(self): """Copy images using the PIL. @@ -362,8 +364,9 @@ class EpubBuilder(StandaloneHTMLBuilder): def handle_page(self, pagename, addctx, templatename='page.html', outfilename=None, event_arg=None): """Create a rendered page. - This method is overwritten for genindex pages in order to fix - href link attributes. + + This method is overwritten for genindex pages in order to fix href link + attributes. """ if pagename.startswith('genindex'): self.fix_genindex(addctx['genindexentries']) @@ -465,6 +468,14 @@ class EpubBuilder(StandaloneHTMLBuilder): spine.append(_spine_template % { 'idref': self.esc(self.make_id(item['refuri'])) }) + for info in self.domain_indices: + spine.append(_spine_template % { + 'idref': self.esc(self.make_id(info[0] + self.out_suffix)) + }) + if self.config.html_use_index: + spine.append(_spine_template % { + 'idref': self.esc(self.make_id('genindex' + self.out_suffix)) + }) # add the optional cover content_tmpl = _content_template @@ -513,6 +524,7 @@ class EpubBuilder(StandaloneHTMLBuilder): def insert_subnav(self, node, subnav): """Insert nested navpoints for given node. + The node and subnav are already rendered to text. """ nlist = node.rsplit('\n', 1) @@ -522,8 +534,8 @@ class EpubBuilder(StandaloneHTMLBuilder): def build_navpoints(self, nodes): """Create the toc navigation structure. - Subelements of a node are nested inside the navpoint. - For nested nodes the parent node is reinserted in the subnav. + Subelements of a node are nested inside the navpoint. For nested nodes + the parent node is reinserted in the subnav. """ navstack = [] navlist = [] @@ -563,8 +575,8 @@ class EpubBuilder(StandaloneHTMLBuilder): return '\n'.join(navlist) def toc_metadata(self, level, navpoints): - """Create a dictionary with all metadata for the toc.ncx - file properly escaped. + """Create a dictionary with all metadata for the toc.ncx file + properly escaped. """ metadata = {} metadata['uid'] = self.config.epub_uid @@ -589,8 +601,8 @@ class EpubBuilder(StandaloneHTMLBuilder): def build_epub(self, outdir, outname): """Write the epub file. - It is a zip file with the mimetype file stored uncompressed - as the first entry. + It is a zip file with the mimetype file stored uncompressed as the first + entry. """ self.info('writing %s file...' % outname) projectfiles = ['META-INF/container.xml', 'content.opf', 'toc.ncx'] \ @@ -600,7 +612,8 @@ class EpubBuilder(StandaloneHTMLBuilder): epub.write(path.join(outdir, 'mimetype'), 'mimetype', \ zipfile.ZIP_STORED) for file in projectfiles: - if isinstance(file, unicode): - file = file.encode('utf-8') - epub.write(path.join(outdir, file), file, zipfile.ZIP_DEFLATED) + fp = path.join(outdir, file) + if isinstance(fp, unicode): + fp = fp.encode(sys.getfilesystemencoding()) + epub.write(fp, file, zipfile.ZIP_DEFLATED) epub.close() diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py new file mode 100644 index 000000000..1ff92360f --- /dev/null +++ b/sphinx/builders/gettext.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +""" + sphinx.builders.gettext + ~~~~~~~~~~~~~~~~~~~~~~~ + + The MessageCatalogBuilder class. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from os import path +from codecs import open +from datetime import datetime +from collections import defaultdict + +from docutils import nodes + +from sphinx.builders import Builder +from sphinx.util.nodes import extract_messages +from sphinx.util.osutil import SEP, copyfile +from sphinx.util.console import darkgreen + +POHEADER = ur""" +# SOME DESCRIPTIVE TITLE. +# Copyright (C) %(copyright)s +# This file is distributed under the same license as the %(project)s package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: %(version)s\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: %(ctime)s\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +"""[1:] + + +class I18nBuilder(Builder): + """ + General i18n builder. + """ + name = 'i18n' + versioning_method = 'text' + + def init(self): + Builder.init(self) + self.catalogs = defaultdict(dict) + + def get_target_uri(self, docname, typ=None): + return '' + + def get_outdated_docs(self): + return self.env.found_docs + + def prepare_writing(self, docnames): + return + + def write_doc(self, docname, doctree): + catalog = self.catalogs[docname.split(SEP, 1)[0]] + + for node, msg in extract_messages(doctree): + catalog.setdefault(node.uid, msg) + + +class MessageCatalogBuilder(I18nBuilder): + """ + Builds gettext-style message catalogs (.pot files). + """ + name = 'gettext' + + def finish(self): + I18nBuilder.finish(self) + data = dict( + version = self.config.version, + copyright = self.config.copyright, + project = self.config.project, + # XXX should supply tz + ctime = datetime.now().strftime('%Y-%m-%d %H:%M%z'), + ) + for section, messages in self.status_iterator( + self.catalogs.iteritems(), "writing message catalogs... ", + lambda (section, _):darkgreen(section), len(self.catalogs)): + + pofn = path.join(self.outdir, section + '.pot') + pofile = open(pofn, 'w', encoding='utf-8') + try: + pofile.write(POHEADER % data) + for uid, message in messages.iteritems(): + # message contains *one* line of text ready for translation + message = message.replace(u'\\', ur'\\'). \ + replace(u'"', ur'\"') + pomsg = u'#%s\nmsgid "%s"\nmsgstr ""\n\n' % (uid, message) + pofile.write(pomsg) + finally: + pofile.close() diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index bbfe67e22..b6f9d1338 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -5,7 +5,7 @@ Several HTML builders. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -35,7 +35,7 @@ from sphinx.util.osutil import SEP, os_path, relative_uri, ensuredir, \ movefile, ustrftime, copyfile from sphinx.util.nodes import inline_all_toctrees from sphinx.util.matching import patmatch, compile_matchers -from sphinx.util.pycompat import any +from sphinx.util.pycompat import any, b from sphinx.errors import SphinxError from sphinx.locale import _ from sphinx.search import js_index @@ -63,6 +63,7 @@ class StandaloneHTMLBuilder(Builder): out_suffix = '.html' link_suffix = '.html' # defaults to matching out_suffix indexer_format = js_index + indexer_dumps_unicode = True supported_image_types = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] searchindex_filename = 'searchindex.js' @@ -87,6 +88,8 @@ class StandaloneHTMLBuilder(Builder): self.tags_hash = '' # section numbers for headings in the currently visited document self.secnumbers = {} + # currently written docname + self.current_docname = None self.init_templates() self.init_highlighter() @@ -100,21 +103,28 @@ class StandaloneHTMLBuilder(Builder): self.link_suffix = self.out_suffix if self.config.language is not None: - jsfile_list = [path.join(package_dir, 'locale', - self.config.language, 'LC_MESSAGES', 'sphinx.js'), - path.join(sys.prefix, 'share/sphinx/locale', - self.config.language, 'sphinx.js')] + if self._get_translations_js(): + self.script_files.append('_static/translations.js') - for jsfile in jsfile_list: - if path.isfile(jsfile): - self.script_files.append('_static/translations.js') - break + def _get_translations_js(self): + candidates = [path.join(package_dir, 'locale', self.config.language, + 'LC_MESSAGES', 'sphinx.js'), + path.join(sys.prefix, 'share/sphinx/locale', + self.config.language, 'sphinx.js')] + \ + [path.join(dir, self.config.language, + 'LC_MESSAGES', 'sphinx.js') + for dir in self.config.locale_dirs] + for jsfile in candidates: + if path.isfile(jsfile): + return jsfile + return None def get_theme_config(self): return self.config.html_theme, self.config.html_theme_options def init_templates(self): - Theme.init_themes(self) + Theme.init_themes(self.confdir, self.config.html_theme_path, + warn=self.warn) themename, themeoptions = self.get_theme_config() self.theme = Theme(themename) self.theme_options = themeoptions.copy() @@ -146,8 +156,9 @@ class StandaloneHTMLBuilder(Builder): cfgdict = dict((name, self.config[name]) for (name, desc) in self.config.values.iteritems() if desc[1] == 'html') - self.config_hash = md5(str(cfgdict)).hexdigest() - self.tags_hash = md5(str(sorted(self.tags))).hexdigest() + self.config_hash = md5(unicode(cfgdict).encode('utf-8')).hexdigest() + self.tags_hash = md5(unicode(sorted(self.tags)).encode('utf-8')) \ + .hexdigest() old_config_hash = old_tags_hash = '' try: fp = open(path.join(self.outdir, '.buildinfo')) @@ -199,7 +210,7 @@ class StandaloneHTMLBuilder(Builder): """Utility: Render a lone doctree node.""" if node is None: return {'fragment': ''} - doc = new_document('') + doc = new_document(b('')) doc.append(node) if self._publisher is None: @@ -221,10 +232,15 @@ class StandaloneHTMLBuilder(Builder): return pub.writer.parts def prepare_writing(self, docnames): - from sphinx.search import IndexBuilder - - self.indexer = IndexBuilder(self.env) + # create the search indexer + from sphinx.search import IndexBuilder, languages + lang = self.config.html_search_language or self.config.language + if not lang or lang not in languages: + lang = 'en' + self.indexer = IndexBuilder(self.env, lang, + self.config.html_search_options) self.load_indexer(docnames) + self.docwriter = HTMLWriter(self) self.docsettings = OptionParser( defaults=self.env.settings, @@ -371,7 +387,8 @@ class StandaloneHTMLBuilder(Builder): meta = self.env.metadata.get(docname) # local TOC and global TOC tree - toc = self.render_partial(self.env.get_toc_for(docname))['fragment'] + self_toc = self.env.get_toc_for(docname, self) + toc = self.render_partial(self_toc)['fragment'] return dict( parents = parents, @@ -396,6 +413,7 @@ class StandaloneHTMLBuilder(Builder): self.imgpath = relative_uri(self.get_target_uri(docname), '_images') self.post_process_images(doctree) 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'] @@ -523,22 +541,22 @@ class StandaloneHTMLBuilder(Builder): f.close() # then, copy translations JavaScript file if self.config.language is not None: - jsfile_list = [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 jsfile_list: - if path.isfile(jsfile): - copyfile(jsfile, path.join(self.outdir, '_static', - 'translations.js')) - break + jsfile = self._get_translations_js() + if jsfile: + copyfile(jsfile, path.join(self.outdir, '_static', + 'translations.js')) + + # add context items for search function used in searchtools.js_t + ctx = self.globalcontext.copy() + ctx.update(self.indexer.context_for_searchtool()) + # then, copy over theme-supplied static files if self.theme: themeentries = [path.join(themepath, 'static') for themepath in self.theme.get_dirchain()[::-1]] for entry in themeentries: copy_static_entry(entry, path.join(self.outdir, '_static'), - self, self.globalcontext) + self, ctx) # then, copy over all user-supplied static files staticentries = [path.join(self.confdir, spath) for spath in self.config.html_static_path] @@ -551,7 +569,7 @@ class StandaloneHTMLBuilder(Builder): self.warn('html_static_path entry %r does not exist' % entry) continue copy_static_entry(entry, path.join(self.outdir, '_static'), self, - self.globalcontext, exclude_matchers=matchers) + ctx, exclude_matchers=matchers) # copy logo and favicon files if not already in static path if self.config.html_logo: logobase = path.basename(self.config.html_logo) @@ -585,8 +603,7 @@ class StandaloneHTMLBuilder(Builder): self.theme.cleanup() def post_process_images(self, doctree): - """ - Pick the best candidate for an image and link down-scaled images to + """Pick the best candidate for an image and link down-scaled images to their high res version. """ Builder.post_process_images(self, doctree) @@ -610,7 +627,11 @@ class StandaloneHTMLBuilder(Builder): def load_indexer(self, docnames): keep = set(self.env.all_docs) - set(docnames) try: - f = open(path.join(self.outdir, self.searchindex_filename), 'rb') + searchindexfn = path.join(self.outdir, self.searchindex_filename) + if self.indexer_dumps_unicode: + f = codecs.open(searchindexfn, 'r', encoding='utf-8') + else: + f = open(searchindexfn, 'rb') try: self.indexer.load(f, self.indexer_format) finally: @@ -678,13 +699,19 @@ class StandaloneHTMLBuilder(Builder): def pathto(otheruri, resource=False, baseuri=self.get_target_uri(pagename)): - if not resource: + 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 '#' return uri ctx['pathto'] = pathto ctx['hasdoc'] = lambda name: name in self.env.all_docs - ctx['encoding'] = encoding = self.config.html_output_encoding + if self.name != 'htmlhelp': + ctx['encoding'] = encoding = self.config.html_output_encoding + else: + ctx['encoding'] = encoding = self.encoding ctx['toctree'] = lambda **kw: self._get_local_toctree(pagename, **kw) self.add_sidebars(pagename, ctx) ctx.update(addctx) @@ -705,7 +732,7 @@ class StandaloneHTMLBuilder(Builder): # outfilename's path is in general different from self.outdir ensuredir(path.dirname(outfilename)) try: - f = codecs.open(outfilename, 'w', encoding) + f = codecs.open(outfilename, 'w', encoding, 'xmlcharrefreplace') try: f.write(output) finally: @@ -727,10 +754,12 @@ class StandaloneHTMLBuilder(Builder): self.info(bold('dumping object inventory... '), nonl=True) f = open(path.join(self.outdir, INVENTORY_FILENAME), 'wb') try: - f.write('# Sphinx inventory version 2\n') - f.write('# Project: %s\n' % self.config.project.encode('utf-8')) - f.write('# Version: %s\n' % self.config.version.encode('utf-8')) - f.write('# The remainder of this file is compressed using zlib.\n') + f.write((u'# Sphinx inventory version 2\n' + u'# Project: %s\n' + u'# Version: %s\n' + u'# The remainder of this file is compressed using zlib.\n' + % (self.config.project, self.config.version) + ).encode('utf-8')) compressor = zlib.compressobj(9) for domainname, domain in self.env.domains.iteritems(): for name, dispname, type, docname, anchor, prio in \ @@ -742,11 +771,9 @@ class StandaloneHTMLBuilder(Builder): if dispname == name: dispname = u'-' f.write(compressor.compress( - '%s %s:%s %s %s %s\n' % (name.encode('utf-8'), - domainname.encode('utf-8'), - type.encode('utf-8'), prio, - uri.encode('utf-8'), - dispname.encode('utf-8')))) + (u'%s %s:%s %s %s %s\n' % (name, domainname, type, + prio, uri, dispname) + ).encode('utf-8'))) f.write(compressor.flush()) finally: f.close() @@ -758,7 +785,10 @@ class StandaloneHTMLBuilder(Builder): searchindexfn = path.join(self.outdir, self.searchindex_filename) # first write to a temporary file, so that if dumping fails, # the existing index won't be overwritten - f = open(searchindexfn + '.tmp', 'wb') + if self.indexer_dumps_unicode: + f = codecs.open(searchindexfn + '.tmp', 'w', encoding='utf-8') + else: + f = open(searchindexfn + '.tmp', 'wb') try: self.indexer.dump(f, self.indexer_format) finally: @@ -847,8 +877,14 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder): def get_doc_context(self, docname, body, metatags): # no relation links... toc = self.env.get_toctree_for(self.config.master_doc, self, False) - self.fix_refuris(toc) - toc = self.render_partial(toc)['fragment'] + # if there is no toctree, toc is None + if toc: + self.fix_refuris(toc) + toc = self.render_partial(toc)['fragment'] + display_toc = True + else: + toc = '' + display_toc = False return dict( parents = [], prev = None, @@ -861,7 +897,7 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder): rellinks = [], sourcename = '', toc = toc, - display_toc = True, + display_toc = display_toc, ) def write(self, *ignored): @@ -909,6 +945,9 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder): #: implements a `dump`, `load`, `dumps` and `loads` functions #: (pickle, simplejson etc.) implementation = None + implementation_dumps_unicode = False + #: additional arguments for dump() + additional_dump_args = () #: the filename for the global context file globalcontext_filename = None @@ -931,6 +970,16 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder): return docname[:-5] # up to sep return docname + SEP + def dump_context(self, context, filename): + if self.implementation_dumps_unicode: + f = codecs.open(filename, 'w', encoding='utf-8') + else: + f = open(filename, 'wb') + try: + self.implementation.dump(context, f, *self.additional_dump_args) + finally: + f.close() + def handle_page(self, pagename, ctx, templatename='page.html', outfilename=None, event_arg=None): ctx['current_page_name'] = pagename @@ -944,11 +993,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder): ctx, event_arg) ensuredir(path.dirname(outfilename)) - f = open(outfilename, 'wb') - try: - self.implementation.dump(ctx, f, 2) - finally: - f.close() + self.dump_context(ctx, outfilename) # if there is a source file, copy the source file for the # "show source" link @@ -961,11 +1006,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder): def handle_finish(self): # dump the global context outfilename = path.join(self.outdir, self.globalcontext_filename) - f = open(outfilename, 'wb') - try: - self.implementation.dump(self.globalcontext, f, 2) - finally: - f.close() + self.dump_context(self.globalcontext, outfilename) # super here to dump the search index StandaloneHTMLBuilder.handle_finish(self) @@ -985,7 +1026,10 @@ class PickleHTMLBuilder(SerializingHTMLBuilder): A Builder that dumps the generated HTML into pickle files. """ implementation = pickle + implementation_dumps_unicode = False + additional_dump_args = (pickle.HIGHEST_PROTOCOL,) indexer_format = pickle + indexer_dumps_unicode = False name = 'pickle' out_suffix = '.fpickle' globalcontext_filename = 'globalcontext.pickle' @@ -1000,7 +1044,9 @@ class JSONHTMLBuilder(SerializingHTMLBuilder): A builder that dumps the generated HTML into JSON files. """ implementation = jsonimpl + implementation_dumps_unicode = True indexer_format = jsonimpl + indexer_dumps_unicode = True name = 'json' out_suffix = '.fjson' globalcontext_filename = 'globalcontext.json' diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py index 538f4c848..9227a6e62 100644 --- a/sphinx/builders/htmlhelp.py +++ b/sphinx/builders/htmlhelp.py @@ -6,7 +6,7 @@ Build HTML help support files. Parts adapted from Python's Doc/tools/prechm.py. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -200,7 +200,7 @@ class HTMLHelpBuilder(StandaloneHTMLBuilder): outdir += os.sep olen = len(outdir) for root, dirs, files in os.walk(outdir): - staticdir = (root == path.join(outdir, '_static')) + staticdir = root.startswith(path.join(outdir, '_static')) for fn in files: if (staticdir and not fn.endswith('.js')) or \ fn.endswith('.html'): @@ -258,7 +258,8 @@ class HTMLHelpBuilder(StandaloneHTMLBuilder): def write_index(title, refs, subitems): def write_param(name, value): item = ' \n' % (name, value) - f.write(item.encode('ascii', 'xmlcharrefreplace')) + f.write(item.encode(self.encoding, 'xmlcharrefreplace') + .decode(self.encoding)) title = cgi.escape(title) f.write('

  • \n') write_param('Keyword', title) diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index b2a3c4e74..3369338c2 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -5,7 +5,7 @@ LaTeX builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,10 +46,6 @@ class LaTeXBuilder(Builder): return 'all documents' # for now def get_target_uri(self, docname, typ=None): - if typ == 'token': - # token references are always inside production lists and must be - # replaced by \token{} in LaTeX - return '@token' if docname not in self.docnames: raise NoUri else: diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 4a0bab633..ad15b55de 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -5,13 +5,17 @@ The CheckExternalLinksBuilder class. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import re +import sys +import Queue import socket +import threading from os import path -from urllib2 import build_opener, HTTPError +from urllib2 import build_opener, Request from docutils import nodes @@ -23,6 +27,12 @@ opener = build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] +class HeadRequest(Request): + """Subclass of urllib2.Request that sends a HEAD request.""" + def get_method(self): + return 'HEAD' + + class CheckExternalLinksBuilder(Builder): """ Checks for broken external links. @@ -30,6 +40,7 @@ class CheckExternalLinksBuilder(Builder): name = 'linkcheck' def init(self): + self.to_ignore = map(re.compile, self.app.config.linkcheck_ignore) self.good = set() self.broken = {} self.redirected = {} @@ -38,6 +49,83 @@ class CheckExternalLinksBuilder(Builder): # create output file open(path.join(self.outdir, 'output.txt'), 'w').close() + # create queues and worker threads + self.wqueue = Queue.Queue() + self.rqueue = Queue.Queue() + self.workers = [] + for i in range(self.app.config.linkcheck_workers): + thread = threading.Thread(target=self.check_thread) + thread.setDaemon(True) + thread.start() + self.workers.append(thread) + + def check_thread(self): + kwargs = {} + if sys.version_info > (2, 5) and self.app.config.linkcheck_timeout: + kwargs['timeout'] = self.app.config.linkcheck_timeout + + def check(): + # check for various conditions without bothering the network + if len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:': + return 'unchecked', '' + elif not (uri[0:5] == 'http:' or uri[0:6] == 'https:'): + return 'local', '' + elif uri in self.good: + return 'working', '' + elif uri in self.broken: + return 'broken', self.broken[uri] + elif uri in self.redirected: + return 'redirected', self.redirected[uri] + for rex in self.to_ignore: + if rex.match(uri): + return 'ignored', '' + + # need to actually check the URI + try: + f = opener.open(HeadRequest(uri), **kwargs) + f.close() + except Exception, err: + self.broken[uri] = str(err) + return 'broken', str(err) + if f.url.rstrip('/') == uri.rstrip('/'): + self.good.add(uri) + return 'working', 'new' + else: + self.redirected[uri] = f.url + return 'redirected', f.url + + while True: + uri, docname, lineno = self.wqueue.get() + if uri is None: + break + status, info = check() + self.rqueue.put((uri, docname, lineno, status, info)) + + def process_result(self, result): + uri, docname, lineno, status, info = result + if status == 'unchecked': + return + if status == 'working' and info != 'new': + return + if lineno: + self.info('(line %3d) ' % lineno, nonl=1) + if status == 'ignored': + self.info(uri + ' - ' + darkgray('ignored')) + elif status == 'local': + self.info(uri + ' - ' + darkgray('local')) + self.write_entry('local', docname, lineno, uri) + elif status == 'working': + self.info(uri + ' - ' + darkgreen('working')) + elif status == 'broken': + self.info(uri + ' - ' + red('broken: ') + info) + self.write_entry('broken', docname, lineno, uri + ': ' + info) + if self.app.quiet: + self.warn('broken link: %s' % uri, + '%s:%s' % (self.env.doc2path(docname), lineno)) + elif status == 'redirected': + self.info(uri + ' - ' + purple('redirected') + ' to ' + info) + self.write_entry('redirected', docname, lineno, uri + ' to ' + info) + def get_target_uri(self, docname, typ=None): return '' @@ -49,61 +137,25 @@ class CheckExternalLinksBuilder(Builder): def write_doc(self, docname, doctree): self.info() + n = 0 for node in doctree.traverse(nodes.reference): - try: - self.check(node, docname) - except KeyError: + if 'refuri' not in node: continue - - def check(self, node, docname): - uri = node['refuri'] - - if '#' in uri: - uri = uri.split('#')[0] - - if uri in self.good: - return - - lineno = None - while lineno is None: - node = node.parent - if node is None: - break - lineno = node.line - - if len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:': - return - - if lineno: - self.info('(line %3d) ' % lineno, nonl=1) - if uri[0:5] == 'http:' or uri[0:6] == 'https:': - self.info(uri, nonl=1) - - if uri in self.broken: - (r, s) = self.broken[uri] - elif uri in self.redirected: - (r, s) = self.redirected[uri] - else: - (r, s) = self.resolve(uri) - - if r == 0: - self.info(' - ' + darkgreen('working')) - self.good.add(uri) - elif r == 2: - self.info(' - ' + red('broken: ') + s) - self.write_entry('broken', docname, lineno, uri + ': ' + s) - self.broken[uri] = (r, s) - if self.app.quiet: - self.warn('broken link: %s' % uri, - '%s:%s' % (self.env.doc2path(docname), lineno)) - else: - self.info(' - ' + purple('redirected') + ' to ' + s) - self.write_entry('redirected', docname, - lineno, uri + ' to ' + s) - self.redirected[uri] = (r, s) - else: - self.info(uri + ' - ' + darkgray('local')) - self.write_entry('local', docname, lineno, uri) + uri = node['refuri'] + if '#' in uri: + uri = uri.split('#')[0] + lineno = None + while lineno is None: + node = node.parent + if node is None: + break + lineno = node.line + self.wqueue.put((uri, docname, lineno), False) + n += 1 + done = 0 + while done < n: + self.process_result(self.rqueue.get()) + done += 1 if self.broken: self.app.statuscode = 1 @@ -114,21 +166,6 @@ class CheckExternalLinksBuilder(Builder): line, what, uri)) output.close() - def resolve(self, uri): - try: - f = opener.open(uri) - f.close() - except HTTPError, err: - #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'): - # # Wikipedia blocks requests from urllib User-Agent - # return (0, 0) - return (2, str(err)) - except Exception, err: - return (2, str(err)) - if f.url.rstrip('/') == uri.rstrip('/'): - return (0, 0) - else: - return (1, f.url) - def finish(self): - return + for worker in self.workers: + self.wqueue.put((None, None, None), False) diff --git a/sphinx/builders/manpage.py b/sphinx/builders/manpage.py index 756e4732f..93b56a01c 100644 --- a/sphinx/builders/manpage.py +++ b/sphinx/builders/manpage.py @@ -5,7 +5,7 @@ Manual pages builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/qthelp.py b/sphinx/builders/qthelp.py index ffc52334c..5598aad2c 100644 --- a/sphinx/builders/qthelp.py +++ b/sphinx/builders/qthelp.py @@ -5,7 +5,7 @@ Build input files for the Qt collection generator. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,7 +23,7 @@ from sphinx.builders.html import StandaloneHTMLBuilder _idpattern = re.compile( - r'(?P.+) (\((?P<id>[\w\.]+)( (?P<descr>\w+))?\))$') + r'(?P<title>.+) (\((class in )?(?P<id>[\w\.]+)( (?P<descr>\w+))?\))$') # Qt Help Collection Project (.qhcp). @@ -130,12 +130,20 @@ class QtHelpBuilder(StandaloneHTMLBuilder): for indexname, indexcls, content, collapse in self.domain_indices: item = section_template % {'title': indexcls.localname, 'ref': '%s.html' % indexname} - sections.append(' '*4*4 + item) - sections = '\n'.join(sections) + sections.append((' ' * 4 * 4 + item).encode('utf-8')) + # sections may be unicode strings or byte strings, we have to make sure + # they are all byte strings before joining them + new_sections = [] + for section in sections: + if isinstance(section, unicode): + new_sections.append(section.encode('utf-8')) + else: + new_sections.append(section) + sections = u'\n'.encode('utf-8').join(new_sections) # keywords keywords = [] - index = self.env.create_index(self) + index = self.env.create_index(self, group_entries=False) for (key, group) in index: for title, (refs, subitems) in group: keywords.extend(self.build_keywords(title, refs, subitems)) @@ -165,6 +173,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder): nspace = 'org.sphinx.%s.%s' % (outname, self.config.version) nspace = re.sub('[^a-zA-Z0-9.]', '', nspace) nspace = re.sub(r'\.+', '.', nspace).strip('.') + nspace = nspace.lower() # write the project file f = codecs.open(path.join(outdir, outname+'.qhp'), 'w', 'utf-8') @@ -230,7 +239,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder): link = node['refuri'] title = escape(node.astext()).replace('"','"') item = section_template % {'title': title, 'ref': link} - item = ' '*4*indentlevel + item.encode('ascii', 'xmlcharrefreplace') + item = u' ' * 4 * indentlevel + item parts.append(item.encode('ascii', 'xmlcharrefreplace')) elif isinstance(node, nodes.bullet_list): for subnode in node: diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py new file mode 100644 index 000000000..52e32362a --- /dev/null +++ b/sphinx/builders/texinfo.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +""" + sphinx.builders.texinfo + ~~~~~~~~~~~~~~~~~~~~~~~ + + Texinfo builder. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from os import path + +from docutils import nodes +from docutils.io import FileOutput +from docutils.utils import new_document +from docutils.frontend import OptionParser + +from sphinx import addnodes +from sphinx.locale import _ +from sphinx.builders import Builder +from sphinx.environment import NoUri +from sphinx.util.nodes import inline_all_toctrees +from sphinx.util.osutil import SEP, copyfile +from sphinx.util.console import bold, darkgreen +from sphinx.writers.texinfo import TexinfoWriter + + +TEXINFO_MAKEFILE = '''\ +# Makefile for Sphinx Texinfo output + +infodir ?= /usr/share/info + +MAKEINFO = makeinfo --no-split +MAKEINFO_html = makeinfo --no-split --html +MAKEINFO_plaintext = makeinfo --no-split --plaintext +TEXI2PDF = texi2pdf --batch --expand +INSTALL_INFO = install-info + +ALLDOCS = $(basename $(wildcard *.texi)) + +all: info +info: $(addsuffix .info,$(ALLDOCS)) +plaintext: $(addsuffix .txt,$(ALLDOCS)) +html: $(addsuffix .html,$(ALLDOCS)) +pdf: $(addsuffix .pdf,$(ALLDOCS)) + +install-info: info +\tfor f in *.info; do \\ +\t cp -t $(infodir) "$$f" && \\ +\t $(INSTALL_INFO) --info-dir=$(infodir) "$$f" ; \\ +\tdone + +uninstall-info: info +\tfor f in *.info; do \\ +\t rm -f "$(infodir)/$$f" ; \\ +\t $(INSTALL_INFO) --delete --info-dir=$(infodir) "$$f" ; \\ +\tdone + +%.info: %.texi +\t$(MAKEINFO) -o '$@' '$<' + +%.txt: %.texi +\t$(MAKEINFO_plaintext) -o '$@' '$<' + +%.html: %.texi +\t$(MAKEINFO_html) -o '$@' '$<' + +%.pdf: %.texi +\t-$(TEXI2PDF) '$<' +\t-$(TEXI2PDF) '$<' +\t-$(TEXI2PDF) '$<' + +clean: +\t-rm -f *.info *.pdf *.txt *.html +\t-rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ky *.pg +\t-rm -f *.vr *.tp *.fn *.fns *.def *.defs *.cp *.cps *.ge *.ges *.mo + +.PHONY: all info plaintext html pdf install-info uninstall-info clean +''' + + +class TexinfoBuilder(Builder): + """ + Builds Texinfo output to create Info documentation. + """ + name = 'texinfo' + format = 'texinfo' + supported_image_types = ['application/pdf', 'image/png', + 'image/gif', 'image/jpeg'] + + def init(self): + self.docnames = [] + self.document_data = [] + + def get_outdated_docs(self): + return 'all documents' # for now + + def get_target_uri(self, docname, typ=None): + if docname not in self.docnames: + raise NoUri + else: + return '%' + docname + + def get_relative_uri(self, from_, to, typ=None): + # ignore source path + return self.get_target_uri(to, typ) + + def init_document_data(self): + preliminary_document_data = map(list, self.config.texinfo_documents) + if not preliminary_document_data: + self.warn('no "texinfo_documents" config value found; no documents ' + 'will be written') + return + # assign subdirs to titles + self.titles = [] + for entry in preliminary_document_data: + docname = entry[0] + if docname not in self.env.all_docs: + self.warn('"texinfo_documents" config value references unknown ' + 'document %s' % docname) + continue + self.document_data.append(entry) + if docname.endswith(SEP+'index'): + docname = docname[:-5] + self.titles.append((docname, entry[2])) + + def write(self, *ignored): + self.init_document_data() + for entry in self.document_data: + docname, targetname, title, author = entry[:4] + targetname += '.texi' + direntry = description = category = '' + if len(entry) > 6: + direntry, description, category = entry[4:7] + toctree_only = False + if len(entry) > 7: + toctree_only = entry[7] + destination = FileOutput( + destination_path=path.join(self.outdir, targetname), + encoding='utf-8') + self.info("processing " + targetname + "... ", nonl=1) + doctree = self.assemble_doctree(docname, toctree_only, + appendices=(self.config.texinfo_appendices or [])) + self.info("writing... ", nonl=1) + + # Add an Index section + if self.config.texinfo_domain_indices: + doctree.append( + nodes.section('', + nodes.title(_("Index"), + nodes.Text(_('Index'), + _('Index'))), + nodes.raw('@printindex ge\n', + nodes.Text('@printindex ge\n', + '@printindex ge\n'), + format="texinfo"))) + self.post_process_images(doctree) + docwriter = TexinfoWriter(self) + settings = OptionParser( + defaults=self.env.settings, + components=(docwriter,)).get_default_values() + settings.author = author + settings.title = title + settings.texinfo_filename = targetname[:-5] + '.info' + settings.texinfo_elements = self.config.texinfo_elements + settings.texinfo_dir_entry = direntry or '' + settings.texinfo_dir_category = category or '' + settings.texinfo_dir_description = description or '' + settings.docname = docname + doctree.settings = settings + docwriter.write(doctree, destination) + self.info("done") + + def assemble_doctree(self, indexfile, toctree_only, appendices): + self.docnames = set([indexfile] + appendices) + self.info(darkgreen(indexfile) + " ", nonl=1) + tree = self.env.get_doctree(indexfile) + tree['docname'] = indexfile + if toctree_only: + # extract toctree nodes from the tree and put them in a + # fresh document + new_tree = new_document('<texinfo output>') + new_sect = nodes.section() + new_sect += nodes.title(u'<Set title in conf.py>', + u'<Set title in conf.py>') + new_tree += new_sect + for node in tree.traverse(addnodes.toctree): + new_sect += node + tree = new_tree + largetree = inline_all_toctrees(self, self.docnames, indexfile, tree, + darkgreen) + largetree['docname'] = indexfile + for docname in appendices: + appendix = self.env.get_doctree(docname) + appendix['docname'] = docname + largetree.append(appendix) + self.info() + self.info("resolving references...") + self.env.resolve_references(largetree, indexfile, self) + # TODO: add support for external :ref:s + for pendingnode in largetree.traverse(addnodes.pending_xref): + docname = pendingnode['refdocname'] + sectname = pendingnode['refsectname'] + newnodes = [nodes.emphasis(sectname, sectname)] + for subdir, title in self.titles: + if docname.startswith(subdir): + newnodes.append(nodes.Text(_(' (in '), _(' (in '))) + newnodes.append(nodes.emphasis(title, title)) + newnodes.append(nodes.Text(')', ')')) + break + else: + pass + pendingnode.replace_self(newnodes) + return largetree + + def finish(self): + # copy image files + if self.images: + self.info(bold('copying images...'), nonl=1) + for src, dest in self.images.iteritems(): + self.info(' '+src, nonl=1) + copyfile(path.join(self.srcdir, src), + path.join(self.outdir, dest)) + self.info() + + self.info(bold('copying Texinfo support files... '), nonl=True) + # copy Makefile + fn = path.join(self.outdir, 'Makefile') + self.info(fn, nonl=1) + try: + mkfile = open(fn, 'w') + try: + mkfile.write(TEXINFO_MAKEFILE) + finally: + mkfile.close() + except (IOError, OSError), err: + self.warn("error writing file %s: %s" % (fn, err)) + self.info(' done') diff --git a/sphinx/builders/text.py b/sphinx/builders/text.py index 092a1d97a..40fd3d791 100644 --- a/sphinx/builders/text.py +++ b/sphinx/builders/text.py @@ -5,7 +5,7 @@ Plain-text Sphinx builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py new file mode 100644 index 000000000..b77573095 --- /dev/null +++ b/sphinx/builders/websupport.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +""" + sphinx.builders.websupport + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Builder for the web support package. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from os import path +import posixpath +import shutil + +from docutils.io import StringOutput + +from sphinx.jinja2glue import BuiltinTemplateLoader +from sphinx.util.osutil import os_path, relative_uri, ensuredir, copyfile +from sphinx.builders.html import PickleHTMLBuilder +from sphinx.writers.websupport import WebSupportTranslator + + +class WebSupportBuilder(PickleHTMLBuilder): + """ + Builds documents for the web support package. + """ + name = 'websupport' + versioning_method = 'commentable' + + def init(self): + PickleHTMLBuilder.init(self) + # templates are needed for this builder, but the serializing + # builder does not initialize them + self.init_templates() + if not isinstance(self.templates, BuiltinTemplateLoader): + raise RuntimeError('websupport builder must be used with ' + 'the builtin templates') + # add our custom JS + self.script_files.append('_static/websupport.js') + + def set_webinfo(self, staticdir, virtual_staticdir, search, storage): + self.staticdir = staticdir + self.virtual_staticdir = virtual_staticdir + self.search = search + self.storage = storage + + def init_translator_class(self): + self.translator_class = WebSupportTranslator + + def prepare_writing(self, docnames): + PickleHTMLBuilder.prepare_writing(self, docnames) + self.globalcontext['no_search_suffix'] = True + + def write_doc(self, docname, doctree): + destination = StringOutput(encoding='utf-8') + doctree.settings = self.docsettings + + self.cur_docname = docname + self.secnumbers = self.env.toc_secnumbers.get(docname, {}) + self.imgpath = '/' + posixpath.join(self.virtual_staticdir, '_images') + self.post_process_images(doctree) + self.dlpath = '/' + posixpath.join(self.virtual_staticdir, '_downloads') + self.docwriter.write(doctree, destination) + self.docwriter.assemble_parts() + body = self.docwriter.parts['fragment'] + metatags = self.docwriter.clean_meta + + ctx = self.get_doc_context(docname, body, metatags) + self.index_page(docname, doctree, ctx.get('title', '')) + self.handle_page(docname, ctx, event_arg=doctree) + + def load_indexer(self, docnames): + self.indexer = self.search + self.indexer.init_indexing(changed=docnames) + + def _render_page(self, pagename, addctx, templatename, event_arg=None): + # This is mostly copied from StandaloneHTMLBuilder. However, instead + # of rendering the template and saving the html, create a context + # dict and pickle it. + ctx = self.globalcontext.copy() + ctx['pagename'] = pagename + + def pathto(otheruri, resource=False, + baseuri=self.get_target_uri(pagename)): + if resource and '://' in otheruri: + return otheruri + elif not resource: + otheruri = self.get_target_uri(otheruri) + return relative_uri(baseuri, otheruri) or '#' + else: + return '/' + posixpath.join(self.virtual_staticdir, otheruri) + ctx['pathto'] = pathto + ctx['hasdoc'] = lambda name: name in self.env.all_docs + ctx['encoding'] = self.config.html_output_encoding + ctx['toctree'] = lambda **kw: self._get_local_toctree(pagename, **kw) + self.add_sidebars(pagename, ctx) + ctx.update(addctx) + + self.app.emit('html-page-context', pagename, templatename, + ctx, event_arg) + + # create a dict that will be pickled and used by webapps + doc_ctx = { + 'body': ctx.get('body', ''), + 'title': ctx.get('title', ''), + } + # partially render the html template to get at interesting macros + template = self.templates.environment.get_template(templatename) + template_module = template.make_module(ctx) + for item in ['sidebar', 'relbar', 'script', 'css']: + if hasattr(template_module, item): + doc_ctx[item] = getattr(template_module, item)() + + return ctx, doc_ctx + + def handle_page(self, pagename, addctx, templatename='page.html', + outfilename=None, event_arg=None): + ctx, doc_ctx = self._render_page(pagename, addctx, + templatename, event_arg) + + if not outfilename: + outfilename = path.join(self.outdir, 'pickles', + os_path(pagename) + self.out_suffix) + ensuredir(path.dirname(outfilename)) + self.dump_context(doc_ctx, outfilename) + + # if there is a source file, copy the source file for the + # "show source" link + if ctx.get('sourcename'): + source_name = path.join(self.staticdir, + '_sources', os_path(ctx['sourcename'])) + ensuredir(path.dirname(source_name)) + copyfile(self.env.doc2path(pagename), source_name) + + def handle_finish(self): + # get global values for css and script files + _, doc_ctx = self._render_page('tmp', {}, 'page.html') + self.globalcontext['css'] = doc_ctx['css'] + self.globalcontext['script'] = doc_ctx['script'] + + PickleHTMLBuilder.handle_finish(self) + + # move static stuff over to separate directory + directories = ['_images', '_static'] + for directory in directories: + src = path.join(self.outdir, directory) + dst = path.join(self.staticdir, directory) + if path.isdir(src): + if path.isdir(dst): + shutil.rmtree(dst) + shutil.move(src, dst) + + def dump_search_index(self): + self.indexer.finish_indexing() diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py index e3e944656..af780167a 100644 --- a/sphinx/cmdline.py +++ b/sphinx/cmdline.py @@ -5,7 +5,7 @@ sphinx-build command-line handling. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -90,6 +90,13 @@ def main(argv): if err: return 1 + # likely encoding used for command-line arguments + try: + locale = __import__('locale') # due to submodule of the same name + likely_encoding = locale.getpreferredencoding() + except Exception: + likely_encoding = None + buildername = None force_all = freshenv = warningiserror = use_pdb = False status = sys.stdout @@ -129,7 +136,11 @@ def main(argv): try: val = int(val) except ValueError: - pass + if likely_encoding: + try: + val = val.decode(likely_encoding) + except UnicodeError: + pass confoverrides[key] = val elif opt == '-A': try: @@ -141,7 +152,11 @@ def main(argv): try: val = int(val) except ValueError: - pass + if likely_encoding: + try: + val = val.decode(likely_encoding) + except UnicodeError: + pass confoverrides['html_context.%s' % key] = val elif opt == '-n': confoverrides['nitpicky'] = True diff --git a/sphinx/config.py b/sphinx/config.py index 93250f9b0..d4aacb225 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -5,22 +5,29 @@ Build configuration file handling. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os import re +import sys from os import path from sphinx.errors import ConfigError from sphinx.util.osutil import make_filename +from sphinx.util.pycompat import bytes, b, convert_with_2to3 -nonascii_re = re.compile(r'[\x80-\xff]') +nonascii_re = re.compile(b(r'[\x80-\xff]')) +CONFIG_SYNTAX_ERROR = "There is a syntax error in your configuration file: %s" +if sys.version_info >= (3, 0): + CONFIG_SYNTAX_ERROR += "\nDid you change the syntax from 2.x to 3.x?" class Config(object): - """Configuration file abstraction.""" + """ + Configuration file abstraction. + """ # the values are: (default, what needs to be rebuilt if changed) @@ -64,12 +71,13 @@ class Config(object): primary_domain = ('py', 'env'), needs_sphinx = (None, None), nitpicky = (False, 'env'), + nitpick_ignore = ([], 'env'), # HTML options html_theme = ('default', 'html'), html_theme_path = ([], 'html'), html_theme_options = ({}, 'html'), - html_title = (lambda self: '%s v%s documentation' % + html_title = (lambda self: '%s %s documentation' % (self.project, self.release), 'html'), html_short_title = (lambda self: self.html_title, 'html'), @@ -85,7 +93,7 @@ class Config(object): html_additional_pages = ({}, 'html'), html_use_modindex = (True, 'html'), # deprecated html_domain_indices = (True, 'html'), - html_add_permalinks = (True, 'html'), + html_add_permalinks = (u'\u00B6', 'html'), html_use_index = (True, 'html'), html_split_index = (False, 'html'), html_copy_source = (True, 'html'), @@ -99,6 +107,8 @@ class Config(object): html_output_encoding = ('utf-8', 'html'), html_compact_lists = (True, 'html'), html_secnumber_suffix = ('. ', 'html'), + html_search_language = (None, 'html'), + html_search_options = ({}, 'html'), # HTML help only options htmlhelp_basename = (lambda self: make_filename(self.project), None), @@ -136,7 +146,7 @@ class Config(object): latex_use_parts = (False, None), latex_use_modindex = (True, None), # deprecated latex_domain_indices = (True, None), - latex_show_urls = (False, None), + latex_show_urls = ('no', None), latex_show_pagerefs = (False, None), # paper_size and font_size are still separate values # so that you can give them easily on the command line @@ -149,11 +159,23 @@ class Config(object): latex_preamble = ('', None), # text options - text_sectionchars = ('*=-~"+`', 'text'), - text_windows_newlines = (False, 'text'), + text_sectionchars = ('*=-~"+`', 'env'), + text_newlines = ('unix', 'env'), # manpage options man_pages = ([], None), + man_show_urls = (False, None), + + # Texinfo options + texinfo_documents = ([], None), + texinfo_appendices = ([], None), + texinfo_elements = ({}, None), + texinfo_domain_indices = (True, None), + + # linkcheck options + linkcheck_ignore = ([], None), + linkcheck_timeout = (None, None), + linkcheck_workers = (5, None), ) def __init__(self, dirname, filename, overrides, tags): @@ -166,12 +188,30 @@ class Config(object): config['tags'] = tags olddir = os.getcwd() try: + # we promise to have the config dir as current dir while the + # config file is executed + os.chdir(dirname) + # get config source + f = open(config_file, 'rb') try: - os.chdir(dirname) - execfile(config['__file__'], config) + source = f.read() + finally: + f.close() + try: + # compile to a code object, handle syntax errors + try: + code = compile(source, config_file, 'exec') + except SyntaxError: + if convert_with_2to3: + # maybe the file uses 2.x syntax; try to refactor to + # 3.x syntax using 2to3 + source = convert_with_2to3(config_file) + code = compile(source, config_file, 'exec') + else: + raise + exec code in config except SyntaxError, err: - raise ConfigError('There is a syntax error in your ' - 'configuration file: ' + str(err)) + raise ConfigError(CONFIG_SYNTAX_ERROR % err) finally: os.chdir(olddir) @@ -185,10 +225,11 @@ class Config(object): # check all string values for non-ASCII characters in bytestrings, # since that can result in UnicodeErrors all over the place for name, value in self._raw_config.iteritems(): - if isinstance(value, str) and nonascii_re.search(value): + if isinstance(value, bytes) and nonascii_re.search(value): warn('the config value %r is set to a string with non-ASCII ' 'characters; this can lead to Unicode errors occurring. ' - 'Please use Unicode strings, e.g. u"Content".' % name) + 'Please use Unicode strings, e.g. %r.' % (name, u'Content') + ) def init_values(self): config = self._raw_config diff --git a/sphinx/directives/__init__.py b/sphinx/directives/__init__.py index 6c03b8e5f..6e0300abc 100644 --- a/sphinx/directives/__init__.py +++ b/sphinx/directives/__init__.py @@ -5,7 +5,7 @@ Handlers for additional ReST directives. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -32,7 +32,8 @@ except AttributeError: # RE to strip backslash escapes -strip_backslash_re = re.compile(r'\\(?=[^\\])') +nl_escape_re = re.compile(r'\\\n') +strip_backslash_re = re.compile(r'\\(.)') class ObjectDescription(Directive): @@ -57,10 +58,12 @@ class ObjectDescription(Directive): """ Retrieve the signatures to document from the directive arguments. By default, signatures are given as arguments, one per line. + + Backslash-escaping of newlines is supported. """ + lines = nl_escape_re.sub('', self.arguments[0]).split('\n') # remove backslashes to support (dummy) escapes; helps Vim highlighting - return [strip_backslash_re.sub('', sig.strip()) - for sig in self.arguments[0].split('\n')] + return [strip_backslash_re.sub(r'\1', line.strip()) for line in lines] def handle_signature(self, sig, signode): """ @@ -159,7 +162,6 @@ class ObjectDescription(Directive): self.env.temp_data['object'] = self.names[0] self.before_content() self.state.nested_parse(self.content, self.content_offset, contentnode) - #self.handle_doc_fields(contentnode) DocFieldTransformer(self).transform_all(contentnode) self.env.temp_data['object'] = None self.after_content() diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index 0647daf09..99fb3502a 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -3,14 +3,12 @@ sphinx.directives.code ~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import os import sys import codecs -from os import path from docutils import nodes from docutils.parsers.rst import Directive, directives @@ -64,6 +62,7 @@ class CodeBlock(Directive): literal = nodes.literal_block(code, code) literal['language'] = self.arguments[0] literal['linenos'] = 'linenos' in self.options + literal.line = self.lineno return [literal] @@ -93,23 +92,11 @@ class LiteralInclude(Directive): def run(self): document = self.state.document - filename = self.arguments[0] if not document.settings.file_insertion_enabled: return [document.reporter.warning('File insertion disabled', line=self.lineno)] env = document.settings.env - if filename.startswith('/') or filename.startswith(os.sep): - rel_fn = filename[1:] - else: - docdir = path.dirname(env.doc2path(env.docname, base=None)) - rel_fn = path.join(docdir, filename) - try: - fn = path.join(env.srcdir, rel_fn) - except UnicodeDecodeError: - # the source directory is a bytestring with non-ASCII characters; - # let's try to encode the rel_fn in the file system encoding - rel_fn = rel_fn.encode(sys.getfilesystemencoding()) - fn = path.join(env.srcdir, rel_fn) + rel_filename, filename = env.relfn2path(self.arguments[0]) if 'pyobject' in self.options and 'lines' in self.options: return [document.reporter.warning( @@ -119,7 +106,7 @@ class LiteralInclude(Directive): encoding = self.options.get('encoding', env.config.source_encoding) codec_info = codecs.lookup(encoding) try: - f = codecs.StreamReaderWriter(open(fn, 'U'), + f = codecs.StreamReaderWriter(open(filename, 'rb'), codec_info[2], codec_info[3], 'strict') lines = f.readlines() f.close() @@ -136,7 +123,7 @@ class LiteralInclude(Directive): objectname = self.options.get('pyobject') if objectname is not None: from sphinx.pycode import ModuleAnalyzer - analyzer = ModuleAnalyzer.for_file(fn, '') + analyzer = ModuleAnalyzer.for_file(filename, '') tags = analyzer.find_tags() if objectname not in tags: return [document.reporter.warning( @@ -178,13 +165,14 @@ class LiteralInclude(Directive): text = ''.join(lines) if self.options.get('tab-width'): text = text.expandtabs(self.options['tab-width']) - retnode = nodes.literal_block(text, text, source=fn) + retnode = nodes.literal_block(text, text, source=filename) retnode.line = 1 + retnode.attributes['line_number'] = self.lineno if self.options.get('language', ''): retnode['language'] = self.options['language'] if 'linenos' in self.options: retnode['linenos'] = True - document.settings.env.note_dependency(rel_fn) + env.note_dependency(rel_filename) return [retnode] diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index 332c40849..246d64036 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -3,7 +3,7 @@ sphinx.directives.other ~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -11,21 +11,28 @@ import os from docutils import nodes from docutils.parsers.rst import Directive, directives +from docutils.parsers.rst.directives.misc import Class +from docutils.parsers.rst.directives.misc import Include as BaseInclude from sphinx import addnodes -from sphinx.locale import pairindextypes, _ +from sphinx.locale import _ from sphinx.util import url_re, docname_join -from sphinx.util.nodes import explicit_title_re +from sphinx.util.nodes import explicit_title_re, process_index_entry from sphinx.util.compat import make_admonition from sphinx.util.matching import patfilter +def int_or_nothing(argument): + if not argument: + return 999 + return int(argument) + + class TocTree(Directive): """ Directive to notify Sphinx about the hierarchical structure of the docs, and to include a table-of-contents like tree in the current document. """ - has_content = True required_arguments = 0 optional_arguments = 0 @@ -34,7 +41,7 @@ class TocTree(Directive): 'maxdepth': int, 'glob': directives.flag, 'hidden': directives.flag, - 'numbered': directives.flag, + 'numbered': int_or_nothing, 'titlesonly': directives.flag, } @@ -73,8 +80,9 @@ class TocTree(Directive): entries.append((title, ref)) elif docname not in env.found_docs: ret.append(self.state.document.reporter.warning( - 'toctree references unknown document %r' % docname, - line=self.lineno)) + 'toctree contains reference to nonexisting ' + 'document %r' % docname, line=self.lineno)) + env.note_reread() else: entries.append((title, docname)) includefiles.append(docname) @@ -98,7 +106,7 @@ class TocTree(Directive): subnode['maxdepth'] = self.options.get('maxdepth', -1) subnode['glob'] = glob subnode['hidden'] = 'hidden' in self.options - subnode['numbered'] = 'numbered' in self.options + subnode['numbered'] = self.options.get('numbered', 0) subnode['titlesonly'] = 'titlesonly' in self.options wrappernode = nodes.compound(classes=['toctree-wrapper']) wrappernode.append(subnode) @@ -111,7 +119,6 @@ class Author(Directive): Directive to give the name of the author of the current document or section. Shown in the output only if the show_authors option is on. """ - has_content = False required_arguments = 1 optional_arguments = 0 @@ -144,17 +151,12 @@ class Index(Directive): """ Directive to add entries to the index. """ - has_content = False required_arguments = 1 optional_arguments = 0 final_argument_whitespace = True option_spec = {} - indextypes = [ - 'single', 'pair', 'double', 'triple', - ] - def run(self): arguments = self.arguments[0].split('\n') env = self.state.document.settings.env @@ -163,29 +165,9 @@ class Index(Directive): self.state.document.note_explicit_target(targetnode) indexnode = addnodes.index() indexnode['entries'] = ne = [] + indexnode['inline'] = False for entry in arguments: - entry = entry.strip() - for type in pairindextypes: - if entry.startswith(type+':'): - value = entry[len(type)+1:].strip() - value = pairindextypes[type] + '; ' + value - ne.append(('pair', value, targetid, value)) - break - else: - for type in self.indextypes: - if entry.startswith(type+':'): - value = entry[len(type)+1:].strip() - if type == 'double': - type = 'pair' - ne.append((type, value, targetid, value)) - break - # shorthand notation for single entries - else: - for value in entry.split(','): - value = value.strip() - if not value: - continue - ne.append(('single', value, targetid, value)) + ne.extend(process_index_entry(entry, targetid)) return [indexnode, targetnode] @@ -193,7 +175,6 @@ class VersionChange(Directive): """ Directive to describe a change/addition/deprecation in a specific version. """ - has_content = True required_arguments = 1 optional_arguments = 1 @@ -223,7 +204,6 @@ class SeeAlso(Directive): """ An admonition mentioning things to look at as reference. """ - has_content = True required_arguments = 0 optional_arguments = 1 @@ -249,7 +229,6 @@ class TabularColumns(Directive): """ Directive to give an explicit tabulary column definition to LaTeX. """ - has_content = False required_arguments = 1 optional_arguments = 0 @@ -259,6 +238,7 @@ class TabularColumns(Directive): def run(self): node = addnodes.tabular_col_spec() node['spec'] = self.arguments[0] + node.line = self.lineno return [node] @@ -266,7 +246,6 @@ class Centered(Directive): """ Directive to create a centered line of bold text. """ - has_content = False required_arguments = 1 optional_arguments = 0 @@ -283,12 +262,10 @@ class Centered(Directive): return [subnode] + messages - class Acks(Directive): """ Directive for a list of names. """ - has_content = True required_arguments = 0 optional_arguments = 0 @@ -310,7 +287,6 @@ class HList(Directive): """ Directive for a list that gets compacted horizontally. """ - has_content = True required_arguments = 0 optional_arguments = 0 @@ -347,7 +323,6 @@ class Only(Directive): """ Directive to only include text if the given tag(s) are enabled. """ - has_content = True required_arguments = 1 optional_arguments = 0 @@ -364,19 +339,16 @@ class Only(Directive): return [node] -from docutils.parsers.rst.directives.misc import Include as BaseInclude - class Include(BaseInclude): """ Like the standard "Include" directive, but interprets absolute paths - correctly. + "correctly", i.e. relative to source directory. """ def run(self): - if self.arguments[0].startswith('/') or \ - self.arguments[0].startswith(os.sep): - env = self.state.document.settings.env - self.arguments[0] = os.path.join(env.srcdir, self.arguments[0][1:]) + env = self.state.document.settings.env + rel_filename, filename = env.relfn2path(self.arguments[0]) + self.arguments[0] = filename return BaseInclude.run(self) @@ -397,7 +369,6 @@ directives.register_directive('only', Only) directives.register_directive('include', Include) # register the standard rst class directive under a different name -from docutils.parsers.rst.directives.misc import Class # only for backwards compatibility now directives.register_directive('cssclass', Class) # new standard name when default-domain with "class" is in effect diff --git a/sphinx/domains/__init__.py b/sphinx/domains/__init__.py index d133a8123..c48568eb9 100644 --- a/sphinx/domains/__init__.py +++ b/sphinx/domains/__init__.py @@ -6,7 +6,7 @@ Support for domains, which are groupings of description directives and roles describing e.g. constructs of one programming language. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -66,9 +66,8 @@ class Index(object): self.domain = domain def generate(self, docnames=None): - """ - Return entries for the index given by *name*. If *docnames* is given, - restrict to entries referring to these docnames. + """Return entries for the index given by *name*. If *docnames* is + given, restrict to entries referring to these docnames. The return value is a tuple of ``(content, collapse)``, where *collapse* is a boolean that determines if sub-entries should start collapsed (for @@ -132,6 +131,8 @@ class Domain(object): roles = {} #: a list of Index subclasses indices = [] + #: role name -> a warning message if reference is missing + dangling_warnings = {} #: data value for a fresh environment initial_data = {} @@ -158,8 +159,7 @@ class Domain(object): self.objtypes_for_role = self._role2type.get def role(self, name): - """ - Return a role adapter function that always gives the registered + """Return a role adapter function that always gives the registered role its full name ('domain:name') as the first argument. """ if name in self._role_cache: @@ -175,8 +175,7 @@ class Domain(object): return role_adapter def directive(self, name): - """ - Return a directive adapter class that always gives the registered + """Return a directive adapter class that always gives the registered directive its full name ('domain:name') as ``self.name``. """ if name in self._directive_cache: @@ -195,21 +194,16 @@ class Domain(object): # methods that should be overwritten def clear_doc(self, docname): - """ - Remove traces of a document in the domain-specific inventories. - """ + """Remove traces of a document in the domain-specific inventories.""" pass def process_doc(self, env, docname, document): - """ - Process a document after it is read by the environment. - """ + """Process a document after it is read by the environment.""" pass def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): - """ - Resolve the ``pending_xref`` *node* with the given *typ* and *target*. + """Resolve the pending_xref *node* with the given *typ* and *target*. This method should return a new node, to replace the xref node, containing the *contnode* which is the markup content of the @@ -225,8 +219,7 @@ class Domain(object): pass def get_objects(self): - """ - Return an iterable of "object descriptions", which are tuples with + """Return an iterable of "object descriptions", which are tuples with five items: * `name` -- fully qualified name @@ -245,9 +238,7 @@ class Domain(object): return [] def get_type_name(self, type, primary=False): - """ - Return full name for given ObjType. - """ + """Return full name for given ObjType.""" if primary: return type.lname return _('%s %s') % (self.label, type.lname) diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index c49dc2843..b0dd332b5 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -5,7 +5,7 @@ The C language domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -99,13 +99,20 @@ class CObject(ObjectDescription): m = c_funcptr_name_re.match(name) if m: name = m.group(1) + + typename = self.env.temp_data.get('c:type') + if self.name == 'c:member' and typename: + fullname = typename + '.' + name + else: + fullname = name + if not arglist: if self.objtype == 'function': # for functions, add an empty parameter list signode += addnodes.desc_parameterlist() if const: signode += addnodes.desc_addname(const, const) - return name + return fullname paramlist = addnodes.desc_parameterlist() arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup @@ -121,12 +128,13 @@ class CObject(ObjectDescription): self._parse_type(param, arg) else: self._parse_type(param, ctype) - param += nodes.emphasis(' '+argname, ' '+argname) + # separate by non-breaking space in the output + param += nodes.emphasis(' '+argname, u'\xa0'+argname) paramlist += param signode += paramlist if const: signode += addnodes.desc_addname(const, const) - return name + return fullname def get_index_text(self, name): if self.objtype == 'function': @@ -160,7 +168,32 @@ class CObject(ObjectDescription): indextext = self.get_index_text(name) if indextext: - self.indexnode['entries'].append(('single', indextext, name, name)) + self.indexnode['entries'].append(('single', indextext, name, '')) + + def before_content(self): + self.typename_set = False + if self.name == 'c:type': + if self.names: + self.env.temp_data['c:type'] = self.names[0] + self.typename_set = True + + def after_content(self): + if self.typename_set: + self.env.temp_data['c:type'] = None + + +class CXRefRole(XRefRole): + def process_link(self, env, refnode, has_explicit_title, title, target): + 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 CDomain(Domain): @@ -183,11 +216,11 @@ class CDomain(Domain): 'var': CObject, } roles = { - 'func' : XRefRole(fix_parens=True), - 'member': XRefRole(), - 'macro': XRefRole(), - 'data': XRefRole(), - 'type': XRefRole(), + 'func' : CXRefRole(fix_parens=True), + 'member': CXRefRole(), + 'macro': CXRefRole(), + 'data': CXRefRole(), + 'type': CXRefRole(), } initial_data = { 'objects': {}, # fullname -> docname, objtype diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 4dac89253..5465c91fb 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -5,7 +5,7 @@ The C++ language domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,14 @@ from sphinx.domains import Domain, ObjType from sphinx.directives import ObjectDescription from sphinx.util.nodes import make_refnode from sphinx.util.compat import Directive -from sphinx.util.docfields import TypedField -_identifier_re = re.compile(r'\b(~?[a-zA-Z_][a-zA-Z0-9_]*)\b') +_identifier_re = re.compile(r'(~?\b[a-zA-Z_][a-zA-Z0-9_]*)\b') _whitespace_re = re.compile(r'\s+(?u)') _string_re = re.compile(r"[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'" r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S) _visibility_re = re.compile(r'\b(public|private|protected)\b') +_array_def_re = re.compile(r'\[\s*(.+?)?\s*\]') _operator_re = re.compile(r'''(?x) \[\s*\] | \(\s*\) @@ -110,7 +110,7 @@ class DefinitionError(Exception): return self.description def __str__(self): - return unicode(self.encode('utf-8')) + return unicode(self).encode('utf-8') class DefExpr(object): @@ -132,17 +132,21 @@ class DefExpr(object): def __ne__(self, other): return not self.__eq__(other) + __hash__ = None + def clone(self): - """Close a definition expression node""" + """Clone a definition expression node.""" return deepcopy(self) def get_id(self): - """Returns the id for the node""" + """Return the id for the node.""" return u'' def get_name(self): - """Returns the name. Returns either `None` or a node with - a name you might call :meth:`split_owner` on. + """Return the name. + + Returns either `None` or a node with a name you might call + :meth:`split_owner` on. """ return None @@ -150,19 +154,19 @@ class DefExpr(object): """Nodes returned by :meth:`get_name` can split off their owning parent. This function returns the owner and the name as a tuple of two items. If a node does not support - it, :exc:`NotImplementedError` is raised. + it, it returns None as owner and self as name. """ - raise NotImplementedError() + return None, self def prefix(self, prefix): - """Prefixes a name node (a node returned by :meth:`get_name`).""" + """Prefix a name node (a node returned by :meth:`get_name`).""" raise NotImplementedError() def __str__(self): return unicode(self).encode('utf-8') def __repr__(self): - return '<defexpr %s>' % self + return '<%s %s>' % (self.__class__.__name__, self) class PrimaryDefExpr(DefExpr): @@ -170,9 +174,6 @@ class PrimaryDefExpr(DefExpr): def get_name(self): return self - def split_owner(self): - return None, self - def prefix(self, prefix): if isinstance(prefix, PathDefExpr): prefix = prefix.clone() @@ -273,6 +274,22 @@ class PtrDefExpr(WrappingDefExpr): return u'%s*' % self.typename +class ArrayDefExpr(WrappingDefExpr): + + def __init__(self, typename, size_hint=None): + WrappingDefExpr.__init__(self, typename) + self.size_hint = size_hint + + def get_id(self): + return self.typename.get_id() + u'A' + + def __unicode__(self): + return u'%s[%s]' % ( + self.typename, + self.size_hint is not None and unicode(self.size_hint) or u'' + ) + + class RefDefExpr(WrappingDefExpr): def get_id(self): @@ -323,9 +340,8 @@ class ArgumentDefExpr(DefExpr): return self.type.get_id() def __unicode__(self): - return (self.type is not None and u'%s %s' % (self.type, self.name) - or unicode(self.name)) + (self.default is not None and - u'=%s' % self.default or u'') + return (u'%s %s' % (self.type or u'', self.name or u'')).strip() + \ + (self.default is not None and u'=%s' % self.default or u'') class NamedDefExpr(DefExpr): @@ -445,9 +461,9 @@ class DefinitionParser(object): 'mutable': None, 'const': None, 'typename': None, - 'unsigned': set(('char', 'int', 'long')), - 'signed': set(('char', 'int', 'long')), - 'short': set(('int', 'short')), + 'unsigned': set(('char', 'short', 'int', 'long')), + 'signed': set(('char', 'short', 'int', 'long')), + 'short': set(('int',)), 'long': set(('int', 'long', 'double')) } @@ -563,6 +579,8 @@ class DefinitionParser(object): expr = ConstDefExpr(expr) elif self.skip_string('*'): expr = PtrDefExpr(expr) + elif self.match(_array_def_re): + expr = ArrayDefExpr(expr, self.last_match.group(1)) elif self.skip_string('&'): expr = RefDefExpr(expr) else: @@ -694,14 +712,13 @@ class DefinitionParser(object): self.fail('expected comma between arguments') self.skip_ws() - argname = self._parse_type() - argtype = default = None + argtype = self._parse_type() + argname = default = None self.skip_ws() if self.skip_string('='): self.pos += 1 default = self._parse_default_expr() elif self.current_char not in ',)': - argtype = argname argname = self._parse_name() self.skip_ws() if self.skip_string('='): @@ -824,17 +841,18 @@ class CPPObject(ObjectDescription): def add_target_and_index(self, sigobj, sig, signode): theid = sigobj.get_id() name = unicode(sigobj.name) - signode['names'].append(theid) - signode['ids'].append(theid) - signode['first'] = (not self.names) - self.state.document.note_explicit_target(signode) + if theid not in self.state.document.ids: + signode['names'].append(theid) + signode['ids'].append(theid) + signode['first'] = (not self.names) + self.state.document.note_explicit_target(signode) - self.env.domaindata['cpp']['objects'].setdefault(name, - (self.env.docname, self.objtype, theid)) + self.env.domaindata['cpp']['objects'].setdefault(name, + (self.env.docname, self.objtype, theid)) indextext = self.get_index_text(name) if indextext: - self.indexnode['entries'].append(('single', indextext, name, name)) + self.indexnode['entries'].append(('single', indextext, theid, '')) def before_content(self): lastname = self.names and self.names[-1] @@ -982,8 +1000,9 @@ class CPPFunctionObject(CPPObject): class CPPCurrentNamespace(Directive): - """This directive is just to tell Sphinx that we're documenting - stuff in namespace foo. + """ + This directive is just to tell Sphinx that we're documenting stuff in + namespace foo. """ has_content = False @@ -1071,13 +1090,15 @@ class CPPDomain(Domain): contnode, name) parser = DefinitionParser(target) - # XXX: warn? try: expr = parser.parse_type().get_name() parser.skip_ws() if not parser.eof or expr is None: - return None + raise DefinitionError('') except DefinitionError: + refdoc = node.get('refdoc', fromdocname) + env.warn(refdoc, 'unparseable C++ definition: %r' % target, + node.line) return None parent = node['cpp:parent'] diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py index 890af8e14..73edf4515 100644 --- a/sphinx/domains/javascript.py +++ b/sphinx/domains/javascript.py @@ -5,7 +5,7 @@ The JavaScript domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,8 +13,8 @@ from sphinx import addnodes from sphinx.domains import Domain, ObjType from sphinx.locale import l_, _ from sphinx.directives import ObjectDescription -from sphinx.domains.python import py_paramlist_re as js_paramlist_re from sphinx.roles import XRefRole +from sphinx.domains.python import _pseudo_parse_arglist from sphinx.util.nodes import make_refnode from sphinx.util.docfields import Field, GroupedField, TypedField @@ -56,7 +56,7 @@ class JSObject(ObjectDescription): else: # just a function or constructor objectname = '' - fullname = '' + fullname = name signode['object'] = objectname signode['fullname'] = fullname @@ -68,28 +68,10 @@ class JSObject(ObjectDescription): signode += addnodes.desc_addname(nameprefix + '.', nameprefix + '.') signode += addnodes.desc_name(name, name) if self.has_arguments: - signode += addnodes.desc_parameterlist() - if not arglist: - return fullname, nameprefix - - stack = [signode[-1]] - for token in js_paramlist_re.split(arglist): - if token == '[': - opt = addnodes.desc_optional() - stack[-1] += opt - stack.append(opt) - elif token == ']': - try: - stack.pop() - except IndexError: - raise ValueError() - elif not token or token == ',' or token.isspace(): - pass + if not arglist: + signode += addnodes.desc_parameterlist() else: - token = token.strip() - stack[-1] += addnodes.desc_parameter(token, token) - if len(stack) != 1: - raise ValueError() + _pseudo_parse_arglist(signode, arglist) return fullname, nameprefix def add_target_and_index(self, name_obj, sig, signode): @@ -114,7 +96,8 @@ class JSObject(ObjectDescription): indextext = self.get_index_text(objectname, name_obj) if indextext: self.indexnode['entries'].append(('single', indextext, - fullname, fullname)) + fullname.replace('$', '_S_'), + '')) def get_index_text(self, objectname, name_obj): name, obj = name_obj @@ -148,7 +131,7 @@ class JSCallable(JSObject): class JSConstructor(JSCallable): - """Like a callable but with a different prefix""" + """Like a callable but with a different prefix.""" display_prefix = 'class ' @@ -226,8 +209,10 @@ class JavaScriptDomain(Domain): name, obj = self.find_obj(env, objectname, target, typ, searchorder) if not obj: return None - return make_refnode(builder, fromdocname, obj[0], name, contnode, name) + return make_refnode(builder, fromdocname, obj[0], + name.replace('$', '_S_'), contnode, name) def get_objects(self): for refname, (docname, type) in self.data['objects'].iteritems(): - yield refname, refname, type, docname, refname, 1 + yield refname, refname, type, docname, \ + refname.replace('$', '_S_'), 1 diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index fc8086995..021aaaaa7 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -5,7 +5,7 @@ The Python domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,7 +33,52 @@ py_sig_re = re.compile( )? $ # and nothing more ''', re.VERBOSE) -py_paramlist_re = re.compile(r'([\[\],])') # split at '[', ']' and ',' + +def _pseudo_parse_arglist(signode, arglist): + """"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() + stack = [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(']'): + ends_close += 1 + argument = argument[:-1].strip() + while argument.endswith('['): + ends_open += 1 + argument = argument[:-1].strip() + if argument: + stack[-1] += addnodes.desc_parameter(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 + signode += addnodes.desc_parameterlist() + signode[-1] += addnodes.desc_parameter(arglist, arglist) + else: + signode += paramlist class PyObject(ObjectDescription): @@ -43,16 +88,19 @@ class PyObject(ObjectDescription): option_spec = { 'noindex': directives.flag, 'module': directives.unchanged, + 'annotation': directives.unchanged, } doc_field_types = [ TypedField('parameter', label=l_('Parameters'), names=('param', 'parameter', 'arg', 'argument', 'keyword', 'kwarg', 'kwparam'), - typerolename='obj', typenames=('paramtype', 'type')), + typerolename='obj', typenames=('paramtype', 'type'), + can_collapse=True), TypedField('variable', label=l_('Variables'), rolename='obj', names=('var', 'ivar', 'cvar'), - typerolename='obj', typenames=('vartype',)), + typerolename='obj', typenames=('vartype',), + can_collapse=True), GroupedField('exceptions', label=l_('Raises'), rolename='exc', names=('raises', 'raise', 'exception', 'except'), can_collapse=True), @@ -63,22 +111,21 @@ class PyObject(ObjectDescription): ] def get_signature_prefix(self, sig): - """ - May return a prefix to put before the object name in the signature. + """May return a prefix to put before the object name in the + signature. """ return '' def needs_arglist(self): - """ - May return true if an empty argument list is to be generated even if + """May return true if an empty argument list is to be generated even if the document contains none. """ return False def handle_signature(self, sig, signode): - """ - Transform a Python signature into RST nodes. - Returns (fully qualified name of the thing, classname if any). + """Transform a Python signature into RST nodes. + + Return (fully qualified name of the thing, classname if any). If inside a class, the current class name is handled intelligently: * it is stripped from the displayed name if present @@ -134,6 +181,8 @@ class PyObject(ObjectDescription): nodetext = modname + '.' signode += addnodes.desc_addname(nodetext, nodetext) + anno = self.options.get('annotation') + signode += addnodes.desc_name(name, name) if not arglist: if self.needs_arglist(): @@ -141,35 +190,19 @@ class PyObject(ObjectDescription): signode += addnodes.desc_parameterlist() if retann: signode += addnodes.desc_returns(retann, retann) + if anno: + signode += addnodes.desc_annotation(' ' + anno, ' ' + anno) return fullname, name_prefix - signode += addnodes.desc_parameterlist() - stack = [signode[-1]] - for token in py_paramlist_re.split(arglist): - if token == '[': - opt = addnodes.desc_optional() - stack[-1] += opt - stack.append(opt) - elif token == ']': - try: - stack.pop() - except IndexError: - raise ValueError - elif not token or token == ',' or token.isspace(): - pass - else: - token = token.strip() - stack[-1] += addnodes.desc_parameter(token, token) - if len(stack) != 1: - raise ValueError + _pseudo_parse_arglist(signode, arglist) if retann: signode += addnodes.desc_returns(retann, retann) + if anno: + signode += addnodes.desc_annotation(' ' + anno, ' ' + anno) return fullname, name_prefix def get_index_text(self, modname, name): - """ - Return the text for the index entry of the object. - """ + """Return the text for the index entry of the object.""" raise NotImplementedError('must be implemented in subclasses') def add_target_and_index(self, name_cls, sig, signode): @@ -196,7 +229,7 @@ class PyObject(ObjectDescription): indextext = self.get_index_text(modname, name_cls) if indextext: self.indexnode['entries'].append(('single', indextext, - fullname, fullname)) + fullname, '')) def before_content(self): # needed for automatic qualification of members (reset in subclasses) @@ -332,6 +365,38 @@ class PyClassmember(PyObject): self.clsname_set = True +class PyDecoratorMixin(object): + """ + Mixin for decorator directives. + """ + def handle_signature(self, sig, signode): + ret = super(PyDecoratorMixin, self).handle_signature(sig, signode) + signode.insert(0, addnodes.desc_addname('@', '@')) + return ret + + def needs_arglist(self): + return False + + +class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel): + """ + Directive to mark functions meant to be used as decorators. + """ + def run(self): + # a decorator function is a function after all + self.name = 'py:function' + return PyModulelevel.run(self) + + +class PyDecoratorMethod(PyDecoratorMixin, PyClassmember): + """ + Directive to mark methods meant to be used as decorators. + """ + def run(self): + self.name = 'py:method' + return PyClassmember.run(self) + + class PyModule(Directive): """ Directive to mark description of a new module. @@ -356,22 +421,18 @@ class PyModule(Directive): env.domaindata['py']['modules'][modname] = \ (env.docname, self.options.get('synopsis', ''), self.options.get('platform', ''), 'deprecated' in self.options) + # make a duplicate entry in 'objects' to facilitate searching for the + # module in PythonDomain.find_obj() + env.domaindata['py']['objects'][modname] = (env.docname, 'module') targetnode = nodes.target('', '', ids=['module-' + modname], ismod=True) self.state.document.note_explicit_target(targetnode) ret = [targetnode] - # XXX this behavior of the module directive is a mess... - if 'platform' in self.options: - platform = self.options['platform'] - node = nodes.paragraph() - node += nodes.emphasis('', _('Platforms: ')) - node += nodes.Text(platform, platform) - ret.append(node) - # the synopsis isn't printed; in fact, it is only used in the - # modindex currently + # the platform and synopsis aren't printed; in fact, they are only used + # in the modindex currently if not noindex: indextext = _('%s (module)') % modname inode = addnodes.index(entries=[('single', indextext, - 'module-' + modname, modname)]) + 'module-' + modname, '')]) ret.append(inode) return ret @@ -506,16 +567,18 @@ class PythonDomain(Domain): } directives = { - 'function': PyModulelevel, - 'data': PyModulelevel, - 'class': PyClasslike, - 'exception': PyClasslike, - 'method': PyClassmember, - 'classmethod': PyClassmember, - 'staticmethod': PyClassmember, - 'attribute': PyClassmember, - 'module': PyModule, - 'currentmodule': PyCurrentModule, + 'function': PyModulelevel, + 'data': PyModulelevel, + 'class': PyClasslike, + 'exception': PyClasslike, + 'method': PyClassmember, + 'classmethod': PyClassmember, + 'staticmethod': PyClassmember, + 'attribute': PyClassmember, + 'module': PyModule, + 'currentmodule': PyCurrentModule, + 'decorator': PyDecoratorFunction, + 'decoratormethod': PyDecoratorMethod, } roles = { 'data': PyXRefRole(), @@ -544,38 +607,46 @@ class PythonDomain(Domain): if fn == docname: del self.data['modules'][modname] - def find_obj(self, env, modname, classname, name, type, searchorder=0): - """ - Find a Python object for "name", perhaps using the given module and/or - classname. Returns a list of (name, object entry) tuples. + def find_obj(self, env, modname, classname, name, type, searchmode=0): + """Find a Python object for "name", perhaps using the given module + and/or classname. Returns a list of (name, object entry) tuples. """ # skip parens if name[-2:] == '()': name = name[:-2] if not name: - return None, None + return [] objects = self.data['objects'] matches = [] newname = None - if searchorder == 1: - if modname and classname and \ - modname + '.' + classname + '.' + name in objects: - newname = modname + '.' + classname + '.' + name - elif modname and modname + '.' + name in objects: - newname = modname + '.' + name - elif name in objects: - newname = name - else: - # "fuzzy" searching mode - searchname = '.' + name - matches = [(name, objects[name]) for name in objects - if name.endswith(searchname)] + if searchmode == 1: + objtypes = self.objtypes_for_role(type) + if modname and classname: + fullname = modname + '.' + classname + '.' + name + if fullname in objects and objects[fullname][1] in objtypes: + newname = fullname + if not newname: + if modname and modname + '.' + name in objects and \ + objects[modname + '.' + name][1] in objtypes: + newname = modname + '.' + name + elif name in objects and objects[name][1] in objtypes: + newname = name + else: + # "fuzzy" searching mode + searchname = '.' + name + matches = [(name, objects[name]) for name in objects + if name.endswith(searchname) + and objects[name][1] in objtypes] else: + # NOTE: searching for exact match, object type is not considered if name in objects: newname = name + elif type == 'mod': + # only exact matches allowed for modules + return [] elif classname and classname + '.' + name in objects: newname = classname + '.' + name elif modname and modname + '.' + name in objects: @@ -597,33 +668,35 @@ class PythonDomain(Domain): def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode): - if (type == 'mod' or - type == 'obj' and target in self.data['modules']): - docname, synopsis, platform, deprecated = \ - self.data['modules'].get(target, ('','','', '')) - if not docname: - return None - else: - title = '%s%s%s' % ((platform and '(%s) ' % platform), - synopsis, - (deprecated and ' (deprecated)' or '')) - return make_refnode(builder, fromdocname, docname, - 'module-' + target, contnode, title) + modname = node.get('py:module') + clsname = node.get('py:class') + searchmode = node.hasattr('refspecific') and 1 or 0 + matches = self.find_obj(env, modname, clsname, target, + type, searchmode) + if not matches: + return None + elif len(matches) > 1: + env.warn(fromdocname, + 'more than one target found for cross-reference ' + '%r: %s' % (target, + ', '.join(match[0] for match in matches)), + node.line) + name, obj = matches[0] + + if obj[1] == 'module': + # get additional info for modules + docname, synopsis, platform, deprecated = self.data['modules'][name] + assert docname == obj[0] + title = name + if synopsis: + title += ': ' + synopsis + if deprecated: + title += _(' (deprecated)') + if platform: + title += ' (' + platform + ')' + return make_refnode(builder, fromdocname, docname, + 'module-' + name, contnode, title) else: - modname = node.get('py:module') - clsname = node.get('py:class') - searchorder = node.hasattr('refspecific') and 1 or 0 - matches = self.find_obj(env, modname, clsname, target, - type, searchorder) - if not matches: - return None - elif len(matches) > 1: - env.warn(fromdocname, - 'more than one target found for cross-reference ' - '%r: %s' % (target, - ', '.join(match[0] for match in matches)), - node.line) - name, obj = matches[0] return make_refnode(builder, fromdocname, obj[0], name, contnode, name) diff --git a/sphinx/domains/rst.py b/sphinx/domains/rst.py index 04092eab0..e67f827e0 100644 --- a/sphinx/domains/rst.py +++ b/sphinx/domains/rst.py @@ -5,7 +5,7 @@ The reStructuredText domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -28,9 +28,10 @@ class ReSTMarkup(ObjectDescription): """ def add_target_and_index(self, name, sig, signode): - if name not in self.state.document.ids: - signode['names'].append(name) - signode['ids'].append(name) + targetname = self.objtype + '-' + name + if targetname not in self.state.document.ids: + signode['names'].append(targetname) + signode['ids'].append(targetname) signode['first'] = (not self.names) self.state.document.note_explicit_target(signode) @@ -47,7 +48,7 @@ class ReSTMarkup(ObjectDescription): indextext = self.get_index_text(self.objtype, name) if indextext: self.indexnode['entries'].append(('single', indextext, - name, name)) + targetname, '')) def get_index_text(self, objectname, name): if self.objtype == 'directive': @@ -58,9 +59,10 @@ class ReSTMarkup(ObjectDescription): def parse_directive(d): - """ - Parses a directive signature. Returns (directive, arguments) string tuple. - if no arguments are given, returns (directive, ''). + """Parse a directive signature. + + Returns (directive, arguments) string tuple. If no arguments are given, + returns (directive, ''). """ dir = d.strip() if not dir.startswith('.'): @@ -129,8 +131,9 @@ class ReSTDomain(Domain): if (objtype, target) in objects: return make_refnode(builder, fromdocname, objects[objtype, target], - target, contnode, target) + objtype + '-' + target, + contnode, target + ' ' + objtype) def get_objects(self): for (typ, name), docname in self.data['objects'].iteritems(): - yield name, name, typ, docname, name, 1 + yield name, name, typ, docname, typ + '-' + name, 1 diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 63a3bf6dc..9d5b0b0f1 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -5,14 +5,16 @@ The standard domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re +import unicodedata from docutils import nodes from docutils.parsers.rst import directives +from docutils.statemachine import ViewList from sphinx import addnodes from sphinx.roles import XRefRole @@ -59,7 +61,7 @@ class GenericObject(ObjectDescription): indextype = 'single' indexentry = self.indextemplate % (name,) self.indexnode['entries'].append((indextype, indexentry, - targetname, targetname)) + targetname, '')) self.env.domaindata['std']['objects'][self.objtype, name] = \ self.env.docname, targetname @@ -80,8 +82,8 @@ class EnvVarXRefRole(XRefRole): tgtid = 'index-%s' % env.new_serialno('index') indexnode = addnodes.index() indexnode['entries'] = [ - ('single', varname, tgtid, varname), - ('single', _('environment variable; %s') % varname, tgtid, varname) + ('single', varname, tgtid, ''), + ('single', _('environment variable; %s') % varname, tgtid, '') ] targetnode = nodes.target('', '', ids=[tgtid]) document.note_explicit_target(targetnode) @@ -116,7 +118,7 @@ class Target(Directive): indextype = indexentry[:colon].strip() indexentry = indexentry[colon+1:].strip() inode = addnodes.index(entries=[(indextype, indexentry, - targetname, targetname)]) + targetname, '')]) ret.insert(0, inode) name = self.name if ':' in self.name: @@ -159,7 +161,7 @@ class Cmdoption(ObjectDescription): self.indexnode['entries'].append( ('pair', _('%scommand line option; %s') % ((currprogram and currprogram + ' ' or ''), sig), - targetname, targetname)) + targetname, '')) self.env.domaindata['std']['progoptions'][currprogram, name] = \ self.env.docname, targetname @@ -205,8 +207,8 @@ class OptionXRefRole(XRefRole): class Glossary(Directive): """ - Directive to create a glossary with cross-reference targets - for :term: roles. + Directive to create a glossary with cross-reference targets for :term: + roles. """ has_content = True @@ -223,37 +225,100 @@ class Glossary(Directive): gloss_entries = env.temp_data.setdefault('gloss_entries', set()) node = addnodes.glossary() node.document = self.state.document - self.state.nested_parse(self.content, self.content_offset, node) - # the content should be definition lists - dls = [child for child in node - if isinstance(child, nodes.definition_list)] - # now, extract definition terms to enable cross-reference creation - new_dl = nodes.definition_list() - new_dl['classes'].append('glossary') + # This directive implements a custom format of the reST definition list + # that allows multiple lines of terms before the definition. This is + # easy to parse since we know that the contents of the glossary *must + # be* a definition list. + + # first, collect single entries + entries = [] + in_definition = True + was_empty = True + messages = [] + for line, (source, lineno) in zip(self.content, self.content.items): + # empty line -> add to last definition + if not line: + if in_definition and entries: + entries[-1][1].append('', source, lineno) + was_empty = True + continue + # unindented line -> a term + if line and not line[0].isspace(): + # first term of definition + if in_definition: + if not was_empty: + messages.append(self.state.reporter.system_message( + 2, 'glossary term must be preceded by empty line', + source=source, line=lineno)) + entries.append(([(line, source, lineno)], ViewList())) + in_definition = False + # second term and following + else: + if was_empty: + messages.append(self.state.reporter.system_message( + 2, 'glossary terms must not be separated by empty ' + 'lines', source=source, line=lineno)) + entries[-1][0].append((line, source, lineno)) + else: + if not in_definition: + # first line of definition, determines indentation + in_definition = True + indent_len = len(line) - len(line.lstrip()) + entries[-1][1].append(line[indent_len:], source, lineno) + was_empty = False + + # now, parse all the entries into a big definition list items = [] - for dl in dls: - for li in dl.children: - if not li.children or not isinstance(li[0], nodes.term): - continue - termtext = li.children[0].astext() + for terms, definition in entries: + termtexts = [] + termnodes = [] + system_messages = [] + ids = [] + for line, source, lineno in terms: + # parse the term with inline markup + res = self.state.inline_text(line, lineno) + system_messages.extend(res[1]) + + # get a text-only representation of the term and register it + # as a cross-reference target + tmp = nodes.paragraph('', '', *res[0]) + termtext = tmp.astext() new_id = 'term-' + nodes.make_id(termtext) if new_id in gloss_entries: new_id = 'term-' + str(len(gloss_entries)) gloss_entries.add(new_id) - li[0]['names'].append(new_id) - li[0]['ids'].append(new_id) + ids.append(new_id) objects['term', termtext.lower()] = env.docname, new_id + termtexts.append(termtext) # add an index entry too indexnode = addnodes.index() - indexnode['entries'] = [('single', termtext, new_id, termtext)] - li.insert(0, indexnode) - items.append((termtext, li)) + indexnode['entries'] = [('single', termtext, new_id, 'main')] + termnodes.append(indexnode) + termnodes.extend(res[0]) + termnodes.append(addnodes.termsep()) + # make a single "term" node with all the terms, separated by termsep + # nodes (remove the dangling trailing separator) + term = nodes.term('', '', *termnodes[:-1]) + term['ids'].extend(ids) + term['names'].extend(ids) + term += system_messages + + defnode = nodes.definition() + self.state.nested_parse(definition, definition.items[0][1], defnode) + + items.append((termtexts, + nodes.definition_list_item('', term, defnode))) + if 'sorted' in self.options: - items.sort(key=lambda x: x[0].lower()) - new_dl.extend(item[1] for item in items) - node.children = [new_dl] - return [node] + items.sort(key=lambda x: + unicodedata.normalize('NFD', x[0][0].lower())) + + dlist = nodes.definition_list() + dlist['classes'].append('glossary') + dlist.extend(item[1] for item in items) + node += dlist + return messages + [node] token_re = re.compile('`([a-z_][a-z0-9_]*)`') @@ -346,11 +411,13 @@ class StandardDomain(Domain): # links to tokens in grammar productions 'token': XRefRole(), # links to terms in glossary - 'term': XRefRole(lowercase=True, innernodeclass=nodes.emphasis), + 'term': XRefRole(lowercase=True, innernodeclass=nodes.emphasis, + warn_dangling=True), # links to headings or arbitrary labels - 'ref': XRefRole(lowercase=True, innernodeclass=nodes.emphasis), + 'ref': XRefRole(lowercase=True, innernodeclass=nodes.emphasis, + warn_dangling=True), # links to labels, without a different title - 'keyword': XRefRole(), + 'keyword': XRefRole(warn_dangling=True), } initial_data = { @@ -368,6 +435,13 @@ class StandardDomain(Domain): }, } + dangling_warnings = { + 'term': 'term not in glossary: %(target)s', + 'ref': 'undefined label: %(target)s (if the link has no caption ' + 'the label must precede a section header)', + 'keyword': 'unknown keyword: %(target)s', + } + def clear_doc(self, docname): for key, (fn, _) in self.data['progoptions'].items(): if fn == docname: @@ -425,27 +499,16 @@ class StandardDomain(Domain): def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): if typ == 'ref': - #refdoc = node.get('refdoc', fromdocname) if node['refexplicit']: # reference to anonymous label; the reference uses # the supplied link caption docname, labelid = self.data['anonlabels'].get(target, ('','')) sectname = node.astext() - # XXX warn somehow if not resolved by intersphinx - #if not docname: - # env.warn(refdoc, 'undefined label: %s' % - # target, node.line) else: # reference to named label; the final node will # contain the section name after the label docname, labelid, sectname = self.data['labels'].get(target, ('','','')) - # XXX warn somehow if not resolved by intersphinx - #if not docname: - # env.warn(refdoc, - # 'undefined label: %s' % target + ' -- if you ' - # 'don\'t give a link caption the label must ' - # 'precede a section header.', node.line) if not docname: return None newnode = nodes.reference('', '', internal=True) @@ -469,30 +532,29 @@ class StandardDomain(Domain): # keywords are oddballs: they are referenced by named labels docname, labelid, _ = self.data['labels'].get(target, ('','','')) if not docname: - #env.warn(refdoc, 'unknown keyword: %s' % target) return None - else: - return make_refnode(builder, fromdocname, docname, - labelid, contnode) + return make_refnode(builder, fromdocname, docname, + labelid, contnode) elif typ == 'option': progname = node['refprogram'] docname, labelid = self.data['progoptions'].get((progname, target), ('', '')) if not docname: return None - else: - return make_refnode(builder, fromdocname, docname, - labelid, contnode) + return make_refnode(builder, fromdocname, docname, + labelid, contnode) else: - docname, labelid = self.data['objects'].get((typ, target), ('', '')) - if not docname: - if typ == 'term': - env.warn(node.get('refdoc', fromdocname), - 'term not in glossary: %s' % target, node.line) - return None + objtypes = self.objtypes_for_role(typ) or [] + for objtype in objtypes: + if (objtype, target) in self.data['objects']: + docname, labelid = self.data['objects'][objtype, target] + break else: - return make_refnode(builder, fromdocname, docname, - labelid, contnode) + docname, labelid = '', '' + if not docname: + return None + return make_refnode(builder, fromdocname, docname, + labelid, contnode) def get_objects(self): for (prog, option), info in self.data['progoptions'].iteritems(): diff --git a/sphinx/environment.py b/sphinx/environment.py index 972bfa3ef..6fe18f59e 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -5,17 +5,20 @@ Global creation environment. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re import os +import sys import time import types import codecs import imghdr import string +import posixpath +import unicodedata import cPickle as pickle from os import path from glob import glob @@ -24,9 +27,9 @@ from itertools import izip, groupby from docutils import nodes from docutils.io import FileInput, NullOutput from docutils.core import Publisher -from docutils.utils import Reporter, relative_path +from docutils.utils import Reporter, relative_path, new_document from docutils.readers import standalone -from docutils.parsers.rst import roles, directives +from docutils.parsers.rst import roles, directives, Parser as RSTParser from docutils.parsers.rst.languages import en as english from docutils.parsers.rst.directives.html import MetaBody from docutils.writers import UnfilteredWriter @@ -34,15 +37,18 @@ from docutils.transforms import Transform from docutils.transforms.parts import ContentsFilter from sphinx import addnodes -from sphinx.util import url_re, get_matching_docs, docname_join, \ +from sphinx.util import url_re, get_matching_docs, docname_join, split_into, \ FilenameUniqDict -from sphinx.util.nodes import clean_astext, make_refnode +from sphinx.util.nodes import clean_astext, make_refnode, extract_messages from sphinx.util.osutil import movefile, SEP, ustrftime from sphinx.util.matching import compile_matchers -from sphinx.util.pycompat import all +from sphinx.util.pycompat import all, class_types +from sphinx.util.websupport import is_commentable from sphinx.errors import SphinxError, ExtensionError -from sphinx.locale import _ +from sphinx.locale import _, init as init_locale +from sphinx.versioning import add_uids, merge_doctrees +fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() orig_role_function = roles.role orig_directive_function = directives.directive @@ -63,7 +69,7 @@ default_settings = { # This is increased every time an environment attribute is added # or changed to properly invalidate pickle files. -ENV_VERSION = 36 +ENV_VERSION = 41 default_substitutions = set([ @@ -74,13 +80,19 @@ default_substitutions = set([ dummy_reporter = Reporter('', 4, 4) +versioning_conditions = { + 'none': False, + 'text': nodes.TextElement, + 'commentable': is_commentable, +} + class WarningStream(object): def __init__(self, warnfunc): self.warnfunc = warnfunc def write(self, text): if text.strip(): - self.warnfunc(text, None, '') + self.warnfunc(text.strip(), None, '') class NoUri(Exception): @@ -177,17 +189,56 @@ class CitationReferences(Transform): for citnode in self.document.traverse(nodes.citation_reference): cittext = citnode.astext() refnode = addnodes.pending_xref(cittext, reftype='citation', - reftarget=cittext) + reftarget=cittext, refwarn=True) + refnode.line = citnode.line or citnode.parent.line refnode += nodes.Text('[' + cittext + ']') citnode.parent.replace(citnode, refnode) +class Locale(Transform): + """ + Replace translatable nodes with their translated doctree. + """ + default_priority = 0 + def apply(self): + env = self.document.settings.env + settings, source = self.document.settings, self.document['source'] + # XXX check if this is reliable + assert source.startswith(env.srcdir) + docname = os.path.splitext(source[len(env.srcdir):].lstrip(os.sep))[0] + section = docname.split(os.sep, 1)[0] + + # fetch translations + dirs = [path.join(env.srcdir, x) + for x in env.config.locale_dirs] + catalog, has_catalog = init_locale(dirs, env.config.language, section) + if not has_catalog: + return + + parser = RSTParser() + + for node, msg in extract_messages(self.document): + patch = new_document(source, settings) + msgstr = catalog.gettext(msg) + # XXX add marker to untranslated parts + if not msgstr or msgstr == msg: # as-of-yet untranslated + continue + parser.parse(msgstr, patch) + patch = patch[0] + # XXX doctest and other block markup + if not isinstance(patch, nodes.paragraph): + continue # skip for now + for child in patch.children: # update leaves + child.parent = node + node.children = patch.children + + class SphinxStandaloneReader(standalone.Reader): """ Add our own transforms. """ - transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets, - HandleCodeBlocks, SortIds] + transforms = [Locale, CitationReferences, DefaultSubstitutions, + MoveModuleTargets, HandleCodeBlocks, SortIds] def get_transforms(self): return standalone.Reader.get_transforms(self) + self.transforms @@ -251,7 +302,7 @@ class BuildEnvironment: if key.startswith('_') or \ isinstance(val, types.ModuleType) or \ isinstance(val, types.FunctionType) or \ - isinstance(val, (type, types.ClassType)): + isinstance(val, class_types): del self.config[key] try: pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL) @@ -270,6 +321,9 @@ class BuildEnvironment: self.srcdir = srcdir self.config = config + # the method of doctree versioning; see set_versioning_method + self.versioning_condition = None + # the application object; only set while update() runs self.app = None @@ -286,6 +340,9 @@ class BuildEnvironment: # this is to invalidate old pickles self.version = ENV_VERSION + # make this a set for faster testing + self._nitpick_ignore = set(self.config.nitpick_ignore) + # All "docnames" here are /-separated and relative and exclude # the source suffix. @@ -294,6 +351,8 @@ class BuildEnvironment: # contains all built docnames self.dependencies = {} # docname -> set of dependent file # names, relative to documentation root + self.reread_always = set() # docnames to re-read unconditionally on + # next build # File metadata self.metadata = {} # docname -> dict of metadata items @@ -335,18 +394,32 @@ class BuildEnvironment: self._warnfunc = func self.settings['warning_stream'] = WarningStream(func) + def set_versioning_method(self, method): + """This sets the doctree versioning method for this environment. + + Versioning methods are a builder property; only builders with the same + versioning method can share the same doctree directory. Therefore, we + raise an exception if the user tries to use an environment with an + incompatible versioning method. + """ + if method not in versioning_conditions: + raise ValueError('invalid versioning method: %r' % method) + condition = versioning_conditions[method] + if self.versioning_condition not in (None, condition): + raise SphinxError('This environment is incompatible with the ' + 'selected builder, please choose another ' + 'doctree directory.') + self.versioning_condition = condition + def warn(self, docname, msg, lineno=None): - if docname: - if lineno is None: - lineno = '' - self._warnfunc(msg, '%s:%s' % (self.doc2path(docname), lineno)) - else: - self._warnfunc(msg) + # strange argument order is due to backwards compatibility + self._warnfunc(msg, (docname, lineno)) def clear_doc(self, docname): """Remove all traces of a source file in the inventory.""" if docname in self.all_docs: self.all_docs.pop(docname, None) + self.reread_always.discard(docname) self.metadata.pop(docname, None) self.dependencies.pop(docname, None) self.titles.pop(docname, None) @@ -376,25 +449,46 @@ class BuildEnvironment: domain.clear_doc(docname) def doc2path(self, docname, base=True, suffix=None): + """Return the filename for the document name. + + If *base* is True, return absolute path under self.srcdir. + If *base* is None, return relative path to self.srcdir. + If *base* is a path string, return absolute path under that. + If *suffix* is not None, add it instead of config.source_suffix. """ - Return the filename for the document name. - If base is True, return absolute path under self.srcdir. - If base is None, return relative path to self.srcdir. - If base is a path string, return absolute path under that. - If suffix is not None, add it instead of config.source_suffix. - """ + docname = docname.replace(SEP, path.sep) suffix = suffix or self.config.source_suffix if base is True: - return path.join(self.srcdir, - docname.replace(SEP, path.sep)) + suffix + return path.join(self.srcdir, docname) + suffix elif base is None: - return docname.replace(SEP, path.sep) + suffix + return docname + suffix else: - return path.join(base, docname.replace(SEP, path.sep)) + suffix + return path.join(base, docname) + suffix + + def relfn2path(self, filename, docname=None): + """Return paths to a file referenced from a document, relative to + documentation root and absolute. + + Absolute filenames are relative to the source dir, while relative + filenames are relative to the dir of the containing document. + """ + if filename.startswith('/') or filename.startswith(os.sep): + rel_fn = filename[1:] + else: + docdir = path.dirname(self.doc2path(docname or self.docname, + base=None)) + rel_fn = path.join(docdir, filename) + try: + return rel_fn, path.join(self.srcdir, rel_fn) + except UnicodeDecodeError: + # the source directory is a bytestring with non-ASCII characters; + # let's try to encode the rel_fn in the file system encoding + enc_rel_fn = rel_fn.encode(sys.getfilesystemencoding()) + return rel_fn, path.join(self.srcdir, enc_rel_fn) def find_files(self, config): - """ - Find all source files in the source dir and put them in self.found_docs. + """Find all source files in the source dir and put them in + self.found_docs. """ matchers = compile_matchers( config.exclude_patterns[:] + @@ -407,9 +501,7 @@ class BuildEnvironment: self.srcdir, config.source_suffix, exclude_matchers=matchers)) def get_outdated_files(self, config_changed): - """ - Return (added, changed, removed) sets. - """ + """Return (added, changed, removed) sets.""" # clear all files no longer present removed = set(self.all_docs) - self.found_docs @@ -429,6 +521,10 @@ class BuildEnvironment: '.doctree')): changed.add(docname) continue + # check the "reread always" list + if docname in self.reread_always: + changed.add(docname) + continue # check the mtime of the document mtime = self.all_docs[docname] newmtime = path.getmtime(self.doc2path(docname)) @@ -455,12 +551,12 @@ class BuildEnvironment: return added, changed, removed def update(self, config, srcdir, doctreedir, app=None): - """ - (Re-)read all files new or changed since last update. Returns a - summary, the total count of documents to reread and an iterator that - yields docnames as it processes them. Store all environment docnames in - the canonical format (ie using SEP as a separator in place of - os.path.sep). + """(Re-)read all files new or changed since last update. + + Returns a summary, the total count of documents to reread and an + iterator that yields docnames as it processes them. Store all + environment docnames in the canonical format (ie using SEP as a + separator in place of os.path.sep). """ config_changed = False if self.config is None: @@ -491,10 +587,15 @@ class BuildEnvironment: added, changed, removed = self.get_outdated_files(config_changed) + # allow user intervention as well + for docs in app.emit('env-get-outdated', self, added, changed, removed): + changed.update(set(docs) & self.found_docs) + # if files were added or removed, all documents with globbed toctrees # must be reread if added or removed: - changed.update(self.glob_toctrees) + # ... but not those that already were removed + changed.update(self.glob_toctrees & self.found_docs) msg += '%s added, %s changed, %s removed' % (len(added), len(changed), len(removed)) @@ -509,8 +610,7 @@ class BuildEnvironment: self.clear_doc(docname) # read all new and changed files - to_read = added | changed - for docname in sorted(to_read): + for docname in sorted(added | changed): yield docname self.read_doc(docname, app=app) @@ -591,8 +691,8 @@ class BuildEnvironment: roles.role = role def read_doc(self, docname, src_path=None, save_parsed=True, app=None): - """ - Parse a file and add/update inventory entries for the doctree. + """Parse a file and add/update inventory entries for the doctree. + If srcpath is given, read from a different source file. """ # remove all inventory entries for that file @@ -627,7 +727,14 @@ class BuildEnvironment: codecs.register_error('sphinx', self.warn_and_replace) class SphinxSourceClass(FileInput): + def __init__(self_, *args, **kwds): + # don't call sys.exit() on IOErrors + kwds['handle_io_errors'] = False + FileInput.__init__(self_, *args, **kwds) + def decode(self_, data): + if isinstance(data, unicode): + return data return data.decode(self_.encoding, 'sphinx') def read(self_): @@ -649,7 +756,7 @@ class BuildEnvironment: destination_class=NullOutput) pub.set_components(None, 'restructuredtext', None) pub.process_programmatic_settings(None, self.settings, None) - pub.set_source(None, src_path) + pub.set_source(None, src_path.encode(fs_encoding)) pub.set_destination(None, None) try: pub.publish() @@ -678,6 +785,25 @@ class BuildEnvironment: # store time of build, for outdated files detection self.all_docs[docname] = time.time() + if self.versioning_condition: + # get old doctree + try: + f = open(self.doc2path(docname, + self.doctreedir, '.doctree'), 'rb') + try: + old_doctree = pickle.load(f) + finally: + f.close() + except EnvironmentError: + old_doctree = None + + # add uids for versioning + if old_doctree is None: + list(add_uids(doctree, self.versioning_condition)) + else: + list(merge_doctrees( + old_doctree, doctree, self.versioning_condition)) + # make it picklable doctree.reporter = None doctree.transformer = None @@ -733,6 +859,9 @@ class BuildEnvironment: def note_dependency(self, filename): self.dependencies.setdefault(self.docname, set()).add(filename) + def note_reread(self): + self.reread_always.add(self.docname) + def note_versionchange(self, type, version, node, lineno): self.versionchanges.setdefault(version, []).append( (type, self.temp_data['docname'], lineno, @@ -742,18 +871,15 @@ class BuildEnvironment: # post-processing of read doctrees def filter_messages(self, doctree): - """ - Filter system messages from a doctree. - """ + """Filter system messages from a doctree.""" filterlevel = self.config.keep_warnings and 2 or 5 for node in doctree.traverse(nodes.system_message): if node['level'] < filterlevel: node.parent.remove(node) + def process_dependencies(self, docname, doctree): - """ - Process docutils-generated dependency info. - """ + """Process docutils-generated dependency info.""" cwd = os.getcwd() frompath = path.join(path.normpath(self.srcdir), 'dummy') deps = doctree.settings.record_dependencies @@ -767,30 +893,20 @@ class BuildEnvironment: self.dependencies.setdefault(docname, set()).add(relpath) def process_downloads(self, docname, doctree): - """ - Process downloadable file paths. - """ - docdir = path.dirname(self.doc2path(docname, base=None)) + """Process downloadable file paths. """ for node in doctree.traverse(addnodes.download_reference): targetname = node['reftarget'] - if targetname.startswith('/') or targetname.startswith(os.sep): - # absolute - filepath = targetname[1:] - else: - filepath = path.normpath(path.join(docdir, node['reftarget'])) - self.dependencies.setdefault(docname, set()).add(filepath) - if not os.access(path.join(self.srcdir, filepath), os.R_OK): - self.warn(docname, 'download file not readable: %s' % filepath, + rel_filename, filename = self.relfn2path(targetname, docname) + self.dependencies.setdefault(docname, set()).add(rel_filename) + if not os.access(filename, os.R_OK): + self.warn(docname, 'download file not readable: %s' % filename, getattr(node, 'line', None)) continue - uniquename = self.dlfiles.add_file(docname, filepath) + uniquename = self.dlfiles.add_file(docname, filename) node['filename'] = uniquename def process_images(self, docname, doctree): - """ - Process and rewrite image URIs. - """ - docdir = path.dirname(self.doc2path(docname, base=None)) + """Process and rewrite image URIs.""" for node in doctree.traverse(nodes.image): # Map the mimetype to the corresponding image. The writer may # choose the best image from these candidates. The special key * is @@ -803,16 +919,11 @@ class BuildEnvironment: node.line) candidates['?'] = imguri continue - # imgpath is the image path *from srcdir* - if imguri.startswith('/') or imguri.startswith(os.sep): - # absolute path (= relative to srcdir) - imgpath = path.normpath(imguri[1:]) - else: - imgpath = path.normpath(path.join(docdir, imguri)) + rel_imgpath, full_imgpath = self.relfn2path(imguri, docname) # set imgpath as default URI - node['uri'] = imgpath - if imgpath.endswith(os.extsep + '*'): - for filename in glob(path.join(self.srcdir, imgpath)): + node['uri'] = rel_imgpath + if rel_imgpath.endswith(os.extsep + '*'): + for filename in glob(full_imgpath): new_imgpath = relative_path(self.srcdir, filename) if filename.lower().endswith('.pdf'): candidates['application/pdf'] = new_imgpath @@ -832,7 +943,7 @@ class BuildEnvironment: if imgtype: candidates['image/' + imgtype] = new_imgpath else: - candidates['*'] = imgpath + candidates['*'] = rel_imgpath # map image paths to unique image names (so that they can be put # into a single directory) for imgpath in candidates.itervalues(): @@ -844,8 +955,8 @@ class BuildEnvironment: self.images.add_file(docname, imgpath) def process_metadata(self, docname, doctree): - """ - Process the docinfo part of the doctree as metadata. + """Process the docinfo part of the doctree as metadata. + Keep processing minimal -- just return what docutils says. """ self.metadata[docname] = md = {} @@ -930,8 +1041,7 @@ class BuildEnvironment: item.replace(para, compact_para) def create_title_from(self, docname, document): - """ - Add a title node to the document (just copy the first section title), + """Add a title node to the document (just copy the first section title), and store that title in the environment. """ titlenode = nodes.title() @@ -969,7 +1079,8 @@ class BuildEnvironment: def note_toctree(self, docname, toctreenode): """Note a TOC tree directive in a document and gather information about - file relations from it.""" + file relations from it. + """ if toctreenode['glob']: self.glob_toctrees.add(docname) if toctreenode.get('numbered'): @@ -1007,6 +1118,12 @@ class BuildEnvironment: # find all toctree nodes in this section and add them # to the toc (just copying the toctree node which is then # resolved in self.get_and_resolve_doctree) + if isinstance(sectionnode, addnodes.only): + onlynode = addnodes.only(expr=sectionnode['expr']) + blist = build_toc(sectionnode, depth) + if blist: + onlynode += blist.children + entries.append(onlynode) if not isinstance(sectionnode, nodes.section): for toctreenode in traverse_in_section(sectionnode, addnodes.toctree): @@ -1028,6 +1145,8 @@ class BuildEnvironment: else: anchorname = '#' + sectionnode['ids'][0] numentries[0] += 1 + # make these nodes: + # list_item -> compact_paragraph -> reference reference = nodes.reference( '', '', internal=True, refuri=docname, anchorname=anchorname, *nodetext) @@ -1046,9 +1165,10 @@ class BuildEnvironment: self.tocs[docname] = nodes.bullet_list('') self.toc_num_entries[docname] = numentries[0] - def get_toc_for(self, docname): + def get_toc_for(self, docname, builder): """Return a TOC nodetree -- for use on the same page only!""" toc = self.tocs[docname].deepcopy() + self.process_only_nodes(toc, builder, docname) for node in toc.traverse(nodes.reference): node['refuri'] = node['anchorname'] or '#' return toc @@ -1075,7 +1195,9 @@ class BuildEnvironment: def get_domain(self, domainname): """Return the domain instance with the specified name. - Raises an ExtensionError if the domain is not registered.""" + + Raises an ExtensionError if the domain is not registered. + """ try: return self.domains[domainname] except KeyError: @@ -1100,7 +1222,8 @@ class BuildEnvironment: def get_and_resolve_doctree(self, docname, builder, doctree=None, prune_toctrees=True): """Read the doctree from the pickle, resolve cross-references and - toctrees and return it.""" + toctrees and return it. + """ if doctree is None: doctree = self.get_doctree(docname) @@ -1120,8 +1243,7 @@ class BuildEnvironment: def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0, titles_only=False, collapse=False, includehidden=False): - """ - Resolve a *toctree* node into individual bullet lists with titles + """Resolve a *toctree* node into individual bullet lists with titles as items, returning None (if no containing titles are found) or a new node. @@ -1137,32 +1259,62 @@ class BuildEnvironment: def _walk_depth(node, depth, maxdepth): """Utility: Cut a TOC at a specified depth.""" + + # For reading this 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> + for subnode in node.children[:]: if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)): + # for <p> and <li>, just indicate the depth level and + # recurse to children subnode['classes'].append('toctree-l%d' % (depth-1)) _walk_depth(subnode, depth, maxdepth) + elif isinstance(subnode, nodes.bullet_list): + # for <ul>, determine if the depth is too large or if the + # entry is to be collapsed if maxdepth > 0 and depth > maxdepth: subnode.parent.replace(subnode, []) else: + # to find out what to collapse, *first* walk subitems, + # since that determines which children point to the + # current page _walk_depth(subnode, depth+1, maxdepth) - # cull sub-entries whose parents aren't 'current' - if (collapse and - depth > 1 and - 'current' not in subnode.parent['classes']): + if (collapse and depth > 1 and + 'iscurrent' not in subnode.parent): subnode.parent.remove(subnode) elif isinstance(subnode, nodes.reference): - # identify the toc entry pointing to the current document - if subnode['refuri'] == docname and \ - not subnode['anchorname']: - # tag the whole branch as 'current' - p = subnode - while p: - p['classes'].append('current') - p = p.parent + # 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 = 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 def _entries_from_toctree(toctreenode, separate=False, subtree=False): """Return TOC entries for a toctree node.""" @@ -1193,6 +1345,7 @@ class BuildEnvironment: toc = nodes.bullet_list('', item) else: toc = self.tocs[ref].deepcopy() + self.process_only_nodes(toc, builder, ref) if title and toc.children and len(toc.children) == 1: child = toc.children[0] for refnode in child.traverse(nodes.reference): @@ -1204,11 +1357,12 @@ class BuildEnvironment: self.warn(docname, 'toctree contains reference to document ' '%r that doesn\'t have a title: no link ' - 'will be generated' % ref) + 'will be generated' % ref, toctreenode.line) except KeyError: # this is raised if the included file does not exist self.warn(docname, 'toctree contains reference to ' - 'nonexisting document %r' % ref) + 'nonexisting document %r' % ref, + toctreenode.line) else: # if titles_only is given, only keep the main title and # sub-toctrees @@ -1271,10 +1425,10 @@ class BuildEnvironment: typ = node['reftype'] target = node['reftarget'] refdoc = node.get('refdoc', fromdocname) - warned = False + domain = None try: - if node.has_key('refdomain') and node['refdomain']: + if 'refdomain' in node and node['refdomain']: # let the domain try to resolve the reference try: domain = self.domains[node['refdomain']] @@ -1287,11 +1441,7 @@ class BuildEnvironment: # directly reference to document by source name; # can be absolute or relative docname = docname_join(refdoc, target) - if docname not in self.all_docs: - self.warn(refdoc, - 'unknown document: %s' % docname, node.line) - warned = True - else: + if docname in self.all_docs: if node['refexplicit']: # reference with explicit title caption = node.astext() @@ -1304,11 +1454,7 @@ class BuildEnvironment: newnode.append(innernode) elif typ == 'citation': docname, labelid = self.citations.get(target, ('', '')) - if not docname: - self.warn(refdoc, - 'citation not found: %s' % target, node.line) - warned = True - else: + if docname: newnode = make_refnode(builder, fromdocname, docname, labelid, contnode) # no new node found? try the missing-reference event @@ -1316,16 +1462,44 @@ class BuildEnvironment: newnode = builder.app.emit_firstresult( 'missing-reference', self, node, contnode) # still not found? warn if in nit-picky mode - if newnode is None and not warned and self.config.nitpicky: - self.warn(refdoc, - 'reference target not found: %stype %s, target %s' - % (node.get('refdomain') and - 'domain %s, ' % node['refdomain'] or '', - typ, target)) + if newnode is None: + self._warn_missing_reference( + fromdocname, typ, target, node, domain) except NoUri: newnode = contnode node.replace_self(newnode or contnode) + # remove only-nodes that do not belong to our builder + self.process_only_nodes(doctree, builder, fromdocname) + + # allow custom references to be resolved + builder.app.emit('doctree-resolved', doctree, fromdocname) + + def _warn_missing_reference(self, fromdoc, typ, target, node, domain): + warn = node.get('refwarn') + if self.config.nitpicky: + warn = True + if self._nitpick_ignore: + dtype = domain and '%s:%s' % (domain.name, typ) or typ + if (dtype, target) in self._nitpick_ignore: + warn = False + if not warn: + return + refdoc = node.get('refdoc', fromdoc) + if domain and typ in domain.dangling_warnings: + msg = domain.dangling_warnings[typ] + elif typ == 'doc': + msg = 'unknown document: %(target)s' + elif typ == 'citation': + msg = 'citation not found: %(target)s' + elif node.get('refdomain', 'std') != 'std': + msg = '%s:%s reference target not found: %%(target)s' % \ + (node['refdomain'], typ) + else: + msg = '%s reference target not found: %%(target)s' % typ + self.warn(refdoc, msg % {'target': target}, node.line) + + def process_only_nodes(self, doctree, builder, fromdocname=None): for node in doctree.traverse(addnodes.only): try: ret = builder.tags.eval_condition(node['expr']) @@ -1337,10 +1511,9 @@ class BuildEnvironment: if ret: node.replace_self(node.children) else: - node.replace_self([]) - - # allow custom references to be resolved - builder.app.emit('doctree-resolved', doctree, fromdocname) + # replacing by [] would result in an "Losing ids" exception + # if there is a target node before the only node + node.replace_self(nodes.comment()) def assign_section_numbers(self): """Assign a section number to each heading under a numbered toctree.""" @@ -1350,149 +1523,160 @@ class BuildEnvironment: old_secnumbers = self.toc_secnumbers self.toc_secnumbers = {} - def _walk_toc(node, secnums, titlenode=None): + def _walk_toc(node, secnums, depth, titlenode=None): # titlenode is the title of the document, it will get assigned a # secnumber too, so that it shows up in next/prev/parent rellinks for subnode in node.children: if isinstance(subnode, nodes.bullet_list): numstack.append(0) - _walk_toc(subnode, secnums, titlenode) + _walk_toc(subnode, secnums, depth-1, titlenode) numstack.pop() titlenode = None elif isinstance(subnode, nodes.list_item): - _walk_toc(subnode, secnums, titlenode) + _walk_toc(subnode, secnums, depth, titlenode) + titlenode = None + elif isinstance(subnode, addnodes.only): + # at this stage we don't know yet which sections are going + # to be included; just include all of them, even if it leads + # to gaps in the numbering + _walk_toc(subnode, secnums, depth, titlenode) titlenode = None elif isinstance(subnode, addnodes.compact_paragraph): numstack[-1] += 1 + if depth > 0: + number = tuple(numstack) + else: + number = None secnums[subnode[0]['anchorname']] = \ - subnode[0]['secnumber'] = tuple(numstack) + subnode[0]['secnumber'] = number if titlenode: - titlenode['secnumber'] = tuple(numstack) + titlenode['secnumber'] = number titlenode = None elif isinstance(subnode, addnodes.toctree): - _walk_toctree(subnode) + _walk_toctree(subnode, depth) - def _walk_toctree(toctreenode): + def _walk_toctree(toctreenode, depth): + if depth == 0: + return for (title, ref) in toctreenode['entries']: if url_re.match(ref) or ref == 'self': # don't mess with those continue if ref in self.tocs: secnums = self.toc_secnumbers[ref] = {} - _walk_toc(self.tocs[ref], secnums, self.titles.get(ref)) + _walk_toc(self.tocs[ref], secnums, depth, + self.titles.get(ref)) if secnums != old_secnumbers.get(ref): rewrite_needed.append(ref) for docname in self.numbered_toctrees: doctree = self.get_doctree(docname) for toctreenode in doctree.traverse(addnodes.toctree): - if toctreenode.get('numbered'): + depth = toctreenode.get('numbered', 0) + if depth: # every numbered toctree gets new numbering numstack = [0] - _walk_toctree(toctreenode) + _walk_toctree(toctreenode, depth) return rewrite_needed - def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')): + def create_index(self, builder, group_entries=True, + _fixre=re.compile(r'(.*) ([(][^()]*[)])')): """Create the real index from the collected index entries.""" new = {} - def add_entry(word, subword, dic=new): + def add_entry(word, subword, link=True, dic=new): entry = dic.get(word) if not entry: dic[word] = entry = [[], {}] if subword: - add_entry(subword, '', dic=entry[1]) - else: + add_entry(subword, '', link=link, dic=entry[1]) + elif link: try: - entry[0].append(builder.get_relative_uri('genindex', fn) - + '#' + tid) + uri = builder.get_relative_uri('genindex', fn) + '#' + tid except NoUri: pass + else: + entry[0].append((main, uri)) for fn, entries in self.indexentries.iteritems(): # new entry types must be listed in directives/other.py! - for type, value, tid, alias in entries: - if type == 'single': - try: - entry, subentry = value.split(';', 1) - except ValueError: - entry, subentry = value, '' - if not entry: - self.warn(fn, 'invalid index entry %r' % value) - continue - add_entry(entry.strip(), subentry.strip()) - elif type == 'pair': - try: - first, second = map(lambda x: x.strip(), - value.split(';', 1)) - if not first or not second: - raise ValueError - except ValueError: - self.warn(fn, 'invalid pair index entry %r' % value) - continue - add_entry(first, second) - add_entry(second, first) - elif type == 'triple': - try: - first, second, third = map(lambda x: x.strip(), - value.split(';', 2)) - if not first or not second or not third: - raise ValueError - except ValueError: - self.warn(fn, 'invalid triple index entry %r' % value) - continue - add_entry(first, second+' '+third) - add_entry(second, third+', '+first) - add_entry(third, first+' '+second) - else: - self.warn(fn, 'unknown index entry type %r' % type) + for type, value, tid, main in entries: + try: + if type == 'single': + try: + entry, subentry = split_into(2, 'single', value) + except ValueError: + entry, = split_into(1, 'single', value) + subentry = '' + add_entry(entry, subentry) + elif type == 'pair': + first, second = split_into(2, 'pair', value) + add_entry(first, second) + add_entry(second, first) + elif type == 'triple': + first, second, third = split_into(3, 'triple', value) + add_entry(first, second+' '+third) + add_entry(second, third+', '+first) + add_entry(third, first+' '+second) + elif type == 'see': + first, second = split_into(2, 'see', value) + add_entry(first, _('see %s') % second, link=False) + elif type == 'seealso': + first, second = split_into(2, 'see', value) + add_entry(first, _('see also %s') % second, link=False) + else: + self.warn(fn, 'unknown index entry type %r' % type) + except ValueError, err: + self.warn(fn, str(err)) # sort the index entries; put all symbols at the front, even those # following the letters in ASCII, this is where the chr(127) comes from def keyfunc(entry, lcletters=string.ascii_lowercase + '_'): - lckey = entry[0].lower() + lckey = unicodedata.normalize('NFD', entry[0].lower()) if lckey[0:1] in lcletters: return chr(127) + lckey return lckey newlist = new.items() newlist.sort(key=keyfunc) - # fixup entries: transform - # func() (in module foo) - # func() (in module bar) - # into - # func() - # (in module foo) - # (in module bar) - oldkey = '' - oldsubitems = None - i = 0 - while i < len(newlist): - key, (targets, subitems) = newlist[i] - # cannot move if it has subitems; structure gets too complex - if not subitems: - m = _fixre.match(key) - if m: - if oldkey == m.group(1): - # prefixes match: add entry as subitem of the - # previous entry - oldsubitems.setdefault(m.group(2), [[], {}])[0].\ - extend(targets) - del newlist[i] - continue - oldkey = m.group(1) - else: - oldkey = key - oldsubitems = subitems - i += 1 + if group_entries: + # fixup entries: transform + # func() (in module foo) + # func() (in module bar) + # into + # func() + # (in module foo) + # (in module bar) + oldkey = '' + oldsubitems = None + i = 0 + while i < len(newlist): + key, (targets, subitems) = newlist[i] + # cannot move if it has subitems; structure gets too complex + if not subitems: + m = _fixre.match(key) + if m: + if oldkey == m.group(1): + # prefixes match: add entry as subitem of the + # previous entry + oldsubitems.setdefault(m.group(2), [[], {}])[0].\ + extend(targets) + del newlist[i] + continue + oldkey = m.group(1) + else: + oldkey = key + oldsubitems = subitems + i += 1 # group the entries by letter - def keyfunc2((k, v), letters=string.ascii_uppercase + '_'): + def keyfunc2(item, letters=string.ascii_uppercase + '_'): # hack: mutating the subitems dicts to a list in the keyfunc + k, v = item v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems()) # now calculate the key - letter = k[0].upper() + letter = unicodedata.normalize('NFD', k[0])[0].upper() if letter in letters: return letter else: @@ -1548,7 +1732,6 @@ class BuildEnvironment: def check_consistency(self): """Do consistency checks.""" - for docname in sorted(self.all_docs): if docname not in self.files_to_rebuild: if docname == self.config.master_doc: diff --git a/sphinx/errors.py b/sphinx/errors.py index b614d9ab0..bfc2be378 100644 --- a/sphinx/errors.py +++ b/sphinx/errors.py @@ -6,7 +6,7 @@ Contains SphinxError and a few subclasses (in an extra module to avoid circular import problems). - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/__init__.py b/sphinx/ext/__init__.py index 31b6f2aef..07269dc08 100644 --- a/sphinx/ext/__init__.py +++ b/sphinx/ext/__init__.py @@ -5,6 +5,6 @@ Contains Sphinx features not activated by default. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index adf08bcde..e00f6fd2c 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -7,14 +7,15 @@ the doctree, thus avoiding duplication between docstrings and documentation for those who like elaborate docstrings. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re import sys import inspect -from types import FunctionType, BuiltinFunctionType, MethodType, ClassType +import traceback +from types import FunctionType, BuiltinFunctionType, MethodType from docutils import nodes from docutils.utils import assemble_option_dict @@ -26,16 +27,12 @@ from sphinx.pycode import ModuleAnalyzer, PycodeError from sphinx.application import ExtensionError from sphinx.util.nodes import nested_parse_with_titles from sphinx.util.compat import Directive -from sphinx.util.inspect import isdescriptor, safe_getmembers, safe_getattr +from sphinx.util.inspect import getargspec, isdescriptor, safe_getmembers, \ + safe_getattr, safe_repr +from sphinx.util.pycompat import base_exception, class_types from sphinx.util.docstrings import prepare_docstring -try: - base_exception = BaseException -except NameError: - base_exception = Exception - - #: extended signature RE: with explicit module name separated by :: py_ext_sig_re = re.compile( r'''^ ([\w.]+::)? # explicit module name @@ -90,7 +87,8 @@ def members_set_option(arg): def bool_option(arg): """Used to convert flag options to auto directives. (Instead of - directives.flag(), which returns None.)""" + directives.flag(), which returns None). + """ return True @@ -107,7 +105,7 @@ class AutodocReporter(object): return getattr(self.reporter, name) def system_message(self, level, message, *children, **kwargs): - if 'line' in kwargs: + if 'line' in kwargs and 'source' not in kwargs: try: source, line = self.viewlist.items[kwargs['line']] except IndexError: @@ -138,8 +136,7 @@ class AutodocReporter(object): # Some useful event listener factories for autodoc-process-docstring. def cut_lines(pre, post=0, what=None): - """ - Return a listener that removes the first *pre* and last *post* + """Return a listener that removes the first *pre* and last *post* lines of every docstring. If *what* is a sequence of strings, only docstrings of a type in *what* will be processed. @@ -165,9 +162,8 @@ def cut_lines(pre, post=0, what=None): return process def between(marker, what=None, keepempty=False, exclude=False): - """ - Return a listener that either keeps, or if *exclude* is True excludes, lines - between lines that match the *marker* regular expression. If no line + """Return a listener that either keeps, or if *exclude* is True excludes, + lines between lines that match the *marker* regular expression. If no line matches, the resulting docstring would be empty, so no change will be made unless *keepempty* is true. @@ -222,6 +218,8 @@ class Documenter(object): priority = 0 #: order if autodoc_member_order is set to 'groupwise' member_order = 0 + #: true if the generated content may contain titles + titles_allowed = False option_spec = {'noindex': bool_option} @@ -256,6 +254,9 @@ class Documenter(object): self.retann = None # the object to document (set after import_object succeeds) self.object = None + self.object_name = None + # the parent/owner of the object to document + self.parent = None # the module analyzer to get at attribute docs, or None self.analyzer = None @@ -264,8 +265,7 @@ class Documenter(object): self.directive.result.append(self.indent + line, source, *lineno) def resolve_name(self, modname, parents, path, base): - """ - Resolve the module and name of the object to document given by the + """Resolve the module and name of the object to document given by the arguments and the current module/class. Must return a pair of the module name and a chain of attributes; for @@ -275,8 +275,7 @@ class Documenter(object): raise NotImplementedError('must be implemented in subclasses') def parse_name(self): - """ - Determine what module to import and what attribute to document. + """Determine what module to import and what attribute to document. Returns True and sets *self.modname*, *self.objpath*, *self.fullname*, *self.args* and *self.retann* if parsing and resolving was successful. @@ -313,38 +312,44 @@ class Documenter(object): return True def import_object(self): - """ - Import the object given by *self.modname* and *self.objpath* and sets + """Import the object given by *self.modname* and *self.objpath* and set it as *self.object*. Returns True if successful, False if an error occurred. """ try: __import__(self.modname) + parent = None obj = self.module = sys.modules[self.modname] for part in self.objpath: + parent = obj obj = self.get_attr(obj, part) + self.object_name = part + self.parent = parent self.object = obj return True # this used to only catch SyntaxError, ImportError and AttributeError, # but importing modules with side effects can raise all kinds of errors except Exception, err: + if self.env.app and not self.env.app.quiet: + self.env.app.info(traceback.format_exc().rstrip()) self.directive.warn( 'autodoc can\'t import/find %s %r, it reported error: ' '"%s", please check your spelling and sys.path' % (self.objtype, str(self.fullname), err)) + self.env.note_reread() return False def get_real_modname(self): - """ - Get the real module name of an object to document. (It can differ - from the name of the module through which the object was imported.) + """Get the real module name of an object to document. + + It can differ from the name of the module through which the object was + imported. """ return self.get_attr(self.object, '__module__', None) or self.modname def check_module(self): - """ - Check if *self.object* is really defined in the module given by + """Check if *self.object* is really defined in the module given by *self.modname*. """ modname = self.get_attr(self.object, '__module__', None) @@ -353,25 +358,26 @@ class Documenter(object): return True def format_args(self): - """ - Format the argument signature of *self.object*. Should return None if - the object does not have a signature. + """Format the argument signature of *self.object*. + + Should return None if the object does not have a signature. """ return None def format_name(self): - """ - Format the name of *self.object*. This normally should be something - that can be parsed by the generated directive, but doesn't need to be - (Sphinx will display it unparsed then). + """Format the name of *self.object*. + + This normally should be something that can be parsed by the generated + directive, but doesn't need to be (Sphinx will display it unparsed + then). """ # normally the name doesn't contain the module (except for module # directives of course) return '.'.join(self.objpath) or self.modname def format_signature(self): - """ - Format the signature (arguments and return annotation) of the object. + """Format the signature (arguments and return annotation) of the object. + Let the user process it via the ``autodoc-process-signature`` event. """ if self.args is not None: @@ -413,13 +419,16 @@ class Documenter(object): # etc. don't support a prepended module name self.add_line(u' :module: %s' % self.modname, '<autodoc>') - def get_doc(self, encoding=None): + def get_doc(self, encoding=None, ignore=1): """Decode and return lines of the docstring(s) for the object.""" docstring = self.get_attr(self.object, '__doc__', None) - if docstring: - # make sure we have Unicode docstrings, then sanitize and split - # into lines - return [prepare_docstring(force_decode(docstring, encoding))] + # make sure we have Unicode docstrings, then sanitize and split + # into lines + if isinstance(docstring, unicode): + return [prepare_docstring(docstring, ignore)] + elif docstring: + return [prepare_docstring(force_decode(docstring, encoding), + ignore)] return [] def process_doc(self, docstrings): @@ -438,8 +447,11 @@ class Documenter(object): # set sourcename and add content from attribute documentation if self.analyzer: # prevent encoding errors when the file name is non-ASCII - filename = unicode(self.analyzer.srcname, - sys.getfilesystemencoding(), 'replace') + if not isinstance(self.analyzer.srcname, unicode): + filename = unicode(self.analyzer.srcname, + sys.getfilesystemencoding(), 'replace') + else: + filename = self.analyzer.srcname sourcename = u'%s:docstring of %s' % (filename, self.fullname) attr_docs = self.analyzer.find_attr_docs() @@ -457,6 +469,11 @@ class Documenter(object): if not no_docstring: encoding = self.analyzer and self.analyzer.encoding docstrings = self.get_doc(encoding) + 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) @@ -466,8 +483,7 @@ class Documenter(object): self.add_line(line, src[0], src[1]) def get_object_members(self, want_all): - """ - Return `(members_check_module, members)` where `members` is a + """Return `(members_check_module, members)` where `members` is a list of `(membername, member)` pairs of the members of *self.object*. If *want_all* is True, return all members. Else, only return those @@ -511,11 +527,15 @@ class Documenter(object): return False, sorted(members) def filter_members(self, members, want_all): - """ - Filter the given member list: members are skipped if + """Filter the given member list. - - they are private (except if given explicitly) - - they are undocumented (except if undoc-members is given) + Members are skipped if + + - they are private (except if given explicitly or the private-members + option is set) + - they are special methods (except if given explicitly or the + special-members option is set) + - they are undocumented (except if the undoc-members option is set) The user can override the skipping decision by connecting to the ``autodoc-skip-member`` event. @@ -535,17 +555,27 @@ class Documenter(object): # if isattr is True, the member is documented as an attribute isattr = False - if want_all and membername.startswith('_'): + if want_all and membername.startswith('__') and \ + membername.endswith('__') and len(membername) > 4: + # special __methods__ + skip = not self.options.special_members + elif want_all and membername.startswith('_'): # ignore members whose name starts with _ by default - skip = True + skip = not self.options.private_members elif (namespace, membername) in attr_docs: # keep documented attributes skip = False isattr = True else: - # ignore undocumented members if :undoc-members: - # is not given + # ignore undocumented members if :undoc-members: is not given doc = self.get_attr(member, '__doc__', None) + # if the member __doc__ is the same as self's __doc__, it's just + # inherited and therefore not the member's doc + cls = self.get_attr(member, '__class__', None) + if cls: + cls_doc = self.get_attr(cls, '__doc__', None) + if cls_doc == doc: + doc = None skip = not self.options.undoc_members and not doc # give the user a chance to decide whether this member @@ -565,9 +595,10 @@ class Documenter(object): return ret def document_members(self, all_members=False): - """ - Generate reST for member documentation. If *all_members* is True, - do all members, else those given by *self.options.members*. + """Generate reST for member documentation. + + If *all_members* is True, do all members, else those given by + *self.options.members*. """ # set current namespace for finding members self.env.temp_data['autodoc:module'] = self.modname @@ -625,8 +656,8 @@ class Documenter(object): def generate(self, more_content=None, real_modname=None, check_module=False, all_members=False): - """ - Generate reST for the object given by *self.name*, and possibly members. + """Generate reST for the object given by *self.name*, and possibly for + its members. If *more_content* is given, include that content. If *real_modname* is given, use that module name to find attribute docs. If *check_module* is @@ -659,7 +690,7 @@ class Documenter(object): # parse right now, to get PycodeErrors on parsing (results will # be cached anyway) self.analyzer.find_attr_docs() - except PycodeError, err: + except PycodeError: # no source file -- e.g. for builtin and C modules self.analyzer = None # at least add the module.__file__ as a dependency @@ -676,7 +707,7 @@ class Documenter(object): # 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(u'', '') + self.add_line(u'', '<autodoc>') # format the object's signature, if any sig = self.format_signature() @@ -701,6 +732,7 @@ class ModuleDocumenter(Documenter): """ objtype = 'module' content_indent = u'' + titles_allowed = True option_spec = { 'members': members_option, 'undoc-members': bool_option, @@ -708,6 +740,7 @@ class ModuleDocumenter(Documenter): 'show-inheritance': bool_option, 'synopsis': identity, 'platform': identity, 'deprecated': bool_option, 'member-order': identity, 'exclude-members': members_set_option, + 'private-members': bool_option, 'special-members': bool_option, } @classmethod @@ -814,7 +847,53 @@ class ClassLevelDocumenter(Documenter): return modname, parents + [base] -class FunctionDocumenter(ModuleLevelDocumenter): +class DocstringSignatureMixin(object): + """ + Mixin for FunctionDocumenter and MethodDocumenter to provide the + feature of reading the signature from the docstring. + """ + + def _find_signature(self, encoding=None): + docstrings = Documenter.get_doc(self, encoding, 2) + if len(docstrings) != 1: + return + doclines = docstrings[0] + setattr(self, '__new_doclines', doclines) + if not doclines: + return + # match first line of docstring against signature RE + match = py_ext_sig_re.match(doclines[0]) + if not match: + return + exmod, path, base, args, retann = match.groups() + # the base name must match ours + if not self.objpath or base != self.objpath[-1]: + return + # ok, now jump over remaining empty lines and set the remaining + # lines as the new doclines + i = 1 + while i < len(doclines) and not doclines[i].strip(): + i += 1 + setattr(self, '__new_doclines', doclines[i:]) + return args, retann + + def get_doc(self, encoding=None, ignore=1): + lines = getattr(self, '__new_doclines', None) + if lines is not None: + return [lines] + return Documenter.get_doc(self, encoding, ignore) + + def format_signature(self): + if self.args is None and self.env.config.autodoc_docstring_signature: + # only act if a signature is not explicitly given already, and if + # the feature is enabled + result = self._find_signature() + if result is not None: + self.args, self.retann = result + return Documenter.format_signature(self) + + +class FunctionDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): """ Specialized Documenter subclass for functions. """ @@ -828,18 +907,18 @@ class FunctionDocumenter(ModuleLevelDocumenter): def format_args(self): if inspect.isbuiltin(self.object) or \ inspect.ismethoddescriptor(self.object): - # can never get arguments of a C function or method - return None + # cannot introspect arguments of a C function or method + pass try: - argspec = inspect.getargspec(self.object) + argspec = getargspec(self.object) except TypeError: # if a class should be documented as function (yay duck # typing) we try to use the constructor signature as function # signature without the first argument. try: - argspec = inspect.getargspec(self.object.__new__) + argspec = getargspec(self.object.__new__) except TypeError: - argspec = inspect.getargspec(self.object.__init__) + argspec = getargspec(self.object.__init__) if argspec[0]: del argspec[0][0] args = inspect.formatargspec(*argspec) @@ -862,11 +941,12 @@ class ClassDocumenter(ModuleLevelDocumenter): 'noindex': bool_option, 'inherited-members': bool_option, 'show-inheritance': bool_option, 'member-order': identity, 'exclude-members': members_set_option, + 'private-members': bool_option, 'special-members': bool_option, } @classmethod def can_document_member(cls, member, membername, isattr, parent): - return isinstance(member, (type, ClassType)) + return isinstance(member, class_types) def import_object(self): ret = ModuleLevelDocumenter.import_object(self) @@ -888,7 +968,7 @@ class ClassDocumenter(ModuleLevelDocumenter): (inspect.ismethod(initmeth) or inspect.isfunction(initmeth)): return None try: - argspec = inspect.getargspec(initmeth) + argspec = getargspec(initmeth) except TypeError: # still not possible: happens e.g. for old-style classes # with __init__ in C @@ -918,13 +998,13 @@ class ClassDocumenter(ModuleLevelDocumenter): self.add_line(_(u' Bases: %s') % ', '.join(bases), '<autodoc>') - def get_doc(self, encoding=None): + def get_doc(self, encoding=None, ignore=1): content = self.env.config.autoclass_content docstrings = [] - docstring = self.get_attr(self.object, '__doc__', None) - if docstring: - docstrings.append(docstring) + attrdocstring = self.get_attr(self.object, '__doc__', None) + 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 @@ -939,9 +1019,12 @@ class ClassDocumenter(ModuleLevelDocumenter): docstrings = [initdocstring] else: docstrings.append(initdocstring) - - return [prepare_docstring(force_decode(docstring, encoding)) - for docstring in docstrings] + doc = [] + for docstring in docstrings: + if not isinstance(docstring, unicode): + docstring = force_decode(docstring, encoding) + doc.append(prepare_docstring(docstring)) + return doc def add_content(self, more_content, no_docstring=False): if self.doc_as_attr: @@ -972,7 +1055,7 @@ class ExceptionDocumenter(ClassDocumenter): @classmethod def can_document_member(cls, member, membername, isattr, parent): - return isinstance(member, (type, ClassType)) and \ + return isinstance(member, class_types) and \ issubclass(member, base_exception) @@ -982,16 +1065,26 @@ class DataDocumenter(ModuleLevelDocumenter): """ objtype = 'data' member_order = 40 + priority = -10 @classmethod def can_document_member(cls, member, membername, isattr, parent): return isinstance(parent, ModuleDocumenter) and isattr + def add_directive_header(self, sig): + ModuleLevelDocumenter.add_directive_header(self, sig) + try: + objrepr = safe_repr(self.object) + except ValueError: + pass + else: + self.add_line(u' :annotation: = ' + objrepr, '<autodoc>') + def document_members(self, all_members=False): pass -class MethodDocumenter(ClassLevelDocumenter): +class MethodDocumenter(DocstringSignatureMixin, ClassLevelDocumenter): """ Specialized Documenter subclass for methods (normal, static and class). """ @@ -1004,31 +1097,45 @@ class MethodDocumenter(ClassLevelDocumenter): return inspect.isroutine(member) and \ not isinstance(parent, ModuleDocumenter) - def import_object(self): - ret = ClassLevelDocumenter.import_object(self) - if isinstance(self.object, classmethod) or \ - (isinstance(self.object, MethodType) and - self.object.im_self is not None): - self.directivetype = 'classmethod' - # document class and static members before ordinary ones - self.member_order = self.member_order - 1 - elif isinstance(self.object, FunctionType) or \ - (isinstance(self.object, BuiltinFunctionType) and - hasattr(self.object, '__self__') and - self.object.__self__ is not None): - self.directivetype = 'staticmethod' - # document class and static members before ordinary ones - self.member_order = self.member_order - 1 - else: - self.directivetype = 'method' - return ret + if sys.version_info >= (3, 0): + def import_object(self): + ret = ClassLevelDocumenter.import_object(self) + obj_from_parent = self.parent.__dict__.get(self.object_name) + if isinstance(obj_from_parent, classmethod): + self.directivetype = 'classmethod' + self.member_order = self.member_order - 1 + elif isinstance(obj_from_parent, staticmethod): + self.directivetype = 'staticmethod' + self.member_order = self.member_order - 1 + else: + self.directivetype = 'method' + return ret + else: + def import_object(self): + ret = ClassLevelDocumenter.import_object(self) + if isinstance(self.object, classmethod) or \ + (isinstance(self.object, MethodType) and + self.object.im_self is not None): + self.directivetype = 'classmethod' + # document class and static members before ordinary ones + self.member_order = self.member_order - 1 + elif isinstance(self.object, FunctionType) or \ + (isinstance(self.object, BuiltinFunctionType) and + hasattr(self.object, '__self__') and + self.object.__self__ is not None): + self.directivetype = 'staticmethod' + # document class and static members before ordinary ones + self.member_order = self.member_order - 1 + else: + self.directivetype = 'method' + return ret def format_args(self): if inspect.isbuiltin(self.object) or \ inspect.ismethoddescriptor(self.object): # can never get arguments of a C function or method return None - argspec = inspect.getargspec(self.object) + argspec = getargspec(self.object) if argspec[0] and argspec[0][0] in ('cls', 'self'): del argspec[0][0] return inspect.formatargspec(*argspec) @@ -1054,12 +1161,44 @@ class AttributeDocumenter(ClassLevelDocumenter): def can_document_member(cls, member, membername, isattr, parent): isdatadesc = isdescriptor(member) and not \ isinstance(member, cls.method_types) - return isdatadesc or \ - (isattr and not isinstance(parent, ModuleDocumenter)) + return isdatadesc or (not isinstance(parent, ModuleDocumenter) + and not inspect.isroutine(member) + and not isinstance(member, class_types)) def document_members(self, all_members=False): pass + def import_object(self): + ret = ClassLevelDocumenter.import_object(self) + if isdescriptor(self.object) and \ + not isinstance(self.object, self.method_types): + self._datadescriptor = True + else: + # if it's not a data descriptor + self._datadescriptor = False + return ret + + def get_real_modname(self): + return self.get_attr(self.parent or self.object, '__module__', None) \ + or self.modname + + def add_directive_header(self, sig): + ClassLevelDocumenter.add_directive_header(self, sig) + if not self._datadescriptor: + try: + objrepr = safe_repr(self.object) + except ValueError: + pass + else: + self.add_line(u' :annotation: = ' + objrepr, '<autodoc>') + + def add_content(self, more_content, no_docstring=False): + if not self._datadescriptor: + # if it's not a data descriptor, its docstring is very probably the + # wrong thing to display + no_docstring = True + ClassLevelDocumenter.add_content(self, more_content, no_docstring) + class InstanceAttributeDocumenter(AttributeDocumenter): """ @@ -1082,6 +1221,7 @@ class InstanceAttributeDocumenter(AttributeDocumenter): """Never import anything.""" # disguise as an attribute self.objtype = 'attribute' + self._datadescriptor = False return True def add_content(self, more_content, no_docstring=False): @@ -1111,8 +1251,10 @@ class AutoDirective(Directive): _special_attrgetters = {} # flags that can be given in autodoc_default_flags - _default_flags = set(['members', 'undoc-members', 'inherited-members', - 'show-inheritance']) + _default_flags = set([ + 'members', 'undoc-members', 'inherited-members', 'show-inheritance', + 'private-members', 'special-members', + ]) # standard docutils directive settings has_content = True @@ -1164,7 +1306,7 @@ class AutoDirective(Directive): self.state.memo.reporter = AutodocReporter(self.result, self.state.memo.reporter) - if self.name == 'automodule': + if documenter.titles_allowed: node = nodes.section() # necessary so that the child nodes get the right source/line set node.document = self.state.document @@ -1202,6 +1344,7 @@ def setup(app): app.add_config_value('autoclass_content', 'class', True) app.add_config_value('autodoc_member_order', 'alphabetic', True) app.add_config_value('autodoc_default_flags', [], True) + app.add_config_value('autodoc_docstring_signature', True, True) app.add_event('autodoc-process-docstring') app.add_event('autodoc-process-signature') app.add_event('autodoc-skip-member') diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index cf67c7fb4..aad8b9f6e 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -49,7 +49,7 @@ resolved to a Python object, and otherwise it becomes simple emphasis. This can be used as the default role to make links 'smart'. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -73,8 +73,7 @@ class autosummary_toc(nodes.comment): pass def process_autosummary_toc(app, doctree): - """ - Insert items described in autosummary:: to the TOC tree, but do + """Insert items described in autosummary:: to the TOC tree, but do not generate the toctree:: list. """ env = app.builder.env @@ -134,27 +133,19 @@ except AttributeError: return False isgetsetdescriptor = ismemberdescriptor -def get_documenter(obj): +def get_documenter(obj, parent): + """Get an autodoc.Documenter class suitable for documenting the given + object. """ - Get an autodoc.Documenter class suitable for documenting the given object - """ - import sphinx.ext.autodoc as autodoc + from sphinx.ext.autodoc import AutoDirective, DataDocumenter - if inspect.isclass(obj): - if issubclass(obj, Exception): - return autodoc.ExceptionDocumenter - return autodoc.ClassDocumenter - elif inspect.ismodule(obj): - return autodoc.ModuleDocumenter - elif inspect.ismethod(obj) or inspect.ismethoddescriptor(obj): - return autodoc.MethodDocumenter - elif (ismemberdescriptor(obj) or isgetsetdescriptor(obj) - or inspect.isdatadescriptor(obj)): - return autodoc.AttributeDocumenter - elif inspect.isroutine(obj): - return autodoc.FunctionDocumenter + classes = [cls for cls in AutoDirective._registry.values() + if cls.can_document_member(obj, '', False, parent)] + if classes: + classes.sort(key=lambda cls: cls.priority) + return classes[-1] else: - return autodoc.DataDocumenter + return DataDocumenter # -- .. autosummary:: ---------------------------------------------------------- @@ -218,8 +209,7 @@ class Autosummary(Directive): return self.warnings + nodes def get_items(self, names): - """ - Try to import the given names, and return a list of + """Try to import the given names, and return a list of ``[(name, signature, summary_string, real_name), ...]``. """ env = self.state.document.settings.env @@ -240,7 +230,7 @@ class Autosummary(Directive): display_name = name.split('.')[-1] try: - obj, real_name = import_by_name(name, prefixes=prefixes) + real_name, obj, parent = import_by_name(name, prefixes=prefixes) except ImportError: self.warn('failed to import %s' % name) items.append((name, '', '', name)) @@ -248,7 +238,7 @@ class Autosummary(Directive): # NB. using real_name here is important, since Documenters # handle module prefixes slightly differently - documenter = get_documenter(obj)(self, real_name) + documenter = get_documenter(obj, parent)(self, real_name) if not documenter.parse_name(): self.warn('failed to parse name %s' % real_name) items.append((display_name, '', '', real_name)) @@ -287,8 +277,7 @@ class Autosummary(Directive): return items def get_table(self, items): - """ - Generate a proper list of table nodes for autosummary:: directive. + """Generate a proper list of table nodes for autosummary:: directive. *items* is a list produced by :meth:`get_items`. """ @@ -351,8 +340,7 @@ def mangle_signature(sig, max_chars=30): return u"(%s)" % sig def limited_join(sep, items, max_chars=30, overflow_marker="..."): - """ - Join a number of strings to one, limiting the length to *max_chars*. + """Join a number of strings to one, limiting the length to *max_chars*. If the string overflows this limit, replace the last fitting item by *overflow_marker*. @@ -377,8 +365,7 @@ def limited_join(sep, items, max_chars=30, overflow_marker="..."): # -- Importing items ----------------------------------------------------------- def import_by_name(name, prefixes=[None]): - """ - Import a Python object that has the given *name*, under one of the + """Import a Python object that has the given *name*, under one of the *prefixes*. The first name that succeeds is used. """ tried = [] @@ -388,7 +375,8 @@ def import_by_name(name, prefixes=[None]): prefixed_name = '.'.join([prefix, name]) else: prefixed_name = name - return _import_by_name(prefixed_name), prefixed_name + obj, parent = _import_by_name(prefixed_name) + return prefixed_name, obj, parent except ImportError: tried.append(prefixed_name) raise ImportError('no module named %s' % ' or '.join(tried)) @@ -403,7 +391,8 @@ def _import_by_name(name): if modname: try: __import__(modname) - return getattr(sys.modules[modname], name_parts[-1]) + mod = sys.modules[modname] + return getattr(mod, name_parts[-1]), mod except (ImportError, IndexError, AttributeError): pass @@ -421,12 +410,14 @@ def _import_by_name(name): 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 + return obj, parent else: - return sys.modules[modname] + return sys.modules[modname], None except (ValueError, ImportError, AttributeError, KeyError), e: raise ImportError(*e.args) @@ -435,8 +426,7 @@ def _import_by_name(name): def autolink_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]): - """ - Smart linking role. + """Smart linking role. Expands to ':obj:`text`' if `text` is an object that can be imported; otherwise expands to '*text*'. @@ -449,7 +439,7 @@ def autolink_role(typ, rawtext, etext, lineno, inliner, prefixes = [None] #prefixes.insert(0, inliner.document.settings.env.currmodule) try: - obj, name = import_by_name(pnode['reftarget'], prefixes) + name, obj, parent = import_by_name(pnode['reftarget'], prefixes) except ImportError: content = pnode[0] r[0][0] = nodes.emphasis(rawtext, content[0].astext(), @@ -487,12 +477,14 @@ def setup(app): html=(autosummary_toc_visit_html, autosummary_noop), latex=(autosummary_noop, autosummary_noop), text=(autosummary_noop, autosummary_noop), - man=(autosummary_noop, autosummary_noop)) + man=(autosummary_noop, autosummary_noop), + texinfo=(autosummary_noop, autosummary_noop)) app.add_node(autosummary_table, html=(autosummary_table_visit_html, autosummary_noop), latex=(autosummary_noop, autosummary_noop), text=(autosummary_noop, autosummary_noop), - man=(autosummary_noop, autosummary_noop)) + man=(autosummary_noop, autosummary_noop), + texinfo=(autosummary_noop, autosummary_noop)) app.add_directive('autosummary', Autosummary) app.add_role('autolink', autolink_role) app.connect('doctree-read', process_autosummary_toc) diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py index 66a124d27..fecb5689a 100644 --- a/sphinx/ext/autosummary/generate.py +++ b/sphinx/ext/autosummary/generate.py @@ -12,11 +12,12 @@ Example Makefile rule:: generate: - sphinx-autogen source/*.rst source/generated + sphinx-autogen -o source/generated source/*.rst - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ + import os import re import sys @@ -107,7 +108,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', ensuredir(path) try: - obj, name = import_by_name(name) + name, obj, parent = import_by_name(name) except ImportError, e: warn('[autosummary] failed to import %r: %s' % (name, e)) continue @@ -123,7 +124,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', f = open(fn, 'w') try: - doc = get_documenter(obj) + doc = get_documenter(obj, parent) if template_name is not None: template = template_env.get_template(template_name) @@ -137,7 +138,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', def get_members(obj, typ, include_public=[]): items = [ name for name in dir(obj) - if get_documenter(getattr(obj, name)).objtype == typ + if get_documenter(getattr(obj, name), obj).objtype == typ ] public = [x for x in items if x in include_public or not x.startswith('_')] @@ -193,8 +194,8 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', # -- Finding documented entries in files --------------------------------------- def find_autosummary_in_files(filenames): - """ - Find out what items are documented in source/*.rst. + """Find out what items are documented in source/*.rst. + See `find_autosummary_in_lines`. """ documented = [] @@ -206,12 +207,12 @@ def find_autosummary_in_files(filenames): return documented def find_autosummary_in_docstring(name, module=None, filename=None): - """ - Find out what items are documented in the given object's docstring. + """Find out what items are documented in the given object's docstring. + See `find_autosummary_in_lines`. """ try: - obj, real_name = import_by_name(name) + real_name, obj, parent = import_by_name(name) lines = pydoc.getdoc(obj).splitlines() return find_autosummary_in_lines(lines, module=name, filename=filename) except AttributeError: @@ -221,8 +222,8 @@ def find_autosummary_in_docstring(name, module=None, filename=None): return [] def find_autosummary_in_lines(lines, module=None, filename=None): - """ - Find out what items appear in autosummary:: directives in the given lines. + """Find out what items appear in autosummary:: directives in the + given lines. Returns a list of (name, toctree, template) where *name* is a name of an object and *toctree* the :toctree: path of the corresponding diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 4924d30b0..e3e3a65eb 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -6,7 +6,7 @@ Check Python modules and C API for coverage. Mostly written by Josip Dzolonga for the Google Highly Open Participation contest. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -105,7 +105,8 @@ class CoverageBuilder(Builder): output_file = path.join(self.outdir, 'c.txt') op = open(output_file, 'w') try: - write_header(op, 'Undocumented C API elements', '=') + if self.config.coverage_write_headline: + write_header(op, 'Undocumented C API elements', '=') op.write('\n') for filename, undoc in self.c_undoc.iteritems(): @@ -120,6 +121,8 @@ class CoverageBuilder(Builder): objects = self.env.domaindata['py']['objects'] modules = self.env.domaindata['py']['modules'] + skip_undoc = self.config.coverage_skip_undoc_in_source + for mod_name in modules: ignore = False for exp in self.mod_ignorexps: @@ -160,6 +163,8 @@ class CoverageBuilder(Builder): if exp.match(name): break else: + if skip_undoc and not obj.__doc__: + continue funcs.append(name) elif inspect.isclass(obj): for exp in self.cls_ignorexps: @@ -167,17 +172,27 @@ class CoverageBuilder(Builder): break else: if full_name not in objects: + if skip_undoc and not obj.__doc__: + continue # not documented at all classes[name] = [] continue attrs = [] - for attr_name, attr in inspect.getmembers( - obj, inspect.ismethod): + for attr_name in dir(obj): + if attr_name not in obj.__dict__: + continue + attr = getattr(obj, attr_name) + if not (inspect.ismethod(attr) or + inspect.isfunction(attr)): + continue if attr_name[0] == '_': # starts with an underscore, ignore it continue + if skip_undoc and not attr.__doc__: + # skip methods without docstring if wished + continue full_attr_name = '%s.%s' % (full_name, attr_name) if full_attr_name not in objects: @@ -194,8 +209,8 @@ class CoverageBuilder(Builder): op = open(output_file, 'w') failed = [] try: - write_header(op, 'Undocumented Python objects', '=') - + if self.config.coverage_write_headline: + write_header(op, 'Undocumented Python objects', '=') keys = self.py_undoc.keys() keys.sort() for name in keys: @@ -245,3 +260,5 @@ def setup(app): app.add_config_value('coverage_c_path', [], False) app.add_config_value('coverage_c_regexes', {}, False) app.add_config_value('coverage_ignore_c_items', {}, False) + app.add_config_value('coverage_write_headline', True, False) + app.add_config_value('coverage_skip_undoc_in_source', False, False) diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index 9d681f904..2952388fe 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -6,7 +6,7 @@ Mimic doctest by automatically executing code snippets and checking their results. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -56,7 +56,7 @@ class TestDirective(Directive): test = code code = doctestopt_re.sub('', code) nodetype = nodes.literal_block - if self.name == 'testsetup' or 'hide' in self.options: + if self.name in ('testsetup', 'testcleanup') or 'hide' in self.options: nodetype = nodes.comment if self.arguments: groups = [x.strip() for x in self.arguments[0].split(',')] @@ -86,6 +86,9 @@ class TestDirective(Directive): class TestsetupDirective(TestDirective): option_spec = {} +class TestcleanupDirective(TestDirective): + option_spec = {} + class DoctestDirective(TestDirective): option_spec = { 'hide': directives.flag, @@ -113,6 +116,7 @@ class TestGroup(object): self.name = name self.setup = [] self.tests = [] + self.cleanup = [] def add_code(self, code, prepend=False): if code.type == 'testsetup': @@ -120,6 +124,8 @@ class TestGroup(object): self.setup.insert(0, code) else: self.setup.append(code) + elif code.type == 'testcleanup': + self.cleanup.append(code) elif code.type == 'doctest': self.tests.append([code]) elif code.type == 'testcode': @@ -131,8 +137,8 @@ class TestGroup(object): raise RuntimeError('invalid TestCode type') def __repr__(self): - return 'TestGroup(name=%r, setup=%r, tests=%r)' % ( - self.name, self.setup, self.tests) + return 'TestGroup(name=%r, setup=%r, cleanup=%r, tests=%r)' % ( + self.name, self.setup, self.cleanup, self.tests) class TestCode(object): @@ -149,14 +155,14 @@ class TestCode(object): class SphinxDocTestRunner(doctest.DocTestRunner): def summarize(self, out, verbose=None): - io = StringIO.StringIO() + string_io = StringIO.StringIO() old_stdout = sys.stdout - sys.stdout = io + sys.stdout = string_io try: res = doctest.DocTestRunner.summarize(self, verbose) finally: sys.stdout = old_stdout - out(io.getvalue()) + out(string_io.getvalue()) return res def _DocTestRunner__patched_linecache_getlines(self, filename, @@ -204,6 +210,8 @@ class DocTestBuilder(Builder): self.total_tries = 0 self.setup_failures = 0 self.setup_tries = 0 + self.cleanup_failures = 0 + self.cleanup_tries = 0 date = time.strftime('%Y-%m-%d %H:%M:%S') @@ -240,12 +248,14 @@ Doctest summary %5d test%s %5d failure%s in tests %5d failure%s in setup code +%5d failure%s in cleanup code ''' % (self.total_tries, s(self.total_tries), self.total_failures, s(self.total_failures), - self.setup_failures, s(self.setup_failures))) + self.setup_failures, s(self.setup_failures), + self.cleanup_failures, s(self.cleanup_failures))) self.outfile.close() - if self.total_failures or self.setup_failures: + if self.total_failures or self.setup_failures or self.cleanup_failures: self.app.statuscode = 1 def write(self, build_docnames, updated_docnames, method='update'): @@ -265,6 +275,12 @@ Doctest summary optionflags=self.opt) self.test_runner = SphinxDocTestRunner(verbose=False, optionflags=self.opt) + self.cleanup_runner = SphinxDocTestRunner(verbose=False, + optionflags=self.opt) + + self.test_runner._fakeout = self.setup_runner._fakeout + self.cleanup_runner._fakeout = self.setup_runner._fakeout + if self.config.doctest_test_doctest_blocks: def condition(node): return (isinstance(node, (nodes.literal_block, nodes.comment)) @@ -298,6 +314,11 @@ Doctest summary 'testsetup', lineno=0) for group in groups.itervalues(): group.add_code(code, prepend=True) + if self.config.doctest_global_cleanup: + code = TestCode(self.config.doctest_global_cleanup, + 'testcleanup', lineno=0) + for group in groups.itervalues(): + group.add_code(code) if not groups: return @@ -313,29 +334,43 @@ Doctest summary res_f, res_t = self.test_runner.summarize(self._out, verbose=True) self.total_failures += res_f self.total_tries += res_t + if self.cleanup_runner.tries: + res_f, res_t = self.cleanup_runner.summarize(self._out, + verbose=True) + self.cleanup_failures += res_f + self.cleanup_tries += res_t def compile(self, code, name, type, flags, dont_inherit): return compile(code, name, self.type, flags, dont_inherit) def test_group(self, group, filename): ns = {} - setup_examples = [] - for setup in group.setup: - setup_examples.append(doctest.Example(setup.code, '', - lineno=setup.lineno)) - if setup_examples: - # simulate a doctest with the setup code - setup_doctest = doctest.DocTest(setup_examples, {}, - '%s (setup code)' % group.name, - filename, 0, None) - setup_doctest.globs = ns - old_f = self.setup_runner.failures + + def run_setup_cleanup(runner, testcodes, what): + examples = [] + for testcode in testcodes: + examples.append(doctest.Example(testcode.code, '', + lineno=testcode.lineno)) + if not examples: + return True + # simulate a doctest with the code + sim_doctest = doctest.DocTest(examples, {}, + '%s (%s code)' % (group.name, what), + filename, 0, None) + sim_doctest.globs = ns + old_f = runner.failures self.type = 'exec' # the snippet may contain multiple statements - self.setup_runner.run(setup_doctest, out=self._warn_out, - clear_globs=False) - if self.setup_runner.failures > old_f: - # don't run the group - return + runner.run(sim_doctest, out=self._warn_out, clear_globs=False) + if runner.failures > old_f: + return False + return True + + # run the setup code + if not run_setup_cleanup(self.setup_runner, group.setup, 'setup'): + # if setup failed, don't run the group + return + + # run the tests for code in group.tests: if len(code) == 1: # ordinary doctests (code/output interleaved) @@ -373,9 +408,13 @@ Doctest summary # also don't clear the globs namespace after running the doctest self.test_runner.run(test, out=self._warn_out, clear_globs=False) + # run the cleanup + run_setup_cleanup(self.cleanup_runner, group.cleanup, 'cleanup') + def setup(app): app.add_directive('testsetup', TestsetupDirective) + app.add_directive('testcleanup', TestcleanupDirective) app.add_directive('doctest', DoctestDirective) app.add_directive('testcode', TestcodeDirective) app.add_directive('testoutput', TestoutputDirective) @@ -384,3 +423,4 @@ def setup(app): app.add_config_value('doctest_path', [], False) app.add_config_value('doctest_test_doctest_blocks', 'default', False) app.add_config_value('doctest_global_setup', '', False) + app.add_config_value('doctest_global_cleanup', '', False) diff --git a/sphinx/ext/extlinks.py b/sphinx/ext/extlinks.py index 9a29918a5..910354a29 100644 --- a/sphinx/ext/extlinks.py +++ b/sphinx/ext/extlinks.py @@ -20,7 +20,7 @@ You can also give an explicit caption, e.g. :exmpl:`Foo <foo>`. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index 106de7a65..57a08375d 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -6,11 +6,12 @@ Allow graphviz-formatted graphs to be included in Sphinx-generated documents inline. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re +import codecs import posixpath from os import path from math import ceil @@ -46,23 +47,48 @@ class Graphviz(Directive): """ has_content = True required_arguments = 0 - optional_arguments = 0 + optional_arguments = 1 final_argument_whitespace = False option_spec = { 'alt': directives.unchanged, + 'inline': directives.flag, + 'caption': directives.unchanged, } def run(self): - dotcode = '\n'.join(self.content) - if not dotcode.strip(): - return [self.state_machine.reporter.warning( - 'Ignoring "graphviz" directive without content.', - line=self.lineno)] + if self.arguments: + document = self.state.document + if self.content: + return [document.reporter.warning( + 'Graphviz directive cannot have both content and ' + 'a filename argument', line=self.lineno)] + env = self.state.document.settings.env + rel_filename, filename = env.relfn2path(self.arguments[0]) + env.note_dependency(rel_filename) + try: + fp = codecs.open(filename, 'r', 'utf-8') + try: + dotcode = fp.read() + finally: + fp.close() + except (IOError, OSError): + return [document.reporter.warning( + 'External Graphviz file %r not found or reading ' + 'it failed' % filename, line=self.lineno)] + else: + dotcode = '\n'.join(self.content) + if not dotcode.strip(): + return [self.state_machine.reporter.warning( + 'Ignoring "graphviz" directive without content.', + line=self.lineno)] node = graphviz() node['code'] = dotcode node['options'] = [] if 'alt' in self.options: node['alt'] = self.options['alt'] + if 'caption' in self.options: + node['caption'] = self.options['caption'] + node['inline'] = 'inline' in self.options return [node] @@ -76,6 +102,8 @@ class GraphvizSimple(Directive): final_argument_whitespace = False option_spec = { 'alt': directives.unchanged, + 'inline': directives.flag, + 'caption': directives.unchanged, } def run(self): @@ -85,14 +113,16 @@ class GraphvizSimple(Directive): node['options'] = [] if 'alt' in self.options: node['alt'] = self.options['alt'] + if 'caption' in self.options: + node['caption'] = self.options['caption'] + node['inline'] = 'inline' in self.options return [node] def render_dot(self, code, options, format, prefix='graphviz'): - """ - Render graphviz code into a PNG or PDF output file. - """ + """Render graphviz code into a PNG or PDF output file.""" hashkey = code.encode('utf-8') + str(options) + \ + str(self.builder.config.graphviz_dot) + \ str(self.builder.config.graphviz_dot_args) fname = '%s-%s.%s' % (prefix, sha(hashkey).hexdigest(), format) if hasattr(self.builder, 'imgpath'): @@ -193,7 +223,13 @@ def render_dot_html(self, node, code, options, prefix='graphviz', self.builder.warn('dot code %r: ' % code + str(exc)) raise nodes.SkipNode - self.body.append(self.starttag(node, 'p', CLASS='graphviz')) + inline = node.get('inline', False) + if inline: + wrapper = 'span' + else: + wrapper = 'p' + + self.body.append(self.starttag(node, wrapper, CLASS='graphviz')) if fname is None: self.body.append(self.encode(code)) else: @@ -219,8 +255,11 @@ def render_dot_html(self, node, code, options, prefix='graphviz', self.body.append('<img src="%s" alt="%s" usemap="#%s" %s/>\n' % (fname, alt, mapname, imgcss)) self.body.extend(imgmap) + if node.get('caption') and not inline: + self.body.append('</p>\n<p class="caption">') + self.body.append(self.encode(node['caption'])) - self.body.append('</p>\n') + self.body.append('</%s>\n' % wrapper) raise nodes.SkipNode @@ -235,8 +274,25 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'): self.builder.warn('dot code %r: ' % code + str(exc)) raise nodes.SkipNode + inline = node.get('inline', False) + if inline: + para_separator = '' + else: + para_separator = '\n' + if fname is not None: - self.body.append('\\includegraphics{%s}' % fname) + caption = node.get('caption') + # XXX add ids from previous target node + if caption and not inline: + self.body.append('\n\\begin{figure}[h!]') + self.body.append('\n\\begin{center}') + self.body.append('\n\\caption{%s}' % self.encode(caption)) + self.body.append('\n\\includegraphics{%s}' % fname) + self.body.append('\n\\end{center}') + self.body.append('\n\\end{figure}\n') + else: + self.body.append('%s\\includegraphics{%s}%s' % + (para_separator, fname, para_separator)) raise nodes.SkipNode diff --git a/sphinx/ext/ifconfig.py b/sphinx/ext/ifconfig.py index cdb6e2c3c..5698ca28c 100644 --- a/sphinx/ext/ifconfig.py +++ b/sphinx/ext/ifconfig.py @@ -16,7 +16,7 @@ namespace of the project configuration (that is, all variables from ``conf.py`` are available.) - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index b930d8cab..fba083bf4 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -""" +r""" sphinx.ext.inheritance_diagram ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -32,7 +32,7 @@ The graph is inserted as a PNG+image map into HTML and a PDF in LaTeX. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -66,28 +66,26 @@ class InheritanceGraph(object): from all the way to the root "object", and then is able to generate a graphviz dot graph from them. """ - def __init__(self, class_names, currmodule, show_builtins=False): - """ - *class_names* is a list of child classes to show bases from. + def __init__(self, class_names, currmodule, show_builtins=False, + private_bases=False, parts=0): + """*class_names* is a list of child classes to show bases from. If *show_builtins* is True, then Python builtins will be shown in the graph. """ self.class_names = class_names - self.classes = self._import_classes(class_names, currmodule) - self.all_classes = self._all_classes(self.classes) - if len(self.all_classes) == 0: + classes = self._import_classes(class_names, currmodule) + self.class_info = self._class_info(classes, show_builtins, + private_bases, parts) + if not self.class_info: raise InheritanceException('No classes found for ' 'inheritance diagram') - self.show_builtins = show_builtins def _import_class_or_module(self, name, currmodule): - """ - Import a class using its fully-qualified *name*. - """ + """Import a class using its fully-qualified *name*.""" try: path, base = class_sig_re.match(name).groups() - except ValueError: + except (AttributeError, ValueError): raise InheritanceException('Invalid class or module %r specified ' 'for inheritance diagram' % name) @@ -129,36 +127,52 @@ class InheritanceGraph(object): 'not a class or module' % name) def _import_classes(self, class_names, currmodule): - """ - Import a list of classes. - """ + """Import a list of classes.""" classes = [] for name in class_names: classes.extend(self._import_class_or_module(name, currmodule)) return classes - def _all_classes(self, classes): - """ - Return a list of all classes that are ancestors of *classes*. + def _class_info(self, classes, show_builtins, private_bases, parts): + """Return name and bases for all classes that are ancestors of + *classes*. + + *parts* gives the number of dotted name parts that is removed from the + displayed node names. """ all_classes = {} + builtins = __builtins__.values() def recurse(cls): - all_classes[cls] = None - for c in cls.__bases__: - if c not in all_classes: - recurse(c) + if not show_builtins and cls in builtins: + return + if not private_bases and cls.__name__.startswith('_'): + return + + nodename = self.class_name(cls, parts) + fullname = self.class_name(cls, 0) + + baselist = [] + all_classes[cls] = (nodename, fullname, baselist) + for base in cls.__bases__: + if not show_builtins and base in builtins: + continue + if not private_bases and base.__name__.startswith('_'): + continue + baselist.append(self.class_name(base, parts)) + if base not in all_classes: + recurse(base) for cls in classes: recurse(cls) - return all_classes.keys() + return all_classes.values() def class_name(self, cls, parts=0): - """ - 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. + """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 == '__builtin__': @@ -171,10 +185,8 @@ class InheritanceGraph(object): return '.'.join(name_parts[-parts:]) def get_all_class_names(self): - """ - Get all of the class names involved in the graph. - """ - return [self.class_name(x) for x in self.all_classes] + """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 = { @@ -200,11 +212,10 @@ class InheritanceGraph(object): def _format_graph_attrs(self, attrs): return ''.join(['%s=%s;\n' % x for x in attrs.items()]) - def generate_dot(self, name, parts=0, urls={}, env=None, + def generate_dot(self, name, urls={}, env=None, graph_attrs={}, node_attrs={}, edge_attrs={}): - """ - Generate a graphviz dot graph from the classes that - were passed in to __init__. + """Generate a graphviz dot graph from the classes that were passed in + to __init__. *name* is the name of the graph. @@ -228,26 +239,17 @@ class InheritanceGraph(object): res.append('digraph %s {\n' % name) res.append(self._format_graph_attrs(g_attrs)) - for cls in self.all_classes: - if not self.show_builtins and cls in __builtins__.values(): - continue - - name = self.class_name(cls, parts) - + for name, fullname, bases in self.class_info: # Write the node this_node_attrs = n_attrs.copy() - url = urls.get(self.class_name(cls)) + url = urls.get(fullname) if url is not None: this_node_attrs['URL'] = '"%s"' % url res.append(' "%s" [%s];\n' % (name, self._format_node_attrs(this_node_attrs))) # Write the edges - for base in cls.__bases__: - if not self.show_builtins and base in __builtins__.values(): - continue - - base_name = self.class_name(base, parts) + for base_name in bases: res.append(' "%s" -> "%s" [%s];\n' % (base_name, name, self._format_node_attrs(e_attrs))) @@ -272,6 +274,7 @@ class InheritanceDiagram(Directive): final_argument_whitespace = True option_spec = { 'parts': directives.nonnegative_int, + 'private-bases': directives.flag, } def run(self): @@ -280,11 +283,16 @@ class InheritanceDiagram(Directive): env = self.state.document.settings.env class_names = self.arguments[0].split() class_role = 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) # Create a graph starting with the list of classes try: - graph = InheritanceGraph(class_names, - env.temp_data.get('py:module')) + graph = InheritanceGraph( + class_names, env.temp_data.get('py:module'), + parts=node['parts'], + private_bases='private-bases' in self.options) except InheritanceException, err: return [node.document.reporter.warning(err.args[0], line=self.lineno)] @@ -300,9 +308,6 @@ class InheritanceDiagram(Directive): # Store the graph object so we can use it to generate the # dot file later node['graph'] = graph - # Store the original content for use as a hash - node['parts'] = self.options.get('parts', 0) - node['content'] = ', '.join(class_names) return [node] @@ -316,7 +321,6 @@ def html_visit_inheritance_diagram(self, node): image map. """ graph = node['graph'] - parts = node['parts'] graph_hash = get_graph_hash(node) name = 'inheritance%s' % graph_hash @@ -329,7 +333,7 @@ def html_visit_inheritance_diagram(self, node): elif child.get('refid') is not None: urls[child['reftitle']] = '#' + child.get('refid') - dotcode = graph.generate_dot(name, parts, urls, env=self.builder.env) + 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 @@ -340,12 +344,11 @@ def latex_visit_inheritance_diagram(self, node): Output the graph for LaTeX. This will insert a PDF. """ graph = node['graph'] - parts = node['parts'] graph_hash = get_graph_hash(node) name = 'inheritance%s' % graph_hash - dotcode = graph.generate_dot(name, parts, env=self.builder.env, + 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 @@ -362,7 +365,8 @@ def setup(app): latex=(latex_visit_inheritance_diagram, None), html=(html_visit_inheritance_diagram, None), text=(skip, None), - man=(skip, None)) + man=(skip, None), + texinfo=(skip, None)) app.add_directive('inheritance-diagram', InheritanceDiagram) app.add_config_value('inheritance_graph_attrs', {}, False), app.add_config_value('inheritance_node_attrs', {}, False), diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index 4fb3805f9..709428a35 100644 --- a/sphinx/ext/intersphinx.py +++ b/sphinx/ext/intersphinx.py @@ -20,12 +20,13 @@ also be specified individually, e.g. if the docs should be buildable without Internet access. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import time import zlib +import codecs import urllib2 import posixpath from os import path @@ -33,19 +34,26 @@ from os import path from docutils import nodes from sphinx.builders.html import INVENTORY_FILENAME +from sphinx.util.pycompat import b + handlers = [urllib2.ProxyHandler(), urllib2.HTTPRedirectHandler(), urllib2.HTTPHandler()] -if hasattr(urllib2, 'HTTPSHandler'): +try: handlers.append(urllib2.HTTPSHandler) +except NameError: + pass urllib2.install_opener(urllib2.build_opener(*handlers)) +UTF8StreamReader = codecs.lookup('utf-8')[2] + def read_inventory_v1(f, uri, join): + f = UTF8StreamReader(f) invdata = {} line = f.next() - projname = line.rstrip()[11:].decode('utf-8') + projname = line.rstrip()[11:] line = f.next() version = line.rstrip()[11:] for line in f: @@ -68,25 +76,25 @@ def read_inventory_v2(f, uri, join, bufsize=16*1024): projname = line.rstrip()[11:].decode('utf-8') line = f.readline() version = line.rstrip()[11:].decode('utf-8') - line = f.readline() + line = f.readline().decode('utf-8') if 'zlib' not in line: raise ValueError def read_chunks(): decompressor = zlib.decompressobj() - for chunk in iter(lambda: f.read(bufsize), ''): + for chunk in iter(lambda: f.read(bufsize), b('')): yield decompressor.decompress(chunk) yield decompressor.flush() def split_lines(iter): - buf = '' + buf = b('') for chunk in iter: buf += chunk - lineend = buf.find('\n') + lineend = buf.find(b('\n')) while lineend != -1: yield buf[:lineend].decode('utf-8') buf = buf[lineend+1:] - lineend = buf.find('\n') + lineend = buf.find(b('\n')) assert not buf for line in split_lines(read_chunks()): @@ -109,13 +117,13 @@ def fetch_inventory(app, uri, inv): if inv.find('://') != -1: f = urllib2.urlopen(inv) else: - f = open(path.join(app.srcdir, inv)) + f = open(path.join(app.srcdir, inv), 'rb') except Exception, err: app.warn('intersphinx inventory %r not fetchable due to ' '%s: %s' % (inv, err.__class__, err)) return try: - line = f.readline().rstrip() + line = f.readline().rstrip().decode('utf-8') try: if line == '# Sphinx inventory version 1': invdata = read_inventory_v1(f, uri, join) @@ -141,6 +149,8 @@ def load_mappings(app): env = app.builder.env if not hasattr(env, 'intersphinx_cache'): env.intersphinx_cache = {} + env.intersphinx_inventory = {} + env.intersphinx_named_inventory = {} cache = env.intersphinx_cache update = False for key, value in app.config.intersphinx_mapping.iteritems(): @@ -191,10 +201,12 @@ def missing_reference(app, env, node, contnode): return objtypes = ['%s:%s' % (domain, objtype) for objtype in objtypes] to_try = [(env.intersphinx_inventory, target)] + in_set = None if ':' in target: # first part may be the foreign doc set name setname, newtarget = target.split(':', 1) if setname in env.intersphinx_named_inventory: + in_set = setname to_try.append((env.intersphinx_named_inventory[setname], newtarget)) for inventory, target in to_try: for objtype in objtypes: @@ -203,11 +215,25 @@ def missing_reference(app, env, node, contnode): proj, version, uri, dispname = inventory[objtype][target] newnode = nodes.reference('', '', internal=False, refuri=uri, reftitle='(in %s v%s)' % (proj, version)) - if dispname == '-': + if node.get('refexplicit'): + # use whatever title was given newnode.append(contnode) + elif dispname == '-': + # use whatever title was given, but strip prefix + title = contnode.astext() + if in_set and title.startswith(in_set+':'): + newnode.append(contnode.__class__(title[len(in_set)+1:], + title[len(in_set)+1:])) + else: + newnode.append(contnode) else: + # else use the given display name (used for :ref:) newnode.append(contnode.__class__(dispname, dispname)) return newnode + # at least get rid of the ':' in the target if no explicit title given + if in_set is not None and not node.get('refexplicit', True): + if len(contnode) and isinstance(contnode[0], nodes.Text): + contnode[0] = nodes.Text(newtarget, contnode[0].rawsource) def setup(app): diff --git a/sphinx/ext/jsmath.py b/sphinx/ext/jsmath.py index 8277caa57..bad8225bd 100644 --- a/sphinx/ext/jsmath.py +++ b/sphinx/ext/jsmath.py @@ -6,7 +6,7 @@ Set up everything for use of JSMath to display math in HTML via JavaScript. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 8a5b75d34..d021c60bd 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -5,13 +5,14 @@ Set up math support in source files and LaTeX/text output. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from docutils import nodes, utils from docutils.parsers.rst import directives +from sphinx.writers import texinfo from sphinx.util.compat import Directive @@ -69,6 +70,9 @@ class MathDirective(Directive): node['nowrap'] = 'nowrap' in self.options node['docname'] = self.state.document.settings.env.docname ret = [node] + node.line = self.lineno + if hasattr(self, 'src'): + node.source = self.src if node['label']: tnode = nodes.target('', '', ids=['equation-' + node['label']]) self.state.document.note_explicit_target(tnode) @@ -122,6 +126,20 @@ def man_visit_eqref(self, node): raise nodes.SkipNode +def texinfo_visit_math(self, node): + self.body.append('@math{' + texinfo.escape_arg(node['latex']) + '}') + raise nodes.SkipNode + +def texinfo_visit_displaymath(self, node): + self.visit_paragraph(node) +def texinfo_depart_displaymath(self, node): + self.depart_paragraph(node) + +def texinfo_visit_eqref(self, node): + self.body.append(node['target']) + raise nodes.SkipNode + + def html_visit_eqref(self, node): self.body.append('<a href="#equation-%s">' % node['target']) @@ -148,20 +166,23 @@ def number_equations(app, doctree, docname): def setup_math(app, htmlinlinevisitors, htmldisplayvisitors): app.add_node(math, - latex=(latex_visit_math, None), - text=(text_visit_math, None), - man=(man_visit_math, None), - html=htmlinlinevisitors) + latex=(latex_visit_math, None), + text=(text_visit_math, None), + man=(man_visit_math, None), + texinfo=(texinfo_visit_math, None), + html=htmlinlinevisitors) app.add_node(displaymath, - latex=(latex_visit_displaymath, None), - text=(text_visit_displaymath, None), - man=(man_visit_displaymath, man_depart_displaymath), - html=htmldisplayvisitors) + latex=(latex_visit_displaymath, None), + text=(text_visit_displaymath, None), + man=(man_visit_displaymath, man_depart_displaymath), + texinfo=(texinfo_visit_displaymath, texinfo_depart_displaymath), + html=htmldisplayvisitors) app.add_node(eqref, - latex=(latex_visit_eqref, None), - text=(text_visit_eqref, None), - man=(man_visit_eqref, None), - html=(html_visit_eqref, html_depart_eqref)) + latex=(latex_visit_eqref, None), + text=(text_visit_eqref, None), + man=(man_visit_eqref, None), + texinfo=(texinfo_visit_eqref, None), + html=(html_visit_eqref, html_depart_eqref)) app.add_role('math', math_role) app.add_role('eq', eq_role) app.add_directive('math', MathDirective) diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py new file mode 100644 index 000000000..e8d2d4851 --- /dev/null +++ b/sphinx/ext/mathjax.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.mathjax + ~~~~~~~~~~~~~~~~~~ + + Allow `MathJax <http://mathjax.org/>`_ to be used to display math in + Sphinx's HTML writer -- requires the MathJax JavaScript library on your + webserver/computer. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from docutils import nodes + +from sphinx.application import ExtensionError +from sphinx.ext.mathbase import setup_math as mathbase_setup + + +def html_visit_math(self, node): + self.body.append(self.starttag(node, 'span', '', CLASS='math')) + self.body.append(self.builder.config.mathjax_inline[0] + + self.encode(node['latex']) + + self.builder.config.mathjax_inline[1] + '</span>') + raise nodes.SkipNode + +def html_visit_displaymath(self, node): + self.body.append(self.starttag(node, 'div', CLASS='math')) + if node['nowrap']: + self.body.append(self.builder.config.mathjax_display[0] + + node['latex'] + + self.builder.config.mathjax_display[1]) + self.body.append('</div>') + raise nodes.SkipNode + + parts = [prt for prt in node['latex'].split('\n\n') if prt.strip()] + for i, part in enumerate(parts): + part = self.encode(part) + if i == 0: + # necessary to e.g. set the id property correctly + if node['number']: + self.body.append('<span class="eqno">(%s)</span>' % + node['number']) + if '&' in part or '\\\\' in part: + self.body.append(self.builder.config.mathjax_display[0] + + '\\begin{split}' + part + '\\end{split}' + + self.builder.config.mathjax_display[1]) + else: + self.body.append(self.builder.config.mathjax_display[0] + part + + self.builder.config.mathjax_display[1]) + self.body.append('</div>\n') + raise nodes.SkipNode + +def builder_inited(app): + if not app.config.mathjax_path: + raise ExtensionError('mathjax_path config value must be set for the ' + 'mathjax extension to work') + app.add_javascript(app.config.mathjax_path) + + +def setup(app): + mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None)) + app.add_config_value('mathjax_path', '', False) + app.add_config_value('mathjax_inline', [r'\(', r'\)'], 'html') + app.add_config_value('mathjax_display', [r'\[', r'\]'], 'html') + app.connect('builder-inited', builder_inited) + diff --git a/sphinx/ext/oldcmarkup.py b/sphinx/ext/oldcmarkup.py index 84ae61dd2..41969c364 100644 --- a/sphinx/ext/oldcmarkup.py +++ b/sphinx/ext/oldcmarkup.py @@ -5,7 +5,7 @@ Extension for compatibility with old C markup (directives and roles). - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,6 +18,7 @@ WARNING_MSG = 'using old C markup; please migrate to new-style markup ' \ '(e.g. c:function instead of cfunction), see ' \ 'http://sphinx.pocoo.org/domains.html' + class OldCDirective(Directive): has_content = True required_arguments = 1 @@ -42,6 +43,8 @@ class OldCDirective(Directive): def old_crole(typ, rawtext, text, lineno, inliner, options={}, content=[]): env = inliner.document.settings.env + if not typ: + typ = env.config.default_role if not env.app._oldcmarkup_warned: env.warn(env.docname, WARNING_MSG) env.app._oldcmarkup_warned = True diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 7f3997543..78c331a60 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -5,7 +5,7 @@ Render math in HTML via dvipng. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,7 @@ from docutils import nodes from sphinx.errors import SphinxError from sphinx.util.png import read_png_depth, write_png_depth from sphinx.util.osutil import ensuredir, ENOENT +from sphinx.util.pycompat import b from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath class MathExtError(SphinxError): @@ -58,11 +59,10 @@ DOC_BODY_PREVIEW = r''' \end{document} ''' -depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]') +depth_re = re.compile(b(r'\[\d+ depth=(-?\d+)\]')) def render_math(self, math): - """ - Render the LaTeX math expression *math* using latex and dvipng. + """Render the LaTeX math expression *math* using latex and dvipng. Return the filename relative to the built document and the "depth", that is, the distance of image bottom and baseline in pixels, if the @@ -178,6 +178,11 @@ def cleanup_tempdir(app, exc): except Exception: pass +def get_tooltip(self, node): + if self.builder.config.pngmath_add_tooltips: + return ' alt="%s"' % self.encode(node['latex']).strip() + return '' + def html_visit_math(self, node): try: fname, depth = render_math(self, '$'+node['latex']+'$') @@ -193,15 +198,10 @@ def html_visit_math(self, node): self.body.append('<span class="math">%s</span>' % self.encode(node['latex']).strip()) else: - if depth is None: - self.body.append( - '<img class="math" src="%s" alt="%s"/>' % - (fname, self.encode(node['latex']).strip())) - else: - self.body.append( - '<img class="math" src="%s" alt="%s" ' - 'style="vertical-align: %dpx"/>' % - (fname, self.encode(node['latex']).strip(), -depth)) + c = ('<img class="math" src="%s"' % fname) + get_tooltip(self, node) + if depth is not None: + c += ' style="vertical-align: %dpx"' % (-depth) + self.body.append(c + '/>') raise nodes.SkipNode def html_visit_displaymath(self, node): @@ -226,8 +226,8 @@ def html_visit_displaymath(self, node): self.body.append('<span class="math">%s</span></p>\n</div>' % self.encode(node['latex']).strip()) else: - self.body.append('<img src="%s" alt="%s" /></p>\n</div>' % - (fname, self.encode(node['latex']).strip())) + self.body.append(('<img src="%s"' % fname) + get_tooltip(self, node) + + '/></p>\n</div>') raise nodes.SkipNode @@ -240,4 +240,5 @@ def setup(app): ['-gamma 1.5', '-D 110'], 'html') app.add_config_value('pngmath_latex_args', [], 'html') app.add_config_value('pngmath_latex_preamble', '', 'html') + app.add_config_value('pngmath_add_tooltips', True, 'html') app.connect('build-finished', cleanup_tempdir) diff --git a/sphinx/ext/refcounting.py b/sphinx/ext/refcounting.py index 6ab9fe4ba..a8dc721d7 100644 --- a/sphinx/ext/refcounting.py +++ b/sphinx/ext/refcounting.py @@ -9,7 +9,7 @@ Usage: Set the `refcount_file` config value to the path to the reference count data file. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index a6c33202e..6a44a9b4b 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -8,7 +8,7 @@ all todos of your project and lists them along with a backlink to the original location. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -159,7 +159,8 @@ def setup(app): html=(visit_todo_node, depart_todo_node), latex=(visit_todo_node, depart_todo_node), text=(visit_todo_node, depart_todo_node), - man=(visit_todo_node, depart_todo_node)) + man=(visit_todo_node, depart_todo_node), + texinfo=(visit_todo_node, depart_todo_node)) app.add_directive('todo', Todo) app.add_directive('todolist', TodoList) diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py index 81881beb6..020db6974 100644 --- a/sphinx/ext/viewcode.py +++ b/sphinx/ext/viewcode.py @@ -5,7 +5,7 @@ Add links to module code in Python object descriptions. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,7 +31,11 @@ def doctree_read(app, doctree): env._viewcode_modules[modname] = False return analyzer.find_tags() - entry = analyzer.code.decode(analyzer.encoding), analyzer.tags, {} + if not isinstance(analyzer.code, unicode): + code = analyzer.code.decode(analyzer.encoding) + else: + code = analyzer.code + entry = code, analyzer.tags, {} env._viewcode_modules[modname] = entry elif entry is False: return @@ -47,10 +51,10 @@ def doctree_read(app, doctree): for signode in objnode: if not isinstance(signode, addnodes.desc_signature): continue - modname = signode['module'] + modname = signode.get('module') if not modname: continue - fullname = signode['fullname'] + fullname = signode.get('fullname') if not has_tag(modname, fullname, env.docname): continue if fullname in names: diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py index f5ea859cb..76bcb122d 100644 --- a/sphinx/highlighting.py +++ b/sphinx/highlighting.py @@ -5,7 +5,7 @@ Highlight code blocks using Pygments. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,6 +21,7 @@ except ImportError: parser = None from sphinx.util.texescape import tex_hl_escape_map_old, tex_hl_escape_map_new +from sphinx.ext import doctest try: import pygments @@ -30,34 +31,14 @@ try: from pygments.lexers import get_lexer_by_name, guess_lexer from pygments.formatters import HtmlFormatter, LatexFormatter from pygments.filters import ErrorToken - from pygments.style import Style from pygments.styles import get_style_by_name - from pygments.styles.friendly import FriendlyStyle - from pygments.token import Generic, Comment, Number from pygments.util import ClassNotFound + from sphinx.pygments_styles import SphinxStyle, NoneStyle except ImportError: pygments = None lexers = None HtmlFormatter = LatexFormatter = None else: - class SphinxStyle(Style): - """ - Like friendly, but a bit darker to enhance contrast on the green - background. - """ - - background_color = '#eeffcc' - default_style = '' - - styles = FriendlyStyle.styles - styles.update({ - Generic.Output: '#333', - Comment: 'italic #408090', - Number: '#208050', - }) - - class NoneStyle(Style): - """Style without any styling.""" lexers = dict( none = TextLexer(), @@ -84,8 +65,6 @@ _LATEX_STYLES = r''' \newcommand\PYGZrb{]} ''' -doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE) - parsing_exceptions = (SyntaxError, UnicodeEncodeError) if sys.version_info < (2, 5): # Python <= 2.4 raises MemoryError when parsing an @@ -156,7 +135,7 @@ class PygmentsBridge(object): if sys.version_info >= (2, 5): src = 'from __future__ import with_statement\n' + src - if isinstance(src, unicode): + if sys.version_info < (3, 0) and isinstance(src, unicode): # Non-ASCII chars will only occur in string literals # and comments. If we wanted to give them to the parser # correctly, we'd have to find out the correct source @@ -175,7 +154,7 @@ class PygmentsBridge(object): return True def highlight_block(self, source, lang, linenos=False, warn=None): - if isinstance(source, str): + if not isinstance(source, unicode): source = source.decode() if not pygments: return self.unhighlighted(source) @@ -207,7 +186,7 @@ class PygmentsBridge(object): lexer = lexers[lang] = get_lexer_by_name(lang) except ClassNotFound: if warn: - warn('Pygments lexer name %s is not known' % lang) + warn('Pygments lexer name %r is not known' % lang) return self.unhighlighted(source) else: raise @@ -216,7 +195,8 @@ class PygmentsBridge(object): # trim doctest options if wanted if isinstance(lexer, PythonConsoleLexer) and self.trim_doctest_flags: - source = doctestopt_re.sub('', source) + source = doctest.blankline_re.sub('', source) + source = doctest.doctestopt_re.sub('', source) # highlight via Pygments try: @@ -240,7 +220,7 @@ class PygmentsBridge(object): # no HTML styles needed return '' if self.dest == 'html': - return self.fmter[0].get_style_defs() + return self.fmter[0].get_style_defs('.highlight') else: styledefs = self.fmter[0].get_style_defs() # workaround for Pygments < 0.12 diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py index a6f1a853e..629bce30f 100644 --- a/sphinx/jinja2glue.py +++ b/sphinx/jinja2glue.py @@ -5,7 +5,7 @@ Glue code for the jinja2 templating engine. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,12 @@ def _tobool(val): return val.lower() in ('true', '1', 'yes', 'on') return bool(val) +def _toint(val): + try: + return int(val) + except ValueError: + return 0 + def accesskey(context, key): """Helper to output each access key only once.""" if '_accesskeys' not in context: @@ -35,10 +41,21 @@ def accesskey(context, key): return 'accesskey="%s"' % key return '' +class idgen(object): + def __init__(self): + self.id = 0 + def current(self): + return self.id + def next(self): + self.id += 1 + return self.id + class SphinxFileSystemLoader(FileSystemLoader): - """FileSystemLoader subclass that is not so strict about '..' - entries in template names.""" + """ + FileSystemLoader subclass that is not so strict about '..' entries in + template names. + """ def get_source(self, environment, template): for searchpath in self.searchpath: @@ -98,8 +115,10 @@ class BuiltinTemplateLoader(TemplateBridge, BaseLoader): self.environment = SandboxedEnvironment(loader=self, extensions=extensions) self.environment.filters['tobool'] = _tobool + self.environment.filters['toint'] = _toint self.environment.globals['debug'] = contextfunction(pformat) self.environment.globals['accesskey'] = contextfunction(accesskey) + self.environment.globals['idgen'] = idgen if use_i18n: self.environment.install_gettext_translations( builder.app.translator) diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py index b0b89720c..3aca780cf 100644 --- a/sphinx/locale/__init__.py +++ b/sphinx/locale/__init__.py @@ -5,16 +5,19 @@ Locale utilities. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ + +import sys import gettext import UserString class _TranslationProxy(UserString.UserString, object): - """Class for proxy strings from gettext translations. This is a helper - for the lazy_* functions from this module. + """ + Class for proxy strings from gettext translations. This is a helper for the + lazy_* functions from this module. The proxy implementation attempts to be as complete as possible, so that the lazy objects should mostly work as expected, for example for sorting. @@ -135,7 +138,8 @@ class _TranslationProxy(UserString.UserString, object): def mygettext(string): """Used instead of _ when creating TranslationProxies, because _ is - not bound yet at that time.""" + not bound yet at that time. + """ return _(string) def lazy_gettext(string): @@ -166,6 +170,7 @@ versionlabels = { 'deprecated': l_('Deprecated since version %s'), } +# XXX Python specific pairindextypes = { 'module': l_('module'), 'keyword': l_('keyword'), @@ -176,18 +181,32 @@ pairindextypes = { 'builtin': l_('built-in function'), } -translator = None +translators = {} -def _(message): - return translator.ugettext(message) +if sys.version_info >= (3, 0): + def _(message): + return translators['sphinx'].gettext(message) +else: + def _(message): + return translators['sphinx'].ugettext(message) -def init(locale_dirs, language): - global translator + +def init(locale_dirs, language, catalog='sphinx'): + """Look for message catalogs in `locale_dirs` and *ensure* that there is at + least a NullTranslations catalog set in `translators`. If called multiple + times or if several ``.mo`` files are found, their contents are merged + together (thus making ``init`` reentrable). + """ + global translators + translator = translators.get(catalog) + # ignore previously failed attempts to find message catalogs + if isinstance(translator, gettext.NullTranslations): + translator = None # the None entry is the system's default locale path has_translation = True for dir_ in locale_dirs: try: - trans = gettext.translation('sphinx', localedir=dir_, + trans = gettext.translation(catalog, localedir=dir_, languages=[language]) if translator is None: translator = trans @@ -196,7 +215,11 @@ def init(locale_dirs, language): except Exception: # Language couldn't be found in the specified path pass + # guarantee translations[catalog] exists if translator is None: translator = gettext.NullTranslations() has_translation = False + translators[catalog] = translator + if hasattr(translator, 'ugettext'): + translator.gettext = translator.ugettext return translator, has_translation diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.js b/sphinx/locale/bn/LC_MESSAGES/sphinx.js new file mode 100644 index 000000000..a69d00b5c --- /dev/null +++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.js @@ -0,0 +1 @@ +Documentation.addTranslations({"locale": "bn", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09ae\u09cd\u09af\u09be\u099a\u0997\u09c1\u09b2\u09c7\u09be \u09b2\u09c1\u0995\u09be\u09a8", "Permalink to this definition": "\u098f\u0987 \u09b8\u0982\u099c\u09cd\u099e\u09be\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Expand sidebar": "", "Permalink to this headline": "\u098f\u0987 \u09b6\u09bf\u09b0\u09c7\u09be\u09a8\u09be\u09ae\u09c7\u09b0 \u09aa\u09be\u09b0\u09cd\u09ae\u09be\u09b2\u09bf\u0999\u09cd\u0995", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.mo b/sphinx/locale/bn/LC_MESSAGES/sphinx.mo new file mode 100644 index 000000000..3f23ac2e7 Binary files /dev/null and b/sphinx/locale/bn/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.po b/sphinx/locale/bn/LC_MESSAGES/sphinx.po new file mode 100644 index 000000000..c0456cbdb --- /dev/null +++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.po @@ -0,0 +1,806 @@ +# Bengali translations for Sphinx. +# Copyright (C) 2009 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 1.0pre/[?1034h2e1ab15e035e\n" +"Report-Msgid-Bugs-To: nasim.haque@gmail.com\n" +"POT-Creation-Date: 2009-11-08 16:28+0100\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" +"Last-Translator: Nasimul Haque <nasim.haque@gmail.com>\n" +"Language-Team: Nasimul Haque <nasim.haque@gmail.com>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.5\n" + +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 +#: sphinx/writers/manpage.py:67 +#, python-format +msgid "%B %d, %Y" +msgstr "%B %d, %Y" + +#: sphinx/environment.py:1624 +#, fuzzy, python-format +msgid "see %s" +msgstr "আরও %s" + +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "আরও দেখুন %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "পাইথন উন্নয়ন পরামর্শ; PEP %s" + +#: sphinx/builders/changes.py:73 +msgid "Builtins" +msgstr "বিল্টইন সমূহ" + +#: sphinx/builders/changes.py:75 +msgid "Module level" +msgstr "মডিউল লেভেল" + +#: sphinx/builders/html.py:274 +#, python-format +msgid "%b %d, %Y" +msgstr "%b %d, %Y" + +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 +msgid "General Index" +msgstr "সাধারণ ইনডেক্স" + +#: sphinx/builders/html.py:293 +msgid "index" +msgstr "ইনডেক্স" + +#: sphinx/builders/html.py:353 +msgid "next" +msgstr "পরবর্তী" + +#: sphinx/builders/html.py:362 +msgid "previous" +msgstr "পূর্ববর্তী" + +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 +msgid " (in " +msgstr "(-" + +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "ইনডেক্স" + +#: sphinx/directives/other.py:136 +msgid "Section author: " +msgstr "অনুচ্ছেদ লেখক:" + +#: sphinx/directives/other.py:138 +msgid "Module author: " +msgstr "মডিউল লেখক:" + +#: sphinx/directives/other.py:140 +#, fuzzy +msgid "Code author: " +msgstr "মডিউল লেখক:" + +#: sphinx/directives/other.py:142 +msgid "Author: " +msgstr "লেখক:" + +#: sphinx/directives/other.py:215 +msgid "See also" +msgstr "আরও দেখুন" + +#: sphinx/domains/__init__.py:244 +#, python-format +msgid "%s %s" +msgstr "" + +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 +msgid "Parameters" +msgstr "প্যারামিটার" + +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 +msgid "Returns" +msgstr "রিটার্নস" + +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 +msgid "Return type" +msgstr "রিটার্ন টাইপ" + +#: sphinx/domains/c.py:141 +#, python-format +msgid "%s (C function)" +msgstr "%s (C ফাংশন)" + +#: sphinx/domains/c.py:143 +#, python-format +msgid "%s (C member)" +msgstr "%s (C মেম্বার)" + +#: sphinx/domains/c.py:145 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C ম্যাক্রো)" + +#: sphinx/domains/c.py:147 +#, python-format +msgid "%s (C type)" +msgstr "%s (C টাইপ)" + +#: sphinx/domains/c.py:149 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C ভ্যারিয়েবল)" + +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 +msgid "function" +msgstr "ফাংশন" + +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 +#, fuzzy +msgid "member" +msgstr "C মেম্বার" + +#: sphinx/domains/c.py:206 +#, fuzzy +msgid "macro" +msgstr "C ম্যাক্রো" + +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 +#, fuzzy +msgid "type" +msgstr "C টাইপ" + +#: sphinx/domains/c.py:208 +#, fuzzy +msgid "variable" +msgstr "C ভ্যারিয়েবল" + +#: sphinx/domains/cpp.py:897 +#, python-format +msgid "%s (C++ class)" +msgstr "%s (C++ ক্লাসে)" + +#: sphinx/domains/cpp.py:912 +#, python-format +msgid "%s (C++ type)" +msgstr "%s (C++ টাইপ)" + +#: sphinx/domains/cpp.py:931 +#, python-format +msgid "%s (C++ member)" +msgstr "%s (C++ মেম্বার)" + +#: sphinx/domains/cpp.py:983 +#, python-format +msgid "%s (C++ function)" +msgstr "%s (C++ ফাংশন)" + +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 +msgid "class" +msgstr "ক্লাস" + +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (বিল্ট-ইন ফাংশন)" + +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s মেথড)" + +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (ক্লাসে)" + +#: sphinx/domains/javascript.py:111 +#, python-format +msgid "%s (global variable or constant)" +msgstr "" + +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s এ্যট্রিবিউট)" + +#: sphinx/domains/javascript.py:122 +#, fuzzy +msgid "Arguments" +msgstr "প্যারামিটার" + +#: sphinx/domains/javascript.py:125 +msgid "Throws" +msgstr "" + +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 +msgid "data" +msgstr "ডাটা" + +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 +msgid "attribute" +msgstr "এ্যট্রিবিউট" + +#: sphinx/domains/python.py:100 +#, fuzzy +msgid "Variables" +msgstr "ভ্যারিয়েবল" + +#: sphinx/domains/python.py:104 +msgid "Raises" +msgstr "রেইজেস" + +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (%s মডিউলে)" + +#: sphinx/domains/python.py:258 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (বিল্ট-ইন ভ্যারিয়েবল)" + +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (%s মডিউলে)" + +#: sphinx/domains/python.py:275 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (বিল্ট-ইন ক্লাস)" + +#: sphinx/domains/python.py:276 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (%s ক্লাসে)" + +#: sphinx/domains/python.py:316 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s (%s.%s মেথড)" + +#: sphinx/domains/python.py:328 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s (%s.%s স্ট্যাটিক মেথড)" + +#: sphinx/domains/python.py:331 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s স্ট্যাটিক মেথড)" + +#: sphinx/domains/python.py:341 +#, python-format +msgid "%s() (%s.%s class method)" +msgstr "%s() (%s.%s ক্লাস মেথড)" + +#: sphinx/domains/python.py:344 +#, python-format +msgid "%s() (%s class method)" +msgstr "%s() (%s ক্লাস মেথড)" + +#: sphinx/domains/python.py:354 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s এ্যট্রিবিউট)" + +#: sphinx/domains/python.py:433 +#, python-format +msgid "%s (module)" +msgstr "%s (মডিউল)" + +#: sphinx/domains/python.py:490 +#, fuzzy +msgid "Python Module Index" +msgstr "মডিউল ইনডেক্স" + +#: sphinx/domains/python.py:491 +msgid "modules" +msgstr "মডিউল সমূহ" + +#: sphinx/domains/python.py:536 +msgid "Deprecated" +msgstr "ডেপ্রিকেটেড" + +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 +msgid "exception" +msgstr "এক্সেপশন" + +#: sphinx/domains/python.py:562 +msgid "method" +msgstr "মেথড" + +#: sphinx/domains/python.py:563 +msgid "class method" +msgstr "ক্লাস মেথড" + +#: sphinx/domains/python.py:564 +msgid "static method" +msgstr "স্ট্যাটিক মেথড" + +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 +msgid "module" +msgstr "মডিউল" + +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr "ডেপ্রিকেটেড" + +#: sphinx/domains/rst.py:55 +#, python-format +msgid "%s (directive)" +msgstr "" + +#: sphinx/domains/rst.py:57 +#, fuzzy, python-format +msgid "%s (role)" +msgstr "%s (মডিউল)" + +#: sphinx/domains/rst.py:106 +msgid "directive" +msgstr "" + +#: sphinx/domains/rst.py:107 +#, fuzzy +msgid "role" +msgstr "মডিউল" + +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 +#, python-format +msgid "environment variable; %s" +msgstr "এনভায়রনমেন্ট ভ্যারিয়েবল; %s" + +#: sphinx/domains/std.py:162 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sকমান্ড লাইন অপশন; %s" + +#: sphinx/domains/std.py:393 +msgid "glossary term" +msgstr "শব্দকোষ" + +#: sphinx/domains/std.py:394 +msgid "grammar token" +msgstr "ব্যকরণ টোকেন" + +#: sphinx/domains/std.py:395 +msgid "reference label" +msgstr "" + +#: sphinx/domains/std.py:396 +msgid "environment variable" +msgstr "এনভায়রনমেন্ট ভ্যারিয়েবল" + +#: sphinx/domains/std.py:397 +msgid "program option" +msgstr "প্রোগ্রাম অপশন" + +#: sphinx/domains/std.py:428 +msgid "Module Index" +msgstr "মডিউল ইনডেক্স" + +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 +msgid "Search Page" +msgstr "অনুসন্ধান পাতা" + +#: sphinx/ext/autodoc.py:998 +#, python-format +msgid " Bases: %s" +msgstr "বেস: %s" + +#: sphinx/ext/autodoc.py:1034 +#, python-format +msgid "alias of :class:`%s`" +msgstr ":class:`%s` এর উপনাম" + +#: sphinx/ext/todo.py:41 +msgid "Todo" +msgstr "অসমাপ্ত কাজ" + +#: sphinx/ext/todo.py:109 +#, fuzzy, python-format +msgid "(The <<original entry>> is located in %s, line %d.)" +msgstr "(%s, %d লাইনে মূল অন্তর্ভুক্তিটি রয়েছে.)" + +#: sphinx/ext/todo.py:117 +msgid "original entry" +msgstr "" + +#: sphinx/ext/viewcode.py:70 +msgid "[source]" +msgstr "" + +#: sphinx/ext/viewcode.py:117 +msgid "[docs]" +msgstr "" + +#: sphinx/ext/viewcode.py:131 +#, fuzzy +msgid "Module code" +msgstr "মডিউল" + +#: sphinx/ext/viewcode.py:137 +#, python-format +msgid "<h1>Source code for %s</h1>" +msgstr "" + +#: sphinx/ext/viewcode.py:164 +msgid "Overview: module code" +msgstr "" + +#: sphinx/ext/viewcode.py:165 +msgid "<h1>All modules for which code is available</h1>" +msgstr "" + +#: sphinx/locale/__init__.py:155 +msgid "Attention" +msgstr "দৃষ্টি আকর্ষণ" + +#: sphinx/locale/__init__.py:156 +msgid "Caution" +msgstr "সতর্কীকরণ" + +#: sphinx/locale/__init__.py:157 +msgid "Danger" +msgstr "বিপজ্জনক" + +#: sphinx/locale/__init__.py:158 +msgid "Error" +msgstr "ভুল (এরর)" + +#: sphinx/locale/__init__.py:159 +msgid "Hint" +msgstr "আভাস" + +#: sphinx/locale/__init__.py:160 +msgid "Important" +msgstr "গুরুত্বপূর্ণ" + +#: sphinx/locale/__init__.py:161 +msgid "Note" +msgstr "নোট" + +#: sphinx/locale/__init__.py:162 +msgid "See Also" +msgstr "আরও দেখুন" + +#: sphinx/locale/__init__.py:163 +msgid "Tip" +msgstr "পরামর্শ" + +#: sphinx/locale/__init__.py:164 +msgid "Warning" +msgstr "সতর্কতা" + +#: sphinx/locale/__init__.py:168 +#, python-format +msgid "New in version %s" +msgstr "%s ভার্সনে নতুন" + +#: sphinx/locale/__init__.py:169 +#, python-format +msgid "Changed in version %s" +msgstr "%s ভার্সনে পরিবর্তিত" + +#: sphinx/locale/__init__.py:170 +#, python-format +msgid "Deprecated since version %s" +msgstr "%s ভার্সন থেকে ডেপ্রিকেটেড" + +#: sphinx/locale/__init__.py:176 +msgid "keyword" +msgstr "কিওয়ার্ড" + +#: sphinx/locale/__init__.py:177 +msgid "operator" +msgstr "অপারেটর" + +#: sphinx/locale/__init__.py:178 +msgid "object" +msgstr "অবজেক্ট" + +#: sphinx/locale/__init__.py:180 +msgid "statement" +msgstr "স্ট্যাটমেন্ট" + +#: sphinx/locale/__init__.py:181 +msgid "built-in function" +msgstr "বিল্ট-ইন ফাংশন" + +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/basic/localtoc.html:11 +msgid "Table Of Contents" +msgstr "সূচীপত্র" + +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 +msgid "Search" +msgstr "অনুসন্ধান" + +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 +msgid "Go" +msgstr "যান" + +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 +msgid "Enter search terms or a module, class or function name." +msgstr "অনুসন্ধানের জন্য টার্ম, মডিউল, ক্লাস অথবা ফাংশনের নাম দিন।" + +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 +msgid "Show Source" +msgstr "সোর্স দেখুন" + +#: sphinx/themes/basic/defindex.html:11 +msgid "Overview" +msgstr "ভুমিকা" + +#: sphinx/themes/basic/defindex.html:20 +msgid "Indices and tables:" +msgstr "ইনডেক্স ও টেবিল সমূহ:" + +#: sphinx/themes/basic/defindex.html:23 +msgid "Complete Table of Contents" +msgstr "পূর্ণাঙ্গ সূচীপত্র" + +#: sphinx/themes/basic/defindex.html:24 +msgid "lists all sections and subsections" +msgstr "সকল অনুচ্ছেদ সমূহের তালিকা" + +#: sphinx/themes/basic/defindex.html:26 +msgid "search this documentation" +msgstr "এই সহায়িকাতে অনুসন্ধা করুন" + +#: sphinx/themes/basic/defindex.html:28 +msgid "Global Module Index" +msgstr "গ্লোবাল মডিউল ইনডেক্স" + +#: sphinx/themes/basic/defindex.html:29 +msgid "quick access to all modules" +msgstr "সকল মডিউলে দ্রুত প্রবেশ" + +#: sphinx/themes/basic/defindex.html:31 +msgid "all functions, classes, terms" +msgstr "সকল ফাংশন, ক্লাস, টার্ম" + +#: sphinx/themes/basic/genindex-single.html:35 +#, python-format +msgid "Index – %(key)s" +msgstr "ইনডেক্স – %(key)s" + +#: sphinx/themes/basic/genindex-single.html:63 +#: sphinx/themes/basic/genindex-split.html:24 +#: sphinx/themes/basic/genindex-split.html:38 +#: sphinx/themes/basic/genindex.html:74 +msgid "Full index on one page" +msgstr "এক পাতায় সম্পূর্ণ ইনডেক্স" + +#: sphinx/themes/basic/genindex-split.html:16 +msgid "Index pages by letter" +msgstr "বর্ণানুসারে ইনডেক্স পাতা" + +#: sphinx/themes/basic/genindex-split.html:25 +msgid "can be huge" +msgstr "খুব বড় হতে পারে" + +#: sphinx/themes/basic/layout.html:29 +msgid "Navigation" +msgstr "নেভিগেশন" + +#: sphinx/themes/basic/layout.html:122 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "%(docstitle)s এর মধ্যে খুঁজুন" + +#: sphinx/themes/basic/layout.html:131 +msgid "About these documents" +msgstr "এই ডকুমেন্ট সম্পর্কে" + +#: sphinx/themes/basic/layout.html:140 +msgid "Copyright" +msgstr "কপিরাইট" + +#: sphinx/themes/basic/layout.html:189 +#, python-format +msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." +msgstr "© <a href=\"%(path)s\">কপিরাইট</a> %(copyright)s." + +#: sphinx/themes/basic/layout.html:191 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© কপিরাইট %(copyright)s." + +#: sphinx/themes/basic/layout.html:195 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "%(last_updated)s সর্বশেষ পরিবর্তন করা হয়েছে।" + +#: sphinx/themes/basic/layout.html:198 +#, python-format +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +"<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s দিয়ে " +"তৈরী।" + +#: sphinx/themes/basic/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "%(docstitle)s-এ খুঁজুন" + +#: sphinx/themes/basic/relations.html:11 +msgid "Previous topic" +msgstr "পূর্ববর্তী টপিক" + +#: sphinx/themes/basic/relations.html:13 +msgid "previous chapter" +msgstr "পূর্ববর্তী অধ্যায়" + +#: sphinx/themes/basic/relations.html:16 +msgid "Next topic" +msgstr "পরবর্তী টপিক" + +#: sphinx/themes/basic/relations.html:18 +msgid "next chapter" +msgstr "পরবর্তী অধ্যায়" + +#: sphinx/themes/basic/search.html:24 +msgid "" +"Please activate JavaScript to enable the search\n" +" functionality." +msgstr "" +"অনুসন্ধান করার জন্য অনুগ্রহপূর্বক জাভাস্ক্রিপ্ট \n" +" সক্রিয় করুন।" + +#: sphinx/themes/basic/search.html:29 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"এখান থেকে এই নথিগুলোতে আপনি অনুসন্ধান করতে পারবেন। \n" +" আপনার কাঙ্ক্ষিত শব্দসমূহ নিচের বাক্সে লিখুন এবং \"অনুসন্ধান\" বাটনে " +"ক্লিক করুন।\n" +" উল্লেখ্য, সকল শব্দসমূহের উপস্থিতি নিয়ে অনুসন্ধান করা হবে। যেসব পাতায় " +"সকল\n" +" শব্দ নেই সেগুলো বাদ দেয়া হবে।" + +#: sphinx/themes/basic/search.html:36 +msgid "search" +msgstr "খুঁজুন" + +#: sphinx/themes/basic/search.html:40 +msgid "Search Results" +msgstr "অনুসন্ধানের ফলাফল" + +#: sphinx/themes/basic/search.html:42 +msgid "Your search did not match any results." +msgstr "আপনার অনুসন্ধানে কোন ফলাফল পাওয়া যায়নি।" + +#: sphinx/themes/basic/searchbox.html:12 +msgid "Quick search" +msgstr "দ্রুত অনুসন্ধান" + +#: sphinx/themes/basic/sourcelink.html:11 +msgid "This Page" +msgstr "এই পাতা" + +#: sphinx/themes/basic/changes/frameset.html:5 +#: sphinx/themes/basic/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "%(version)s — %(docstitle)s-এ পরিবর্তন সমূহ" + +#: sphinx/themes/basic/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/themes/basic/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "স্বয়ংক্রিয়ভাবে তৈরী %(version)s-এ পরিবর্তন সমূহের তালিকা।" + +#: sphinx/themes/basic/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "লাইব্রেরির পরিবর্তন" + +#: sphinx/themes/basic/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API পরিবর্তন" + +#: sphinx/themes/basic/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "অন্যান্য পরিবর্তন" + +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 +msgid "Permalink to this headline" +msgstr "এই শিরোনামের পার্মালিঙ্ক" + +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 +msgid "Permalink to this definition" +msgstr "এই সংজ্ঞার পার্মালিঙ্ক" + +#: sphinx/themes/basic/static/doctools.js:189 +msgid "Hide Search Matches" +msgstr "অনুসন্ধানের ম্যাচগুলো লুকান" + +#: sphinx/themes/default/static/sidebar.js:69 +msgid "Expand sidebar" +msgstr "" + +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 +msgid "Collapse sidebar" +msgstr "" + +#: sphinx/themes/haiku/layout.html:26 +msgid "Contents" +msgstr "" + +#: sphinx/writers/latex.py:176 +msgid "Release" +msgstr "রিলিজ" + +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 +msgid "Footnotes" +msgstr "পাদটীকা" + +#: sphinx/writers/latex.py:672 +msgid "continued from previous page" +msgstr "পূর্ববর্তী পাতা হতে চলমান" + +#: sphinx/writers/latex.py:677 +msgid "Continued on next page" +msgstr "পরবর্তী পাতাতে চলমান" + +#: sphinx/writers/text.py:430 +msgid "[image]" +msgstr "[ছবি]" + +#~ msgid "Platforms: " +#~ msgstr "প্লাটফরম:" + +#~ msgid "Searching" +#~ msgstr "অনুসন্ধান চলছে" + +#~ msgid "Preparing search..." +#~ msgstr "অনুসন্ধানের প্রস্তুতি চলছে..." + +#~ msgid ", in " +#~ msgstr ", -" + +#~ 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 "" +#~ "আপনার অনুসন্ধানে কোন ফলাফল পাওয়া যায়নি।" +#~ " আপনার অনুসন্ধানের শব্দগুলোর সঠিক বানান" +#~ " ও বিভাগ নির্বাচন নিশ্চিত করুন।" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "অনুসন্ধান শেষ হয়েছে, ফলাফলে %s-টি পাতা পাওয়া গেছে।" + diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.js b/sphinx/locale/ca/LC_MESSAGES/sphinx.js index 71a50776a..736d9b767 100644 --- a/sphinx/locale/ca/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "ca", "plural_expr": "(n != 1)", "messages": {"Search Results": "Resultats de la Cerca", "Preparing search...": "Preparant la cerca...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La teva cerca no ha donat resultats. Assegura't que totes les paraules estan ben escrites i que has seleccionat prou categories.", "Search finished, found %s page(s) matching the search query.": "Cerca finalitzada, s'han trobat %s p\u00e0gin(a/es) de resultats.", ", in ": ", a ", "Expand sidebar": "", "Permalink to this headline": "Link permanent a aquest t\u00edtol", "Searching": "Cercant", "Collapse sidebar": "", "Permalink to this definition": "Link permanent a aquesta definici\u00f3", "Hide Search Matches": "Oculta Resultats de Cerca"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "ca", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Oculta Resultats de Cerca", "Permalink to this definition": "Link permanent a aquesta definici\u00f3", "Expand sidebar": "", "Permalink to this headline": "Link permanent a aquest t\u00edtol", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.mo b/sphinx/locale/ca/LC_MESSAGES/sphinx.mo index 339c787f6..4773faee5 100644 Binary files a/sphinx/locale/ca/LC_MESSAGES/sphinx.mo and b/sphinx/locale/ca/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.po b/sphinx/locale/ca/LC_MESSAGES/sphinx.po index 7bfb66427..89452144c 100644 --- a/sphinx/locale/ca/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.po @@ -8,386 +8,401 @@ msgstr "" "Project-Id-Version: Sphinx 1.0\n" "Report-Msgid-Bugs-To: pau.fernandez@upc.edu\n" "POT-Creation-Date: 2009-05-22 18:51+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Pau Fernández <pau.fernandez@upc.edu>\n" "Language-Team: ca <LL@li.org>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d de %B de %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "vegeu %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "vegeu també %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Mòduls Interns" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Nivell de mòdul" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b, %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Índex General" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "índex" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "següent" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "anterior" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (a " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Índex" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor de la secció:" -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor del mòdul: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Autor del mòdul: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Vegeu també" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Paràmetres" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Retorna" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Tipus de retorn" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (funció de C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (membre de C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (macro de C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (tipus de C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (variable de C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funció" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "membre" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "macro" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipus" -#: sphinx/domains/c.py:175 -#, fuzzy +#: sphinx/domains/c.py:208 msgid "variable" -msgstr "Variable" +msgstr "variable" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (class de C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (tipus de C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (membre de C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (funció de C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "class" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (funció interna)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (mètode %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (class)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (atribut %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Paràmetres" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Variable" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Llença" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (al mòdul %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (variable interna)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (al mòdul %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (classe interna)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (class a %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (mètode %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (mètode estàtic %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (mètode estàtic %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (mètode %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (mètode %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (atribut %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Plataformes: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (mòdul)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Índex de Mòduls" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "mòduls" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Obsolet" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "excepció" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (mètode %s)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "mètode estàtic" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "mòdul" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (obsolet)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (mòdul)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "mòdul" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "variable d'entorn; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "opció de línia de comandes %s; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "variable d'entorn" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Índex" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Índex de Mòduls" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Pàgina de Cerca" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Bases: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "àlies de :class:`%s`" @@ -405,104 +420,104 @@ msgstr "(La <<entrada original>> està a %s, línia %d i.)" msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "mòdul" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Atenció" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Compte" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Perill" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Error" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Suggerència" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Important" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Nota" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Vegeu També" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Truc" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Avís" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Novetat de la versió %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Canviat a la versió %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Obsolet desde la versió %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "paraula clau" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operador" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objecte" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "sentència" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "funció interna" @@ -511,8 +526,8 @@ msgstr "funció interna" msgid "Table Of Contents" msgstr "Taula de Contingut" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Cerca" @@ -560,15 +575,15 @@ msgstr "accés ràpid a tots els mòduls" msgid "all functions, classes, terms" msgstr "totes les funcions, classes, termes" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Índes – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Índex complet en una pàgina" @@ -580,39 +595,39 @@ msgstr "Pàgines d'índex per lletra" msgid "can be huge" msgstr "pot ser gegant" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navegació" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Cerca dins de %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Quant a aquests documents" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Última actualització el %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -642,7 +657,7 @@ msgstr "Tema següent" msgid "next chapter" msgstr "capítol següent" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -650,7 +665,7 @@ msgstr "" "Activa JavaScript per utilitzar la funcionalitat\n" "de cerca." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -662,16 +677,15 @@ msgstr "" "que la cerca inclourà totes les paraules que posis. Les pàgines que no\n" "tenen totes les paraules no sortiràn." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "cerca" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Resultats de la Cerca" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "La teva cerca no té resultats." @@ -711,12 +725,12 @@ msgstr "Canvis a la API de C" msgid "Other changes" msgstr "Altres canvis" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Link permanent a aquest títol" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Link permanent a aquesta definició" @@ -724,37 +738,12 @@ msgstr "Link permanent a aquesta definició" msgid "Hide Search Matches" msgstr "Oculta Resultats de Cerca" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Cercant" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Preparant la cerca..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", a " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"La teva cerca no ha donat resultats. Assegura't que totes les paraules " -"estan ben escrites i que has seleccionat prou categories." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Cerca finalitzada, s'han trobat %s pàgin(a/es) de resultats." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -762,22 +751,49 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Versió" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "ve de la pàgina anterior" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Continua a la pàgina següent" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[imatge]" + +#~ msgid "Platforms: " +#~ msgstr "Plataformes: " + +#~ msgid "Searching" +#~ msgstr "Cercant" + +#~ msgid "Preparing search..." +#~ msgstr "Preparant la cerca..." + +#~ msgid ", in " +#~ msgstr ", a " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "La teva cerca no ha donat " +#~ "resultats. Assegura't que totes les " +#~ "paraules estan ben escrites i que " +#~ "has seleccionat prou categories." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Cerca finalitzada, s'han trobat %s pàgin(a/es) de resultats." + diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.js b/sphinx/locale/cs/LC_MESSAGES/sphinx.js index 8fdd489aa..011ef5421 100644 --- a/sphinx/locale/cs/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "V\u00fdsledky hled\u00e1n\u00ed", "Preparing search...": "P\u0159ipravuji vyhled\u00e1v\u00e1n\u00ed....", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nenalezli jsme \u017e\u00e1dn\u00fd dokument. Ujist\u011bte se pros\u00edm, \u017ee v\u0161echna slova jsou spr\u00e1vn\u011b a \u017ee jste vybral dostatek kategori\u00ed.", "Search finished, found %s page(s) matching the search query.": "Vyhled\u00e1v\u00e1n\u00ed skon\u010dilo, nalezeno %s stran.", ", in ": ", v", "Expand sidebar": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "Hled\u00e1m", "Collapse sidebar": "", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "Skr\u00fdt v\u00fdsledky vyhled\u00e1v\u00e1n\u00ed"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Skr\u00fdt v\u00fdsledky vyhled\u00e1v\u00e1n\u00ed", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Expand sidebar": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo index 8092a9927..d5b560eb0 100644 Binary files a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo and b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.po b/sphinx/locale/cs/LC_MESSAGES/sphinx.po index 535d4b9fb..4f3f620c8 100644 --- a/sphinx/locale/cs/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-11-27 18:39+0100\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n" "Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " @@ -16,379 +16,395 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d.%m.%Y" -#: sphinx/roles.py:174 -#, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +#: sphinx/environment.py:1624 +#, fuzzy, python-format +msgid "see %s" +msgstr "viz %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "viz také %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Vestavěné funkce " -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Úroveň modulů" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d.%m.%Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Rejstřík indexů" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "index" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "další" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "předchozí" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "(v" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Index" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor sekce: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor modulu: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Autor modulu: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Viz také" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametry" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Vrací" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Typ navrácené hodnoty" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C funkce)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (člen C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C makro)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C typ)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C proměnná)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funkce" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "člen" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "typ" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Proměnná" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ třída)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ typ)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (člen C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ funkce)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "třída" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (vestavěná funkce)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (metoda %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (třída)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s() (atribut %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parametry" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Proměnná" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Vyvolá" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (v modulu %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s() (vestavěná proměnná)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s() (v modulu %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s () (vestavěná proměnná)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s() (třída v %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (metoda %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (statická metoda %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (statická metoda %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (metoda %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (metoda %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s() (atribut %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platformy: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (module)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" -msgstr "Rejstřík modulů " +msgstr "Rejstřík modulů" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "moduly" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Zastaralé" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "výjimka" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (metoda %s)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statická metoda" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modul" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (zastaralé)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (module)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "modul" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "promměná prostředí, %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%s parametry příkazového řádku; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "promměná prostředí" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Index" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Rejstřík modulů " -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Vyhledávací stránka" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -400,110 +416,110 @@ msgstr "Todo" #: sphinx/ext/todo.py:109 #, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(Původní záznam je v %s, řádka %d a lze jej nalézt" +msgstr "(Původní záznam je v %s, řádka %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "modul" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Výstraha" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Upozornění" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Nebezpečí" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Chyba" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Rada" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Důležité" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Poznámka" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Viz také" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Tip" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Varování" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nové ve verzi %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Změněno ve verzi %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Zastaralé od verze %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "klíčové slovo" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operátor" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objekt" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "příkaz" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "vestavěná funkce" @@ -512,8 +528,8 @@ msgstr "vestavěná funkce" msgid "Table Of Contents" msgstr "Obsah" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Hledání" @@ -562,15 +578,15 @@ msgstr "rychlý přístup ke všem modulům" msgid "all functions, classes, terms" msgstr "všechny funkce, třídy, termíny" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Index – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Plný index na jedné stránce" @@ -582,39 +598,39 @@ msgstr "Index podle písmene" msgid "can be huge" msgstr "může být obrovský" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigace" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Hledání uvnitř %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "O těchto dokumentech" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Veškerá práva vyhrazena" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Aktualizováno dne %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -644,13 +660,13 @@ msgstr "Další téma" msgid "next chapter" msgstr "další kapitola" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -662,16 +678,15 @@ msgstr "" "Vyhledávání hledá automaticky všechna slova. Nebudou tedy nalezeny " "stránky, obsahující méně slov." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "hledej" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Výsledky hledání" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Nic jsme nenašli." @@ -711,12 +726,12 @@ msgstr "Změny API" msgid "Other changes" msgstr "Ostatní změny" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Trvalý odkaz na tento nadpis" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Trvalý odkaz na tuto definici" @@ -724,37 +739,12 @@ msgstr "Trvalý odkaz na tuto definici" msgid "Hide Search Matches" msgstr "Skrýt výsledky vyhledávání" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Hledám" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Připravuji vyhledávání...." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", v" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Nenalezli jsme žádný dokument. Ujistěte se prosím, že všechna slova jsou " -"správně a že jste vybral dostatek kategorií." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Vyhledávání skončilo, nalezeno %s stran." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -762,23 +752,50 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Vydání" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Plný index na jedné stránce" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[obrázek]" + +#~ msgid "Platforms: " +#~ msgstr "Platformy: " + +#~ msgid "Searching" +#~ msgstr "Hledám" + +#~ msgid "Preparing search..." +#~ msgstr "Připravuji vyhledávání...." + +#~ msgid ", in " +#~ msgstr ", v" + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Nenalezli jsme žádný dokument. Ujistěte " +#~ "se prosím, že všechna slova jsou " +#~ "správně a že jste vybral dostatek " +#~ "kategorií." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Vyhledávání skončilo, nalezeno %s stran." + diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.js b/sphinx/locale/da/LC_MESSAGES/sphinx.js index d17efc474..c28fab306 100644 --- a/sphinx/locale/da/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/da/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "da", "plural_expr": "(n != 1)", "messages": {"Search Results": "S\u00f8geresultater", "Preparing search...": "Forbereder s\u00f8gning...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Din s\u00f8gning gav ingen resultater. Kontroll\u00e9r venligst at alle ord er stavet korrekt, og at du har valgt nok kategorier.", "Search finished, found %s page(s) matching the search query.": "S\u00f8gningen fuldf\u00f8rt - fandt %s sider for denne s\u00f8gning.", ", in ": ", i ", "Permalink to this headline": "Permalink til denne overskrift", "Searching": "S\u00f8ger", "Permalink to this definition": "Permalink til denne definition", "Hide Search Matches": "Skjul s\u00f8geresultater"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "da", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Skjul s\u00f8geresultater", "Permalink to this definition": "Permalink til denne definition", "Expand sidebar": "Udfold sidebj\u00e6lke", "Permalink to this headline": "Permalink til denne overskrift", "Collapse sidebar": "Sammenfold sidebj\u00e6lke"}}); \ No newline at end of file diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.mo b/sphinx/locale/da/LC_MESSAGES/sphinx.mo index a47f10deb..018ac7f0a 100644 Binary files a/sphinx/locale/da/LC_MESSAGES/sphinx.mo and b/sphinx/locale/da/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.po b/sphinx/locale/da/LC_MESSAGES/sphinx.po index c975e747e..752936bb5 100644 --- a/sphinx/locale/da/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/da/LC_MESSAGES/sphinx.po @@ -1,509 +1,599 @@ -# Translations template for Sphinx. -# Copyright (C) 2009 The Sphinx Team +# Danish translations for Sphinx. +# Copyright (C) 2009, 2011 The Sphinx Team # This file is distributed under the same license as the Sphinx project. # -# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010. +# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010, 2011. msgid "" msgstr "" "Project-Id-Version: Sphinx 1.0pre/[?1034h2e1ab15e035e\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2009-11-08 16:28+0100\n" -"PO-Revision-Date: 2010-06-03 23:47+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n" -"Language-Team: Danish <dansk@dansk-gruppen.dk\n" +"Language-Team: Danish <dansk@dansk-gruppen.dk>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -# 21. april, 2010 -#: sphinx/environment.py:130 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 +#: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d. %B, %Y" -#: sphinx/environment.py:348 sphinx/themes/basic/genindex-single.html:2 -#: sphinx/themes/basic/genindex-split.html:2 -#: sphinx/themes/basic/genindex-split.html:5 -#: sphinx/themes/basic/genindex.html:2 sphinx/themes/basic/genindex.html:5 -#: sphinx/themes/basic/genindex.html:48 sphinx/themes/basic/layout.html:134 -#: sphinx/writers/latex.py:190 -msgid "Index" -msgstr "Indeks" - -#: sphinx/environment.py:349 sphinx/writers/latex.py:189 -msgid "Module Index" -msgstr "Modulindeks" - -# Ikke 'Søg på side' -#: sphinx/environment.py:350 sphinx/themes/basic/defindex.html:16 -msgid "Search Page" -msgstr "Søgeside" - -#: sphinx/roles.py:167 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "se %s" -#: sphinx/builders/changes.py:70 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "se også %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Indbyggede" -#: sphinx/builders/changes.py:72 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Modulniveau" -# Apr 21, 2010 -#: sphinx/builders/html.py:224 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d. %b, %Y" -#: sphinx/builders/html.py:243 sphinx/themes/basic/defindex.html:21 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Generelt indeks" -#: sphinx/builders/html.py:243 +#: sphinx/builders/html.py:293 msgid "index" msgstr "indeks" -#: sphinx/builders/html.py:247 sphinx/builders/htmlhelp.py:220 -#: sphinx/builders/qthelp.py:133 sphinx/themes/basic/defindex.html:19 -#: sphinx/themes/basic/modindex.html:2 sphinx/themes/basic/modindex.html:13 -#: sphinx/themes/scrolls/modindex.html:2 sphinx/themes/scrolls/modindex.html:13 -msgid "Global Module Index" -msgstr "Globalt modulindeks" - -#: sphinx/builders/html.py:248 -msgid "modules" -msgstr "moduler" - -#: sphinx/builders/html.py:304 +#: sphinx/builders/html.py:353 msgid "next" msgstr "næste" -#: sphinx/builders/html.py:313 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "forrige" -#: sphinx/builders/latex.py:162 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (i " -#: sphinx/directives/__init__.py:78 sphinx/directives/__init__.py:79 -#: sphinx/directives/__init__.py:80 sphinx/directives/__init__.py:81 -msgid "Raises" -msgstr "Rejser" +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Indeks" -#: sphinx/directives/__init__.py:82 sphinx/directives/__init__.py:83 -#: sphinx/directives/__init__.py:84 -msgid "Variable" -msgstr "Variabel" - -#: sphinx/directives/__init__.py:85 sphinx/directives/__init__.py:86 -#: sphinx/directives/__init__.py:92 sphinx/directives/__init__.py:93 -msgid "Returns" -msgstr "Returnerer" - -#: sphinx/directives/__init__.py:94 -msgid "Return type" -msgstr "Returtype" - -#: sphinx/directives/__init__.py:169 -msgid "Parameter" -msgstr "Parameter" - -#: sphinx/directives/__init__.py:173 -msgid "Parameters" -msgstr "Parametre" - -#: sphinx/directives/other.py:127 +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Afsnitsforfatter: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Modulforfatter: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 +msgid "Code author: " +msgstr "Kodeforfatter: " + +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Forfatter: " -#: sphinx/directives/other.py:233 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Se også" -#: sphinx/domains/c.py:124 +#: sphinx/domains/__init__.py:244 +#, python-format +msgid "%s %s" +msgstr "%s %s" + +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 +msgid "Parameters" +msgstr "Parametre" + +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 +msgid "Returns" +msgstr "Returnerer" + +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 +msgid "Return type" +msgstr "Returtype" + +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C-funktion)" -#: sphinx/domains/c.py:126 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C-medlem)" -#: sphinx/domains/c.py:128 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C-makro)" -#: sphinx/domains/c.py:130 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C-type)" -#: sphinx/domains/c.py:132 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C-variabel)" -#: sphinx/domains/c.py:162 -msgid "C function" -msgstr "C-funktion" +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 +msgid "function" +msgstr "funktion" -#: sphinx/domains/c.py:163 -msgid "C member" -msgstr "C-medlem" +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 +msgid "member" +msgstr "medlem" -#: sphinx/domains/c.py:164 -msgid "C macro" -msgstr "C-makro" +#: sphinx/domains/c.py:206 +msgid "macro" +msgstr "makro" -#: sphinx/domains/c.py:165 -msgid "C type" -msgstr "C-type" +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 +msgid "type" +msgstr "type" -#: sphinx/domains/c.py:166 -msgid "C variable" -msgstr "C-variabel" +#: sphinx/domains/c.py:208 +msgid "variable" +msgstr "variabel" -#: sphinx/domains/python.py:186 +#: sphinx/domains/cpp.py:897 +#, python-format +msgid "%s (C++ class)" +msgstr "%s (C++-klasse)" + +#: sphinx/domains/cpp.py:912 +#, python-format +msgid "%s (C++ type)" +msgstr "%s (C++-type)" + +#: sphinx/domains/cpp.py:931 +#, python-format +msgid "%s (C++ member)" +msgstr "%s (C++-medlem)" + +#: sphinx/domains/cpp.py:983 +#, python-format +msgid "%s (C++ function)" +msgstr "%s (C++-funktion)" + +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 +msgid "class" +msgstr "klasse" + +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (indbygget funktion)" -#: sphinx/domains/python.py:187 sphinx/domains/python.py:244 -#: sphinx/domains/python.py:256 sphinx/domains/python.py:269 -#, python-format -msgid "%s() (in module %s)" -msgstr "%s() (i modulet %s)" - -#: sphinx/domains/python.py:190 -#, python-format -msgid "%s (built-in variable)" -msgstr "%s (indbygget variabel)" - -#: sphinx/domains/python.py:191 sphinx/domains/python.py:282 -#, python-format -msgid "%s (in module %s)" -msgstr "%s (i modulet %s)" - -#: sphinx/domains/python.py:207 -#, python-format -msgid "%s (built-in class)" -msgstr "%s (indbygget klasse)" - -#: sphinx/domains/python.py:208 -#, python-format -msgid "%s (class in %s)" -msgstr "%s (klasse i %s)" - -#: sphinx/domains/python.py:248 -#, python-format -msgid "%s() (%s.%s method)" -msgstr "%s() (metode i %s.%s)" - -#: sphinx/domains/python.py:250 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (metode i %s)" -#: sphinx/domains/python.py:260 +#: sphinx/domains/javascript.py:109 #, python-format -msgid "%s() (%s.%s static method)" -msgstr "%s() (statisk metode i %s.%s)" +msgid "%s() (class)" +msgstr "%s() (klasse)" -#: sphinx/domains/python.py:263 +#: sphinx/domains/javascript.py:111 #, python-format -msgid "%s() (%s static method)" -msgstr "%s() (statisk metode i %s)" +msgid "%s (global variable or constant)" +msgstr "%s (global variabel eller konstant)" -#: sphinx/domains/python.py:273 -#, python-format -msgid "%s() (%s.%s class method)" -msgstr "%s() (klassemetode i %s.%s)" - -#: sphinx/domains/python.py:276 -#, python-format -msgid "%s() (%s class method)" -msgstr "%s() (klassemetode i %s)" - -#: sphinx/domains/python.py:286 -#, python-format -msgid "%s (%s.%s attribute)" -msgstr "%s (attribut i %s.%s)" - -#: sphinx/domains/python.py:288 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (attribut i %s)" -#: sphinx/domains/python.py:334 -msgid "Platforms: " -msgstr "Platforme: " +#: sphinx/domains/javascript.py:122 +msgid "Arguments" +msgstr "Parametre" -#: sphinx/domains/python.py:340 +#: sphinx/domains/javascript.py:125 +msgid "Throws" +msgstr "Kaster" + +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 +msgid "data" +msgstr "data" + +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 +msgid "attribute" +msgstr "attribut" + +#: sphinx/domains/python.py:100 +msgid "Variables" +msgstr "Variable" + +#: sphinx/domains/python.py:104 +msgid "Raises" +msgstr "Rejser" + +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (i modulet %s)" + +#: sphinx/domains/python.py:258 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (indbygget variabel)" + +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (i modulet %s)" + +#: sphinx/domains/python.py:275 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (indbygget klasse)" + +#: sphinx/domains/python.py:276 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (klasse i %s)" + +#: sphinx/domains/python.py:316 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (metode i %s.%s)" + +#: sphinx/domains/python.py:328 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (statisk metode i %s.%s)" + +#: sphinx/domains/python.py:331 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (statisk metode i %s)" + +#: sphinx/domains/python.py:341 +#, python-format +msgid "%s() (%s.%s class method)" +msgstr "%s() (klassemetode i %s.%s)" + +#: sphinx/domains/python.py:344 +#, python-format +msgid "%s() (%s class method)" +msgstr "%s() (klassemetode i %s)" + +#: sphinx/domains/python.py:354 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (attribut i %s.%s)" + +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modul)" -#: sphinx/domains/python.py:396 -msgid "function" -msgstr "funktion" +#: sphinx/domains/python.py:490 +msgid "Python Module Index" +msgstr "Python-modulindeks" -#: sphinx/domains/python.py:397 -msgid "data" -msgstr "data" +#: sphinx/domains/python.py:491 +msgid "modules" +msgstr "moduler" -#: sphinx/domains/python.py:398 -msgid "class" -msgstr "klasse" +#: sphinx/domains/python.py:536 +msgid "Deprecated" +msgstr "Forældet" -#: sphinx/domains/python.py:399 sphinx/locale/__init__.py:161 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "undtagelse" -#: sphinx/domains/python.py:400 +#: sphinx/domains/python.py:562 msgid "method" msgstr "metode" -#: sphinx/domains/python.py:401 -msgid "attribute" -msgstr "attribut" +#: sphinx/domains/python.py:563 +msgid "class method" +msgstr "klassemetode" -#: sphinx/domains/python.py:402 sphinx/locale/__init__.py:157 +#: sphinx/domains/python.py:564 +msgid "static method" +msgstr "statisk metode" + +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modul" -#: sphinx/domains/std.py:67 sphinx/domains/std.py:83 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (forældet)" + +#: sphinx/domains/rst.py:55 +#, python-format +msgid "%s (directive)" +msgstr "%s (direktiv)" + +#: sphinx/domains/rst.py:57 +#, python-format +msgid "%s (role)" +msgstr "%s (rolle)" + +#: sphinx/domains/rst.py:106 +msgid "directive" +msgstr "direktiv" + +#: sphinx/domains/rst.py:107 +msgid "role" +msgstr "rolle" + +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "miljøvariabel; %s" -#: sphinx/domains/std.py:156 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%skommandolinjetilvalg; %s" -#: sphinx/domains/std.py:324 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "begreb i ordliste" -#: sphinx/domains/std.py:325 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "grammatisk element" -#: sphinx/domains/std.py:326 +#: sphinx/domains/std.py:395 +msgid "reference label" +msgstr "referenceetiket" + +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "miljøvariabel" -#: sphinx/domains/std.py:327 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "programtilvalg" -#: sphinx/ext/autodoc.py:892 +#: sphinx/domains/std.py:428 +msgid "Module Index" +msgstr "Modulindeks" + +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 +msgid "Search Page" +msgstr "Søgeside" + +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Baser: %s" -#: sphinx/ext/autodoc.py:925 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "alias for :class:`%s`" -#: sphinx/ext/todo.py:40 +#: sphinx/ext/todo.py:41 msgid "Todo" msgstr "Todo" -#: sphinx/ext/todo.py:98 +#: sphinx/ext/todo.py:109 #, python-format -msgid "(The original entry is located in %s, line %d and can be found " -msgstr "(Det oprindelige punkt befinder sig i %s, linje %d, og kan findes " +msgid "(The <<original entry>> is located in %s, line %d.)" +msgstr "(Det <<oprindelige punkt>> befinder sig i %s, linje %d.)" -#: sphinx/ext/todo.py:104 -msgid "here" -msgstr "her" +#: sphinx/ext/todo.py:117 +msgid "original entry" +msgstr "oprindeligt punkt" -#: sphinx/locale/__init__.py:138 +#: sphinx/ext/viewcode.py:70 +msgid "[source]" +msgstr "[kilde]" + +#: sphinx/ext/viewcode.py:117 +msgid "[docs]" +msgstr "[dok]" + +#: sphinx/ext/viewcode.py:131 +msgid "Module code" +msgstr "Modulkode" + +#: sphinx/ext/viewcode.py:137 +#, python-format +msgid "<h1>Source code for %s</h1>" +msgstr "<h1>Kildekode for %s</h1>" + +#: sphinx/ext/viewcode.py:164 +msgid "Overview: module code" +msgstr "Oversigt: modulkode" + +#: sphinx/ext/viewcode.py:165 +msgid "<h1>All modules for which code is available</h1>" +msgstr "<h1>Alle moduler, der er kode tilgængelig for</h1>" + +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Vær opmærksom" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Forsigtig" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Fare" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Fejl" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Fif" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Vigtigt" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Bemærk" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Se også" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Tip" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Advarsel" -#: sphinx/locale/__init__.py:151 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Ny i version %s" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Ændret i version %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" -msgstr "Deprecieret siden version %s" +msgstr "Forældet siden version %s" -#: sphinx/locale/__init__.py:158 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "nøgleord" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operator" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objekt" -#: sphinx/locale/__init__.py:162 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "erklæring" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "indbygget funktion" -#: sphinx/themes/basic/defindex.html:2 +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/basic/localtoc.html:11 +msgid "Table Of Contents" +msgstr "Indholdsfortegnelse" + +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 +msgid "Search" +msgstr "Søg" + +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 +msgid "Go" +msgstr "Søg" + +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 +msgid "Enter search terms or a module, class or function name." +msgstr "Indtast søgeord eller navnet på et modul, en klasse eller en funktion." + +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 +msgid "Show Source" +msgstr "Vis kilde" + +#: sphinx/themes/basic/defindex.html:11 msgid "Overview" msgstr "Oversigt" -#: sphinx/themes/basic/defindex.html:11 +#: sphinx/themes/basic/defindex.html:20 msgid "Indices and tables:" msgstr "Indeks og tabeller:" -#: sphinx/themes/basic/defindex.html:14 +#: sphinx/themes/basic/defindex.html:23 msgid "Complete Table of Contents" msgstr "Fuldstændig indholdsfortegnelse" -#: sphinx/themes/basic/defindex.html:15 +#: sphinx/themes/basic/defindex.html:24 msgid "lists all sections and subsections" msgstr "viser alle afsnit og underafsnit" -#: sphinx/themes/basic/defindex.html:17 +#: sphinx/themes/basic/defindex.html:26 msgid "search this documentation" msgstr "søg i denne dokumentation" -#: sphinx/themes/basic/defindex.html:20 +#: sphinx/themes/basic/defindex.html:28 +msgid "Global Module Index" +msgstr "Globalt modulindeks" + +#: sphinx/themes/basic/defindex.html:29 msgid "quick access to all modules" msgstr "hurtig adgang til alle moduler" -#: sphinx/themes/basic/defindex.html:22 +#: sphinx/themes/basic/defindex.html:31 msgid "all functions, classes, terms" msgstr "alle funktioner, klasser, begreber" -#: sphinx/themes/basic/genindex-single.html:5 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Indeks – %(key)s" -#: sphinx/themes/basic/genindex-single.html:44 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex-split.html:27 -#: sphinx/themes/basic/genindex.html:54 +#: sphinx/themes/basic/genindex-single.html:63 +#: sphinx/themes/basic/genindex-split.html:24 +#: sphinx/themes/basic/genindex-split.html:38 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Fuldt indeks på én side" -#: sphinx/themes/basic/genindex-split.html:7 +#: sphinx/themes/basic/genindex-split.html:16 msgid "Index pages by letter" msgstr "Indeksér sider efter bogstav" -# refererer til indeks -#: sphinx/themes/basic/genindex-split.html:15 +#: sphinx/themes/basic/genindex-split.html:25 msgid "can be huge" msgstr "kan være enormt" -#: sphinx/themes/basic/layout.html:10 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigation" -#: sphinx/themes/basic/layout.html:42 -msgid "Table Of Contents" -msgstr "Indholdsfortegnelse" - -#: sphinx/themes/basic/layout.html:48 -msgid "Previous topic" -msgstr "Forrige emne" - -#: sphinx/themes/basic/layout.html:50 -msgid "previous chapter" -msgstr "forrige kapitel" - -#: sphinx/themes/basic/layout.html:53 -msgid "Next topic" -msgstr "Næste emne" - -#: sphinx/themes/basic/layout.html:55 -msgid "next chapter" -msgstr "næste kapitel" - -#: sphinx/themes/basic/layout.html:60 -msgid "This Page" -msgstr "Denne side" - -#: sphinx/themes/basic/layout.html:63 -msgid "Show Source" -msgstr "Vis kilde" - -#: sphinx/themes/basic/layout.html:73 -msgid "Quick search" -msgstr "Hurtig søgning" - -# Referencen fra layout.html:76 er til en søgeknap -#: sphinx/themes/basic/layout.html:76 -msgid "Go" -msgstr "Søg" - -#: sphinx/themes/basic/layout.html:81 -msgid "Enter search terms or a module, class or function name." -msgstr "Indtast søgeord eller navnet på et modul, en klasse eller en funktion." - #: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" @@ -513,48 +603,56 @@ msgstr "Søg i %(docstitle)s" msgid "About these documents" msgstr "Om disse dokumenter" -#: sphinx/themes/basic/layout.html:137 sphinx/themes/basic/search.html:2 -#: sphinx/themes/basic/search.html:5 -msgid "Search" -msgstr "Søg" - #: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Ophavsret" -#: sphinx/themes/basic/layout.html:187 sphinx/themes/scrolls/layout.html:83 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Ophavsret</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:189 sphinx/themes/scrolls/layout.html:85 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Ophavsret %(copyright)s." -# datoformatet passer ikke med "den %(last_updated)s" -#: sphinx/themes/basic/layout.html:193 sphinx/themes/scrolls/layout.html:89 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Sidst opdateret %(last_updated)s." -#: sphinx/themes/basic/layout.html:196 sphinx/themes/scrolls/layout.html:92 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " "%(sphinx_version)s." -msgstr "Bygget med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." - -#: sphinx/themes/basic/modindex.html:36 sphinx/themes/scrolls/modindex.html:37 -msgid "Deprecated" -msgstr "Deprecieret" +msgstr "" +"Bygget med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." #: sphinx/themes/basic/opensearch.xml:4 #, python-format msgid "Search %(docstitle)s" msgstr "Søg i %(docstitle)s" -#: sphinx/themes/basic/search.html:9 +#: sphinx/themes/basic/relations.html:11 +msgid "Previous topic" +msgstr "Forrige emne" + +#: sphinx/themes/basic/relations.html:13 +msgid "previous chapter" +msgstr "forrige kapitel" + +#: sphinx/themes/basic/relations.html:16 +msgid "Next topic" +msgstr "Næste emne" + +#: sphinx/themes/basic/relations.html:18 +msgid "next chapter" +msgstr "næste kapitel" + +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -562,7 +660,7 @@ msgstr "" "Aktivér venligst JavaScript for at aktivere\n" " søgefunktionalitet." -#: sphinx/themes/basic/search.html:14 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -574,19 +672,26 @@ msgstr "" " automatisk vil søge på alle ordene. Sider, der indeholder\n" " færre ord, vil ikke indgå i resultaterne." -#: sphinx/themes/basic/search.html:21 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "søg" -#: sphinx/themes/basic/search.html:25 -#: sphinx/themes/basic/static/searchtools.js:473 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Søgeresultater" -#: sphinx/themes/basic/search.html:27 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Din søgning gav ingen resultater." +#: sphinx/themes/basic/searchbox.html:12 +msgid "Quick search" +msgstr "Hurtig søgning" + +#: sphinx/themes/basic/sourcelink.html:11 +msgid "This Page" +msgstr "Denne side" + #: sphinx/themes/basic/changes/frameset.html:5 #: sphinx/themes/basic/changes/versionchanges.html:12 #, python-format @@ -615,64 +720,75 @@ msgstr "Ændringer i C-API" msgid "Other changes" msgstr "Andre ændringer" -#: sphinx/themes/basic/static/doctools.js:138 sphinx/writers/html.py:462 -#: sphinx/writers/html.py:467 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Permalink til denne overskrift" -#: sphinx/themes/basic/static/doctools.js:144 sphinx/writers/html.py:80 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Permalink til denne definition" -#: sphinx/themes/basic/static/doctools.js:173 +#: sphinx/themes/basic/static/doctools.js:189 msgid "Hide Search Matches" msgstr "Skjul søgeresultater" -#: sphinx/themes/basic/static/searchtools.js:274 -msgid "Searching" -msgstr "Søger" +#: sphinx/themes/default/static/sidebar.js:69 +msgid "Expand sidebar" +msgstr "Udfold sidebjælke" -#: sphinx/themes/basic/static/searchtools.js:279 -msgid "Preparing search..." -msgstr "Forbereder søgning..." +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 +msgid "Collapse sidebar" +msgstr "Sammenfold sidebjælke" -#: sphinx/themes/basic/static/searchtools.js:352 -msgid ", in " -msgstr ", i " +#: sphinx/themes/haiku/layout.html:26 +msgid "Contents" +msgstr "Indhold" -#: sphinx/themes/basic/static/searchtools.js:475 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "Din søgning gav ingen resultater. Kontrollér venligst at alle ord er stavet korrekt, og at du har valgt nok kategorier." - -#: sphinx/themes/basic/static/searchtools.js:477 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Søgningen fuldført - fandt %s sider for denne søgning." - -#: sphinx/writers/latex.py:187 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Udgave" -#: sphinx/writers/latex.py:579 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Fodnoter" -#: sphinx/writers/latex.py:647 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "fortsat fra forrige side" -#: sphinx/writers/latex.py:652 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Fortsættes på næste side" -#: sphinx/writers/text.py:166 -#, python-format -msgid "Platform: %s" -msgstr "Platform: %s" - -#: sphinx/writers/text.py:428 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[billede]" +#~ msgid "Platforms: " +#~ msgstr "Platforme: " + +#~ msgid "Searching" +#~ msgstr "Søger" + +#~ msgid "Preparing search..." +#~ msgstr "Forbereder søgning..." + +#~ msgid ", in " +#~ msgstr ", i " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Din søgning gav ingen resultater. " +#~ "Kontrollér venligst at alle ord er " +#~ "stavet korrekt, og at du har valgt" +#~ " nok kategorier." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Søgningen fuldført - fandt %s sider for denne søgning." + diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.js b/sphinx/locale/de/LC_MESSAGES/sphinx.js index 5409d6d9d..665492b11 100644 --- a/sphinx/locale/de/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/de/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"Search Results": "Suchergebnisse", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine zutreffenden Dokumente gefunden. Haben Sie alle Suchbegriffe richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s zutreffende Seite(n) gefunden.", ", in ": ", in ", "Expand sidebar": "Sidebar ausklappen", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suche...", "Collapse sidebar": "Sidebar einklappen", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Suchergebnisse ausblenden", "Permalink to this definition": "Permalink zu dieser Definition", "Expand sidebar": "Sidebar ausklappen", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Collapse sidebar": "Sidebar einklappen"}}); \ No newline at end of file diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.mo b/sphinx/locale/de/LC_MESSAGES/sphinx.mo index 5657b0ab8..357d46f08 100644 Binary files a/sphinx/locale/de/LC_MESSAGES/sphinx.mo and b/sphinx/locale/de/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.po b/sphinx/locale/de/LC_MESSAGES/sphinx.po index f92ba23cd..a3bebd9d3 100644 --- a/sphinx/locale/de/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/de/LC_MESSAGES/sphinx.po @@ -7,382 +7,397 @@ msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-08-07 21:40+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Georg Brandl <georg@python.org>\n" "Language-Team: de <LL@li.org>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d. %m. %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "siehe %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "siehe auch %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Builtins" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Modulebene" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d. %m. %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Allgemeiner Index" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "Index" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "weiter" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "zurück" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (in " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Stichwortverzeichnis" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor des Abschnitts: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor des Moduls: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 msgid "Code author: " msgstr "Autor des Quellcode: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Siehe auch" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "%s-%s" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parameter" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Rückgabe" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Rückgabetyp" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C-Funktion)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C-Member)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C-Makro)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C-Typ)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C-Variable)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "Funktion" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "Member" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "Makro" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "Typ" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "Variable" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++-Klasse)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++-Typ)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++-Member)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++-Funktion)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "Klasse" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (Standard-Funktion)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (Methode von %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (Klasse)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (globale Variable oder Konstante)" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (Attribut von %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "Parameter" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "Wirft" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "Daten" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 -#, python-format +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "Attribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "Variablen" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Verursacht" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (in Modul %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (Standard-Variable)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (in Modul %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (Standard-Klasse)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (Klasse in %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (Methode von %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (statische Methode von %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (statische Methode von %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (Klassenmethode von %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "%s() (Klassenmethode von %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (Attribut von %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Plattformen: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (Modul)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 msgid "Python Module Index" msgstr "Python-Modulindex" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "Module" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Veraltet" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "Exception" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "Methode" -#: sphinx/domains/python.py:502 -#, python-format +#: sphinx/domains/python.py:563 msgid "class method" msgstr "Klassenmethode" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statische Methode" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "Module" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (veraltet)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "%s (Direktive)" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, python-format msgid "%s (role)" msgstr "%s (Rolle)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "Direktive" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 msgid "role" msgstr "Rolle" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "Umgebungsvariable; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sKommandozeilenoption; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "Glossareintrag" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "Grammatik-Token" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "Referenz-Label" -#: sphinx/domains/std.py:331 -#, python-format +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "Umgebungsvariable" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "Programmoption" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Stichwortverzeichnis" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Modulindex" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Suche" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Basisklassen: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "Alias von :class:`%s`" @@ -400,103 +415,103 @@ msgstr "(Der <<ursprüngliche Eintrag>> steht in %s, Zeile %d.)" msgid "original entry" msgstr "ursprüngliche Eintrag" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "[Quelle]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "[Doku]" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 msgid "Module code" msgstr "Modul-Quellcode" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "<h1>Quellcode für %s</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "Überblick: Modul-Quellcode" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "<h1>Alle Module, für die Quellcode verfügbar ist</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Achtung" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Vorsicht" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Gefahr" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Fehler" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Hinweis" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Wichtig" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Bemerkung" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Siehe auch" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Tipp" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Warnung" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Neu in Version %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Geändert in Version %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Veraltet ab Version %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "Schlüsselwort" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "Operator" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "Objekt" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "Anweisung" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "Standard-Funktion" @@ -505,8 +520,8 @@ msgstr "Standard-Funktion" msgid "Table Of Contents" msgstr "Inhalt" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Suche" @@ -556,15 +571,15 @@ msgstr "Schneller Zugriff auf alle Module" msgid "all functions, classes, terms" msgstr "Alle Funktionen, Klassen, Begriffe" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Stichwortverzeichnis – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Gesamtes Stichwortverzeichnis auf einer Seite" @@ -576,39 +591,39 @@ msgstr "Stichwortverzeichnis nach Anfangsbuchstabe" msgid "can be huge" msgstr "kann groß sein" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigation" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Suche in %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Über diese Dokumentation" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Zuletzt aktualisiert am %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -638,13 +653,13 @@ msgstr "Nächstes Thema" msgid "next chapter" msgstr "nächstes Kapitel" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -657,16 +672,15 @@ msgstr "" "all diesen Worten suchen wird. Seiten, die nicht alle Worte enthalten, " "werden nicht in der Ergebnisliste erscheinen." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "suchen" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Suchergebnisse" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Deine Suche ergab leider keine Treffer." @@ -706,12 +720,12 @@ msgstr "C API-Änderungen" msgid "Other changes" msgstr "Andere Änderungen" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Permalink zu dieser Überschrift" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Permalink zu dieser Definition" @@ -719,37 +733,12 @@ msgstr "Permalink zu dieser Definition" msgid "Hide Search Matches" msgstr "Suchergebnisse ausblenden" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Suche..." - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Suche wird vorbereitet..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", in " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Es wurden keine zutreffenden Dokumente gefunden. Haben Sie alle " -"Suchbegriffe richtig geschrieben und genügend Kategorien ausgewählt?" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Suche beendet, %s zutreffende Seite(n) gefunden." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "Sidebar ausklappen" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "Sidebar einklappen" @@ -757,23 +746,49 @@ msgstr "Sidebar einklappen" msgid "Contents" msgstr "Inhalt" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Release" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Fußnoten" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "Fortsetzung der vorherigen Seite" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Fortsetzung auf der nächsten Seite" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[Bild]" +#~ msgid "Platforms: " +#~ msgstr "Plattformen: " + +#~ msgid "Searching" +#~ msgstr "Suche..." + +#~ msgid "Preparing search..." +#~ msgstr "Suche wird vorbereitet..." + +#~ msgid ", in " +#~ msgstr ", in " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Es wurden keine zutreffenden Dokumente " +#~ "gefunden. Haben Sie alle Suchbegriffe " +#~ "richtig geschrieben und genügend Kategorien" +#~ " ausgewählt?" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Suche beendet, %s zutreffende Seite(n) gefunden." + diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.js b/sphinx/locale/es/LC_MESSAGES/sphinx.js index 098e8b5df..8ccbc0ca8 100644 --- a/sphinx/locale/es/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/es/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"Search Results": "Resultados de la b\u00fasqueda", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado. Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Collapse sidebar": "", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Expand sidebar": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.mo b/sphinx/locale/es/LC_MESSAGES/sphinx.mo index c1ee0bfe1..b897ad435 100644 Binary files a/sphinx/locale/es/LC_MESSAGES/sphinx.mo and b/sphinx/locale/es/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.po b/sphinx/locale/es/LC_MESSAGES/sphinx.po index a380a416f..52ed0b74f 100644 --- a/sphinx/locale/es/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/es/LC_MESSAGES/sphinx.po @@ -8,389 +8,408 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n" "POT-Creation-Date: 2008-09-11 23:58+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n" "Language-Team: es <LL@li.org>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 -#, fuzzy, python-format +#, python-format msgid "%B %d, %Y" msgstr "%d de %B de %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "ver %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "ver también %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 #, fuzzy msgid "Builtins" msgstr "Funciones de base" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 #, fuzzy msgid "Module level" msgstr "Módulos" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b, %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Índice General" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "índice" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "siguiente" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "anterior" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Índice" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor de la sección: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor del módulo: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Autor del módulo: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor:" -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Ver también" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parámetros" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Devuelve" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 #, fuzzy msgid "Return type" msgstr "Tipo del argumento devuelto" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (función C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (miembro C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (macro C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (tipo C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (variable C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "función" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "miembro" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipo" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Variable" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (clase C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (tipo C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, fuzzy, python-format msgid "%s (C++ member)" msgstr "%s (miembro C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, fuzzy, python-format msgid "%s (C++ function)" msgstr "%s (función C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "clase" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, fuzzy, python-format msgid "%s() (built-in function)" msgstr "%s() (función de base)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s método)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, fuzzy, python-format +msgid "%s() (class)" +msgstr "%s (clase C++)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s atributo)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parámetros" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atributo" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Variable" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Muestra" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (en el módulo %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, fuzzy, python-format msgid "%s (built-in variable)" msgstr "%s (variable de base)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (en el módulo %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, fuzzy, python-format msgid "%s (built-in class)" msgstr "%s (variable de base)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (clase en %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s método)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s método estático)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s método estático)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s método)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s método)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s atributo)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Plataformas:" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (módulo)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Índice de Módulos" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "módulos" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Obsoleto" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "excepción" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 +#, fuzzy msgid "class method" msgstr "%s() (%s método)" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "método estático" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "módulo" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr "Obsoleto" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, fuzzy, python-format msgid "%s (role)" msgstr "%s (módulo)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 #, fuzzy msgid "role" msgstr "módulo" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "variables de entorno; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, fuzzy, python-format msgid "%scommand line option; %s" msgstr "%sOpciones en línea de comandos; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "variables de entorno" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Índice" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Índice de Módulos" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Página de Búsqueda" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -408,104 +427,104 @@ msgstr "" msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "módulo" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Atención" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Prudencia" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Peligro" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Error" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Consejo" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Importante" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Nota" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Ver También" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Truco" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Advertencia" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nuevo en la versión %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Distinto en la versión %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Obsoleto desde la versión %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "palabra clave" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operador" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objeto" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "sentencia" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 #, fuzzy msgid "built-in function" msgstr "función de base" @@ -515,8 +534,8 @@ msgstr "función de base" msgid "Table Of Contents" msgstr "Contenidos" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Búsqueda" @@ -565,15 +584,15 @@ msgstr "acceso rápido a todos los módulos" msgid "all functions, classes, terms" msgstr "todas las funciones, clases, términos" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Índice – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Índice completo en una página" @@ -585,39 +604,39 @@ msgstr "Índice alfabético" msgid "can be huge" msgstr "puede ser muy grande" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navegación" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Buscar en %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Sobre este documento" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Actualizado por última vez en %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -647,13 +666,13 @@ msgstr "Próximo tema" msgid "next chapter" msgstr "Próximo capítulo" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 #, fuzzy msgid "" "From here you can search these documents. Enter your search\n" @@ -666,16 +685,15 @@ msgstr "" " las palabras. Las páginas que contengan menos palabras no aparecerán en" " la lista de resultados." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "buscar" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Resultados de la búsqueda" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Tu consulta no obtuvo ningún resultado" @@ -715,12 +733,12 @@ msgstr "Cambios en la API C" msgid "Other changes" msgstr "Otros cambios" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Enlazar permanentemente con este título" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Enlazar permanentemente con esta definición" @@ -729,40 +747,12 @@ msgstr "Enlazar permanentemente con esta definición" msgid "Hide Search Matches" msgstr "Coincidencias de la búsqueda" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Buscando" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Preparando la búsqueda" - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"La búsqueda no dio ningún resultado. Por favor asegúrese que escribió " -"todas las palabras correctamente y que ha seleccionado suficientes " -"categorías" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "" -"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su" -" consulta" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -770,24 +760,54 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 #, fuzzy msgid "Release" msgstr "Versión" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Índice completo en una página" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[imagen]" + +#~ msgid "Platforms: " +#~ msgstr "Plataformas:" + +#~ msgid "Searching" +#~ msgstr "Buscando" + +#~ msgid "Preparing search..." +#~ msgstr "Preparando la búsqueda" + +#~ msgid ", in " +#~ msgstr "" + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "La búsqueda no dio ningún resultado." +#~ " Por favor asegúrese que escribió " +#~ "todas las palabras correctamente y que" +#~ " ha seleccionado suficientes categorías" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "" +#~ "Búsqueda finalizada, se han encontrado " +#~ "%s página(s) que concuerdan con su " +#~ "consulta" + diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.js b/sphinx/locale/fa/LC_MESSAGES/sphinx.js new file mode 100644 index 000000000..72b0ee94d --- /dev/null +++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.js @@ -0,0 +1 @@ +Documentation.addTranslations({"locale": "fa", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "\u0639\u062f\u0645 \u0646\u0645\u0627\u06cc\u0634 \u0646\u062a\u0627\u06cc\u062c \u06cc\u0627\u0641\u062a \u0634\u062f\u0647", "Permalink to this definition": "\u0644\u06cc\u0646\u06a9 \u062b\u0627\u0628\u062a \u0628\u0647 \u0627\u06cc\u0646 \u062a\u0639\u0631\u06cc\u0641", "Expand sidebar": "", "Permalink to this headline": "\u0644\u06cc\u0646\u06a9 \u062b\u0627\u0628\u062a \u0628\u0647 \u0627\u06cc\u0646 \u0633\u0631 \u0645\u0642\u0627\u0644\u0647", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.mo b/sphinx/locale/fa/LC_MESSAGES/sphinx.mo new file mode 100644 index 000000000..040cf00a8 Binary files /dev/null and b/sphinx/locale/fa/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.po b/sphinx/locale/fa/LC_MESSAGES/sphinx.po new file mode 100644 index 000000000..8f75c591e --- /dev/null +++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.po @@ -0,0 +1,836 @@ +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 1.0.3\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-11-09 19:46+0100\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" +"Last-Translator: Omid Raha <omidraha.com@gmail.com>\n" +"Language-Team: Omid Raha <omidraha.com@gmail.com>\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.5\n" + +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 +#: sphinx/writers/manpage.py:67 +#, python-format +msgid "%B %d, %Y" +msgstr "" + +#: sphinx/environment.py:1624 +#, python-format +msgid "see %s" +msgstr "" + +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "همچنین ملاحظه نمائید %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 +msgid "Builtins" +msgstr "درونی سازی" + +#: sphinx/builders/changes.py:75 +msgid "Module level" +msgstr "در سطح ماژول" + +#: sphinx/builders/html.py:274 +#, python-format +msgid "%b %d, %Y" +msgstr "" + +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 +msgid "General Index" +msgstr "فهرست کلی" + +#: sphinx/builders/html.py:293 +msgid "index" +msgstr "فهرست" + +#: sphinx/builders/html.py:353 +msgid "next" +msgstr "بعدی" + +#: sphinx/builders/html.py:362 +msgid "previous" +msgstr "قبلی" + +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 +msgid " (in " +msgstr "" + +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "فهرست" + +#: sphinx/directives/other.py:136 +msgid "Section author: " +msgstr ":نویسنده این بخش" + +#: sphinx/directives/other.py:138 +msgid "Module author: " +msgstr "نویسنده این ماژول:" + +#: sphinx/directives/other.py:140 +#, fuzzy +msgid "Code author: " +msgstr "نویسنده این ماژول:" + +#: sphinx/directives/other.py:142 +msgid "Author: " +msgstr ":نویسنده" + +#: sphinx/directives/other.py:215 +msgid "See also" +msgstr "همچنین ملاحظه نمائید" + +#: sphinx/domains/__init__.py:244 +#, python-format +msgid "%s %s" +msgstr "" + +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 +msgid "Parameters" +msgstr "پارامترها" + +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 +msgid "Returns" +msgstr "" + +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 +msgid "Return type" +msgstr "نوع برگشتی" + +#: sphinx/domains/c.py:141 +#, python-format +msgid "%s (C function)" +msgstr "%s (C تابع)" + +#: sphinx/domains/c.py:143 +#, python-format +msgid "%s (C member)" +msgstr "%s (C عضو)" + +#: sphinx/domains/c.py:145 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C ماکرو)" + +#: sphinx/domains/c.py:147 +#, python-format +msgid "%s (C type)" +msgstr "%s (C نوع)" + +#: sphinx/domains/c.py:149 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C متغیر)" + +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 +#, fuzzy, python-format +msgid "function" +msgstr "تابع" + +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 +#, fuzzy, python-format +msgid "member" +msgstr "عضو" + +#: sphinx/domains/c.py:206 +msgid "macro" +msgstr "" + +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 +msgid "type" +msgstr "" + +#: sphinx/domains/c.py:208 +#, fuzzy +msgid "variable" +msgstr "متغیر" + +#: sphinx/domains/cpp.py:897 +#, fuzzy, python-format +msgid "%s (C++ class)" +msgstr "%s (C++ کلاس در)" + +#: sphinx/domains/cpp.py:912 +#, fuzzy, python-format +msgid "%s (C++ type)" +msgstr "%s (C++ نوع)" + +#: sphinx/domains/cpp.py:931 +#, fuzzy, python-format +msgid "%s (C++ member)" +msgstr "%s (C++ عضو)" + +#: sphinx/domains/cpp.py:983 +#, fuzzy, python-format +msgid "%s (C++ function)" +msgstr "%s (C++ تابع)" + +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 +msgid "class" +msgstr "" + +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (توابع درونی)" + +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s متد)" + +#: sphinx/domains/javascript.py:109 +#, fuzzy, python-format +msgid "%s() (class)" +msgstr "%s() (کلاس در)" + +#: sphinx/domains/javascript.py:111 +#, python-format +msgid "%s (global variable or constant)" +msgstr "" + +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s مشخصه)" + +#: sphinx/domains/javascript.py:122 +#, fuzzy +msgid "Arguments" +msgstr "پارامترها" + +#: sphinx/domains/javascript.py:125 +msgid "Throws" +msgstr "" + +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 +msgid "data" +msgstr "" + +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 +#, python-format +msgid "attribute" +msgstr "" + +#: sphinx/domains/python.py:100 +#, fuzzy +msgid "Variables" +msgstr "متغیر" + +#: sphinx/domains/python.py:104 +msgid "Raises" +msgstr "برانگیختن" + +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (در ماژول %s)" + +#: sphinx/domains/python.py:258 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (متغیر درونی)" + +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (در ماژول %s)" + +#: sphinx/domains/python.py:275 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (کلاس درونی)" + +#: sphinx/domains/python.py:276 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (کلاس در %s)" + +#: sphinx/domains/python.py:316 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s متد)" + +#: sphinx/domains/python.py:328 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s متد استاتیک)" + +#: sphinx/domains/python.py:331 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s متد استاتیک)" + +#: sphinx/domains/python.py:341 +#, fuzzy, python-format +msgid "%s() (%s.%s class method)" +msgstr "%s() (%s.%s متد)" + +#: sphinx/domains/python.py:344 +#, fuzzy, python-format +msgid "%s() (%s class method)" +msgstr "%s() (%s متد)" + +#: sphinx/domains/python.py:354 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s مشخصه)" + +#: sphinx/domains/python.py:433 +#, python-format +msgid "%s (module)" +msgstr "%s (ماژول)" + +#: sphinx/domains/python.py:490 +#, fuzzy +msgid "Python Module Index" +msgstr "فهرست ماژول ها" + +#: sphinx/domains/python.py:491 +msgid "modules" +msgstr "ماژول ها" + +#: sphinx/domains/python.py:536 +msgid "Deprecated" +msgstr "منسوخ شده" + +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 +msgid "exception" +msgstr "استثناء" + +#: sphinx/domains/python.py:562 +msgid "method" +msgstr "" + +#: sphinx/domains/python.py:563 +#, python-format +msgid "class method" +msgstr "" + +#: sphinx/domains/python.py:564 +#, python-format +msgid "static method" +msgstr "" + +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 +msgid "module" +msgstr "ماژول" + +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr " (منسوخ شده)" + +#: sphinx/domains/rst.py:55 +#, python-format +msgid "%s (directive)" +msgstr "" + +#: sphinx/domains/rst.py:57 +#, python-format +msgid "%s (role)" +msgstr "" + +#: sphinx/domains/rst.py:106 +msgid "directive" +msgstr "" + +#: sphinx/domains/rst.py:107 +msgid "role" +msgstr "" + +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 +#, python-format +msgid "environment variable; %s" +msgstr "%s متغیرهای عمومی؛" + +#: sphinx/domains/std.py:162 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sگزینه خط فرمان; %s" + +#: sphinx/domains/std.py:393 +msgid "glossary term" +msgstr "" + +#: sphinx/domains/std.py:394 +msgid "grammar token" +msgstr "" + +#: sphinx/domains/std.py:395 +msgid "reference label" +msgstr "" + +#: sphinx/domains/std.py:396 +#, fuzzy, python-format +msgid "environment variable" +msgstr "متغیرهای عمومی؛" + +#: sphinx/domains/std.py:397 +msgid "program option" +msgstr "" + +#: sphinx/domains/std.py:428 +msgid "Module Index" +msgstr "فهرست ماژول ها" + +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 +msgid "Search Page" +msgstr "صفحه جستجو" + +#: sphinx/ext/autodoc.py:998 +#, python-format +msgid " Bases: %s" +msgstr "" + +#: sphinx/ext/autodoc.py:1034 +#, python-format +msgid "alias of :class:`%s`" +msgstr "" + +#: sphinx/ext/todo.py:41 +msgid "Todo" +msgstr "در دست انجام" + +#: sphinx/ext/todo.py:109 +#, python-format +msgid "(The <<original entry>> is located in %s, line %d.)" +msgstr "" + +#: sphinx/ext/todo.py:117 +msgid "original entry" +msgstr "" + +#: sphinx/ext/viewcode.py:70 +msgid "[source]" +msgstr "" + +#: sphinx/ext/viewcode.py:117 +msgid "[docs]" +msgstr "" + +#: sphinx/ext/viewcode.py:131 +#, fuzzy +msgid "Module code" +msgstr "ماژول" + +#: sphinx/ext/viewcode.py:137 +#, python-format +msgid "<h1>Source code for %s</h1>" +msgstr "" + +#: sphinx/ext/viewcode.py:164 +msgid "Overview: module code" +msgstr "" + +#: sphinx/ext/viewcode.py:165 +msgid "<h1>All modules for which code is available</h1>" +msgstr "" + +#: sphinx/locale/__init__.py:155 +msgid "Attention" +msgstr "دقت" + +#: sphinx/locale/__init__.py:156 +msgid "Caution" +msgstr "ملاحظه" + +#: sphinx/locale/__init__.py:157 +msgid "Danger" +msgstr "خطر" + +#: sphinx/locale/__init__.py:158 +msgid "Error" +msgstr "خطا" + +#: sphinx/locale/__init__.py:159 +msgid "Hint" +msgstr "تذکر" + +#: sphinx/locale/__init__.py:160 +msgid "Important" +msgstr "مهم" + +#: sphinx/locale/__init__.py:161 +msgid "Note" +msgstr "توجه" + +#: sphinx/locale/__init__.py:162 +msgid "See Also" +msgstr "همچنین ملاحظه نمائید" + +#: sphinx/locale/__init__.py:163 +msgid "Tip" +msgstr "نکته" + +#: sphinx/locale/__init__.py:164 +msgid "Warning" +msgstr "هشدار" + +#: sphinx/locale/__init__.py:168 +#, python-format +msgid "New in version %s" +msgstr "جدید در نسخه %s" + +#: sphinx/locale/__init__.py:169 +#, python-format +msgid "Changed in version %s" +msgstr "تغییر داده شده در نسخه %s" + +#: sphinx/locale/__init__.py:170 +#, python-format +msgid "Deprecated since version %s" +msgstr "منسوخ شده از نسخه %s" + +#: sphinx/locale/__init__.py:176 +msgid "keyword" +msgstr "کلمه کلیدی" + +#: sphinx/locale/__init__.py:177 +msgid "operator" +msgstr "عملگر" + +#: sphinx/locale/__init__.py:178 +msgid "object" +msgstr "شیء" + +#: sphinx/locale/__init__.py:180 +msgid "statement" +msgstr "گذاره" + +#: sphinx/locale/__init__.py:181 +msgid "built-in function" +msgstr "توابع درونی" + +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/basic/localtoc.html:11 +msgid "Table Of Contents" +msgstr "فهرست عناوین" + +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 +msgid "Search" +msgstr "جستجو" + +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 +msgid "Go" +msgstr "برو" + +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 +#, fuzzy +msgid "Enter search terms or a module, class or function name." +msgstr "نام یک ماژول ، کلاس و یا تابع را وارد نمائید" + +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 +msgid "Show Source" +msgstr "نمایش سورس" + +#: sphinx/themes/basic/defindex.html:11 +msgid "Overview" +msgstr "بررسی اجمالی" + +#: sphinx/themes/basic/defindex.html:20 +msgid "Indices and tables:" +msgstr "ایندکس ها و جداول:" + +#: sphinx/themes/basic/defindex.html:23 +msgid "Complete Table of Contents" +msgstr "فهرست کامل مطالب" + +#: sphinx/themes/basic/defindex.html:24 +msgid "lists all sections and subsections" +msgstr "فهرست تمامی بخش ها و زیر مجموعه ها" + +#: sphinx/themes/basic/defindex.html:26 +msgid "search this documentation" +msgstr "جستجو در این اسناد" + +#: sphinx/themes/basic/defindex.html:28 +msgid "Global Module Index" +msgstr "فهرست کلی ماژول ها" + +#: sphinx/themes/basic/defindex.html:29 +msgid "quick access to all modules" +msgstr "دسترسی سریع به تمامی متدها" + +#: sphinx/themes/basic/defindex.html:31 +msgid "all functions, classes, terms" +msgstr "تمامی توابع ، کلاس ها ، اصطلاحات" + +#: sphinx/themes/basic/genindex-single.html:35 +#, python-format +msgid "Index – %(key)s" +msgstr "فهرست – %(key)s" + +#: sphinx/themes/basic/genindex-single.html:63 +#: sphinx/themes/basic/genindex-split.html:24 +#: sphinx/themes/basic/genindex-split.html:38 +#: sphinx/themes/basic/genindex.html:74 +msgid "Full index on one page" +msgstr "فهرست کامل در یک صفحه" + +#: sphinx/themes/basic/genindex-split.html:16 +msgid "Index pages by letter" +msgstr "فهرست صفحات بر اساس حروف" + +#: sphinx/themes/basic/genindex-split.html:25 +msgid "can be huge" +msgstr "" + +#: sphinx/themes/basic/layout.html:29 +msgid "Navigation" +msgstr "ناوبری" + +#: sphinx/themes/basic/layout.html:122 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "جستجو در %(docstitle)s" + +#: sphinx/themes/basic/layout.html:131 +msgid "About these documents" +msgstr "درباره این مستندات" + +#: sphinx/themes/basic/layout.html:140 +msgid "Copyright" +msgstr "کپی رایت" + +#: sphinx/themes/basic/layout.html:189 +#, python-format +msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." +msgstr "" + +#: sphinx/themes/basic/layout.html:191 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" + +#: sphinx/themes/basic/layout.html:195 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr ". %(last_updated)s آخرین بروز رسانی در" + +#: sphinx/themes/basic/layout.html:198 +#, python-format +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +". <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s " +"ایجاد شده با" + +#: sphinx/themes/basic/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "جستجو %(docstitle)s" + +#: sphinx/themes/basic/relations.html:11 +msgid "Previous topic" +msgstr "موضوع قبلی" + +#: sphinx/themes/basic/relations.html:13 +msgid "previous chapter" +msgstr "فصل قبلی" + +#: sphinx/themes/basic/relations.html:16 +msgid "Next topic" +msgstr "موضوع بعدی" + +#: sphinx/themes/basic/relations.html:18 +msgid "next chapter" +msgstr "فصل بعدی" + +#: sphinx/themes/basic/search.html:24 +msgid "" +"Please activate JavaScript to enable the search\n" +" functionality." +msgstr "" + +#: sphinx/themes/basic/search.html:29 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"در اینجا شما می توانید مستندات را جستجو نمائید ، کلماتی را در کادر جستجو " +"وارد کنید و سپس بر روی دکمه جستجو کلیک نمائید ، توجه کنید که تابع جستجو " +"گر امر جستجو را بطور خودکار برای تمامی کلمات دنبال خواهد کرد .صفحاتی که " +"شامل کلمات کمتری هستند ، در لیست جستجو نمایش داده نخواهند شد." + +#: sphinx/themes/basic/search.html:36 +msgid "search" +msgstr "جستجو" + +#: sphinx/themes/basic/search.html:40 +msgid "Search Results" +msgstr "نتایج جستجو" + +#: sphinx/themes/basic/search.html:42 +msgid "Your search did not match any results." +msgstr ".جستجوی شما نتیجه ایی در بر نداشت" + +#: sphinx/themes/basic/searchbox.html:12 +msgid "Quick search" +msgstr "جستجو سریع" + +#: sphinx/themes/basic/sourcelink.html:11 +msgid "This Page" +msgstr "صفحه فعلی" + +#: sphinx/themes/basic/changes/frameset.html:5 +#: sphinx/themes/basic/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "تغییرات در نسخه %(version)s — %(docstitle)s" + +#: sphinx/themes/basic/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "" + +#: sphinx/themes/basic/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "لیست تولید شده خودکار از تغییرات در نسخه %(version)s" + +#: sphinx/themes/basic/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "تغییرات کتابخانه ایی" + +#: sphinx/themes/basic/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API تغییرات" + +#: sphinx/themes/basic/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "دگر تغییرات" + +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 +msgid "Permalink to this headline" +msgstr "لینک ثابت به این سر مقاله" + +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 +msgid "Permalink to this definition" +msgstr "لینک ثابت به این تعریف" + +#: sphinx/themes/basic/static/doctools.js:189 +msgid "Hide Search Matches" +msgstr "عدم نمایش نتایج یافت شده" + +#: sphinx/themes/default/static/sidebar.js:69 +msgid "Expand sidebar" +msgstr "" + +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 +msgid "Collapse sidebar" +msgstr "" + +#: sphinx/themes/haiku/layout.html:26 +msgid "Contents" +msgstr "" + +#: sphinx/writers/latex.py:176 +msgid "Release" +msgstr "انتشار" + +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 +msgid "Footnotes" +msgstr "" + +#: sphinx/writers/latex.py:672 +msgid "continued from previous page" +msgstr "" + +#: sphinx/writers/latex.py:677 +#, fuzzy +msgid "Continued on next page" +msgstr "فهرست کامل در یک صفحه" + +#: sphinx/writers/text.py:430 +msgid "[image]" +msgstr "" + +#~ msgid "Python Enhancement Proposals!PEP %s" +#~ msgstr "" + +#~ msgid "Platform: %s" +#~ msgstr "%s:پلتفرم" + +#~ msgid "Platforms: " +#~ msgstr ":پلتفرم ها" + +#~ msgid "here" +#~ msgstr "اینجا" + +#~ msgid "Searching" +#~ msgstr "در حال جستجو" + +#~ msgid "Preparing search..." +#~ msgstr "...آماده جستجو" + +#~ msgid "module, in " +#~ msgstr "ماژول, در" + +#~ msgid ", in " +#~ msgstr ", در" + +#~ 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 "" +#~ ". هیچ سندی برای جستجوی شما یافت" +#~ " نشد، لطفا اطمینان حاصل نمائید که" +#~ " املای تمامی کلمات صحیح می باشد " +#~ "و همچنین موضوعات کافی را برای این" +#~ " جستجو انتخاب نموده اید" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "جستجو انجام شد ، %s صفحه مطابق با پرس و جو پیدا شد" + +#~ msgid "Suggest Change" +#~ msgstr "" + +#~ msgid "Keyword search" +#~ msgstr "جستجو کلید واژه" + +#~ msgid "Most popular modules:" +#~ msgstr "متداول ترین ماژول ها:" + +#~ msgid "Show modules only available on these platforms" +#~ msgstr "تنها ماژول هایی که در این پلتفرم در دسترس هستند را نشان بده" + +#~ msgid "" +#~ "<strong>Note:</strong> You requested an " +#~ "out-of-date URL from this server. " +#~ "We've tried to redirect you to the" +#~ " new location of this page, but " +#~ "it may not be the right one." +#~ msgstr "" + diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.js b/sphinx/locale/fi/LC_MESSAGES/sphinx.js index 9d2cc6f47..1f1600377 100644 --- a/sphinx/locale/fi/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "fi", "plural_expr": "(n != 1)", "messages": {"Search Results": "Etsinn\u00e4n tulos", "Preparing search...": "Valmistellaan etsint\u00e4\u00e4...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Ei l\u00f6ytynyt yht\u00e4\u00e4n. Tarkista hakuehdot, sanahaku, ei sen osia", "Search finished, found %s page(s) matching the search query.": "Etsint\u00e4 tehty, l\u00f6ydetty %s sivu(a).", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "", "Searching": "Etsit\u00e4\u00e4n", "Collapse sidebar": "", "Permalink to this definition": "", "Hide Search Matches": "Piilota l\u00f6ydetyt"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "fi", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Piilota l\u00f6ydetyt", "Permalink to this definition": "", "Expand sidebar": "", "Permalink to this headline": "", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.mo b/sphinx/locale/fi/LC_MESSAGES/sphinx.mo index 7c3000060..b0dfff474 100644 Binary files a/sphinx/locale/fi/LC_MESSAGES/sphinx.mo and b/sphinx/locale/fi/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.po b/sphinx/locale/fi/LC_MESSAGES/sphinx.po index 04839bba6..1b45f6905 100644 --- a/sphinx/locale/fi/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.po @@ -8,383 +8,400 @@ msgstr "" "Project-Id-Version: Sphinx 0.6\n" "Report-Msgid-Bugs-To: sphinx@awot.fi\n" "POT-Creation-Date: 2009-01-24 18:39+0000\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Jukka Inkeri <sphinx@awot.fi>\n" "Language-Team: fi <sphinx@awot.fi>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d.%m.%Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" +msgid "see %s" msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "katso myös %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Moduulitaso" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d.%m.%Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Yleinen sisällysluettelo" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "hakemisto" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr ">" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "<" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Sisällysluettelo" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Luvun kirjoittaja: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Moduulin kirjoittaja: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Moduulin kirjoittaja: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Tekijä: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Katso myös" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "" -#: sphinx/domains/c.py:133 -#, python-format -msgid "%s (C function)" -msgstr "" - -#: sphinx/domains/c.py:135 -#, python-format -msgid "%s (C member)" -msgstr "" - -#: sphinx/domains/c.py:137 -#, python-format -msgid "%s (C macro)" -msgstr "" - -#: sphinx/domains/c.py:139 -#, python-format -msgid "%s (C type)" -msgstr "" - #: sphinx/domains/c.py:141 #, python-format +msgid "%s (C function)" +msgstr "" + +#: sphinx/domains/c.py:143 +#, python-format +msgid "%s (C member)" +msgstr "" + +#: sphinx/domains/c.py:145 +#, python-format +msgid "%s (C macro)" +msgstr "" + +#: sphinx/domains/c.py:147 +#, python-format +msgid "%s (C type)" +msgstr "" + +#: sphinx/domains/c.py:149 +#, python-format msgid "%s (C variable)" msgstr "" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 #, fuzzy msgid "function" msgstr "Varoitus" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Ympäristö" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (moduuli)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Moduuli sisällysluettelo" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "moduulit" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Poistettu" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 +#: sphinx/domains/python.py:563 msgid "class method" msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "moduuli" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (poistettu)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (moduuli)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "moduuli" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Sisällysluettelo" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Moduuli sisällysluettelo" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Etsi sivu" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -402,104 +419,104 @@ msgstr "" msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "moduuli" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Huom" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Varoitus" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Vaara" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Virhe" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Vihje" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Tärkeä" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Muista" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Katso myös" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Vihje" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Varoitus" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Uusi versiossa %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Muutettu versiossa %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Poistettu versiosta %s alkaen" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "" @@ -508,8 +525,8 @@ msgstr "" msgid "Table Of Contents" msgstr "Sisällysluettelo" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Etsi" @@ -557,15 +574,15 @@ msgstr "" msgid "all functions, classes, terms" msgstr "" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Hakemisto yhtenä luettelona" @@ -577,39 +594,39 @@ msgstr "Hakemisto aakkostus sivuttain" msgid "can be huge" msgstr "voi olla iso" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navikointi" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Tietoja tästä documentistä" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "" -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -637,13 +654,13 @@ msgstr ">>" msgid "next chapter" msgstr ">>" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Javascript pitää olla sallittu, jotta etsintä toimii." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -651,16 +668,15 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "Anna hakusanat kokonaan, osasanoilla ei haeta." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "etsi" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Etsinnän tulos" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Ei löytynyt ko. ehdoilla yhtään." @@ -700,12 +716,12 @@ msgstr "" msgid "Other changes" msgstr "" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "" @@ -713,35 +729,12 @@ msgstr "" msgid "Hide Search Matches" msgstr "Piilota löydetyt" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Etsitään" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Valmistellaan etsintää..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "Ei löytynyt yhtään. Tarkista hakuehdot, sanahaku, ei sen osia" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Etsintä tehty, löydetty %s sivu(a)." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -749,24 +742,49 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "" +#~ msgid "Python Enhancement Proposals!PEP %s" +#~ msgstr "" + +#~ msgid "Platforms: " +#~ msgstr "Ympäristö" + +#~ msgid "Searching" +#~ msgstr "Etsitään" + +#~ msgid "Preparing search..." +#~ msgstr "Valmistellaan etsintää..." + +#~ msgid ", in " +#~ msgstr "" + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "Ei löytynyt yhtään. Tarkista hakuehdot, sanahaku, ei sen osia" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Etsintä tehty, löydetty %s sivu(a)." + diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.js b/sphinx/locale/fr/LC_MESSAGES/sphinx.js index e482673f0..5d6fafbde 100644 --- a/sphinx/locale/fr/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"Search Results": "R\u00e9sultats de la recherche", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Expand sidebar": "Agrandir le menu", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Collapse sidebar": "R\u00e9duire le menu", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Expand sidebar": "Agrandir le menu", "Permalink to this headline": "Lien permanent vers ce titre", "Collapse sidebar": "R\u00e9duire le menu"}}); \ No newline at end of file diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo index bfa97b193..a4d35a8be 100644 Binary files a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo and b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.po b/sphinx/locale/fr/LC_MESSAGES/sphinx.po index 8afcf435a..c4e1105cb 100644 --- a/sphinx/locale/fr/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.po @@ -11,386 +11,403 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: larlet@gmail.com\n" "POT-Creation-Date: 2008-08-08 12:39+0000\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Sébastien Douche <sdouche@gmail.com>\n" "Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "voir %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "voir aussi %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Fonctions de base" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Module" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Index général" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "index" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "suivant" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "précédent" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "(dans" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Index" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Auteur de la section : " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Auteur du module : " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Auteur du module : " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Auteur : " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Voir aussi" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Paramètres" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Retourne" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Type retourné" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (fonction C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (membre C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (macro C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (type C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (variable C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "fonction" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "membre" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "type" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Variable" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (classe C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (type C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (membre C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (fonction C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "classe" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (fonction de base)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (méthode %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (classe)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (variable globale ou constante)" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (attribut %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Paramètres" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "Lance" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "données" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "attribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Variable" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Lève" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (dans le module %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (variable de base)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (dans le module %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (classe de base)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (classe dans %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (méthode %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (méthode statique %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (méthode statique %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" -msgstr "%s() (méthode %s.%s)" +msgstr "%s() (méthode de classe %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" -msgstr "%s() (méthode %s)" +msgstr "%s() (méthode de classe %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (attribut %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Plateformes : " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (module)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Index du module" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "modules" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Obsolète" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "exception" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "méthode" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 +#, fuzzy msgid "class method" -msgstr "%s() (méthode %s)" +msgstr "méthode de classe" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "méthode statique" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "module" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (obsolète)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (module)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "module" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "variable d'environnement; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%soption de ligne de commande; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "terme du glossaire" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "élément de grammaire" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "étiquette de référence" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "variable d'environnement" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "option du programme" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Index" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Index du module" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Page de recherche" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "alias de :class:`%s`" @@ -408,104 +425,104 @@ msgstr "(L'<<entrée orginale>> se trouve dans %s, à la ligne %d.)" msgid "original entry" msgstr "entrée orginale" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "module" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "<h1>Code source de %s</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "Vue d'ensemble : code du module" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "<h1>Modules pour lesquels le code est disponible</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Attention" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Prudence" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Danger" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Erreur" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Indice" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Important" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Note" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Voir aussi" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Astuce" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Warning" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Introduit dans la version %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Modifié dans la version %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Obsolète depuis la version %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "mot-clé" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "opérateur" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objet" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "état" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "fonction de base" @@ -514,8 +531,8 @@ msgstr "fonction de base" msgid "Table Of Contents" msgstr "Table des matières" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Recherche" @@ -564,15 +581,15 @@ msgstr "accès rapide à l'ensemble des modules" msgid "all functions, classes, terms" msgstr "toutes les fonctions, classes, termes" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Index – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Index complet sur une seule page" @@ -584,39 +601,39 @@ msgstr "Indexer les pages par lettre" msgid "can be huge" msgstr "peut être énorme" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigation" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Recherchez dans %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "À propos de ces documents" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Mis à jour le %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -646,13 +663,13 @@ msgstr "Sujet suivant" msgid "next chapter" msgstr "Chapitre suivant" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Activez le JavaScript pour que la recherche fonctionne\n" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 #, fuzzy msgid "" "From here you can search these documents. Enter your search\n" @@ -668,16 +685,15 @@ msgstr "" " contenant moins de mots n'apparaîtront pas dans la liste des " "résultats." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "rechercher" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Résultats de la recherche" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Votre recherche n'a retourné aucun résultat" @@ -717,12 +733,12 @@ msgstr "Modifications de l'API C" msgid "Other changes" msgstr "Autres modifications" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Lien permanent vers ce titre" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Lien permanent vers cette définition" @@ -730,38 +746,12 @@ msgstr "Lien permanent vers cette définition" msgid "Hide Search Matches" msgstr "Cacher les résultats de la recherche" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "En cours de recherche" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Préparation de la recherche..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", dans" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe " -"des termes de recherche et que vous avez sélectionné suffisamment de " -"catégories." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "Agrandir le menu" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "Réduire le menu" @@ -769,36 +759,50 @@ msgstr "Réduire le menu" msgid "Contents" msgstr "Contenu" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Version" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Notes de bas de page" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "Suite de la page précédente" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Suite sur la page suivante" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[image]" -#~ msgid "Parameter" -#~ msgstr "Paramètres" +#~ msgid "Platforms: " +#~ msgstr "Plateformes : " -#~ msgid "here" -#~ msgstr "ici" +#~ msgid "Searching" +#~ msgstr "En cours de recherche" -#~ msgid "module, in " -#~ msgstr "module, dans" +#~ msgid "Preparing search..." +#~ msgstr "Préparation de la recherche..." -#~ msgid "Platform: %s" -#~ msgstr "Plateforme : %s" +#~ msgid ", in " +#~ msgstr ", dans" + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Votre recherche ne correspond à aucun" +#~ " document. Vérifiez l'orthographe des " +#~ "termes de recherche et que vous " +#~ "avez sélectionné suffisamment de catégories." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête." diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.js b/sphinx/locale/hr/LC_MESSAGES/sphinx.js index b9d1f7af9..d4284716f 100644 --- a/sphinx/locale/hr/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "hr", "plural_expr": "0", "messages": {"Search Results": "Rezultati pretrage", "Preparing search...": "Pripremam pretra\u017eivanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161u pretragu nema rezultata. Molimo pregledajte da li so sve rije\u010di ispravno napisane i da li ste izbrali dovoljno kategorija.", "Search finished, found %s page(s) matching the search query.": "Pretra\u017eivanje je zaklju\u010deno, prona\u0111eno %s stranica, koje odgovaraju tra\u017eenom nizu.", ", in ": ", u ", "Expand sidebar": "", "Permalink to this headline": "Link na taj naslov", "Searching": "Tra\u017eim", "Collapse sidebar": "", "Permalink to this definition": "Link na tu definiciju", "Hide Search Matches": "Sakrij rezultate pretrage"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "hr", "plural_expr": "0", "messages": {"Hide Search Matches": "Sakrij rezultate pretrage", "Permalink to this definition": "Link na tu definiciju", "Expand sidebar": "", "Permalink to this headline": "Link na taj naslov", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.mo b/sphinx/locale/hr/LC_MESSAGES/sphinx.mo index e032adeb1..6e74304d6 100644 Binary files a/sphinx/locale/hr/LC_MESSAGES/sphinx.mo and b/sphinx/locale/hr/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.po b/sphinx/locale/hr/LC_MESSAGES/sphinx.po index ddcf2299a..d41dcab1e 100644 --- a/sphinx/locale/hr/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.po @@ -1,390 +1,404 @@ - msgid "" msgstr "" "Project-Id-Version: Sphinx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2010-09-11 23:58+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Bojan Mihelač <bmihelac@mihelac.org>\n" "Language-Team: Bojan Mihelač <bmihelac@mihelac.org>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B, %Y" -#: sphinx/roles.py:174 -#, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +#: sphinx/environment.py:1624 +#, fuzzy, python-format +msgid "see %s" +msgstr "pogledaj %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "pogledaj i %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Ugrađeni dijelovi" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Nivo modula" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b, %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Opceniti abecedni indeks" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "abecedni indeks" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "naprijed" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "nazad" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (u " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Abecedni popis" + +#: sphinx/directives/other.py:136 msgid "Section author: " -msgstr "Autor sekcije:" +msgstr "Autor sekcije: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " -msgstr "Autor modula:" +msgstr "Autor modula: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " -msgstr "Autor modula:" +msgstr "Autor modula: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor:" -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Pogledaj i" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametri" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Vraća" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Vraća tip" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C funkcija)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C član)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C makro)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C tip)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C varijabla)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funkcija" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "član" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tip" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Varijabla" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ razred)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ tip)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ član)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ funkcija)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 -#, fuzzy +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "razred" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (ugrađene funkcije)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metoda)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (razred)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s atribut)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parametri" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Varijabla" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Podiže" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (u modulu %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (ugrađene variable)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (u modulu %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (ugrađen razred)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (razred u %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metoda)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s statična metoda)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s statična metoda)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s metoda)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s metoda)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s atribut)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platforme:" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modul)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Popis modula" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "Moduli" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Zastarjelo" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "izuzetak" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s metoda)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statična metoda" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modul" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (zastarjelo)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (modul)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "modul" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "varijabla okruženja; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%scommand line parameter; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "varijabla okruženja" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Abecedni popis" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Popis modula" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Tražilica" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Osnove: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "nadimak za :class:`%s`" @@ -396,110 +410,110 @@ msgstr "Todo" #: sphinx/ext/todo.py:109 #, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(Originalan unos se nalazi u %s, u retku %d, i može biti pronađen " +msgstr "(Originalan unos se nalazi u %s, u retku %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "modul" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Pozor" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Pažnja" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Opasnost" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Greška" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Savjet" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Važno" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Napomena" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Pogledaj i" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Savjet" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Upozorenje" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Novo u verziji %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Promijenjeno u verziji %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Zastarijelo od verzije %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "ključna riječ" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operator" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objekt" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "izjava" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "ugrađen funkcije" @@ -508,8 +522,8 @@ msgstr "ugrađen funkcije" msgid "Table Of Contents" msgstr "Pregled sadržaja" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Traži" @@ -557,15 +571,15 @@ msgstr "brz dostup do svih modulov" msgid "all functions, classes, terms" msgstr "sve funkcije, razredi, izrazi" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Index – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Potpun indeks na jednoj strani" @@ -577,39 +591,39 @@ msgstr "Indeksiraj stranice po slovu" msgid "can be huge" msgstr "može biti veliko" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigacija" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Traži između %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "O ovim dokumentima" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Sva prava zadržana" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Sva prava zadržana</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Sva prava zadržana %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Zadnji put ažurirano %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -639,7 +653,7 @@ msgstr "Slijedeća tema" msgid "next chapter" msgstr "slijedeće poglavje" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -647,7 +661,7 @@ msgstr "" "Molimo omogućite JavaScript\n" " za djelovanje tražilice." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -659,16 +673,15 @@ msgstr "" " function will automatically search for all of the words. Pages\n" " containing fewer words won't appear in the result list." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "traži" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Rezultati pretrage" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Your search did not match any results." @@ -708,12 +721,12 @@ msgstr "C API changes" msgid "Other changes" msgstr "Ostale promjene" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Link na taj naslov" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Link na tu definiciju" @@ -721,39 +734,12 @@ msgstr "Link na tu definiciju" msgid "Hide Search Matches" msgstr "Sakrij rezultate pretrage" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Tražim" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Pripremam pretraživanje..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", u " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Za vašu pretragu nema rezultata. Molimo pregledajte da li so sve riječi " -"ispravno napisane i da li ste izbrali dovoljno kategorija." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "" -"Pretraživanje je zaključeno, pronađeno %s stranica, koje odgovaraju " -"traženom nizu." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -761,35 +747,51 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Distribucija" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "nastavak sa prethodne stranice" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "nastavak na slijedećoj stranici" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[slika]" -#~ msgid "Parameter" -#~ msgstr "Parametar" +#~ msgid "Platforms: " +#~ msgstr "Platforme:" -#~ msgid "here" -#~ msgstr "ovdje" +#~ msgid "Searching" +#~ msgstr "Tražim" -#~ msgid "module, in " -#~ msgstr "modul, u " +#~ msgid "Preparing search..." +#~ msgstr "Pripremam pretraživanje..." -#~ msgid "Platform: %s" -#~ msgstr "Platforma: %s" +#~ msgid ", in " +#~ msgstr ", u " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Za vašu pretragu nema rezultata. Molimo" +#~ " pregledajte da li so sve riječi " +#~ "ispravno napisane i da li ste " +#~ "izbrali dovoljno kategorija." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "" +#~ "Pretraživanje je zaključeno, pronađeno %s " +#~ "stranica, koje odgovaraju traženom nizu." diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.js b/sphinx/locale/it/LC_MESSAGES/sphinx.js index f9b193fe3..590de16ee 100644 --- a/sphinx/locale/it/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/it/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "it", "plural_expr": "(n != 1)", "messages": {"Search Results": "Risultati della ricerca", "Preparing search...": "Preparazione della ricerca", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La tua ricerca non ha trovato alcun risultato. Controlla la correttezza dei termini di ricerca e di avere selezionato un numero sufficiente di categorie", "Search finished, found %s page(s) matching the search query.": "Ricerca terminata, trovate %s pagine corrispondenti alla ricerca.", ", in ": ", in ", "Expand sidebar": "", "Permalink to this headline": "link permanente per questa intestazione", "Searching": "Ricerca in corso", "Collapse sidebar": "", "Permalink to this definition": "link permanente per questa definizione", "Hide Search Matches": "Nascondi i risultati della ricerca"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "it", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Nascondi i risultati della ricerca", "Permalink to this definition": "link permanente per questa definizione", "Expand sidebar": "", "Permalink to this headline": "link permanente per questa intestazione", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.mo b/sphinx/locale/it/LC_MESSAGES/sphinx.mo index 10ca29a50..09c7fdfdc 100644 Binary files a/sphinx/locale/it/LC_MESSAGES/sphinx.mo and b/sphinx/locale/it/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.po b/sphinx/locale/it/LC_MESSAGES/sphinx.po index 40a2ca2a3..04e2e3813 100644 --- a/sphinx/locale/it/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/it/LC_MESSAGES/sphinx.po @@ -7,386 +7,402 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-11-27 18:39+0100\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Sandro Dentella <sandro@e-den.it>\n" "Language-Team: <sphinx-dev@googlegroups.com>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "vedi %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "vedi anche %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Builtin" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Modulo" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d/%b/%Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Indice generale" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "indice" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "successivo" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "precedente" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (in " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Indice" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autore della sezione: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autore del modulo: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Autore del modulo: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autore: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Vedi anche" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametri" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Ritorna" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Tipo di ritorno" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (funzione C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (membro C )" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (macro C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (tipo C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (variabile C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funzione" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "membro" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipo" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Variabile" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (classe C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (tipo C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (membro C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (funzione C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (funzione built-in)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metodo)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (classe)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s attributo)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parametri" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "attributo" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Variabile" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Solleva" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (nel modulo %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (variabile built-in)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (nel modulo %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (classe built-in)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (classe in %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metodo)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s metodo statico)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s metodo statico)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s metodo)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s metodo)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s attributo)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Piattaforme:" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modulo)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Indice dei Moduli" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "moduli" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Deprecato" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "eccezione" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s metodo)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "metodo statico" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modulo" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (deprecato)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (modulo)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "modulo" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "variabile d'ambiente, %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sopzione di linea di comando; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "variabile d'ambiente" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Indice" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Indice dei Moduli" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Cerca" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "alias per :class:`%s`" @@ -404,104 +420,104 @@ msgstr "(La <<riga originale>> si trova in %s, linea %d.)" msgid "original entry" msgstr "riga originale" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "modulo" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Attenzione" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Attenzione" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Pericolo" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Errore" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Consiglio" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Importante" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Nota" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Vedi anche" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Suggerimento" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Avvertimento" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nuovo nella versione %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Cambiato nella versione %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Deprecato dalla versione %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "keyword" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operatore" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "oggetto" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "statement" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "funzione built-in" @@ -510,8 +526,8 @@ msgstr "funzione built-in" msgid "Table Of Contents" msgstr "Tabella dei contenuti" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Cerca" @@ -559,15 +575,15 @@ msgstr "accesso veloce ai moduli" msgid "all functions, classes, terms" msgstr "tutte le funzioni, classi e moduli" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Indice – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Indice completo in una pagina" @@ -579,39 +595,39 @@ msgstr "Indice delle pagine per lettera" msgid "can be huge" msgstr "può essere enorme" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigazione" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Cerca in %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "A proposito di questi documenti" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Ultimo aggiornamento %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -641,13 +657,13 @@ msgstr "Argomento successivo" msgid "next chapter" msgstr "capitolo successivo" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -661,16 +677,15 @@ msgstr "" " di ricerca cerca automaticamente per tutte le parole. Le pagine\n" " che contendono meno parole non compariranno nei risultati di ricerca." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "cerca" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Risultati della ricerca" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "La tua ricerca non ha ottenuto risultati" @@ -710,12 +725,12 @@ msgstr "Modifiche nelle API C" msgid "Other changes" msgstr "Altre modifiche" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "link permanente per questa intestazione" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "link permanente per questa definizione" @@ -723,38 +738,12 @@ msgstr "link permanente per questa definizione" msgid "Hide Search Matches" msgstr "Nascondi i risultati della ricerca" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Ricerca in corso" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Preparazione della ricerca" - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", in " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"La tua ricerca non ha trovato alcun risultato. Controlla la correttezza " -"dei termini di ricerca e di avere selezionato un numero sufficiente di " -"categorie" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Ricerca terminata, trovate %s pagine corrispondenti alla ricerca." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -762,23 +751,51 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Release" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Indice completo in una pagina" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[immagine]" + +#~ msgid "Platforms: " +#~ msgstr "Piattaforme:" + +#~ msgid "Searching" +#~ msgstr "Ricerca in corso" + +#~ msgid "Preparing search..." +#~ msgstr "Preparazione della ricerca" + +#~ msgid ", in " +#~ msgstr ", in " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "La tua ricerca non ha trovato " +#~ "alcun risultato. Controlla la correttezza " +#~ "dei termini di ricerca e di avere" +#~ " selezionato un numero sufficiente di " +#~ "categorie" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Ricerca terminata, trovate %s pagine corrispondenti alla ricerca." + diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.js b/sphinx/locale/ja/LC_MESSAGES/sphinx.js index 6b63245ef..feb321596 100644 --- a/sphinx/locale/ja/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"Search Results": "\u691c\u7d22\u7d50\u679c", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Expand sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u5c55\u958b", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Collapse sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u305f\u305f\u3080"}}); \ No newline at end of file diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.mo b/sphinx/locale/ja/LC_MESSAGES/sphinx.mo index b0284f918..c60fd6dbb 100644 Binary files a/sphinx/locale/ja/LC_MESSAGES/sphinx.mo and b/sphinx/locale/ja/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.po b/sphinx/locale/ja/LC_MESSAGES/sphinx.po index 5f65a6c3e..e8f84f418 100644 --- a/sphinx/locale/ja/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.po @@ -8,386 +8,402 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-09-11 23:58+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n" "Language-Team: ja <LL@li.org>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "組み込み" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "モジュールレベル" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "総合索引" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "索引" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "次へ" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "前へ" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "索引" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "この節の作者: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "モジュールの作者: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "モジュールの作者: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "作者: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "参考" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "パラメタ" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "戻り値" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "戻り値の型" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C の関数)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C のメンバ変数)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C のマクロ)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C のデータ型)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C の変数)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "の関数" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "のメンバ変数" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "のマクロ" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "のデータ型" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "変数" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, fuzzy, python-format msgid "%s (C++ class)" -msgstr "%s (のクラス)" +msgstr "%s (C++ のクラス)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ のデータ型)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ のメンバ変数)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ の関数)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" -msgstr "" +msgstr "クラス" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (組み込み関数)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s のメソッド)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, fuzzy, python-format +msgid "%s() (class)" +msgstr "%s() (のクラス)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" -msgstr "" +msgstr "%s (グローバル変数または定数)" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s の属性)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "パラメタ" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" -msgstr "" +msgstr "例外" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" -msgstr "" +msgstr "データ" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "の属性" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "変数" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "例外" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (%s モジュール)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (組み込み変数)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (%s モジュール)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (組み込み変数)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (%s のクラス)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s のメソッド)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s の静的メソッド)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s の静的メソッド)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s のメソッド)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s のメソッド)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s の属性)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "プラットフォーム: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (モジュール)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "モジュール索引" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "モジュール" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "撤廃" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "例外" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" +msgstr "メソッド" + +#: sphinx/domains/python.py:563 +msgid "class method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format -msgid "class method" -msgstr "%s() (%s のメソッド)" - -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "の静的メソッド" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "モジュール" -#: sphinx/domains/rst.py:53 -#, python-format -msgid "%s (directive)" -msgstr "" +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (撤廃)" #: sphinx/domains/rst.py:55 -#, fuzzy, python-format -msgid "%s (role)" -msgstr "%s (モジュール)" +#, python-format +msgid "%s (directive)" +msgstr "%s (ディレクティブ)" -#: sphinx/domains/rst.py:103 -msgid "directive" +#: sphinx/domains/rst.py:57 +#, python-format +msgid "%s (role)" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy -msgid "role" -msgstr "モジュール" +#: sphinx/domains/rst.py:106 +msgid "directive" +msgstr "ディレクティブ" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/rst.py:107 +msgid "role" +msgstr "" + +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "環境変数; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sコマンドラインオプション; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" -msgstr "" +msgstr "用語集の項目" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" -msgstr "" +msgstr "文法トークン" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" -msgstr "" +msgstr "参照ラベル" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "環境変数" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" -msgstr "" +msgstr "プログラムオプション" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "索引" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "モジュール索引" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "検索ページ" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " ベースクラス: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr ":class:`%s` のエイリアス" @@ -399,110 +415,110 @@ msgstr "課題" #: sphinx/ext/todo.py:109 #, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "" +msgstr "(<<元のエントリ>> は、 %s の %d 行目です)" #: sphinx/ext/todo.py:117 msgid "original entry" -msgstr "" +msgstr "元のエントリ" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" -msgstr "" +msgstr "[ソース]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" -msgstr "" +msgstr "[ドキュメント]" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" -msgstr "モジュール" +msgstr "モジュールコード" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" -msgstr "" +msgstr "<h1>%s のソースコード</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" -msgstr "" +msgstr "概要: モジュールコード" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" -msgstr "" +msgstr "<h1>全モジュールのうち、コードを読めるもの</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "注意" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "ご用心" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "危険" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "エラー" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "ヒント" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "重要" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "ノート" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "参考" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "ちなみに" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "警告" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "バージョン %s で追加" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "バージョン %s で変更" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "バージョン %s で撤廃" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "キーワード" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "演算子" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "オブジェクト" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "文" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "組み込み関数" @@ -511,8 +527,8 @@ msgstr "組み込み関数" msgid "Table Of Contents" msgstr "目次" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "検索" @@ -560,15 +576,15 @@ msgstr "全モジュール早見表" msgid "all functions, classes, terms" msgstr "関数、クラスおよび用語総覧" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "索引 – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "総索引" @@ -580,39 +596,39 @@ msgstr "頭文字別索引" msgid "can be huge" msgstr "大きい場合があるので注意" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "ナビゲーション" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "%(docstitle)s 内を検索" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "このドキュメントについて" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "著作権" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "最終更新: %(last_updated)s" -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -642,13 +658,13 @@ msgstr "次のトピックへ" msgid "next chapter" msgstr "次の章へ" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "検索機能を使うには JavaScript を有効にしてください。" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -656,16 +672,15 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "このページからドキュメントを検索できます。キーワードを下のボックスに入力して、「検索」をクリックしてください。入力された全てのキーワードを含むページが検索されます。一部のキーワードしか含まないページは検索結果に表示されないので注意してください。" -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "検索" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "検索結果" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "検索条件に一致する項目がありませんでした。" @@ -705,12 +720,12 @@ msgstr "C API に関する変更" msgid "Other changes" msgstr "その多の変更" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "このヘッドラインへのパーマリンク" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "この定義へのパーマリンク" @@ -718,58 +733,58 @@ msgstr "この定義へのパーマリンク" msgid "Hide Search Matches" msgstr "検索結果を隠す" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "検索中" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "検索の準備中..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "検索条件に一致するドキュメントはありませんでした。検索したい言葉を正しいつづりで入力しているか確認してください。また、正しいカテゴリの検索を行っているか確認してください。" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "検索が終了し、条件に一致するページが %s 個みつかりました。" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" -msgstr "" +msgstr "サイドバーを展開" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" -msgstr "" +msgstr "サイドバーをたたむ" #: sphinx/themes/haiku/layout.html:26 msgid "Contents" -msgstr "" +msgstr "コンテンツ" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "リリース" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "注記" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "前のページからの続き" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "総索引" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[画像]" + +#~ msgid "Platforms: " +#~ msgstr "プラットフォーム: " + +#~ msgid "Searching" +#~ msgstr "検索中" + +#~ msgid "Preparing search..." +#~ msgstr "検索の準備中..." + +#~ msgid ", in " +#~ msgstr "" + +#~ 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 "検索条件に一致するドキュメントはありませんでした。検索したい言葉を正しいつづりで入力しているか確認してください。また、正しいカテゴリの検索を行っているか確認してください。" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "検索が終了し、条件に一致するページが %s 個みつかりました。" + diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.js b/sphinx/locale/lt/LC_MESSAGES/sphinx.js index daf4f89b5..2ab4266bb 100644 --- a/sphinx/locale/lt/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "lt", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "Paie\u0161kos rezultatai", "Preparing search...": "Ruo\u0161iama paie\u0161ka...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "J\u016bs\u0173 paie\u0161ka neatitiko joki\u0173 dokument\u0173. Pra\u0161om patikrinti ar visi \u017eod\u017eiai teisingai \u012fvesti ir ar pasirinkote pakankamai kategorij\u0173.", "Search finished, found %s page(s) matching the search query.": "Paie\u0161ka baigta, paie\u0161kos rezultatus atitiko %s puslapis(-iai,-i\u0173)", ", in ": ", kuris yra ", "Expand sidebar": "I\u0161pl\u0117sti \u0161onin\u0119 juost\u0105", "Permalink to this headline": "Nuoroda \u012f \u0161i\u0105 antra\u0161t\u0119", "Searching": "Ie\u0161koma", "Collapse sidebar": "Pasl\u0117pti \u0161onin\u0119 juost\u0105", "Permalink to this definition": "Nuoroda \u012f \u0161\u012f apibr\u0117\u017eim\u0105", "Hide Search Matches": "Pasl\u0117pti paie\u0161kos rezultatus"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "lt", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Pasl\u0117pti paie\u0161kos rezultatus", "Permalink to this definition": "Nuoroda \u012f \u0161\u012f apibr\u0117\u017eim\u0105", "Expand sidebar": "I\u0161pl\u0117sti \u0161onin\u0119 juost\u0105", "Permalink to this headline": "Nuoroda \u012f \u0161i\u0105 antra\u0161t\u0119", "Collapse sidebar": "Pasl\u0117pti \u0161onin\u0119 juost\u0105"}}); \ No newline at end of file diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.mo b/sphinx/locale/lt/LC_MESSAGES/sphinx.mo index 794ae655f..c895af1fb 100644 Binary files a/sphinx/locale/lt/LC_MESSAGES/sphinx.mo and b/sphinx/locale/lt/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.po b/sphinx/locale/lt/LC_MESSAGES/sphinx.po index 48618e306..6a9021263 100644 --- a/sphinx/locale/lt/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.po @@ -7,8 +7,9 @@ msgstr "" "Project-Id-Version: Sphinx 1.0pre/8b971dbc7d36\n" "Report-Msgid-Bugs-To: dalius@sandbox.lt\n" "POT-Creation-Date: 2010-05-24 23:53+0200\n" -"PO-Revision-Date: 2010-06-19 12:02+0300\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Dalius Dobravolskas <dalius@sandbox.lt>\n" +"Language-Team: lt <LL@li.org>\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" @@ -16,370 +17,388 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%Y-%m-%d" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" +msgid "see %s" msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Įtaisytieji" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Modulio lygis" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%Y-%m-%d" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Bendras indeksas" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "indeksas" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "kitas" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "praeitas" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (kuris yra " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Indeksas" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Skyriaus autorius: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Modulio autorius: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 msgid "Code author: " msgstr "Kodo autorius: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autorius: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Taip pat žiūrėkite" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "%s %s" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametrai" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Grąžinamos reikšmės" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Grąžinamos reikšmės tipas" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C funkcija)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C narys)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C makrokomanda)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C tipas)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C kintamasis)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funkcija" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "narys" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "makrokomanda" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipas" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "kintamasis" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ tipas)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ narys)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ funkcija)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "klasė" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (itaisytoji funkcija)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metodas)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (klasė)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (globalus kintamasis arba konstanta)" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s atributas)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "Argumentais" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "Išmeta" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "duomenys" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atribudas" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "Kintamieji" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Sukelia" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (modulyje %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (įtaisytasis kintamasis)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (modulje %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (įtaisytoji klasė)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (klasė iš %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metodas)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s statinis metodas)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s statinis metodas)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s klasės metodas)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "%s() (%s klasės metodas)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s atributas)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platformos: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modulis)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 msgid "Python Module Index" msgstr "" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "moduliai" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Atmestas" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "išimtis" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "metodas" -#: sphinx/domains/python.py:502 +#: sphinx/domains/python.py:563 msgid "class method" msgstr "klasės metodas" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statinis metodas" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modulis" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (atmestas)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "%s (direktyva)" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, python-format msgid "%s (role)" msgstr "%s (rolė)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "direktyva" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 msgid "role" msgstr "rolė" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "aplinkos kintamasis; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%skomandinės eilutės parinktis; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "aiškinamasis terminas" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "gramatinė leksema" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "nuorodos požymis" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "aplinkos kintamasis" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "programos parinktis" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Indeksas" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Modulio indeksas" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Paieškos puslapis" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Bazės: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr ":class:`%s` alternatyvus vardas" @@ -397,103 +416,103 @@ msgstr "(<<original entry>> galima rasti %s, eilutėje %d.)" msgid "original entry" msgstr "originalus įrašas" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "[šaltinis]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "[dokumentai]" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 msgid "Module code" msgstr "Modulio kodas" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "<h1>Kodas %s</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "Apžvalga: modulio kodas" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "<h1>Visi moduliai turintys kodą</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Dėmesio" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Atsargiai" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Pavojinga" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Klaida" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Patarimas" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Svarbu" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Pastaba" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Taip pat žiūrėkite" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Patarimas" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Įspėjimas" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nauja %s versijoje" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Pakeista %s versijoje" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Nebepalaikoma nuo %s versijos" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "bazinis žodis" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operatorius" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objektas" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "sakinis" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "įtaisytoji funkcija" @@ -502,8 +521,8 @@ msgstr "įtaisytoji funkcija" msgid "Table Of Contents" msgstr "Turinys" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Paieška" @@ -551,15 +570,15 @@ msgstr "greitas visų modulių pasiekimas" msgid "all functions, classes, terms" msgstr "visos funkcijos, klasės ir terminai" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Indeksas – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Pilnas indeksas viename puslapyje" @@ -571,39 +590,39 @@ msgstr "Indekso puslapiai pagal raidę" msgid "can be huge" msgstr "gali būti didelis" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigacija" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Ieškoti tarp %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Apie šiuos dokumentus" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Autoriaus teisės" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Autoriaus teisės</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Autoriaus teisės %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Paskutinis atnaujinimas %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -633,7 +652,7 @@ msgstr "Kita tema" msgid "next chapter" msgstr "kita dalis" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -641,25 +660,28 @@ msgstr "" "Prašome aktyvuoti JavaScript, kad veiktų paieškos\n" " funkcionalumas." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" " function will automatically search for all of the words. Pages\n" " containing fewer words won't appear in the result list." msgstr "" -"Čia jūs galite ieškoti šiuose dokumentuose. Įveskite savo paieškos\n žodžius į lauką apačioje ir paspauskite \"ieškoti\". Pastebėsime, kad paieškos\n funkcija automatiškai ieškos visų žodžių. Puslapiai,\n kuriuose yra mažiau žodžių nepasirodys tarp paieškos rezultatų." +"Čia jūs galite ieškoti šiuose dokumentuose. Įveskite savo paieškos\n" +" žodžius į lauką apačioje ir paspauskite \"ieškoti\". Pastebėsime, kad" +" paieškos\n" +" funkcija automatiškai ieškos visų žodžių. Puslapiai,\n" +" kuriuose yra mažiau žodžių nepasirodys tarp paieškos rezultatų." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "ieškoti" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Paieškos rezultatai" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Jūsų paieška neatitiko jokių rezultatų" @@ -699,12 +721,12 @@ msgstr "C API pakeitimai" msgid "Other changes" msgstr "Kiti pakeitimai" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Nuoroda į šią antraštę" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Nuoroda į šį apibrėžimą" @@ -712,35 +734,12 @@ msgstr "Nuoroda į šį apibrėžimą" msgid "Hide Search Matches" msgstr "Paslėpti paieškos rezultatus" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Ieškoma" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Ruošiama paieška..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", kuris yra " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "Jūsų paieška neatitiko jokių dokumentų. Prašom patikrinti ar visi žodžiai teisingai įvesti ir ar pasirinkote pakankamai kategorijų." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Paieška baigta, paieškos rezultatus atitiko %s puslapis(-iai,-ių)" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "Išplėsti šoninę juostą" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "Paslėpti šoninę juostą" @@ -748,23 +747,52 @@ msgstr "Paslėpti šoninę juostą" msgid "Contents" msgstr "Turinys" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Leidimas" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Išnašos" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "tęsinys iš praeito puslapio" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Tęsinys kitame puslapyje" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[paveiksliukas]" +#~ msgid "Python Enhancement Proposals!PEP %s" +#~ msgstr "" + +#~ msgid "Platforms: " +#~ msgstr "Platformos: " + +#~ msgid "Searching" +#~ msgstr "Ieškoma" + +#~ msgid "Preparing search..." +#~ msgstr "Ruošiama paieška..." + +#~ msgid ", in " +#~ msgstr ", kuris yra " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Jūsų paieška neatitiko jokių dokumentų. " +#~ "Prašom patikrinti ar visi žodžiai " +#~ "teisingai įvesti ir ar pasirinkote " +#~ "pakankamai kategorijų." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Paieška baigta, paieškos rezultatus atitiko %s puslapis(-iai,-ių)" + diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.js b/sphinx/locale/nl/LC_MESSAGES/sphinx.js index e21ff948b..e33900afb 100644 --- a/sphinx/locale/nl/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"Search Results": "Zoekresultaten", "Preparing search...": "Het zoeken wordt voorbereid...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op. Controleer of alle woorden correct gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": ", in ", "Expand sidebar": "", "Permalink to this headline": "Permalink naar deze titel", "Searching": "Zoeken", "Collapse sidebar": "", "Permalink to this definition": "Permalink naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "Zoekresultaten verbergen", "Permalink to this definition": "Permalink naar deze definitie", "Expand sidebar": "", "Permalink to this headline": "Permalink naar deze titel", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo index 2002607ff..f7afad063 100644 Binary files a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo and b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.po b/sphinx/locale/nl/LC_MESSAGES/sphinx.po index 8683db4f8..c9065504c 100644 --- a/sphinx/locale/nl/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.po @@ -7,411 +7,402 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2009-08-06 23:04+0200\n" -"PO-Revision-Date: 2010-05-29 16:22+0100\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Marijn van der Zee <marijn.vanderzee@gmail.com>\n" "Language-Team: nl <LL@li.org>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 -#: sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d. %B %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "zie %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "zie %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Builtins" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Moduleniveau" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d.%b.%Y" -#: sphinx/builders/html.py:285 -#: sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Algemene index" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "Index" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "volgende" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "vorige" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Index" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Auteur van deze sectie: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Auteur van deze module: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Auteur van deze module: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Auteur: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Zie ook" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 -#: sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parameters" -#: sphinx/domains/c.py:54 -#: sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Returns" -#: sphinx/domains/c.py:56 -#: sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Return type" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C-functie)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C member)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C-macro)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C type)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C-variabele)" -#: sphinx/domains/c.py:171 -#: sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 -#: sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "functie" -#: sphinx/domains/c.py:172 -#: sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "member" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "macro" -#: sphinx/domains/c.py:174 -#: sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "type" -#: sphinx/domains/c.py:175 -#, fuzzy +#: sphinx/domains/c.py:208 msgid "variable" msgstr "variabele" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ klasse)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ type)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ member)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ functie)" -#: sphinx/domains/cpp.py:1030 -#: sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "klasse" -#: sphinx/domains/javascript.py:117 -#: sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (geïntegreerde functie)" -#: sphinx/domains/javascript.py:118 -#: sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s methode)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (klasse)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (globale variabele of constante)" -#: sphinx/domains/javascript.py:122 -#: sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s attribuut)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parameters" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 -#: sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 -#: sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "attribuut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Variabele" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Veroorzaakt" -#: sphinx/domains/python.py:222 -#: sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 -#: sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (in module %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (geïntegreerde variabele)" -#: sphinx/domains/python.py:226 -#: sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (in module %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (geïntegreerde klasse)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (klasse in %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s methode)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s statische methode)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s statische methode)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s methode)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s methode)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s attribuut)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platformen: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (module)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Module-index" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "modules" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Verouderd" -#: sphinx/domains/python.py:500 -#: sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "exceptie" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s methode)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statische methode" -#: sphinx/domains/python.py:505 -#: sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "module" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (verouderd)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, fuzzy, python-format msgid "%s (role)" -msgstr "%s (module)" +msgstr "%s (rolle)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 #, fuzzy msgid "role" -msgstr "module" +msgstr "rolle" -#: sphinx/domains/std.py:68 -#: sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "omgevingsvariabele; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sopdrachtregel optie; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "omgevingsvariabele" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 -#: sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 -#: sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 -#: sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Index" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Module-index" -#: sphinx/domains/std.py:362 -#: sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Zoekpagina" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -429,132 +420,125 @@ msgstr "(Het <<originele item>> is te vinden in %s, regel %d.)" msgid "original entry" msgstr "originele item" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 -#, fuzzy +#: sphinx/ext/viewcode.py:131 msgid "Module code" -msgstr "module" +msgstr "" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Let op" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Pas op" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Gevaar" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Fout" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Hint" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Belangrijk" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Notitie" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Zie ook" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Tip" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Waarschuwing" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nieuw in versie %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Veranderd in versie %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Verouderd sinds versie %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "trefwoord" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operator" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "object" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "statement" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "ingebouwde functie" -#: sphinx/themes/agogo/layout.html:45 -#: sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 #: sphinx/themes/basic/localtoc.html:11 msgid "Table Of Contents" msgstr "Inhoudsopgave" -#: sphinx/themes/agogo/layout.html:49 -#: sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 -#: sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Zoeken" -#: sphinx/themes/agogo/layout.html:52 -#: sphinx/themes/basic/searchbox.html:15 +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 msgid "Go" msgstr "Ga" -#: sphinx/themes/agogo/layout.html:57 -#: sphinx/themes/basic/searchbox.html:20 +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 msgid "Enter search terms or a module, class or function name." msgstr "Geef zoekterm of de naam van een module, klasse of functie." -#: sphinx/themes/agogo/layout.html:78 -#: sphinx/themes/basic/sourcelink.html:14 +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 msgid "Show Source" msgstr "Broncode weergeven" @@ -590,15 +574,15 @@ msgstr "sneltoegang naar alle modules" msgid "all functions, classes, terms" msgstr "alle functies, klasses en begrippen" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Index – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Volledige index op een pagina" @@ -610,42 +594,46 @@ msgstr "Index pagineerd per letter" msgid "can be huge" msgstr "kan heel groot zijn" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigatie" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Zoeken in %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Over deze documenten" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Laatste aanpassing op %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format -msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." -msgstr "Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." #: sphinx/themes/basic/opensearch.xml:4 #, python-format @@ -668,13 +656,13 @@ msgstr "Volgend onderwerp" msgid "next chapter" msgstr "volgend hoofdstuk" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Activeer JavaSscript om de zoekfunctionaliteit in te schakelen." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -682,20 +670,21 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "" "Hier kan u de documenten doorzoeken. Geef enkele trefwoorden\n" -" in het veld hieronder en klik \"zoeken\". Merk op dat de zoekfunctie\n" -" steeds naar alle woorden zoekt. Pagina's die minder woorden bevatten\n" +" in het veld hieronder en klik \"zoeken\". Merk op dat de zoekfunctie" +"\n" +" steeds naar alle woorden zoekt. Pagina's die minder woorden bevatten" +"\n" " zullen niet tussen de resultaten verschijnen." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "zoeken" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Zoekresultaten" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Uw zoekopdracht leverde geen resultaten op." @@ -735,14 +724,12 @@ msgstr "Veranderingen in de C-API" msgid "Other changes" msgstr "Andere veranderingen" -#: sphinx/themes/basic/static/doctools.js:154 -#: sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Permalink naar deze titel" -#: sphinx/themes/basic/static/doctools.js:160 -#: sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Permalink naar deze definitie" @@ -750,33 +737,12 @@ msgstr "Permalink naar deze definitie" msgid "Hide Search Matches" msgstr "Zoekresultaten verbergen" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Zoeken" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Het zoeken wordt voorbereid..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", in " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." -msgstr "Uw zoekopdracht leverde geen resultaten op. Controleer of alle woorden correct gespeld zijn en dat u genoeg categoriën hebt geselecteerd." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Zoeken voltooid, %s pagina(s) gevonden." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -784,33 +750,49 @@ msgstr "" msgid "Contents" msgstr "Inhoud" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Release" -#: sphinx/writers/latex.py:572 -#: sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Voetnoten" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "Vervolgd van vorige pagina" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Vervolgd op volgende pagina" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[afbeelding]" -#~ msgid "Parameter" -#~ msgstr "Parameter" -#~ msgid "here" -#~ msgstr "hier" -#~ msgid "module, in " -#~ msgstr "module, in" -#~ msgid "Platform: %s" -#~ msgstr "Platform: %s" +#~ msgid "Platforms: " +#~ msgstr "Platformen: " + +#~ msgid "Searching" +#~ msgstr "Zoeken" + +#~ msgid "Preparing search..." +#~ msgstr "Het zoeken wordt voorbereid..." + +#~ msgid ", in " +#~ msgstr ", in " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Uw zoekopdracht leverde geen resultaten " +#~ "op. Controleer of alle woorden correct" +#~ " gespeld zijn en dat u genoeg " +#~ "categoriën hebt geselecteerd." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Zoeken voltooid, %s pagina(s) gevonden." diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.js b/sphinx/locale/pl/LC_MESSAGES/sphinx.js index 5823053fe..6a3f5f311 100644 --- a/sphinx/locale/pl/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "Wyniki wyszukiwania", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": ", w ", "Expand sidebar": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Collapse sidebar": "", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "Ukryj wyniki wyszukiwania", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Expand sidebar": "Rozwi\u0144 pasek boczny", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Collapse sidebar": "Zwi\u0144 pasek boczny"}}); \ No newline at end of file diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo index 3c6105cdb..4f91a8c7e 100644 Binary files a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo and b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.po b/sphinx/locale/pl/LC_MESSAGES/sphinx.po index 6044e8eef..adf4f3cc5 100644 --- a/sphinx/locale/pl/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.po @@ -1,507 +1,512 @@ - msgid "" msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-08-10 11:43+0000\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" -"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" +"Last-Translator: Michał Kandulski <michal.kandulski@gmail.com>\n" "Language-Team: \n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " "(n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%B %d %Y" -#: sphinx/roles.py:174 -#, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +#: sphinx/environment.py:1624 +#, fuzzy, python-format +msgid "see %s" +msgstr "zobacz %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "zobacz także %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Wbudowane" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Poziom modułu" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%b %d %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Indeks ogólny" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "indeks" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "dalej" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "wstecz" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (w " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Indeks" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor rozdziału: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor modułu: " -#: sphinx/directives/other.py:131 -#, fuzzy +#: sphinx/directives/other.py:140 msgid "Code author: " -msgstr "Autor modułu: " +msgstr "Autor kodu: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Zobacz także" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" -msgstr "" +msgstr "%s %s" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametry" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Zwraca" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Typ zwracany" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (funkcja C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (pole C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (makro C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (typ C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (zmienna C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funkcja" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "pole" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" -msgstr "" +msgstr "makro" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "typ" -#: sphinx/domains/c.py:175 -#, fuzzy +#: sphinx/domains/c.py:208 msgid "variable" -msgstr "Zmienna" +msgstr "zmienna" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" -msgstr "%s (klasie C++)" +msgstr "%s (klasa C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (typ C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (pole C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (funkcja C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" -msgstr "klasie" +msgstr "klasa" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (funkcja wbudowana)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metoda)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (klasa)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" -msgstr "" +msgstr "%s (zmienna lub stała globalna)" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s atrybut)" -#: sphinx/domains/javascript.py:131 -#, fuzzy +#: sphinx/domains/javascript.py:122 msgid "Arguments" -msgstr "Parametry" +msgstr "Argumenty" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" -msgstr "" +msgstr "Wyrzuca" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" -msgstr "" +msgstr "dane" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atrybut" -#: sphinx/domains/python.py:53 -#, fuzzy +#: sphinx/domains/python.py:100 msgid "Variables" -msgstr "Zmienna" +msgstr "Zmienne" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Wyrzuca" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (w module %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (zmienna wbudowana)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (w module %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (klasa wbudowana)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" -msgstr "%s (w klasie %s)" +msgstr "%s (klasa w module %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metoda)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" -msgstr "%s() (%s.%s statyczna metoda)" +msgstr "%s() (%s.%s metoda statyczna)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" -msgstr "%s() (%s statyczna metoda)" +msgstr "%s() (%s metoda statyczna)" -#: sphinx/domains/python.py:308 -#, fuzzy, python-format +#: sphinx/domains/python.py:341 +#, python-format msgid "%s() (%s.%s class method)" -msgstr "%s() (%s.%s metoda)" +msgstr "%s() (%s.%s metoda klasy)" -#: sphinx/domains/python.py:311 -#, fuzzy, python-format +#: sphinx/domains/python.py:344 +#, python-format msgid "%s() (%s class method)" -msgstr "%s() (%s metoda)" +msgstr "%s() (%s metoda klasy)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" -msgstr "%s (%s.%s atrybut)" +msgstr "%s (atrybut %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platformy: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (moduł)" -#: sphinx/domains/python.py:429 -#, fuzzy +#: sphinx/domains/python.py:490 msgid "Python Module Index" -msgstr "Indeks modułów" +msgstr "Indeks modułów pythona" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "moduły" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Niezalecane" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "wyjątek" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" -msgstr "" +msgstr "metoda" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s metoda)" +msgstr "metoda klasy" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statyczna metoda" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "moduł" -#: sphinx/domains/rst.py:53 -#, python-format -msgid "%s (directive)" -msgstr "" +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (niezalecane)" #: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#, python-format +msgid "%s (directive)" +msgstr "%s (dyrektywa)" + +#: sphinx/domains/rst.py:57 msgid "%s (role)" -msgstr "%s (moduł)" +msgstr "%s (rola)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" -msgstr "" +msgstr "dyrektywa" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "moduł" +msgstr "rola" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "zmienna środowiskowa; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sopcja linii komend; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" -msgstr "" +msgstr "termin glosariusza" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" -msgstr "" +msgstr "symbol gramatyki" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" -msgstr "" +msgstr "etykieta odsyłacza" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "zmienna środowiskowa" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" -msgstr "" +msgstr "opcja programu" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Indeks" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Indeks modułów" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Wyszukiwanie" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Klasy bazowe: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "alias klasy :class:`%s`" #: sphinx/ext/todo.py:41 msgid "Todo" -msgstr "Do zrobienia" +msgstr "Todo" #: sphinx/ext/todo.py:109 -#, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "" -"(Oryginalny wpis znajduje się w pliku %s, w linii %d i może być " -"odnaleziony " +msgstr "(<<Oryginalny wpis>> znajduje się w pliku %s, w linii %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" -msgstr "" +msgstr "oryginalny wpis" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" -msgstr "" +msgstr "[źródło]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" -msgstr "" +msgstr "[dokumenty]" -#: sphinx/ext/viewcode.py:123 -#, fuzzy +#: sphinx/ext/viewcode.py:131 msgid "Module code" -msgstr "moduł" +msgstr "Kod modułu" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" -msgstr "" +msgstr "<h1>Kod źródłowy modułu %s</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" -msgstr "" +msgstr "Przeglądanie: kod modułu" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" -msgstr "" +msgstr "<h1>Wszystkie moduły, dla których jest dostępny kod</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Uwaga" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Ostrożnie" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Niebezpieczeństwo" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Błąd" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Podpowiedź" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Ważne" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Uwaga" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Zobacz także" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Wskazówka" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Ostrzeżenie" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Nowe w wersji %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Zmienione w wersji %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Niezalecane od wersji %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "słowo kluczowe" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operator" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "obiekt" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "instrukcja" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "funkcja wbudowana" @@ -510,8 +515,8 @@ msgstr "funkcja wbudowana" msgid "Table Of Contents" msgstr "Spis treści" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Szukaj" @@ -541,15 +546,15 @@ msgstr "Kompletny spis treści" #: sphinx/themes/basic/defindex.html:24 msgid "lists all sections and subsections" -msgstr "wymień wszystkie rozdziały i podrozdziały" +msgstr "wszystkie rozdziały i podrozdziały" #: sphinx/themes/basic/defindex.html:26 msgid "search this documentation" -msgstr "wyszukaj w dokumentacji" +msgstr "przyszukaj tę dokumentację" #: sphinx/themes/basic/defindex.html:28 msgid "Global Module Index" -msgstr "Indeks modułów" +msgstr "Globalny indeks modułów" #: sphinx/themes/basic/defindex.html:29 msgid "quick access to all modules" @@ -559,15 +564,15 @@ msgstr "szybki dostęp do wszystkich modułów" msgid "all functions, classes, terms" msgstr "wszystkie funkcje, klasy, terminy" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Indeks – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Cały indeks na jednej stronie" @@ -579,39 +584,39 @@ msgstr "Strony indeksu alfabetycznie" msgid "can be huge" msgstr "może być ogromny" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Nawigacja" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Szukaj pośród %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "O tych dokumentach" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Ostatnia modyfikacja %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -641,13 +646,13 @@ msgstr "Następny temat" msgid "next chapter" msgstr "następny rozdział" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Aby umożliwić wuszukiwanie, proszę włączyć JavaScript." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -661,16 +666,15 @@ msgstr "" " nie zawierające wszystkich wpisanych słów nie znajdą się na wynikowej" " liście." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" -msgstr "Szukaj" +msgstr "szukaj" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Wyniki wyszukiwania" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Nie znaleziono żadnych pasujących stron." @@ -710,12 +714,12 @@ msgstr "Zmiany w C API" msgid "Other changes" msgstr "Inne zmiany" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Stały odnośnik do tego nagłówka" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Stały odnośnik do tej definicji" @@ -723,73 +727,62 @@ msgstr "Stały odnośnik do tej definicji" msgid "Hide Search Matches" msgstr "Ukryj wyniki wyszukiwania" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Wyszukiwanie" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Przygotowanie wyszukiwania..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", w " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie " -"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" -msgstr "" +msgstr "Rozwiń pasek boczny" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" -msgstr "" +msgstr "Zwiń pasek boczny" #: sphinx/themes/haiku/layout.html:26 msgid "Contents" -msgstr "" +msgstr "Treść" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Wydanie" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Przypisy" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "kontynuacja poprzedniej strony" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Kontynuacja na następnej stronie" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" -msgstr "[obrazek]" +msgstr "[obraz]" -#~ msgid "Parameter" -#~ msgstr "Parametr" +#~ msgid "Platforms: " +#~ msgstr "Platformy: " -#~ msgid "here" -#~ msgstr "tutaj" +#~ msgid "Searching" +#~ msgstr "Wyszukiwanie" -#~ msgid "module, in " -#~ msgstr "moduł, w " +#~ msgid "Preparing search..." +#~ msgstr "Przygotowanie wyszukiwania..." -#~ msgid "Platform: %s" -#~ msgstr "Platforma: %s" +#~ msgid ", in " +#~ msgstr ", w " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Nie znaleziono żadnych pasujących dokumentów." +#~ " Upewnij się, że wszystkie słowa są" +#~ " poprawnie wpisane i że wybrałeś " +#~ "wystarczającą liczbę kategorii." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron." diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js index 312d0fc7a..288c9692c 100644 --- a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"Search Results": "Resultados da Pesquisa", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Expand sidebar": "Expandir painel lateral", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Collapse sidebar": "Recolher painel lateral", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"Hide Search Matches": "Esconder Resultados da Pesquisa", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Expand sidebar": "Expandir painel lateral", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Collapse sidebar": "Recolher painel lateral"}}); \ No newline at end of file diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo index 67c1ce549..bb7d8d203 100644 Binary files a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo and b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po index 7df9013e7..1906a7c7d 100644 --- a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po @@ -8,405 +8,397 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n" "POT-Creation-Date: 2008-11-09 19:46+0100\n" -"PO-Revision-Date: 2010-06-20 18:34-0300\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n" "Language-Team: pt_BR <roger.demetrescu@gmail.com>\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 -#: sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d/%m/%Y" -#: sphinx/roles.py:174 -#, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +#: sphinx/environment.py:1624 +#, fuzzy, python-format +msgid "see %s" +msgstr "veja %s" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "veja também %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Internos" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Módulo" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d/%m/%Y" -#: sphinx/builders/html.py:285 -#: sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Índice Geral" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "índice" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "próximo" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "anterior" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (em " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Índice" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Autor da seção: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Autor do módulo: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 msgid "Code author: " msgstr "Autor do código: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Autor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Veja também" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "%s %s" -#: sphinx/domains/c.py:51 -#: sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parâmetros" -#: sphinx/domains/c.py:54 -#: sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Retorna" -#: sphinx/domains/c.py:56 -#: sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Tipo de retorno" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (função C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (membro C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (macro C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (tipo C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (variável C)" -#: sphinx/domains/c.py:171 -#: sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 -#: sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "função" -#: sphinx/domains/c.py:172 -#: sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "membro" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "macro" -#: sphinx/domains/c.py:174 -#: sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipo" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "variável" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (classe C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (tipo C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (membro C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (função C++)" -#: sphinx/domains/cpp.py:1030 -#: sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "classe" -#: sphinx/domains/javascript.py:117 -#: sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (função interna)" -#: sphinx/domains/javascript.py:118 -#: sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (método %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (classe)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (variável global ou constante)" -#: sphinx/domains/javascript.py:122 -#: sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (atributo %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "Parâmetros" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "Gera" -#: sphinx/domains/javascript.py:167 -#: sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "dado" -#: sphinx/domains/javascript.py:168 -#: sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atributo" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "Variáveis" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Levanta" -#: sphinx/domains/python.py:222 -#: sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 -#: sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (no módulo %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (variável interna)" -#: sphinx/domains/python.py:226 -#: sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (no módulo %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (classe interna)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (classe em %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (método %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (método estático %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (método estático %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (método de classe %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "%s() (método de classe %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (atributo %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Plataformas: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (módulo)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 msgid "Python Module Index" msgstr "Índice de Módulos do Python" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "módulos" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Obsoleto" -#: sphinx/domains/python.py:500 -#: sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "exceção" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "método" -#: sphinx/domains/python.py:502 -#, python-format +#: sphinx/domains/python.py:563 msgid "class method" msgstr "método de classe" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "método estático" -#: sphinx/domains/python.py:505 -#: sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "módulo" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (obsoleto)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "%s (diretiva)" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, python-format msgid "%s (role)" msgstr "%s (papel)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "diretiva" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 msgid "role" msgstr "papel" -#: sphinx/domains/std.py:68 -#: sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "váriavel de ambiente; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sopção de linha de comando; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "Termo de glossário" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "token de gramática" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "rótulo de referência" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "váriavel de ambiente" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "opção de programa" -#: sphinx/domains/std.py:360 -#: sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 -#: sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 -#: sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Índice" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Índice do Módulo" -#: sphinx/domains/std.py:362 -#: sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Página de Pesquisa" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Bases: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "apelido de :class:`%s`" @@ -424,131 +416,125 @@ msgstr "(A <<entrada original>> está localizada em %s, linha %d.)" msgid "original entry" msgstr "entrada original" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "[código fonte]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "[documentos]" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 msgid "Module code" msgstr "Código do módulo" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "<h1>Código fonte de %s</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "Visão geral: código do módulo" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "<h1>Todos os módulos onde este código está disponível</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Atenção" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Cuidado" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Perigo" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Erro" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Dica" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Importante" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Nota" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Veja Também" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Dica" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Aviso" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Novo na versão %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Alterado na versão %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Obsoleto desde a versão %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "palavra-chave" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operador" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objeto" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "comando" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "função interna" -#: sphinx/themes/agogo/layout.html:45 -#: sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 #: sphinx/themes/basic/localtoc.html:11 msgid "Table Of Contents" msgstr "Tabela de Conteúdo" -#: sphinx/themes/agogo/layout.html:49 -#: sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 -#: sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Pesquisar" -#: sphinx/themes/agogo/layout.html:52 -#: sphinx/themes/basic/searchbox.html:15 +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 msgid "Go" msgstr "Ir" -#: sphinx/themes/agogo/layout.html:57 -#: sphinx/themes/basic/searchbox.html:20 +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 msgid "Enter search terms or a module, class or function name." msgstr "Digite os termos da busca ou o nome de um módulo, classe ou função." -#: sphinx/themes/agogo/layout.html:78 -#: sphinx/themes/basic/sourcelink.html:14 +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 msgid "Show Source" msgstr "Exibir Fonte" @@ -584,15 +570,15 @@ msgstr "acesso rápido para todos os módulos" msgid "all functions, classes, terms" msgstr "todas funções, classes, termos" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Índice – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Índice completo em uma página" @@ -604,42 +590,46 @@ msgstr "Paginas de índice por letra" msgid "can be huge" msgstr "pode ser enorme" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navegação" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Pesquisar dentro de %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Sobre estes documentos" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Última atualização em %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format -msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." -msgstr "Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." #: sphinx/themes/basic/opensearch.xml:4 #, python-format @@ -662,13 +652,13 @@ msgstr "Próximo tópico" msgid "next chapter" msgstr "próximo capítulo" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Por favor ative o JavaScript para habilitar a funcionalidade de pesquisa." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -676,20 +666,21 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "" "A partir daqui você pode pesquisar estes documentos. Preencha suas \n" -" palavras de pesquisa na caixa abaixo e clique em \"pesquisar\". Observe que a função de pesquisa\n" +" palavras de pesquisa na caixa abaixo e clique em \"pesquisar\". " +"Observe que a função de pesquisa\n" " irá pesquisar automaticamente por todas as palavras.\n" -" Páginas contendo menos palavras não irão aparecer na lista de resultado." +" Páginas contendo menos palavras não irão aparecer na lista de " +"resultado." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "pesquisar" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Resultados da Pesquisa" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Sua pesquisa não encontrou nenhum resultado." @@ -729,14 +720,12 @@ msgstr "Alterações na API C" msgid "Other changes" msgstr "Outras alterações" -#: sphinx/themes/basic/static/doctools.js:154 -#: sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Link permanente para este título" -#: sphinx/themes/basic/static/doctools.js:160 -#: sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Link permanente para esta definição" @@ -744,33 +733,12 @@ msgstr "Link permanente para esta definição" msgid "Hide Search Matches" msgstr "Esconder Resultados da Pesquisa" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Pesquisando" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Preparando pesquisa..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", em " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." -msgstr "Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que você tenha selecionado o mínimo de categorias." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o critério de pesquisa." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "Expandir painel lateral" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "Recolher painel lateral" @@ -778,24 +746,53 @@ msgstr "Recolher painel lateral" msgid "Contents" msgstr "Conteúdo" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Versão" -#: sphinx/writers/latex.py:572 -#: sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Notas de rodapé" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "continuação da página anterior" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Continua na próxima página" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[imagem]" +#~ msgid "Platforms: " +#~ msgstr "Plataformas: " + +#~ msgid "Searching" +#~ msgstr "Pesquisando" + +#~ msgid "Preparing search..." +#~ msgstr "Preparando pesquisa..." + +#~ msgid ", in " +#~ msgstr ", em " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Sua pesquisa não encontrou nenhum " +#~ "documento. Por favor assegure-se de " +#~ "que todas as palavras foram digitadas" +#~ " corretamente e de que você tenha " +#~ "selecionado o mínimo de categorias." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "" +#~ "Pesquisa finalizada, foram encontrada(s) %s" +#~ " página(s) que conferem com o " +#~ "critério de pesquisa." + diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.js b/sphinx/locale/ru/LC_MESSAGES/sphinx.js index e597cfad9..ca0376ac6 100644 --- a/sphinx/locale/ru/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "ru", "plural_expr": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", "messages": {"Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430", "Preparing search...": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043f\u043e\u0438\u0441\u043a\u0443...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u041d\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u0430\u0448\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438 \u043d\u0435\u0442 \u043b\u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435.", "Search finished, found %s page(s) matching the search query.": "\u041f\u043e\u0438\u0441\u043a \u043e\u043a\u043e\u043d\u0447\u0435\u043d, \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446: %s.", ", in ": ", \u0432 ", "Expand sidebar": "", "Permalink to this headline": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Searching": "\u041f\u043e\u0438\u0441\u043a", "Collapse sidebar": "", "Permalink to this definition": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "ru", "plural_expr": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", "messages": {"Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Permalink to this definition": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "Expand sidebar": "", "Permalink to this headline": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.mo b/sphinx/locale/ru/LC_MESSAGES/sphinx.mo index ecdc68604..dae20a23a 100644 Binary files a/sphinx/locale/ru/LC_MESSAGES/sphinx.mo and b/sphinx/locale/ru/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.po b/sphinx/locale/ru/LC_MESSAGES/sphinx.po index e2b1e3a13..327152d12 100644 --- a/sphinx/locale/ru/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Sphinx 0.6b1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2009-01-24 18:39+0000\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: alexander smishlajev <alex@tycobka.lv>\n" "Language-Team: ru <LL@li.org>\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " @@ -15,379 +15,396 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, fuzzy, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Встроенные функции" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Модуль" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Словарь-указатель" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "словарь" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "следующий" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "предыдущий" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (в " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Алфавитный указатель" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Автор секции: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Автор модуля: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Автор модуля: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Автор: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "См.также" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Параметры" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Результат" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Тип результата" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (функция C)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (поле C)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (макроподстановка C)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (тип C)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (переменная C)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "функция" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "поле" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "тип" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Переменная" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (класс C++)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (тип C++)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (поле C++)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (функция C++)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "класс" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (встроенная функция)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (метод %s)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (класс)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (атрибут %s)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Параметры" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "атрибут" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Переменная" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Исключение" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (в модуле %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (встроенная переменная)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (в модуле %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (встроенный класс)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (класс в %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (метод %s.%s)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (статический метод %s.%s)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (статический метод %s)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (метод %s.%s)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (метод %s)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (атрибут %s.%s)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Платформы: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (модуль)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Состав модуля" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "модули" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Не рекомендуется" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "исключение" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (метод %s)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "статический метод" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "модуль" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr " (не рекомендуется)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (модуль)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "модуль" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "переменная окружения; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "Опция командной строки %s; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "переменная окружения" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Алфавитный указатель" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Состав модуля" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Поиск" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Базовые классы: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "псевдоним класса :class:`%s`" @@ -399,110 +416,110 @@ msgstr "План" #: sphinx/ext/todo.py:109 #, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(Исходный элемент находится в %s, в строке %d, и может быть найден " +msgstr "(Исходный элемент находится в %s, в строке %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "модуль" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Внимание" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Осторожно" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Опасно" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Ошибка" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Подсказка" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Важно" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Примечание" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "См.также" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Совет" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Предупреждение" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Добавлено в версии %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Изменено в версии %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Не рекомендуется, начиная с версии %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "ключевое слово" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "оператор" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "объект" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "команда" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "базовая функция" @@ -511,8 +528,8 @@ msgstr "базовая функция" msgid "Table Of Contents" msgstr "Содержание" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Поиск" @@ -560,15 +577,15 @@ msgstr "сводный список всех модулей" msgid "all functions, classes, terms" msgstr "все функции, классы, переменные и константы" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Алфавитный указатель – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Полный алфавитный указатель на одной странице" @@ -580,39 +597,39 @@ msgstr "Указатели по буквам алфавита" msgid "can be huge" msgstr "может быть очень большим" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Просмотр" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Поиск в документе «%(docstitle)s»" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Об этих документах…" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Дата последнего обновления: %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -642,13 +659,13 @@ msgstr "Следующий раздел" msgid "next chapter" msgstr "следующая глава" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "Для выполнения поиска необходима поддержка JavaScript в браузере." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -661,16 +678,15 @@ msgstr "" "упомянуты все указанные слова. Страницы, в которых встречается только " "часть этих слов, отобраны не будут." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "искать" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Результаты поиска" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Результатов по вашему запросу не найдено." @@ -710,12 +726,12 @@ msgstr "Изменения в C API" msgid "Other changes" msgstr "Другие изменения" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Ссылка на этот заголовок" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Ссылка на это определение" @@ -723,37 +739,12 @@ msgstr "Ссылка на это определение" msgid "Hide Search Matches" msgstr "Снять выделение" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Поиск" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Подготовка к поиску..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", в " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Нет документов, соответствующих вашему запросу. Проверьте, правильно ли " -"выбраны категории и нет ли опечаток в запросе." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Поиск окончен, найдено страниц: %s." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -761,23 +752,50 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Выпуск" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Полный алфавитный указатель на одной странице" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[рисунок]" + +#~ msgid "Platforms: " +#~ msgstr "Платформы: " + +#~ msgid "Searching" +#~ msgstr "Поиск" + +#~ msgid "Preparing search..." +#~ msgstr "Подготовка к поиску..." + +#~ msgid ", in " +#~ msgstr ", в " + +#~ 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 "" +#~ "Нет документов, соответствующих вашему " +#~ "запросу. Проверьте, правильно ли выбраны " +#~ "категории и нет ли опечаток в " +#~ "запросе." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Поиск окончен, найдено страниц: %s." + diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.js b/sphinx/locale/sl/LC_MESSAGES/sphinx.js index 2a2f960a6..2bcb33dad 100644 --- a/sphinx/locale/sl/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"Search Results": "Rezultati Iskanja", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Expand sidebar": "", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Collapse sidebar": "", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij resultate iskanja"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"Hide Search Matches": "Skrij resultate iskanja", "Permalink to this definition": "Povezava na to definicijo", "Expand sidebar": "", "Permalink to this headline": "Povezava na naslov", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo index 21e64ffd5..0535cf6e2 100644 Binary files a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo and b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.po b/sphinx/locale/sl/LC_MESSAGES/sphinx.po index 6028c35c8..ad0ef4323 100644 --- a/sphinx/locale/sl/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.po @@ -1,389 +1,404 @@ - msgid "" msgstr "" "Project-Id-Version: Sphinx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-09-11 23:58+0200\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Luka Marinko <luka.marinko@simt.si>\n" "Language-Team: Rok Garbas <rok.garbas@gmail.com>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B, %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Vgrajeni deli" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Nivo modula" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b, %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Splošni abecedni seznam" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "abecedni seznam" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "naprej" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "nazaj" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (v " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Abecedni seznam" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Avtor sekcije: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Avtor modula: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Avtor modula: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Avtor: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Poglej Tudi" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametri" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Vrne" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Vrne tip" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C funkcija)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C član)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C makro)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C tip)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C spremenljivka)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "funkcija" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "član" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tip" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Spremenljivka" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ razred)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ tip)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ član)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ funkcija)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "razred" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (vgrajene funkcije)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metoda)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (razred)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s atribut)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Parametri" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "atribut" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Spremenljivka" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Sproži izjemo" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (v modulu %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (vgrajene spremenljivke)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (v modulu %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (vgrajen razred)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (razred v %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metoda)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s statična metoda)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s statična metoda)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s metoda)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s metoda)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s atribut)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platforme:" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modul)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Seznam modulov" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "Moduli" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Zastarelo" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "izjema" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s metoda)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statična metoda" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modul" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (zastarelo)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (modul)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "modul" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "okoljska spremenljivka; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%scommand line parameter; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "okoljska spremenljivka" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Abecedni seznam" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Seznam modulov" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Iskalnik" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Baza: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "vzdevek za :class:`%s`" @@ -395,110 +410,110 @@ msgstr "Todo" #: sphinx/ext/todo.py:109 #, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(Originalen vnos se nahaja v %s, v vrstici %d, in ga je moč poiskati " +msgstr "(<<Originalen vnos>> se nahaja v %s, v vrstici %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "modul" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Pozor" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Previdno" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Nevarno" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Napaka" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Nasvet" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Pomembno" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Opomba" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Poglej Tudi" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Nasvet" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Opozorilo" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Novo v verziji %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Spremenjeno v verziji %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Zastarelo od verzije %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "ključna beseda" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "operator" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "objekt" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "izjava" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "vgrajene funkcije" @@ -507,8 +522,8 @@ msgstr "vgrajene funkcije" msgid "Table Of Contents" msgstr "Seznam Vsebine" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Išči" @@ -556,15 +571,15 @@ msgstr "hiter dostop do vseh modulov" msgid "all functions, classes, terms" msgstr "vse funkcije, razredi, izrazi" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Seznam – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Poln indeks na eni strani" @@ -576,39 +591,39 @@ msgstr "Indeksiraj strani po črki" msgid "can be huge" msgstr "lahko je veliko" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Navigacija" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Išči med %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "O dokumentih" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Vse pravice pridržane" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Vse pravice pridržane %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Zadnjič posodobljeno %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -638,7 +653,7 @@ msgstr "Naslednja tema" msgid "next chapter" msgstr "naslednje poglavje" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -646,7 +661,7 @@ msgstr "" "Za pravilno delovanje Iskanja morete vklopiti\n" " JavaScript." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -658,16 +673,15 @@ msgstr "" " bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n" " vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "išči" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Rezultati Iskanja" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Vaše iskanje ni imelo nobenega zadetka." @@ -707,12 +721,12 @@ msgstr "C API spremembe" msgid "Other changes" msgstr "Ostale spremembe" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Povezava na naslov" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Povezava na to definicijo" @@ -720,37 +734,12 @@ msgstr "Povezava na to definicijo" msgid "Hide Search Matches" msgstr "Skrij resultate iskanja" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Iščem" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Pripravljam iskanje..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", v " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede " -"pravilno črkovane in ali ste izbrali dovolj kategorij." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Iskanje končano, najdeno %s strani, ki ustrezajo iskalnemu nizu." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -758,22 +747,49 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Izdaja" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Opombe" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "nadaljevanje iz prejšnje strani" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Nadaljevanje na naslednji strani" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[slika]" + +#~ msgid "Platforms: " +#~ msgstr "Platforme:" + +#~ msgid "Searching" +#~ msgstr "Iščem" + +#~ msgid "Preparing search..." +#~ msgstr "Pripravljam iskanje..." + +#~ msgid ", in " +#~ msgstr ", v " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Za vaše iskanje ni rezultatov. Prosimo" +#~ " preglejte ali so vse besede pravilno" +#~ " črkovane in ali ste izbrali dovolj" +#~ " kategorij." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Iskanje končano, najdeno %s strani, ki ustrezajo iskalnemu nizu." + diff --git a/sphinx/locale/sphinx.pot b/sphinx/locale/sphinx.pot index 955663aa7..1b9ea2f37 100644 --- a/sphinx/locale/sphinx.pot +++ b/sphinx/locale/sphinx.pot @@ -1,386 +1,404 @@ # Translations template for Sphinx. -# Copyright (C) 2010 ORGANIZATION +# Copyright (C) 2011 ORGANIZATION # This file is distributed under the same license as the Sphinx project. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Sphinx 1.0pre/8b971dbc7d36\n" +"Project-Id-Version: Sphinx 1.1pre/339c7a794c1a\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2010-05-24 23:53+0200\n" +"POT-Creation-Date: 2011-01-22 14:40+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" +msgid "see %s" msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "" -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "" -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 msgid "Code author: " msgstr "" -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "" -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "" -#: sphinx/domains/c.py:133 -#, python-format -msgid "%s (C function)" -msgstr "" - -#: sphinx/domains/c.py:135 -#, python-format -msgid "%s (C member)" -msgstr "" - -#: sphinx/domains/c.py:137 -#, python-format -msgid "%s (C macro)" -msgstr "" - -#: sphinx/domains/c.py:139 -#, python-format -msgid "%s (C type)" -msgstr "" - #: sphinx/domains/c.py:141 #, python-format +msgid "%s (C function)" +msgstr "" + +#: sphinx/domains/c.py:143 +#, python-format +msgid "%s (C member)" +msgstr "" + +#: sphinx/domains/c.py:145 +#, python-format +msgid "%s (C macro)" +msgstr "" + +#: sphinx/domains/c.py:147 +#, python-format +msgid "%s (C type)" +msgstr "" + +#: sphinx/domains/c.py:149 +#, python-format msgid "%s (C variable)" msgstr "" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 msgid "Python Module Index" msgstr "" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 +#: sphinx/domains/python.py:563 msgid "class method" msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "" -#: sphinx/domains/rst.py:53 -#, python-format -msgid "%s (directive)" +#: sphinx/domains/python.py:694 +msgid " (deprecated)" msgstr "" #: sphinx/domains/rst.py:55 #, python-format +msgid "%s (directive)" +msgstr "" + +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 msgid "role" msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -398,103 +416,103 @@ msgstr "" msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 msgid "Module code" msgstr "" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "" @@ -503,8 +521,8 @@ msgstr "" msgid "Table Of Contents" msgstr "" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "" @@ -552,15 +570,15 @@ msgstr "" msgid "all functions, classes, terms" msgstr "" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "" @@ -572,39 +590,39 @@ msgstr "" msgid "can be huge" msgstr "" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "" -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -632,13 +650,13 @@ msgstr "" msgid "next chapter" msgstr "" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -646,16 +664,15 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "" -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "" @@ -695,12 +712,12 @@ msgstr "" msgid "Other changes" msgstr "" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "" @@ -708,35 +725,12 @@ msgstr "" msgid "Hide Search Matches" msgstr "" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -744,23 +738,23 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "" diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.js b/sphinx/locale/sv/LC_MESSAGES/sphinx.js new file mode 100644 index 000000000..15821abac --- /dev/null +++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.js @@ -0,0 +1 @@ +Documentation.addTranslations({"locale": "sv", "plural_expr": "(n != 1)", "messages": {"Hide Search Matches": "D\u00f6lj S\u00f6kresultat", "Permalink to this definition": "Permalink till denna definition", "Expand sidebar": "Expandera sidolist", "Permalink to this headline": "Permalink till denna rubrik", "Collapse sidebar": "D\u00f6lj sidolist"}}); \ No newline at end of file diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.mo b/sphinx/locale/sv/LC_MESSAGES/sphinx.mo new file mode 100644 index 000000000..aed6bf5c7 Binary files /dev/null and b/sphinx/locale/sv/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.po b/sphinx/locale/sv/LC_MESSAGES/sphinx.po new file mode 100644 index 000000000..42aaa5fe6 --- /dev/null +++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.po @@ -0,0 +1,786 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2010-05-24 23:53+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" +"Last-Translator: Henrik Holmboe <henrik@holmboe.se>\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.5\n" + +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 +#: sphinx/writers/manpage.py:67 +#, python-format +msgid "%B %d, %Y" +msgstr "%B %d, %Y" + +#: sphinx/environment.py:1624 +#, python-format +msgid "see %s" +msgstr "se %s" + +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "se även %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 +msgid "Builtins" +msgstr "Inbyggda" + +#: sphinx/builders/changes.py:75 +msgid "Module level" +msgstr "Modulnivå" + +#: sphinx/builders/html.py:274 +#, python-format +msgid "%b %d, %Y" +msgstr "%b %d, %Y" + +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 +msgid "General Index" +msgstr "Huvudindex" + +#: sphinx/builders/html.py:293 +msgid "index" +msgstr "index" + +#: sphinx/builders/html.py:353 +msgid "next" +msgstr "nästa" + +#: sphinx/builders/html.py:362 +msgid "previous" +msgstr "föregående" + +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 +msgid " (in " +msgstr "(i " + +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Index" + +#: sphinx/directives/other.py:136 +msgid "Section author: " +msgstr "Sektionsförfattare" + +#: sphinx/directives/other.py:138 +msgid "Module author: " +msgstr "Modulförfattare" + +#: sphinx/directives/other.py:140 +msgid "Code author: " +msgstr "Källkodsförfattare" + +#: sphinx/directives/other.py:142 +msgid "Author: " +msgstr "Upphovsman:" + +#: sphinx/directives/other.py:215 +msgid "See also" +msgstr "Se även" + +#: sphinx/domains/__init__.py:244 +#, python-format +msgid "%s %s" +msgstr "%s %s" + +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 +msgid "Parameters" +msgstr "Parametrar" + +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 +msgid "Returns" +msgstr "Returnerar" + +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 +msgid "Return type" +msgstr "Returtyp" + +#: sphinx/domains/c.py:141 +#, python-format +msgid "%s (C function)" +msgstr "%s (C-funktion)" + +#: sphinx/domains/c.py:143 +#, python-format +msgid "%s (C member)" +msgstr "%s (C-medlem)" + +#: sphinx/domains/c.py:145 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C-makro)" + +#: sphinx/domains/c.py:147 +#, python-format +msgid "%s (C type)" +msgstr "%s (C-typ)" + +#: sphinx/domains/c.py:149 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C-variabel)" + +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 +msgid "function" +msgstr "funktion" + +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 +msgid "member" +msgstr "medlem" + +#: sphinx/domains/c.py:206 +msgid "macro" +msgstr "makro" + +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 +msgid "type" +msgstr "typ" + +#: sphinx/domains/c.py:208 +msgid "variable" +msgstr "variabel" + +#: sphinx/domains/cpp.py:897 +#, python-format +msgid "%s (C++ class)" +msgstr "%s (C++-klass)" + +#: sphinx/domains/cpp.py:912 +#, python-format +msgid "%s (C++ type)" +msgstr "%s (C++-typ)" + +#: sphinx/domains/cpp.py:931 +#, python-format +msgid "%s (C++ member)" +msgstr "%s (C++-medlem)" + +#: sphinx/domains/cpp.py:983 +#, python-format +msgid "%s (C++ function)" +msgstr "%s (C++-funktion)" + +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 +msgid "class" +msgstr "klass" + +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (inbyggd funktion)" + +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s metod)" + +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (klass)" + +#: sphinx/domains/javascript.py:111 +#, python-format +msgid "%s (global variable or constant)" +msgstr "%s (global variabel eller konstant)" + +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s attribut)" + +#: sphinx/domains/javascript.py:122 +msgid "Arguments" +msgstr "Argument" + +#: sphinx/domains/javascript.py:125 +msgid "Throws" +msgstr "Kastar" + +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 +msgid "data" +msgstr "data" + +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 +msgid "attribute" +msgstr "attribut" + +#: sphinx/domains/python.py:100 +msgid "Variables" +msgstr "Variabler" + +#: sphinx/domains/python.py:104 +msgid "Raises" +msgstr "Väcker" + +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (i modul %s)" + +#: sphinx/domains/python.py:258 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (inbyggd variabel)" + +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (i modul %s)" + +#: sphinx/domains/python.py:275 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (inbyggd klass)" + +#: sphinx/domains/python.py:276 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (klass i %s)" + +#: sphinx/domains/python.py:316 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s metod)" + +#: sphinx/domains/python.py:328 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s statisk metod)" + +#: sphinx/domains/python.py:331 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s statisk metod)" + +#: sphinx/domains/python.py:341 +#, python-format +msgid "%s() (%s.%s class method)" +msgstr "%s() (%s.%s klassmetod)" + +#: sphinx/domains/python.py:344 +#, python-format +msgid "%s() (%s class method)" +msgstr "%s() (%s klassmetod)" + +#: sphinx/domains/python.py:354 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s attribut)" + +#: sphinx/domains/python.py:433 +#, python-format +msgid "%s (module)" +msgstr "%s (modul)" + +#: sphinx/domains/python.py:490 +msgid "Python Module Index" +msgstr "Python Modulindex" + +#: sphinx/domains/python.py:491 +msgid "modules" +msgstr "moduler" + +#: sphinx/domains/python.py:536 +msgid "Deprecated" +msgstr "Ersatt" + +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 +msgid "exception" +msgstr "undantag" + +#: sphinx/domains/python.py:562 +msgid "method" +msgstr "metod" + +#: sphinx/domains/python.py:563 +msgid "class method" +msgstr "klassmetod" + +#: sphinx/domains/python.py:564 +msgid "static method" +msgstr "statisk metod" + +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 +msgid "module" +msgstr "modul" + +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr " (ersatt)" + +#: sphinx/domains/rst.py:55 +#, python-format +msgid "%s (directive)" +msgstr "%s (direktiv)" + +#: sphinx/domains/rst.py:57 +#, python-format +msgid "%s (role)" +msgstr "%s (roll)" + +#: sphinx/domains/rst.py:106 +msgid "directive" +msgstr "direktiv" + +#: sphinx/domains/rst.py:107 +msgid "role" +msgstr "roll" + +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 +#, python-format +msgid "environment variable; %s" +msgstr "miljövariabel; %s" + +#: sphinx/domains/std.py:162 +#, python-format +msgid "%scommand line option; %s" +msgstr "%skommandorad växel; %s" + +#: sphinx/domains/std.py:393 +msgid "glossary term" +msgstr "ordlista" + +#: sphinx/domains/std.py:394 +msgid "grammar token" +msgstr "grammatisk token" + +#: sphinx/domains/std.py:395 +msgid "reference label" +msgstr "referensetikett" + +#: sphinx/domains/std.py:396 +msgid "environment variable" +msgstr "miljövariabel" + +#: sphinx/domains/std.py:397 +msgid "program option" +msgstr "programväxel" + +#: sphinx/domains/std.py:428 +msgid "Module Index" +msgstr "Modulindex" + +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 +msgid "Search Page" +msgstr "Söksida" + +#: sphinx/ext/autodoc.py:998 +#, python-format +msgid " Bases: %s" +msgstr " Baserad: %s" + +#: sphinx/ext/autodoc.py:1034 +#, python-format +msgid "alias of :class:`%s`" +msgstr "alias för :class:`%s`" + +#: sphinx/ext/todo.py:41 +msgid "Todo" +msgstr "Att göra" + +#: sphinx/ext/todo.py:109 +#, python-format +msgid "(The <<original entry>> is located in %s, line %d.)" +msgstr "(<<Ursprunget>> finns i %s, på rad %d.)" + +#: sphinx/ext/todo.py:117 +msgid "original entry" +msgstr "ursprungsvärde" + +#: sphinx/ext/viewcode.py:70 +msgid "[source]" +msgstr "[source]" + +#: sphinx/ext/viewcode.py:117 +msgid "[docs]" +msgstr "[docs]" + +#: sphinx/ext/viewcode.py:131 +msgid "Module code" +msgstr "Modulkällkod" + +#: sphinx/ext/viewcode.py:137 +#, python-format +msgid "<h1>Source code for %s</h1>" +msgstr "<h1>Källkod för %s</h1>" + +#: sphinx/ext/viewcode.py:164 +msgid "Overview: module code" +msgstr "Översikt: modulkällkod" + +#: sphinx/ext/viewcode.py:165 +msgid "<h1>All modules for which code is available</h1>" +msgstr "<h1>Alla moduler där källkod finns</h1>" + +#: sphinx/locale/__init__.py:155 +msgid "Attention" +msgstr "Uppmärksamma" + +#: sphinx/locale/__init__.py:156 +msgid "Caution" +msgstr "Varning" + +#: sphinx/locale/__init__.py:157 +msgid "Danger" +msgstr "Risk" + +#: sphinx/locale/__init__.py:158 +msgid "Error" +msgstr "Fel" + +#: sphinx/locale/__init__.py:159 +msgid "Hint" +msgstr "Råd" + +#: sphinx/locale/__init__.py:160 +msgid "Important" +msgstr "Viktigt" + +#: sphinx/locale/__init__.py:161 +msgid "Note" +msgstr "Observera" + +#: sphinx/locale/__init__.py:162 +msgid "See Also" +msgstr "Se även" + +#: sphinx/locale/__init__.py:163 +msgid "Tip" +msgstr "Tips" + +#: sphinx/locale/__init__.py:164 +msgid "Warning" +msgstr "Varning" + +#: sphinx/locale/__init__.py:168 +#, python-format +msgid "New in version %s" +msgstr "Nyheter i version %s" + +#: sphinx/locale/__init__.py:169 +#, python-format +msgid "Changed in version %s" +msgstr "Förändrat i version %s" + +#: sphinx/locale/__init__.py:170 +#, python-format +msgid "Deprecated since version %s" +msgstr "Ersatt sedan version %s" + +#: sphinx/locale/__init__.py:176 +msgid "keyword" +msgstr "nyckelord" + +#: sphinx/locale/__init__.py:177 +msgid "operator" +msgstr "operator" + +#: sphinx/locale/__init__.py:178 +msgid "object" +msgstr "objekt" + +#: sphinx/locale/__init__.py:180 +msgid "statement" +msgstr "uttryck" + +#: sphinx/locale/__init__.py:181 +msgid "built-in function" +msgstr "inbyggda funktioner" + +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/basic/localtoc.html:11 +msgid "Table Of Contents" +msgstr "Innehållsförteckning" + +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 +msgid "Search" +msgstr "Sök" + +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 +msgid "Go" +msgstr "Gå" + +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 +msgid "Enter search terms or a module, class or function name." +msgstr "Ange sökord eller modul-, klass- eller funktionsnamn." + +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 +msgid "Show Source" +msgstr "Visa källfil" + +#: sphinx/themes/basic/defindex.html:11 +msgid "Overview" +msgstr "Översikt" + +#: sphinx/themes/basic/defindex.html:20 +msgid "Indices and tables:" +msgstr "Index och tabeller" + +#: sphinx/themes/basic/defindex.html:23 +msgid "Complete Table of Contents" +msgstr "Komplett Innehållsförteckning" + +#: sphinx/themes/basic/defindex.html:24 +msgid "lists all sections and subsections" +msgstr "lista över alla paragrafer och underparagrafer" + +#: sphinx/themes/basic/defindex.html:26 +msgid "search this documentation" +msgstr "sök i det här dokumentet" + +#: sphinx/themes/basic/defindex.html:28 +msgid "Global Module Index" +msgstr "Global Modulindex" + +#: sphinx/themes/basic/defindex.html:29 +msgid "quick access to all modules" +msgstr "genväg till alla moduler" + +#: sphinx/themes/basic/defindex.html:31 +msgid "all functions, classes, terms" +msgstr "alla funktioner, klasser, villkor" + +#: sphinx/themes/basic/genindex-single.html:35 +#, python-format +msgid "Index – %(key)s" +msgstr "Index – %(key)s" + +#: sphinx/themes/basic/genindex-single.html:63 +#: sphinx/themes/basic/genindex-split.html:24 +#: sphinx/themes/basic/genindex-split.html:38 +#: sphinx/themes/basic/genindex.html:74 +msgid "Full index on one page" +msgstr "Hela innehållsförteckningen på en sida" + +#: sphinx/themes/basic/genindex-split.html:16 +msgid "Index pages by letter" +msgstr "Innehållsförteckning per inledande bokstav" + +#: sphinx/themes/basic/genindex-split.html:25 +msgid "can be huge" +msgstr "kan bli stort" + +#: sphinx/themes/basic/layout.html:29 +msgid "Navigation" +msgstr "Navigation" + +#: sphinx/themes/basic/layout.html:122 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Sök bland %(docstitle)s" + +#: sphinx/themes/basic/layout.html:131 +msgid "About these documents" +msgstr "Om dessa dokument" + +#: sphinx/themes/basic/layout.html:140 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/themes/basic/layout.html:189 +#, python-format +msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." +msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." + +#: sphinx/themes/basic/layout.html:191 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/themes/basic/layout.html:195 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Senast uppdaterad %(last_updated)s." + +#: sphinx/themes/basic/layout.html:198 +#, python-format +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +"Skapad med <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." + +#: sphinx/themes/basic/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Sök %(docstitle)s" + +#: sphinx/themes/basic/relations.html:11 +msgid "Previous topic" +msgstr "Föregående titel" + +#: sphinx/themes/basic/relations.html:13 +msgid "previous chapter" +msgstr "Föregående kapitel" + +#: sphinx/themes/basic/relations.html:16 +msgid "Next topic" +msgstr "Nästa titel" + +#: sphinx/themes/basic/relations.html:18 +msgid "next chapter" +msgstr "Nästa kapitel" + +#: sphinx/themes/basic/search.html:24 +msgid "" +"Please activate JavaScript to enable the search\n" +" functionality." +msgstr "Var god aktivera JavaScript för sökfunktionalitet." + +#: sphinx/themes/basic/search.html:29 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Här kan du söka bland dessa dokument. Ange sökord nedan och klicka " +"\"sök\".\n" +" Sökningen måste träffa på samtliga angivna sökord." + +#: sphinx/themes/basic/search.html:36 +msgid "search" +msgstr "sök" + +#: sphinx/themes/basic/search.html:40 +msgid "Search Results" +msgstr "Sökresultat" + +#: sphinx/themes/basic/search.html:42 +msgid "Your search did not match any results." +msgstr "Din sökning gav inga resultat." + +#: sphinx/themes/basic/searchbox.html:12 +msgid "Quick search" +msgstr "Snabbsök" + +#: sphinx/themes/basic/sourcelink.html:11 +msgid "This Page" +msgstr "Denna Sida" + +#: sphinx/themes/basic/changes/frameset.html:5 +#: sphinx/themes/basic/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Förändringar i Version %(version)s — %(docstitle)s" + +#: sphinx/themes/basic/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/themes/basic/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automatiskt genererad lista över förändringar i version %(version)s" + +#: sphinx/themes/basic/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Förändringar i bibliotek" + +#: sphinx/themes/basic/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Förändringar i C-API" + +#: sphinx/themes/basic/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Övriga förändringar" + +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 +msgid "Permalink to this headline" +msgstr "Permalink till denna rubrik" + +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 +msgid "Permalink to this definition" +msgstr "Permalink till denna definition" + +#: sphinx/themes/basic/static/doctools.js:189 +msgid "Hide Search Matches" +msgstr "Dölj Sökresultat" + +#: sphinx/themes/default/static/sidebar.js:69 +msgid "Expand sidebar" +msgstr "Expandera sidolist" + +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 +msgid "Collapse sidebar" +msgstr "Dölj sidolist" + +#: sphinx/themes/haiku/layout.html:26 +msgid "Contents" +msgstr "Innehåll" + +#: sphinx/writers/latex.py:176 +msgid "Release" +msgstr "Utgåva" + +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 +msgid "Footnotes" +msgstr "Fotnoter" + +#: sphinx/writers/latex.py:672 +msgid "continued from previous page" +msgstr "fortsättning från föregående sida" + +#: sphinx/writers/latex.py:677 +msgid "Continued on next page" +msgstr "Fortsätter på nästa sida" + +#: sphinx/writers/text.py:430 +msgid "[image]" +msgstr "[image]" + +#~ msgid "Platforms: " +#~ msgstr "Plattformar:" + +#~ msgid "Searching" +#~ msgstr "Söker" + +#~ msgid "Preparing search..." +#~ msgstr "Förbereder sökning..." + +#~ msgid ", in " +#~ msgstr ", i " + +#~ 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ökning gav inga resultat. Kolla " +#~ "stavning och att du valt tillräckligt" +#~ " med kategorier." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Sökning färdig, hittade %s träffar." + diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.js b/sphinx/locale/tr/LC_MESSAGES/sphinx.js index 3cb911770..4ba20a32b 100644 --- a/sphinx/locale/tr/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "tr", "plural_expr": "0", "messages": {"Search Results": "Arama Sonu\u00e7lar\u0131", "Preparing search...": "Aramaya haz\u0131rlan\u0131yor...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Arama sonucunda hi\u00e7bir belge bulunamad\u0131. B\u00fct\u00fcn kelimeleri do\u011fru yazd\u0131\u011f\u0131n\u0131zdan ve gereken kategorileri se\u00e7ti\u011finizden emin olun.", "Search finished, found %s page(s) matching the search query.": "Arama sonu\u00e7land\u0131, aramayla e\u015fle\u015fen %s sayfa bulundu.", ", in ": ", \u015funun i\u00e7inde: ", "Expand sidebar": "Yan \u00e7ubu\u011fu geni\u015flet", "Permalink to this headline": "Bu ba\u015fl\u0131\u011f\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Searching": "Ar\u0131yor", "Collapse sidebar": "Yan \u00e7ubu\u011fu daralt", "Permalink to this definition": "Bu tan\u0131m\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Hide Search Matches": "Arama Sonu\u00e7lar\u0131n\u0131 Gizle"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "tr", "plural_expr": "0", "messages": {"Hide Search Matches": "Arama Sonu\u00e7lar\u0131n\u0131 Gizle", "Permalink to this definition": "Bu tan\u0131m\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Expand sidebar": "Yan \u00e7ubu\u011fu geni\u015flet", "Permalink to this headline": "Bu ba\u015fl\u0131\u011f\u0131n kal\u0131c\u0131 ba\u011flant\u0131s\u0131", "Collapse sidebar": "Yan \u00e7ubu\u011fu daralt"}}); \ No newline at end of file diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.mo b/sphinx/locale/tr/LC_MESSAGES/sphinx.mo index 5054199c4..742eff993 100644 Binary files a/sphinx/locale/tr/LC_MESSAGES/sphinx.mo and b/sphinx/locale/tr/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.po b/sphinx/locale/tr/LC_MESSAGES/sphinx.po index e1e5c1730..9b99a4b6d 100644 --- a/sphinx/locale/tr/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.po @@ -8,405 +8,397 @@ msgstr "" "Project-Id-Version: Sphinx 0.6.2+/6b02a19ccf31\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2009-08-06 22:48+0200\n" -"PO-Revision-Date: 2010-05-28 10:18+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Firat Ozgul <ozgulfirat@gmail.com>\n" "Language-Team: Turkish <kistihza@yahoo.com>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 -#: sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%d %B %Y" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python'u İyileştirme Önerileri!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python'u İyileştirme Önerileri; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Gömülüler" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Modül düzeyi" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%d %b %Y" -#: sphinx/builders/html.py:285 -#: sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Genel Dizin" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "dizin" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "sonraki" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "önceki" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (şunun içinde: " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Dizin" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Bölümü yazan: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Modülü yazan: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 msgid "Code author: " msgstr "Kodu yazan: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Yazan: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Ayrıca bkz." -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "%s %s" -#: sphinx/domains/c.py:51 -#: sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Parametreler" -#: sphinx/domains/c.py:54 -#: sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Şunu döndürür:" -#: sphinx/domains/c.py:56 -#: sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Dönüş tipi" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C fonksiyonu)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C öğesi)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C makrosu)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C tipi)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C değişkeni)" -#: sphinx/domains/c.py:171 -#: sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 -#: sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "fonksiyonu" -#: sphinx/domains/c.py:172 -#: sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "öğesi" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "makrosu" -#: sphinx/domains/c.py:174 -#: sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "tipi" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 msgid "variable" msgstr "değişkeni" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ sınıfı)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ tipi)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ öğesi)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ fonksiyonu)" -#: sphinx/domains/cpp.py:1030 -#: sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "sınıfı" -#: sphinx/domains/javascript.py:117 -#: sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (gömülü fonksiyon)" -#: sphinx/domains/javascript.py:118 -#: sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s metodu)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (sınıfı)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "%s (global değişken veya sabit)" -#: sphinx/domains/javascript.py:122 -#: sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s niteliği)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 msgid "Arguments" msgstr "Argümanlar" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "Şunu verir: " -#: sphinx/domains/javascript.py:167 -#: sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "verisi" -#: sphinx/domains/javascript.py:168 -#: sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "niteliği" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 msgid "Variables" msgstr "Değişkenler" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Şunu üretir:" -#: sphinx/domains/python.py:222 -#: sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 -#: sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (%s modülü içinde)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (gömülü değişken)" -#: sphinx/domains/python.py:226 -#: sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (%s modülü içinde)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (gömülü sınıf)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (%s içinde bir sınıf)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s metodu)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s statik metodu)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s statik metodu)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s sınıf metodu)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, python-format msgid "%s() (%s class method)" msgstr "%s() (%s sınıf metodu)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s niteliği)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Platformlar:" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (modül)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 msgid "Python Module Index" msgstr "Python Modül Dizini" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "modüller" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Önerilmiyor" -#: sphinx/domains/python.py:500 -#: sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "istisnası" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "metodu" -#: sphinx/domains/python.py:502 -#, python-format +#: sphinx/domains/python.py:563 msgid "class method" msgstr "sınıf metodu" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "statik metodu" -#: sphinx/domains/python.py:505 -#: sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "modülü" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (önerilmiyor)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "%s (yönerge)" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, python-format msgid "%s (role)" msgstr "%s (rol)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "yönergesi" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 msgid "role" msgstr "rolü" -#: sphinx/domains/std.py:68 -#: sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "çevre değişkeni; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%skomut satırı seçeneği; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "sözlük terimi" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "dilbilgisi girdisi" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "referans etiketi" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "çevre değişkeni" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "program seçeneği" -#: sphinx/domains/std.py:360 -#: sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 -#: sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 -#: sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Dizin" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Modül Dizini" -#: sphinx/domains/std.py:362 -#: sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Arama Sayfası" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Taban: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "şunun takma adı: :class:`%s`" @@ -424,131 +416,125 @@ msgstr "(<<özgün girdi>> %s içinde ve %d satırında bulunuyor.)" msgid "original entry" msgstr "özgün girdi" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "[kaynak]" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "[belgeler]" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 msgid "Module code" msgstr "Modül kodu" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "<h1>%s öğesinin kaynak kodu</h1>" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "Genel bakış: modül kodu" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "<h1>Kodları mevcut bütün modüller</h1>" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Dikkat" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Uyarı" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Tehlike" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Hata" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "İpucu" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Önemli" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Not" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Ayrıca bkz." -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Tüyo" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Uyarı" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "%s sürümüyle geldi" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "%s sürümünde değişti" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "%s sürümünden beri önerilmiyor" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "anahtar kelime" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "işleç" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "nesne" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "deyim" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "gömülü fonksiyon" -#: sphinx/themes/agogo/layout.html:45 -#: sphinx/themes/basic/globaltoc.html:10 +#: sphinx/themes/agogo/layout.html:45 sphinx/themes/basic/globaltoc.html:10 #: sphinx/themes/basic/localtoc.html:11 msgid "Table Of Contents" msgstr "İçindekiler Tablosu" -#: sphinx/themes/agogo/layout.html:49 -#: sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 -#: sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Ara" -#: sphinx/themes/agogo/layout.html:52 -#: sphinx/themes/basic/searchbox.html:15 +#: sphinx/themes/agogo/layout.html:52 sphinx/themes/basic/searchbox.html:15 msgid "Go" msgstr "Git" -#: sphinx/themes/agogo/layout.html:57 -#: sphinx/themes/basic/searchbox.html:20 +#: sphinx/themes/agogo/layout.html:57 sphinx/themes/basic/searchbox.html:20 msgid "Enter search terms or a module, class or function name." msgstr "Aranacak terimleri veya modül, sınıf ya da fonksiyon adını yazınız" -#: sphinx/themes/agogo/layout.html:78 -#: sphinx/themes/basic/sourcelink.html:14 +#: sphinx/themes/agogo/layout.html:78 sphinx/themes/basic/sourcelink.html:14 msgid "Show Source" msgstr "Kaynağı Göster" @@ -584,15 +570,15 @@ msgstr "bütün modüllere hızlı erişim" msgid "all functions, classes, terms" msgstr "bütün fonksiyonlar, sınıflar, terimler" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Dizin – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Bütün dizin tek sayfada" @@ -604,42 +590,46 @@ msgstr "Harfe göre dizin sayfaları" msgid "can be huge" msgstr "çok büyük olabilir" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Gezinti" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "%(docstitle)s içinde ara" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Bu belgeler hakkında" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Copyright" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Son güncelleme: %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format -msgid "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s." -msgstr "<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s ile oluşturulmuştur." +msgid "" +"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " +"%(sphinx_version)s." +msgstr "" +"<a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s ile " +"oluşturulmuştur." #: sphinx/themes/basic/opensearch.xml:4 #, python-format @@ -662,7 +652,7 @@ msgstr "Sonraki konu" msgid "next chapter" msgstr "sonraki bölüm" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -670,7 +660,7 @@ msgstr "" "Arama işlevini kullanabilmek için lütfen JavaScript'i\n" " etkinleştirin." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -682,16 +672,15 @@ msgstr "" "otomatik olarak bütün kelimeleri arayacaktır. Eksik kelime içeren \n" "sayfalar sonuç listesinde görünmez." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "ara" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Arama Sonuçları" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Arama sonucunda herhangi bir belge bulunamadı." @@ -731,14 +720,12 @@ msgstr "C API'sindeki değişiklikler" msgid "Other changes" msgstr "Diğer değişiklikler" -#: sphinx/themes/basic/static/doctools.js:154 -#: sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Bu başlığın kalıcı bağlantısı" -#: sphinx/themes/basic/static/doctools.js:160 -#: sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Bu tanımın kalıcı bağlantısı" @@ -746,33 +733,12 @@ msgstr "Bu tanımın kalıcı bağlantısı" msgid "Hide Search Matches" msgstr "Arama Sonuçlarını Gizle" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Arıyor" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Aramaya hazırlanıyor..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", şunun içinde: " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." -msgstr "Arama sonucunda hiçbir belge bulunamadı. Bütün kelimeleri doğru yazdığınızdan ve gereken kategorileri seçtiğinizden emin olun." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Arama sonuçlandı, aramayla eşleşen %s sayfa bulundu." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "Yan çubuğu genişlet" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "Yan çubuğu daralt" @@ -780,24 +746,48 @@ msgstr "Yan çubuğu daralt" msgid "Contents" msgstr "İçindekiler" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Sürüm" -#: sphinx/writers/latex.py:572 -#: sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "Dipnotları" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "önceki sayfadan devam" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "Devamı sonraki sayfada" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[resim]" +#~ msgid "Platforms: " +#~ msgstr "Platformlar:" + +#~ msgid "Searching" +#~ msgstr "Arıyor" + +#~ msgid "Preparing search..." +#~ msgstr "Aramaya hazırlanıyor..." + +#~ msgid ", in " +#~ msgstr ", şunun içinde: " + +#~ msgid "" +#~ "Your search did not match any " +#~ "documents. Please make sure that all " +#~ "words are spelled correctly and that " +#~ "you've selected enough categories." +#~ msgstr "" +#~ "Arama sonucunda hiçbir belge bulunamadı. " +#~ "Bütün kelimeleri doğru yazdığınızdan ve " +#~ "gereken kategorileri seçtiğinizden emin olun." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Arama sonuçlandı, aramayla eşleşen %s sayfa bulundu." + diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js index 7af42ca8d..1c7babb77 100644 --- a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "uk_UA", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a\u0443", "Preparing search...": "\u041f\u0456\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u043e \u043f\u043e\u0448\u0443\u043a\u0443...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u0412\u0430\u0448 \u043f\u043e\u0448\u0443\u043a \u043d\u0435 \u0432\u0438\u044f\u0432\u0438\u0432 \u0436\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0456\u0432\u043f\u0430\u0434\u0456\u043d\u043d\u044f. \u0411\u0443\u0434\u044c-\u043b\u0430\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f \u0449\u043e \u0432\u0441\u0456 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u0431\u0440\u0430\u043d\u0456 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0456 \u0432\u0438 \u043e\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043d\u044c\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0456\u0439.", "Search finished, found %s page(s) matching the search query.": "\u041f\u043e\u0448\u0443\u043a \u0437\u0430\u043a\u0456\u043d\u0447\u0435\u043d\u043e, \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e %s \u0441\u0442\u043e\u0440\u0456\u043d\u043e\u043a \u044f\u043a\u0456 \u0441\u043f\u0456\u0432\u043f\u0430\u043b\u0438 \u0437 \u043f\u043e\u0448\u0443\u043a\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0438\u0442\u043e\u043c.", ", in ": ", \u0432 ", "Expand sidebar": "", "Permalink to this headline": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Searching": "\u0428\u0443\u043a\u0430\u044e", "Collapse sidebar": "", "Permalink to this definition": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435 \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f", "Hide Search Matches": "\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u0442\u0438 \u0441\u043f\u0456\u0432\u043f\u0430\u0434\u0456\u043d\u043d\u044f \u043f\u043e\u0448\u0443\u043a\u0443"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "uk_UA", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"Hide Search Matches": "\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u0442\u0438 \u0441\u043f\u0456\u0432\u043f\u0430\u0434\u0456\u043d\u043d\u044f \u043f\u043e\u0448\u0443\u043a\u0443", "Permalink to this definition": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435 \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f", "Expand sidebar": "", "Permalink to this headline": "\u041f\u043e\u0441\u0442\u0456\u0439\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0446\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo index cfa0b8e0e..92c00ca15 100644 Binary files a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo and b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po index a85eaebe4..7667314f6 100644 --- a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Sphinx 0.6\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-12-28 23:40+0100\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Petro Sasnyk <petro@sasnyk.name>\n" "Language-Team: uk_UA <LL@li.org>\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " @@ -16,380 +16,395 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, fuzzy, python-format +msgid "see also %s" +msgstr "дивись також %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python Enhancement Proposals; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "Вбудовані елементи" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "Рівень модуля" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%b %d, %Y" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "Загальний індекс" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "індекс" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "наступний" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "попередній" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr " (в " -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "Індекс" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Автор секції: " -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "Автор модуля: " -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "Автор модуля: " -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "Автор: " -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "Дивись також" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "Параметри" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "Повертає" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "Тип повернення" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (С функція)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C член)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C макрос)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C тип)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C змінна)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "функція" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "член" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "макрос" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "тип" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "Змінна" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, python-format msgid "%s (C++ class)" msgstr "%s (C++ клас)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ тип)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ член)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ функція)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "клас" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (вбудована функція)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s метод)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, python-format +msgid "%s() (class)" +msgstr "%s() (клас)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s атрибут)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "Параметри" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 -#, python-format +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "атрибут" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "Змінна" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "Викликає" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (в модулі %s)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (вбудована змінна)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s (в модулі %s)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (вбудований клас)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "%s (клас в %s)" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s метод)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s статичний метод)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s статичний метод)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s метод)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s метод)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s атрибут)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "Платформи: " - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (модуль)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "Індекс модулів" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "модулі" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "Застарілий" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "виняткова ситуація" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s метод)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "статичний метод" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "модуль" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +msgid " (deprecated)" +msgstr " (застарілий)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (модуль)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "модуль" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "змінна оточення; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%sопція командного рядка; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "змінна оточення" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "Індекс" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "Індекс модулів" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "Сторінка пошуку" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr " Базовий: %s" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "синонім :class:`%s`" @@ -401,110 +416,110 @@ msgstr "Доробити" #: sphinx/ext/todo.py:109 #, fuzzy, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(Початкове входження знаходиться в %s, рядок %d і може бути знайдений " +msgstr "(Початкове входження знаходиться в %s, рядок %d.)" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "модуль" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "Увага" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "Застереження" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "Небезпека" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "Помилка" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "Підказка" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "Важливо" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "Примітка" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "Дивись також" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "Порада" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "Попередження" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "Нове в версії %s" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "Змінено в версії %s" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "Застаріло починаючи з версії %s" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "ключове слово" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "оператор" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "об'єкт" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "вираз" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "вбудована функція" @@ -513,8 +528,8 @@ msgstr "вбудована функція" msgid "Table Of Contents" msgstr "Зміст" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "Пошук" @@ -562,15 +577,15 @@ msgstr "швидкий доступ до всіх модулів" msgid "all functions, classes, terms" msgstr "всі функції, класи, терміни" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "Індекс – %(key)" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "Повний індекс на одній сторінці" @@ -582,39 +597,39 @@ msgstr "Індексні сторінки по символам" msgid "can be huge" msgstr "може бути величезним" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "Навігація" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "Шукати в %(docstitle)s" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "Про ці документи" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "Авторські права" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© Copyright %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "Востаннє оновлено %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -644,7 +659,7 @@ msgstr "Наступна тема" msgid "next chapter" msgstr "наступний розділ" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." @@ -653,7 +668,7 @@ msgstr "" "\"\n" "\" пошук." -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -665,16 +680,15 @@ msgstr "" " пошуку автоматично шукатиме за всіма словами. Сторінки\n" " що містять менше слів не з'являться в результуючому списку." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "пошук" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "Результати пошуку" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "Ваш пошук не виявив жодних співпадінь." @@ -714,12 +728,12 @@ msgstr "зміни C API" msgid "Other changes" msgstr "Інші зміни" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "Постійне посилання на цей заголовок" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "Постійне посилання на це визначення" @@ -727,37 +741,12 @@ msgstr "Постійне посилання на це визначення" msgid "Hide Search Matches" msgstr "Приховати співпадіння пошуку" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "Шукаю" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "Підготовка до пошуку..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", в " - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" -"Ваш пошук не виявив жодного співпадіння. Будь-ласка переконайтеся що всі " -"слова набрані правильно і ви обрали достатньо категорій." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "Пошук закінчено, знайдено %s сторінок які співпали з пошуковим запитом." - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -765,23 +754,50 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "Реліз" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "Повний індекс на одній сторінці" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "" + +#~ msgid "Platforms: " +#~ msgstr "Платформи: " + +#~ msgid "Searching" +#~ msgstr "Шукаю" + +#~ msgid "Preparing search..." +#~ msgstr "Підготовка до пошуку..." + +#~ msgid ", in " +#~ msgstr ", в " + +#~ 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 "" +#~ "Ваш пошук не виявив жодного співпадіння." +#~ " Будь-ласка переконайтеся що всі слова " +#~ "набрані правильно і ви обрали достатньо" +#~ " категорій." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "Пошук закінчено, знайдено %s сторінок які співпали з пошуковим запитом." + diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js index bf0de29db..a59a8b244 100644 --- a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "zh_CN", "plural_expr": "0", "messages": {"Search Results": "\u641c\u7d22\u7ed3\u679c", "Preparing search...": "\u51c6\u5907\u641c\u7d22...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u4f60\u7684\u641c\u7d22\u6ca1\u6709\u5339\u914d\u5230\u4efb\u4f55\u6587\u6863\u3002\u8bf7\u786e\u8ba4\u4f60\u6240\u641c\u7d22\u7684\u5173\u952e\u5b57.", "Search finished, found %s page(s) matching the search query.": "\u641c\u7d22\u5b8c\u6210\uff0c \u627e\u5230\u4e86 %s \u9875\u5339\u914d\u6240\u641c\u7d22\u7684\u5173\u952e\u5b57", ", in ": ", \u4f4d\u4e8e", "Expand sidebar": "", "Permalink to this headline": "\u6c38\u4e45\u94fe\u63a5\u81f3\u6807\u9898", "Searching": "\u641c\u7d22\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "\u6c38\u4e45\u94fe\u63a5\u81f3\u76ee\u6807", "Hide Search Matches": "\u9690\u85cf\u641c\u7d22\u7ed3\u679c"}}); \ No newline at end of file +Documentation.addTranslations({"locale": "zh_CN", "plural_expr": "0", "messages": {"Hide Search Matches": "\u9690\u85cf\u641c\u7d22\u7ed3\u679c", "Permalink to this definition": "\u6c38\u4e45\u94fe\u63a5\u81f3\u76ee\u6807", "Expand sidebar": "", "Permalink to this headline": "\u6c38\u4e45\u94fe\u63a5\u81f3\u6807\u9898", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo index b62c4c5b9..efcfb651f 100644 Binary files a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo and b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po index c17620439..323aa0693 100644 --- a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po @@ -9,386 +9,403 @@ msgstr "" "Project-Id-Version: Sphinx 0.6\n" "Report-Msgid-Bugs-To: zhutao.iscas@gmail.com\n" "POT-Creation-Date: 2009-03-09 19:46+0120\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Tower Joo<zhutao.iscas@gmail.com>\n" "Language-Team: cn <LL@li.org>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" -msgstr "Python 建议文件!PEP %s" +msgid "see %s" +msgstr "" -#: sphinx/builders/changes.py:72 +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "也可以参考 %s" + +#: sphinx/roles.py:175 +#, python-format +msgid "Python Enhancement Proposals; PEP %s" +msgstr "Python 建议文件; PEP %s" + +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "内置" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "模块级别" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "总目录" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "索引" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "下一页" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "上一页" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "索引" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Section 作者:" -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "模块作者:" -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "模块作者:" -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "作者:" -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "也可以参考" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "参数" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "返回" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "返回类型" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C 函数)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C 成员)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C 宏)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C 类型)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C 变量)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "函数" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "成员" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "变量" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, fuzzy, python-format msgid "%s (C++ class)" -msgstr "%s (內置类)" +msgstr "%s (C++ 內置类)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ 类型)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ 成员)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ 函数)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (內置函数)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s 方法)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, fuzzy, python-format +msgid "%s() (class)" +msgstr "%s() (內置类)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s 属性)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "参数" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "属性" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "变量" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "引发" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (在 %s 模块中)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (內置变量)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s() (在 %s 模块中)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (內置类)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s 方法)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s 静态方法)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s 静态方法)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s 方法)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s 方法)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s 属性)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "平台" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (模块)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "模块索引" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "模块" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "已移除" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "例外" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 msgid "class method" -msgstr "%s() (%s 方法)" +msgstr "" -#: sphinx/domains/python.py:503 +#: sphinx/domains/python.py:564 msgid "static method" msgstr "静态方法" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "模块" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr " (已移除)" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 -#, fuzzy, python-format +#: sphinx/domains/rst.py:57 +#, python-format msgid "%s (role)" -msgstr "%s (模块)" +msgstr "" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 -#, fuzzy +#: sphinx/domains/rst.py:107 msgid "role" -msgstr "模块" +msgstr "" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "环境变量; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%s命令行选项; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "环境变量" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "索引" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "模块索引" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "搜索页面" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -398,112 +415,112 @@ msgid "Todo" msgstr "待处理" #: sphinx/ext/todo.py:109 -#, fuzzy, python-format +#, python-format msgid "(The <<original entry>> is located in %s, line %d.)" -msgstr "(最初的入口位于%s 的第%d行" +msgstr "" #: sphinx/ext/todo.py:117 msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "模块" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "注意" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "警告" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "危险" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "错误" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "提示" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "重要" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "注解" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "也可以参考" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "小技巧" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "警告" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "%s 新版功能" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "在 %s 版更改" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "%s 版后已移除" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "关键字" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "操作数" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "对象" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "语句" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "內置函数" @@ -512,8 +529,8 @@ msgstr "內置函数" msgid "Table Of Contents" msgstr "內容目录" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "搜索" @@ -561,15 +578,15 @@ msgstr "快速查看所有的模块" msgid "all functions, classes, terms" msgstr "所的函数,类,术语" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "索引 – %(key)s" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "一页的全部索引" @@ -581,39 +598,39 @@ msgstr "按照字母的索引页" msgid "can be huge" msgstr "可能会很多" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "导航" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "在 %(docstitle)s 中搜索" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "关于这些文档" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "版权所有" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "© <a href=\"%(path)s\">版权所有</a> % (copyright)s." -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "© 版权所有 %(copyright)s." -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "最后更新日期是 %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -641,13 +658,13 @@ msgstr "下一个主题" msgid "next chapter" msgstr "下一章" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -655,16 +672,15 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "在这儿,你可以对这些文档进行搜索。向搜索框中输入你所要搜索的关键字并点击\"搜索\"。注意:搜索引擎会自动搜索所有的关键字。将不会搜索到部分关键字的页面." -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "搜索" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "搜索结果" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "你的搜索没有找到任何的结果." @@ -704,12 +720,12 @@ msgstr "C API 更改" msgid "Other changes" msgstr "其他更改" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "永久链接至标题" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "永久链接至目标" @@ -717,35 +733,12 @@ msgstr "永久链接至目标" msgid "Hide Search Matches" msgstr "隐藏搜索结果" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "搜索中" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "准备搜索..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr ", 位于" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "你的搜索没有匹配到任何文档。请确认你所搜索的关键字." - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "搜索完成, 找到了 %s 页匹配所搜索的关键字" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -753,23 +746,46 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "发布" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 #, fuzzy msgid "Continued on next page" msgstr "一页的全部索引" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[图片]" + +#~ msgid "Platforms: " +#~ msgstr "平台" + +#~ msgid "Searching" +#~ msgstr "搜索中" + +#~ msgid "Preparing search..." +#~ msgstr "准备搜索..." + +#~ msgid ", in " +#~ msgstr ", 位于" + +#~ 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 "你的搜索没有匹配到任何文档。请确认你所搜索的关键字." + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "搜索完成, 找到了 %s 页匹配所搜索的关键字" + diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js index ac64cd0bf..9bfcec76c 100644 --- a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js @@ -1 +1 @@ -Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"Search Results": "\u641c\u5c0b\u7d50\u679c", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Expand sidebar": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Collapse sidebar": "", "Permalink to this definition": "", "Hide Search Matches": ""}}); \ No newline at end of file +Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"Hide Search Matches": "", "Permalink to this definition": "", "Expand sidebar": "", "Permalink to this headline": "", "Collapse sidebar": ""}}); \ No newline at end of file diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo index 008ecec05..13c61e9a9 100644 Binary files a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo and b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo differ diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po index 33dff8cae..d75b45476 100644 --- a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po @@ -8,389 +8,405 @@ msgstr "" "Project-Id-Version: Sphinx 0.5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-11-09 19:46+0100\n" -"PO-Revision-Date: 2010-05-24 23:54+0200\n" +"PO-Revision-Date: 2011-01-22 14:41+0100\n" "Last-Translator: Fred Lin <gasolin@gmail.com>\n" "Language-Team: tw <LL@li.org>\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" +"Generated-By: Babel 0.9.5\n" -#: sphinx/environment.py:106 sphinx/writers/latex.py:184 +#: sphinx/environment.py:120 sphinx/writers/latex.py:189 #: sphinx/writers/manpage.py:67 #, python-format msgid "%B %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/roles.py:174 +#: sphinx/environment.py:1624 #, python-format -msgid "Python Enhancement Proposals!PEP %s" +msgid "see %s" +msgstr "" + +#: sphinx/environment.py:1627 +#, python-format +msgid "see also %s" +msgstr "" + +#: sphinx/roles.py:175 +#, fuzzy, python-format +msgid "Python Enhancement Proposals; PEP %s" msgstr "Python 建議文件!PEP %s" -#: sphinx/builders/changes.py:72 +#: sphinx/builders/changes.py:73 msgid "Builtins" msgstr "" -#: sphinx/builders/changes.py:74 +#: sphinx/builders/changes.py:75 msgid "Module level" msgstr "" -#: sphinx/builders/html.py:266 +#: sphinx/builders/html.py:274 #, python-format msgid "%b %d, %Y" msgstr "%Y 年 %m 月 %d 日" -#: sphinx/builders/html.py:285 sphinx/themes/basic/defindex.html:30 +#: sphinx/builders/html.py:293 sphinx/themes/basic/defindex.html:30 msgid "General Index" msgstr "總索引" -#: sphinx/builders/html.py:285 +#: sphinx/builders/html.py:293 msgid "index" msgstr "索引" -#: sphinx/builders/html.py:345 +#: sphinx/builders/html.py:353 msgid "next" msgstr "下一頁" -#: sphinx/builders/html.py:354 +#: sphinx/builders/html.py:362 msgid "previous" msgstr "上一頁" -#: sphinx/builders/latex.py:151 +#: sphinx/builders/latex.py:141 sphinx/builders/texinfo.py:208 msgid " (in " msgstr "" -#: sphinx/directives/other.py:127 +#: sphinx/builders/texinfo.py:151 sphinx/builders/texinfo.py:152 +#: sphinx/builders/texinfo.py:153 sphinx/domains/std.py:427 +#: sphinx/themes/basic/genindex-single.html:32 +#: sphinx/themes/basic/genindex-split.html:11 +#: sphinx/themes/basic/genindex-split.html:14 +#: sphinx/themes/basic/genindex.html:32 sphinx/themes/basic/genindex.html:35 +#: sphinx/themes/basic/genindex.html:68 sphinx/themes/basic/layout.html:134 +#: sphinx/writers/latex.py:178 +msgid "Index" +msgstr "索引" + +#: sphinx/directives/other.py:136 msgid "Section author: " msgstr "Section 作者:" -#: sphinx/directives/other.py:129 +#: sphinx/directives/other.py:138 msgid "Module author: " msgstr "模組作者:" -#: sphinx/directives/other.py:131 +#: sphinx/directives/other.py:140 #, fuzzy msgid "Code author: " msgstr "模組作者:" -#: sphinx/directives/other.py:133 +#: sphinx/directives/other.py:142 msgid "Author: " msgstr "作者:" -#: sphinx/directives/other.py:238 +#: sphinx/directives/other.py:215 msgid "See also" msgstr "" -#: sphinx/domains/__init__.py:253 +#: sphinx/domains/__init__.py:244 #, python-format msgid "%s %s" msgstr "" -#: sphinx/domains/c.py:51 sphinx/domains/python.py:49 +#: sphinx/domains/c.py:51 sphinx/domains/python.py:95 msgid "Parameters" msgstr "參數" -#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:137 -#: sphinx/domains/python.py:59 +#: sphinx/domains/c.py:54 sphinx/domains/javascript.py:128 +#: sphinx/domains/python.py:107 msgid "Returns" msgstr "返回" -#: sphinx/domains/c.py:56 sphinx/domains/python.py:61 +#: sphinx/domains/c.py:56 sphinx/domains/python.py:109 msgid "Return type" msgstr "返回類別" -#: sphinx/domains/c.py:133 +#: sphinx/domains/c.py:141 #, python-format msgid "%s (C function)" msgstr "%s (C 函式)" -#: sphinx/domains/c.py:135 +#: sphinx/domains/c.py:143 #, python-format msgid "%s (C member)" msgstr "%s (C 成員)" -#: sphinx/domains/c.py:137 +#: sphinx/domains/c.py:145 #, python-format msgid "%s (C macro)" msgstr "%s (C 巨集)" -#: sphinx/domains/c.py:139 +#: sphinx/domains/c.py:147 #, python-format msgid "%s (C type)" msgstr "%s (C 類別)" -#: sphinx/domains/c.py:141 +#: sphinx/domains/c.py:149 #, python-format msgid "%s (C variable)" msgstr "%s (C 變數)" -#: sphinx/domains/c.py:171 sphinx/domains/cpp.py:1031 -#: sphinx/domains/javascript.py:166 sphinx/domains/python.py:497 -#, python-format +#: sphinx/domains/c.py:204 sphinx/domains/cpp.py:1053 +#: sphinx/domains/javascript.py:162 sphinx/domains/python.py:558 msgid "function" msgstr "函式" -#: sphinx/domains/c.py:172 sphinx/domains/cpp.py:1032 +#: sphinx/domains/c.py:205 sphinx/domains/cpp.py:1054 msgid "member" msgstr "成員" -#: sphinx/domains/c.py:173 +#: sphinx/domains/c.py:206 msgid "macro" msgstr "巨集" -#: sphinx/domains/c.py:174 sphinx/domains/cpp.py:1033 +#: sphinx/domains/c.py:207 sphinx/domains/cpp.py:1055 msgid "type" msgstr "類別" -#: sphinx/domains/c.py:175 +#: sphinx/domains/c.py:208 #, fuzzy msgid "variable" msgstr "變數" -#: sphinx/domains/cpp.py:876 +#: sphinx/domains/cpp.py:897 #, fuzzy, python-format msgid "%s (C++ class)" msgstr "%s (內建類別)" -#: sphinx/domains/cpp.py:891 +#: sphinx/domains/cpp.py:912 #, python-format msgid "%s (C++ type)" msgstr "%s (C++ 類別)" -#: sphinx/domains/cpp.py:910 +#: sphinx/domains/cpp.py:931 #, python-format msgid "%s (C++ member)" msgstr "%s (C++ 成員)" -#: sphinx/domains/cpp.py:962 +#: sphinx/domains/cpp.py:983 #, python-format msgid "%s (C++ function)" msgstr "%s (C++ 函式)" -#: sphinx/domains/cpp.py:1030 sphinx/domains/python.py:499 +#: sphinx/domains/cpp.py:1052 sphinx/domains/javascript.py:163 +#: sphinx/domains/python.py:560 msgid "class" msgstr "" -#: sphinx/domains/javascript.py:117 sphinx/domains/python.py:221 +#: sphinx/domains/javascript.py:106 sphinx/domains/python.py:254 #, python-format msgid "%s() (built-in function)" msgstr "%s() (內建函式)" -#: sphinx/domains/javascript.py:118 sphinx/domains/python.py:285 +#: sphinx/domains/javascript.py:107 sphinx/domains/python.py:318 #, python-format msgid "%s() (%s method)" msgstr "%s() (%s 方法)" -#: sphinx/domains/javascript.py:120 +#: sphinx/domains/javascript.py:109 +#, fuzzy, python-format +msgid "%s() (class)" +msgstr "%s (內建類別)" + +#: sphinx/domains/javascript.py:111 #, python-format msgid "%s (global variable or constant)" msgstr "" -#: sphinx/domains/javascript.py:122 sphinx/domains/python.py:323 +#: sphinx/domains/javascript.py:113 sphinx/domains/python.py:356 #, python-format msgid "%s (%s attribute)" msgstr "%s (%s 屬性)" -#: sphinx/domains/javascript.py:131 +#: sphinx/domains/javascript.py:122 #, fuzzy msgid "Arguments" msgstr "參數" -#: sphinx/domains/javascript.py:134 +#: sphinx/domains/javascript.py:125 msgid "Throws" msgstr "" -#: sphinx/domains/javascript.py:167 sphinx/domains/python.py:498 +#: sphinx/domains/javascript.py:164 sphinx/domains/python.py:559 msgid "data" msgstr "" -#: sphinx/domains/javascript.py:168 sphinx/domains/python.py:504 -#, python-format +#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:565 msgid "attribute" msgstr "屬性" -#: sphinx/domains/python.py:53 +#: sphinx/domains/python.py:100 #, fuzzy msgid "Variables" msgstr "變數" -#: sphinx/domains/python.py:56 +#: sphinx/domains/python.py:104 msgid "Raises" msgstr "" -#: sphinx/domains/python.py:222 sphinx/domains/python.py:279 -#: sphinx/domains/python.py:291 sphinx/domains/python.py:304 +#: sphinx/domains/python.py:255 sphinx/domains/python.py:312 +#: sphinx/domains/python.py:324 sphinx/domains/python.py:337 #, python-format msgid "%s() (in module %s)" msgstr "%s() (在 %s 模組中)" -#: sphinx/domains/python.py:225 +#: sphinx/domains/python.py:258 #, python-format msgid "%s (built-in variable)" msgstr "%s (內建變數)" -#: sphinx/domains/python.py:226 sphinx/domains/python.py:317 +#: sphinx/domains/python.py:259 sphinx/domains/python.py:350 #, python-format msgid "%s (in module %s)" msgstr "%s() (在 %s 模組中)" -#: sphinx/domains/python.py:242 +#: sphinx/domains/python.py:275 #, python-format msgid "%s (built-in class)" msgstr "%s (內建類別)" -#: sphinx/domains/python.py:243 +#: sphinx/domains/python.py:276 #, python-format msgid "%s (class in %s)" msgstr "" -#: sphinx/domains/python.py:283 +#: sphinx/domains/python.py:316 #, python-format msgid "%s() (%s.%s method)" msgstr "%s() (%s.%s 方法)" -#: sphinx/domains/python.py:295 +#: sphinx/domains/python.py:328 #, python-format msgid "%s() (%s.%s static method)" msgstr "%s() (%s.%s 靜態方法)" -#: sphinx/domains/python.py:298 +#: sphinx/domains/python.py:331 #, python-format msgid "%s() (%s static method)" msgstr "%s() (%s 靜態方法)" -#: sphinx/domains/python.py:308 +#: sphinx/domains/python.py:341 #, fuzzy, python-format msgid "%s() (%s.%s class method)" msgstr "%s() (%s.%s 方法)" -#: sphinx/domains/python.py:311 +#: sphinx/domains/python.py:344 #, fuzzy, python-format msgid "%s() (%s class method)" msgstr "%s() (%s 方法)" -#: sphinx/domains/python.py:321 +#: sphinx/domains/python.py:354 #, python-format msgid "%s (%s.%s attribute)" msgstr "%s (%s.%s 屬性)" -#: sphinx/domains/python.py:366 -msgid "Platforms: " -msgstr "平台" - -#: sphinx/domains/python.py:372 +#: sphinx/domains/python.py:433 #, python-format msgid "%s (module)" msgstr "%s (模組)" -#: sphinx/domains/python.py:429 +#: sphinx/domains/python.py:490 #, fuzzy msgid "Python Module Index" msgstr "模組索引" -#: sphinx/domains/python.py:430 +#: sphinx/domains/python.py:491 msgid "modules" msgstr "模組" -#: sphinx/domains/python.py:475 +#: sphinx/domains/python.py:536 msgid "Deprecated" msgstr "已移除" -#: sphinx/domains/python.py:500 sphinx/locale/__init__.py:162 +#: sphinx/domains/python.py:561 sphinx/locale/__init__.py:179 msgid "exception" msgstr "例外" -#: sphinx/domains/python.py:501 +#: sphinx/domains/python.py:562 msgid "method" msgstr "" -#: sphinx/domains/python.py:502 -#, fuzzy, python-format +#: sphinx/domains/python.py:563 +#, fuzzy msgid "class method" msgstr "%s() (%s 方法)" -#: sphinx/domains/python.py:503 -#, python-format +#: sphinx/domains/python.py:564 msgid "static method" msgstr "靜態方法" -#: sphinx/domains/python.py:505 sphinx/locale/__init__.py:158 +#: sphinx/domains/python.py:566 sphinx/locale/__init__.py:175 msgid "module" msgstr "模組" -#: sphinx/domains/rst.py:53 +#: sphinx/domains/python.py:694 +#, fuzzy +msgid " (deprecated)" +msgstr "已移除" + +#: sphinx/domains/rst.py:55 #, python-format msgid "%s (directive)" msgstr "" -#: sphinx/domains/rst.py:55 +#: sphinx/domains/rst.py:57 #, fuzzy, python-format msgid "%s (role)" msgstr "%s (模組)" -#: sphinx/domains/rst.py:103 +#: sphinx/domains/rst.py:106 msgid "directive" msgstr "" -#: sphinx/domains/rst.py:104 +#: sphinx/domains/rst.py:107 #, fuzzy msgid "role" msgstr "模組" -#: sphinx/domains/std.py:68 sphinx/domains/std.py:84 +#: sphinx/domains/std.py:70 sphinx/domains/std.py:86 #, python-format msgid "environment variable; %s" msgstr "環境變數; %s" -#: sphinx/domains/std.py:160 +#: sphinx/domains/std.py:162 #, python-format msgid "%scommand line option; %s" msgstr "%s命令列選項; %s" -#: sphinx/domains/std.py:328 +#: sphinx/domains/std.py:393 msgid "glossary term" msgstr "" -#: sphinx/domains/std.py:329 +#: sphinx/domains/std.py:394 msgid "grammar token" msgstr "" -#: sphinx/domains/std.py:330 +#: sphinx/domains/std.py:395 msgid "reference label" msgstr "" -#: sphinx/domains/std.py:331 +#: sphinx/domains/std.py:396 msgid "environment variable" msgstr "環境變數" -#: sphinx/domains/std.py:332 +#: sphinx/domains/std.py:397 msgid "program option" msgstr "" -#: sphinx/domains/std.py:360 sphinx/themes/basic/genindex-single.html:11 -#: sphinx/themes/basic/genindex-split.html:11 -#: sphinx/themes/basic/genindex-split.html:14 -#: sphinx/themes/basic/genindex.html:11 sphinx/themes/basic/genindex.html:14 -#: sphinx/themes/basic/genindex.html:50 sphinx/themes/basic/layout.html:125 -#: sphinx/writers/latex.py:173 -msgid "Index" -msgstr "索引" - -#: sphinx/domains/std.py:361 +#: sphinx/domains/std.py:428 msgid "Module Index" msgstr "模組索引" -#: sphinx/domains/std.py:362 sphinx/themes/basic/defindex.html:25 +#: sphinx/domains/std.py:429 sphinx/themes/basic/defindex.html:25 msgid "Search Page" msgstr "搜尋頁面" -#: sphinx/ext/autodoc.py:917 +#: sphinx/ext/autodoc.py:998 #, python-format msgid " Bases: %s" msgstr "" -#: sphinx/ext/autodoc.py:950 +#: sphinx/ext/autodoc.py:1034 #, python-format msgid "alias of :class:`%s`" msgstr "" @@ -408,104 +424,104 @@ msgstr "" msgid "original entry" msgstr "" -#: sphinx/ext/viewcode.py:66 +#: sphinx/ext/viewcode.py:70 msgid "[source]" msgstr "" -#: sphinx/ext/viewcode.py:109 +#: sphinx/ext/viewcode.py:117 msgid "[docs]" msgstr "" -#: sphinx/ext/viewcode.py:123 +#: sphinx/ext/viewcode.py:131 #, fuzzy msgid "Module code" msgstr "模組" -#: sphinx/ext/viewcode.py:129 +#: sphinx/ext/viewcode.py:137 #, python-format msgid "<h1>Source code for %s</h1>" msgstr "" -#: sphinx/ext/viewcode.py:156 +#: sphinx/ext/viewcode.py:164 msgid "Overview: module code" msgstr "" -#: sphinx/ext/viewcode.py:157 +#: sphinx/ext/viewcode.py:165 msgid "<h1>All modules for which code is available</h1>" msgstr "" -#: sphinx/locale/__init__.py:139 +#: sphinx/locale/__init__.py:155 msgid "Attention" msgstr "注意" -#: sphinx/locale/__init__.py:140 +#: sphinx/locale/__init__.py:156 msgid "Caution" msgstr "警示" -#: sphinx/locale/__init__.py:141 +#: sphinx/locale/__init__.py:157 msgid "Danger" msgstr "危險" -#: sphinx/locale/__init__.py:142 +#: sphinx/locale/__init__.py:158 msgid "Error" msgstr "錯誤" -#: sphinx/locale/__init__.py:143 +#: sphinx/locale/__init__.py:159 msgid "Hint" msgstr "提示" -#: sphinx/locale/__init__.py:144 +#: sphinx/locale/__init__.py:160 msgid "Important" msgstr "重要" -#: sphinx/locale/__init__.py:145 +#: sphinx/locale/__init__.py:161 msgid "Note" msgstr "註解" -#: sphinx/locale/__init__.py:146 +#: sphinx/locale/__init__.py:162 msgid "See Also" msgstr "" -#: sphinx/locale/__init__.py:147 +#: sphinx/locale/__init__.py:163 msgid "Tip" msgstr "小技巧" -#: sphinx/locale/__init__.py:148 +#: sphinx/locale/__init__.py:164 msgid "Warning" msgstr "警告" -#: sphinx/locale/__init__.py:152 +#: sphinx/locale/__init__.py:168 #, python-format msgid "New in version %s" msgstr "%s 版新功能" -#: sphinx/locale/__init__.py:153 +#: sphinx/locale/__init__.py:169 #, python-format msgid "Changed in version %s" msgstr "在 %s 版改變" -#: sphinx/locale/__init__.py:154 +#: sphinx/locale/__init__.py:170 #, python-format msgid "Deprecated since version %s" msgstr "%s 版後已移除" -#: sphinx/locale/__init__.py:159 +#: sphinx/locale/__init__.py:176 msgid "keyword" msgstr "關鍵字" -#: sphinx/locale/__init__.py:160 +#: sphinx/locale/__init__.py:177 msgid "operator" msgstr "運算子" -#: sphinx/locale/__init__.py:161 +#: sphinx/locale/__init__.py:178 msgid "object" msgstr "物件" -#: sphinx/locale/__init__.py:163 +#: sphinx/locale/__init__.py:180 msgid "statement" msgstr "" -#: sphinx/locale/__init__.py:164 +#: sphinx/locale/__init__.py:181 msgid "built-in function" msgstr "內建函式" @@ -514,8 +530,8 @@ msgstr "內建函式" msgid "Table Of Contents" msgstr "內容目錄" -#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:128 -#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:14 +#: sphinx/themes/agogo/layout.html:49 sphinx/themes/basic/layout.html:137 +#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:20 msgid "Search" msgstr "搜尋" @@ -564,15 +580,15 @@ msgstr "" msgid "all functions, classes, terms" msgstr "" -#: sphinx/themes/basic/genindex-single.html:14 +#: sphinx/themes/basic/genindex-single.html:35 #, python-format msgid "Index – %(key)s" msgstr "" -#: sphinx/themes/basic/genindex-single.html:46 +#: sphinx/themes/basic/genindex-single.html:63 #: sphinx/themes/basic/genindex-split.html:24 #: sphinx/themes/basic/genindex-split.html:38 -#: sphinx/themes/basic/genindex.html:56 +#: sphinx/themes/basic/genindex.html:74 msgid "Full index on one page" msgstr "" @@ -584,39 +600,39 @@ msgstr "" msgid "can be huge" msgstr "" -#: sphinx/themes/basic/layout.html:23 +#: sphinx/themes/basic/layout.html:29 msgid "Navigation" msgstr "瀏覽" -#: sphinx/themes/basic/layout.html:113 +#: sphinx/themes/basic/layout.html:122 #, python-format msgid "Search within %(docstitle)s" msgstr "在 %(docstitle)s 中搜尋" -#: sphinx/themes/basic/layout.html:122 +#: sphinx/themes/basic/layout.html:131 msgid "About these documents" msgstr "" -#: sphinx/themes/basic/layout.html:131 +#: sphinx/themes/basic/layout.html:140 msgid "Copyright" msgstr "版權所有" -#: sphinx/themes/basic/layout.html:180 +#: sphinx/themes/basic/layout.html:189 #, python-format msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:182 +#: sphinx/themes/basic/layout.html:191 #, python-format msgid "© Copyright %(copyright)s." msgstr "" -#: sphinx/themes/basic/layout.html:186 +#: sphinx/themes/basic/layout.html:195 #, python-format msgid "Last updated on %(last_updated)s." msgstr "最後更新日期是 %(last_updated)s." -#: sphinx/themes/basic/layout.html:189 +#: sphinx/themes/basic/layout.html:198 #, python-format msgid "" "Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> " @@ -644,13 +660,13 @@ msgstr "下一個主題" msgid "next chapter" msgstr "下一章" -#: sphinx/themes/basic/search.html:18 +#: sphinx/themes/basic/search.html:24 msgid "" "Please activate JavaScript to enable the search\n" " functionality." msgstr "" -#: sphinx/themes/basic/search.html:23 +#: sphinx/themes/basic/search.html:29 msgid "" "From here you can search these documents. Enter your search\n" " words into the box below and click \"search\". Note that the search\n" @@ -658,16 +674,15 @@ msgid "" " containing fewer words won't appear in the result list." msgstr "" -#: sphinx/themes/basic/search.html:30 +#: sphinx/themes/basic/search.html:36 msgid "search" msgstr "搜尋" -#: sphinx/themes/basic/search.html:34 -#: sphinx/themes/basic/static/searchtools.js:489 +#: sphinx/themes/basic/search.html:40 msgid "Search Results" msgstr "搜尋結果" -#: sphinx/themes/basic/search.html:36 +#: sphinx/themes/basic/search.html:42 msgid "Your search did not match any results." msgstr "" @@ -707,12 +722,12 @@ msgstr "C API 改變" msgid "Other changes" msgstr "其他改變:" -#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:482 -#: sphinx/writers/html.py:487 +#: sphinx/themes/basic/static/doctools.js:154 sphinx/writers/html.py:505 +#: sphinx/writers/html.py:511 msgid "Permalink to this headline" msgstr "" -#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:87 +#: sphinx/themes/basic/static/doctools.js:160 sphinx/writers/html.py:92 msgid "Permalink to this definition" msgstr "" @@ -720,35 +735,12 @@ msgstr "" msgid "Hide Search Matches" msgstr "" -#: sphinx/themes/basic/static/searchtools.js:285 -msgid "Searching" -msgstr "搜尋中" - -#: sphinx/themes/basic/static/searchtools.js:290 -msgid "Preparing search..." -msgstr "準備搜尋..." - -#: sphinx/themes/basic/static/searchtools.js:364 -msgid ", in " -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:491 -msgid "" -"Your search did not match any documents. Please make sure that all words " -"are spelled correctly and that you've selected enough categories." -msgstr "" - -#: sphinx/themes/basic/static/searchtools.js:493 -#, python-format -msgid "Search finished, found %s page(s) matching the search query." -msgstr "" - -#: sphinx/themes/default/static/sidebar.js:66 +#: sphinx/themes/default/static/sidebar.js:69 msgid "Expand sidebar" msgstr "" -#: sphinx/themes/default/static/sidebar.js:79 -#: sphinx/themes/default/static/sidebar.js:106 +#: sphinx/themes/default/static/sidebar.js:82 +#: sphinx/themes/default/static/sidebar.js:110 msgid "Collapse sidebar" msgstr "" @@ -756,22 +748,45 @@ msgstr "" msgid "Contents" msgstr "" -#: sphinx/writers/latex.py:171 +#: sphinx/writers/latex.py:176 msgid "Release" msgstr "釋出" -#: sphinx/writers/latex.py:572 sphinx/writers/manpage.py:178 +#: sphinx/writers/latex.py:590 sphinx/writers/manpage.py:182 msgid "Footnotes" msgstr "" -#: sphinx/writers/latex.py:641 +#: sphinx/writers/latex.py:672 msgid "continued from previous page" msgstr "" -#: sphinx/writers/latex.py:646 +#: sphinx/writers/latex.py:677 msgid "Continued on next page" msgstr "" -#: sphinx/writers/text.py:422 +#: sphinx/writers/text.py:430 msgid "[image]" msgstr "[圖片]" + +#~ msgid "Platforms: " +#~ msgstr "平台" + +#~ msgid "Searching" +#~ msgstr "搜尋中" + +#~ msgid "Preparing search..." +#~ msgstr "準備搜尋..." + +#~ msgid ", in " +#~ msgstr "" + +#~ 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 "" + +#~ msgid "Search finished, found %s page(s) matching the search query." +#~ msgstr "" + diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py index b8e2fded2..e15e42bf2 100644 --- a/sphinx/pycode/__init__.py +++ b/sphinx/pycode/__init__.py @@ -5,7 +5,7 @@ Utilities parsing and analyzing Python code. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,6 +18,7 @@ from sphinx.errors import PycodeError from sphinx.pycode import nodes from sphinx.pycode.pgen2 import driver, token, tokenize, parse, literals from sphinx.util import get_module_source +from sphinx.util.pycompat import next from sphinx.util.docstrings import prepare_docstring, prepare_commentdoc @@ -84,10 +85,30 @@ class AttrDocVisitor(nodes.NodeVisitor): self.in_init -= 1 def visit_expr_stmt(self, node): - """Visit an assignment which may have a special comment before it.""" + """Visit an assignment which may have a special comment before (or + after) it. + """ if _eq not in node.children: # not an assignment (we don't care for augmented assignments) return + # look *after* the node; there may be a comment prefixing the NEWLINE + # of the simple_stmt + parent = node.parent + idx = parent.children.index(node) + 1 + while idx < len(parent): + if parent[idx].type == sym.SEMI: + idx += 1 + continue # skip over semicolon + if parent[idx].type == sym.NEWLINE: + prefix = parent[idx].get_prefix() + if not isinstance(prefix, unicode): + prefix = prefix.decode(self.encoding) + docstring = prepare_commentdoc(prefix) + if docstring: + self.add_docstring(node, docstring) + return # don't allow docstrings both before and after + break + # now look *before* the node pnode = node[0] prefix = pnode.get_prefix() # if the assignment is the first statement on a new indentation @@ -98,7 +119,8 @@ class AttrDocVisitor(nodes.NodeVisitor): if not pnode or pnode.type not in (token.INDENT, token.DEDENT): break prefix = pnode.get_prefix() - prefix = prefix.decode(self.encoding) + if not isinstance(prefix, unicode): + prefix = prefix.decode(self.encoding) docstring = prepare_commentdoc(prefix) self.add_docstring(node, docstring) @@ -278,7 +300,7 @@ class ModuleAnalyzer(object): result[fullname] = (dtype, startline, endline) expect_indent = False if tok in ('def', 'class'): - name = tokeniter.next()[1] + name = next(tokeniter)[1] namespace.append(name) fullname = '.'.join(namespace) stack.append((tok, fullname, spos[0], indent)) diff --git a/sphinx/pycode/nodes.py b/sphinx/pycode/nodes.py index e71846779..7adacc1d0 100644 --- a/sphinx/pycode/nodes.py +++ b/sphinx/pycode/nodes.py @@ -5,7 +5,7 @@ Parse tree node implementations. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -29,6 +29,8 @@ class BaseNode(object): return NotImplemented return not self._eq(other) + __hash__ = None + def get_prev_sibling(self): """Return previous child in parent's children, or None.""" if self.parent is None: diff --git a/sphinx/pycode/pgen2/driver.py b/sphinx/pycode/pgen2/driver.py index 39e347b79..5e6cf9a5b 100644 --- a/sphinx/pycode/pgen2/driver.py +++ b/sphinx/pycode/pgen2/driver.py @@ -120,7 +120,7 @@ def load_grammar(gt="Grammar.txt", gp=None, head, tail = os.path.splitext(gt) if tail == ".txt": tail = "" - gp = head + tail + ".".join(map(str, sys.version_info)) + ".pickle" + gp = head + tail + ".".join(map(str, sys.version_info[:2])) + ".pickle" if force or not _newer(gp, gt): logger.info("Generating grammar tables from %s", gt) g = pgen.generate_grammar(gt) diff --git a/sphinx/pycode/pgen2/literals.py b/sphinx/pycode/pgen2/literals.py index 319002910..d48937028 100644 --- a/sphinx/pycode/pgen2/literals.py +++ b/sphinx/pycode/pgen2/literals.py @@ -66,7 +66,7 @@ uni_escape_re = re.compile(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}|" def evalString(s, encoding=None): regex = escape_re repl = escape - if encoding: + if encoding and not isinstance(s, unicode): s = s.decode(encoding) if s.startswith('u') or s.startswith('U'): regex = uni_escape_re diff --git a/sphinx/pycode/pgen2/tokenize.py b/sphinx/pycode/pgen2/tokenize.py index 4489db898..7ad9f012c 100644 --- a/sphinx/pycode/pgen2/tokenize.py +++ b/sphinx/pycode/pgen2/tokenize.py @@ -143,7 +143,9 @@ class TokenError(Exception): pass class StopTokenizing(Exception): pass -def printtoken(type, token, (srow, scol), (erow, ecol), line): # for testing +def printtoken(type, token, scell, ecell, line): # for testing + srow, scol = scell + erow, ecol = ecell print "%d,%d-%d,%d:\t%s\t%s" % \ (srow, scol, erow, ecol, tok_name[type], repr(token)) diff --git a/sphinx/pygments_styles.py b/sphinx/pygments_styles.py new file mode 100644 index 000000000..44740b31e --- /dev/null +++ b/sphinx/pygments_styles.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +""" + sphinx.pygments_styles + ~~~~~~~~~~~~~~~~~~~~~~ + + Sphinx theme specific highlighting styles. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.style import Style +from pygments.styles.friendly import FriendlyStyle +from pygments.token import Generic, Comment, Number, Whitespace, Keyword, \ + Operator, Name, String, Error + + +class NoneStyle(Style): + """Style without any styling.""" + + +class SphinxStyle(Style): + """ + Like friendly, but a bit darker to enhance contrast on the green + background. + """ + + background_color = '#eeffcc' + default_style = '' + + styles = FriendlyStyle.styles + styles.update({ + Generic.Output: '#333', + Comment: 'italic #408090', + Number: '#208050', + }) + + +class PyramidStyle(Style): + """ + Pylons/pyramid pygments style based on friendly style, by Blaise Laflamme. + """ + + # work in progress... + + background_color = "#f8f8f8" + default_style = "" + + styles = { + Whitespace: "#bbbbbb", + Comment: "italic #60a0b0", + Comment.Preproc: "noitalic #007020", + Comment.Special: "noitalic bg:#fff0f0", + + Keyword: "bold #007020", + Keyword.Pseudo: "nobold", + Keyword.Type: "nobold #902000", + + Operator: "#666666", + Operator.Word: "bold #007020", + + Name.Builtin: "#007020", + Name.Function: "#06287e", + Name.Class: "bold #0e84b5", + Name.Namespace: "bold #0e84b5", + Name.Exception: "#007020", + Name.Variable: "#bb60d5", + Name.Constant: "#60add5", + Name.Label: "bold #002070", + Name.Entity: "bold #d55537", + Name.Attribute: "#0e84b5", + Name.Tag: "bold #062873", + Name.Decorator: "bold #555555", + + String: "#4070a0", + String.Doc: "italic", + String.Interpol: "italic #70a0d0", + String.Escape: "bold #4070a0", + String.Regex: "#235388", + String.Symbol: "#517918", + String.Other: "#c65d09", + Number: "#40a070", + + Generic.Heading: "bold #000080", + Generic.Subheading: "bold #800080", + Generic.Deleted: "#A00000", + Generic.Inserted: "#00A000", + Generic.Error: "#FF0000", + Generic.Emph: "italic", + Generic.Strong: "bold", + Generic.Prompt: "bold #c65d09", + Generic.Output: "#888", + Generic.Traceback: "#04D", + + Error: "#a40000 bg:#fbe3e4" + } diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index db18ef4eb..d606e7ad0 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -5,12 +5,13 @@ Quickly setup documentation source to work with Sphinx. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import sys, os, time +import sys, os, time, re from os import path +from codecs import open TERM_ENCODING = getattr(sys.stdin, 'encoding', None) @@ -20,10 +21,23 @@ from sphinx.util.console import purple, bold, red, turquoise, \ nocolor, color_terminal from sphinx.util import texescape +# function to get input from terminal -- overridden by the test suite +try: + # this raw_input is not converted by 2to3 + term_input = raw_input +except NameError: + term_input = input + PROMPT_PREFIX = '> ' -QUICKSTART_CONF = '''\ +if sys.version_info >= (3, 0): + # prevents that the file is checked for being written in Python 2.x syntax + QUICKSTART_CONF = '#!/usr/bin/env python3\n' +else: + QUICKSTART_CONF = '' + +QUICKSTART_CONF += '''\ # -*- coding: utf-8 -*- # # %(project)s documentation build configuration file, created by @@ -240,6 +254,22 @@ man_pages = [ ('%(master_str)s', '%(project_manpage)s', u'%(project_doc)s', [u'%(author_str)s'], 1) ] + +# If true, show URL addresses after external links. +#man_show_urls = False + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('%(master_str)s', '%(project_fn)s', u'%(project_doc)s', u'%(author_str)s', + '%(project_fn)s', 'One line description of project.', 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +texinfo_appendices = [] ''' EPUB_CONFIG = ''' @@ -337,9 +367,11 @@ PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) \ $(SPHINXOPTS) %(rsrcdir)s +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) %(rsrcdir)s .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp \ -epub latex latexpdf text man changes linkcheck doctest +epub latex latexpdf text man changes linkcheck doctest gettext help: \t@echo "Please use \\`make <target>' where <target> is one of" @@ -356,6 +388,9 @@ help: \t@echo " latexpdf to make LaTeX files and run them through pdflatex" \t@echo " text to make text files" \t@echo " man to make manual pages" +\t@echo " texinfo to make Texinfo files" +\t@echo " info to make Texinfo files and run them through makeinfo" +\t@echo " gettext to make PO message catalogs" \t@echo " changes to make an overview of all changed/added/deprecated items" \t@echo " linkcheck to check all external links for integrity" \t@echo " doctest to run all doctests embedded in the documentation \ @@ -442,6 +477,24 @@ man: \t@echo \t@echo "Build finished. The manual pages are in $(BUILDDIR)/man." +texinfo: +\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo +\t@echo +\t@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." +\t@echo "Run \\`make' in that directory to run these through makeinfo" \\ +\t "(use \\`make info' here to do that automatically)." + +info: +\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo +\t@echo "Running Texinfo files through makeinfo..." +\tmake -C $(BUILDDIR)/texinfo info +\t@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: +\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale +\t@echo +\t@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + changes: \t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes \t@echo @@ -469,8 +522,10 @@ if "%%SPHINXBUILD%%" == "" ( ) set BUILDDIR=%(rbuilddir)s set ALLSPHINXOPTS=-d %%BUILDDIR%%/doctrees %%SPHINXOPTS%% %(rsrcdir)s +set I18NSPHINXOPTS=%%SPHINXOPTS%% %(rsrcdir)s if NOT "%%PAPER%%" == "" ( \tset ALLSPHINXOPTS=-D latex_paper_size=%%PAPER%% %%ALLSPHINXOPTS%% +\tset I18NSPHINXOPTS=-D latex_paper_size=%%PAPER%% %%I18NSPHINXOPTS%% ) if "%%1" == "" goto help @@ -490,6 +545,8 @@ if "%%1" == "help" ( \techo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter \techo. text to make text files \techo. man to make manual pages +\techo. texinfo to make Texinfo files +\techo. gettext to make PO message catalogs \techo. changes to make an overview over all changed/added/deprecated items \techo. linkcheck to check all external links for integrity \techo. doctest to run all doctests embedded in the documentation if enabled @@ -504,6 +561,7 @@ if "%%1" == "clean" ( if "%%1" == "html" ( \t%%SPHINXBUILD%% -b html %%ALLSPHINXOPTS%% %%BUILDDIR%%/html +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The HTML pages are in %%BUILDDIR%%/html. \tgoto end @@ -511,6 +569,7 @@ if "%%1" == "html" ( if "%%1" == "dirhtml" ( \t%%SPHINXBUILD%% -b dirhtml %%ALLSPHINXOPTS%% %%BUILDDIR%%/dirhtml +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The HTML pages are in %%BUILDDIR%%/dirhtml. \tgoto end @@ -518,6 +577,7 @@ if "%%1" == "dirhtml" ( if "%%1" == "singlehtml" ( \t%%SPHINXBUILD%% -b singlehtml %%ALLSPHINXOPTS%% %%BUILDDIR%%/singlehtml +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The HTML pages are in %%BUILDDIR%%/singlehtml. \tgoto end @@ -525,6 +585,7 @@ if "%%1" == "singlehtml" ( if "%%1" == "pickle" ( \t%%SPHINXBUILD%% -b pickle %%ALLSPHINXOPTS%% %%BUILDDIR%%/pickle +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished; now you can process the pickle files. \tgoto end @@ -532,6 +593,7 @@ if "%%1" == "pickle" ( if "%%1" == "json" ( \t%%SPHINXBUILD%% -b json %%ALLSPHINXOPTS%% %%BUILDDIR%%/json +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished; now you can process the JSON files. \tgoto end @@ -539,6 +601,7 @@ if "%%1" == "json" ( if "%%1" == "htmlhelp" ( \t%%SPHINXBUILD%% -b htmlhelp %%ALLSPHINXOPTS%% %%BUILDDIR%%/htmlhelp +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %%BUILDDIR%%/htmlhelp. @@ -547,6 +610,7 @@ if "%%1" == "htmlhelp" ( if "%%1" == "qthelp" ( \t%%SPHINXBUILD%% -b qthelp %%ALLSPHINXOPTS%% %%BUILDDIR%%/qthelp +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %%BUILDDIR%%/qthelp, like this: @@ -558,6 +622,7 @@ if "%%1" == "qthelp" ( if "%%1" == "devhelp" ( \t%%SPHINXBUILD%% -b devhelp %%ALLSPHINXOPTS%% %%BUILDDIR%%/devhelp +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. \tgoto end @@ -565,6 +630,7 @@ if "%%1" == "devhelp" ( if "%%1" == "epub" ( \t%%SPHINXBUILD%% -b epub %%ALLSPHINXOPTS%% %%BUILDDIR%%/epub +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The epub file is in %%BUILDDIR%%/epub. \tgoto end @@ -572,6 +638,7 @@ if "%%1" == "epub" ( if "%%1" == "latex" ( \t%%SPHINXBUILD%% -b latex %%ALLSPHINXOPTS%% %%BUILDDIR%%/latex +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished; the LaTeX files are in %%BUILDDIR%%/latex. \tgoto end @@ -579,6 +646,7 @@ if "%%1" == "latex" ( if "%%1" == "text" ( \t%%SPHINXBUILD%% -b text %%ALLSPHINXOPTS%% %%BUILDDIR%%/text +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The text files are in %%BUILDDIR%%/text. \tgoto end @@ -586,13 +654,31 @@ if "%%1" == "text" ( if "%%1" == "man" ( \t%%SPHINXBUILD%% -b man %%ALLSPHINXOPTS%% %%BUILDDIR%%/man +\tif errorlevel 1 exit /b 1 \techo. \techo.Build finished. The manual pages are in %%BUILDDIR%%/man. \tgoto end ) +if "%%1" == "texinfo" ( +\t%%SPHINXBUILD%% -b texinfo %%ALLSPHINXOPTS%% %%BUILDDIR%%/texinfo +\tif errorlevel 1 exit /b 1 +\techo. +\techo.Build finished. The Texinfo files are in %%BUILDDIR%%/texinfo. +\tgoto end +) + +if "%%1" == "gettext" ( +\t%%SPHINXBUILD%% -b gettext %%I18NSPHINXOPTS%% %%BUILDDIR%%/locale +\tif errorlevel 1 exit /b 1 +\techo. +\techo.Build finished. The message catalogs are in %%BUILDDIR%%/locale. +\tgoto end +) + if "%%1" == "changes" ( \t%%SPHINXBUILD%% -b changes %%ALLSPHINXOPTS%% %%BUILDDIR%%/changes +\tif errorlevel 1 exit /b 1 \techo. \techo.The overview file is in %%BUILDDIR%%/changes. \tgoto end @@ -600,6 +686,7 @@ if "%%1" == "changes" ( if "%%1" == "linkcheck" ( \t%%SPHINXBUILD%% -b linkcheck %%ALLSPHINXOPTS%% %%BUILDDIR%%/linkcheck +\tif errorlevel 1 exit /b 1 \techo. \techo.Link check complete; look for any errors in the above output ^ or in %%BUILDDIR%%/linkcheck/output.txt. @@ -608,6 +695,7 @@ or in %%BUILDDIR%%/linkcheck/output.txt. if "%%1" == "doctest" ( \t%%SPHINXBUILD%% -b doctest %%ALLSPHINXOPTS%% %%BUILDDIR%%/doctest +\tif errorlevel 1 exit /b 1 \techo. \techo.Testing of doctests in the sources finished, look at the ^ results in %%BUILDDIR%%/doctest/output.txt. @@ -665,20 +753,22 @@ def do_prompt(d, key, text, default=None, validator=nonempty): prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default)) else: prompt = purple(PROMPT_PREFIX + text + ': ') - x = raw_input(prompt) + x = term_input(prompt) if default and not x: x = default - if x.decode('ascii', 'replace').encode('ascii', 'replace') != x: - if TERM_ENCODING: - x = x.decode(TERM_ENCODING) - else: - print turquoise('* Note: non-ASCII characters entered ' - 'and terminal encoding unknown -- assuming ' - 'UTF-8 or Latin-1.') - try: - x = x.decode('utf-8') - except UnicodeDecodeError: - x = x.decode('latin1') + if not isinstance(x, unicode): + # for Python 2.x, try to get a Unicode string out of it + if x.decode('ascii', 'replace').encode('ascii', 'replace') != x: + if TERM_ENCODING: + x = x.decode(TERM_ENCODING) + else: + print turquoise('* Note: non-ASCII characters entered ' + 'and terminal encoding unknown -- assuming ' + 'UTF-8 or Latin-1.') + try: + x = x.decode('utf-8') + except UnicodeDecodeError: + x = x.decode('latin1') try: x = validator(x) except ValidationError, err: @@ -688,6 +778,18 @@ def do_prompt(d, key, text, default=None, validator=nonempty): d[key] = x +if sys.version_info >= (3, 0): + # remove Unicode literal prefixes + _unicode_string_re = re.compile(r"[uU]('.*?')") + def _convert_python_source(source): + return _unicode_string_re.sub('\\1', source) + + for f in ['QUICKSTART_CONF', 'EPUB_CONFIG', 'INTERSPHINX_CONFIG']: + globals()[f] = _convert_python_source(globals()[f]) + + del _unicode_string_re, _convert_python_source + + def inner_main(args): d = {} texescape.init() @@ -695,14 +797,24 @@ def inner_main(args): if not color_terminal(): nocolor() + if len(args) > 3: + print 'Usage: sphinx-quickstart [root]' + sys.exit(1) + elif len(args) == 2: + d['path'] = args[1] + print bold('Welcome to the Sphinx %s quickstart utility.') % __version__ print ''' Please enter values for the following settings (just press Enter to accept a default value, if one is given in brackets).''' - print ''' + if 'path' in d: + print bold(''' +Selected root path: %s''' % d['path']) + else: + print ''' Enter the root path for documentation.''' - do_prompt(d, 'path', 'Root path for the documentation', '.', is_path) + do_prompt(d, 'path', 'Root path for the documentation', '.', is_path) while path.isfile(path.join(d['path'], 'conf.py')) or \ path.isfile(path.join(d['path'], 'source', 'conf.py')): @@ -843,28 +955,28 @@ directly.''' if d['ext_intersphinx']: conf_text += INTERSPHINX_CONFIG - f = open(path.join(srcdir, 'conf.py'), 'w') - f.write(conf_text.encode('utf-8')) + f = open(path.join(srcdir, 'conf.py'), 'w', encoding='utf-8') + f.write(conf_text) f.close() masterfile = path.join(srcdir, d['master'] + d['suffix']) - f = open(masterfile, 'w') - f.write((MASTER_FILE % d).encode('utf-8')) + f = open(masterfile, 'w', encoding='utf-8') + f.write(MASTER_FILE % d) f.close() if d['makefile']: d['rsrcdir'] = d['sep'] and 'source' or '.' d['rbuilddir'] = d['sep'] and 'build' or d['dot'] + 'build' # use binary mode, to avoid writing \r\n on Windows - f = open(path.join(d['path'], 'Makefile'), 'wb') - f.write((MAKEFILE % d).encode('utf-8')) + f = open(path.join(d['path'], 'Makefile'), 'wb', encoding='utf-8') + f.write(MAKEFILE % d) f.close() if d['batchfile']: d['rsrcdir'] = d['sep'] and 'source' or '.' d['rbuilddir'] = d['sep'] and 'build' or d['dot'] + 'build' - f = open(path.join(d['path'], 'make.bat'), 'w') - f.write((BATCHFILE % d).encode('utf-8')) + f = open(path.join(d['path'], 'make.bat'), 'w', encoding='utf-8') + f.write(BATCHFILE % d) f.close() print @@ -889,4 +1001,3 @@ def main(argv=sys.argv): print print '[Interrupted.]' return - diff --git a/sphinx/roles.py b/sphinx/roles.py index d3f3c67e3..307439146 100644 --- a/sphinx/roles.py +++ b/sphinx/roles.py @@ -5,7 +5,7 @@ Handlers for additional ReST roles. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,7 +18,7 @@ from docutils.parsers.rst import roles from sphinx import addnodes from sphinx.locale import _ from sphinx.util import ws_re -from sphinx.util.nodes import split_explicit_title +from sphinx.util.nodes import split_explicit_title, process_index_entry generic_docroles = { @@ -69,9 +69,10 @@ class XRefRole(object): innernodeclass = nodes.literal def __init__(self, fix_parens=False, lowercase=False, - nodeclass=None, innernodeclass=None): + nodeclass=None, innernodeclass=None, warn_dangling=False): 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: @@ -105,9 +106,9 @@ class XRefRole(object): classes = ['xref', domain, '%s-%s' % (domain, role)] # if the first character is a bang, don't cross-reference at all if text[0:1] == '!': - text = utils.unescape(text) + text = utils.unescape(text)[1:] if self.fix_parens: - text, tgt = self._fix_parens(env, False, text[1:], "") + text, tgt = self._fix_parens(env, False, text, "") innernode = self.innernodeclass(rawtext, text, classes=classes) return self.result_nodes(inliner.document, env, innernode, is_ref=False) @@ -133,22 +134,22 @@ class XRefRole(object): refnode += self.innernodeclass(rawtext, title, classes=classes) # we also need the source document refnode['refdoc'] = env.docname + refnode['refwarn'] = self.warn_dangling # result_nodes allow further modification of return values return self.result_nodes(inliner.document, env, refnode, is_ref=True) # methods that can be overwritten def process_link(self, env, refnode, has_explicit_title, title, target): - """ - Called after parsing title and target text, and creating the reference - node (given in *refnode*). This method can alter the reference node and - must return a new (or the same) ``(title, target)`` tuple. + """Called after parsing title and target text, and creating the + reference node (given in *refnode*). This method can alter the + reference node and must return a new (or the same) ``(title, target)`` + tuple. """ return title, ws_re.sub(' ', target) def result_nodes(self, document, env, node, is_ref): - """ - Called before returning the finished nodes. *node* is the reference + """Called before returning the finished nodes. *node* is the reference node if one was created (*is_ref* is then true), else the content node. This method can add other nodes and must return a ``(nodes, messages)`` tuple (the usual return value of a role function). @@ -171,8 +172,12 @@ def indexmarkup_role(typ, rawtext, etext, lineno, inliner, inliner.document.note_explicit_target(targetnode) if typ == 'pep': indexnode['entries'] = [ - ('single', _('Python Enhancement Proposals!PEP %s') % text, - targetid, 'PEP %s' % text)] + ('single', _('Python Enhancement Proposals; PEP %s') % text, + targetid, '')] + anchor = '' + anchorindex = text.find('#') + if anchorindex > 0: + text, anchor = text[:anchorindex], text[anchorindex:] try: pepnum = int(text) except ValueError: @@ -182,12 +187,16 @@ def indexmarkup_role(typ, rawtext, etext, lineno, inliner, return [prb], [msg] ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum sn = nodes.strong('PEP '+text, 'PEP '+text) - rn = nodes.reference('', '', internal=False, refuri=ref, classes=[typ]) + rn = nodes.reference('', '', internal=False, refuri=ref+anchor, + classes=[typ]) rn += sn return [indexnode, targetnode, rn], [] elif typ == 'rfc': - indexnode['entries'] = [('single', 'RFC; RFC %s' % text, - targetid, 'RFC %s' % text)] + indexnode['entries'] = [('single', 'RFC; RFC %s' % text, targetid, '')] + anchor = '' + anchorindex = text.find('#') + if anchorindex > 0: + text, anchor = text[:anchorindex], text[anchorindex:] try: rfcnum = int(text) except ValueError: @@ -197,7 +206,8 @@ def indexmarkup_role(typ, rawtext, etext, lineno, inliner, return [prb], [msg] ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum sn = nodes.strong('RFC '+text, 'RFC '+text) - rn = nodes.reference('', '', internal=False, refuri=ref, classes=[typ]) + rn = nodes.reference('', '', internal=False, refuri=ref+anchor, + classes=[typ]) rn += sn return [indexnode, targetnode, rn], [] @@ -259,11 +269,38 @@ def abbr_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): return [addnodes.abbreviation(abbr, abbr, explanation=expl)], [] +def index_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + # create new reference target + env = inliner.document.settings.env + targetid = 'index-%s' % env.new_serialno('index') + targetnode = nodes.target('', '', ids=[targetid]) + # split text and target in role content + has_explicit_title, title, target = split_explicit_title(text) + title = utils.unescape(title) + target = utils.unescape(target) + # if an explicit target is given, we can process it as a full entry + if has_explicit_title: + entries = process_index_entry(target, targetid) + # otherwise we just create a "single" entry + else: + # but allow giving main entry + main = '' + if target.startswith('!'): + target = target[1:] + title = title[1:] + main = 'main' + entries = [('single', target, targetid, main)] + indexnode = addnodes.index() + indexnode['entries'] = entries + textnode = nodes.Text(title, title) + return [indexnode, targetnode, textnode], [] + + specific_docroles = { # links to download references 'download': XRefRole(nodeclass=addnodes.download_reference), # links to documents - 'doc': XRefRole(), + 'doc': XRefRole(warn_dangling=True), 'pep': indexmarkup_role, 'rfc': indexmarkup_role, @@ -272,6 +309,7 @@ specific_docroles = { 'file': emph_literal_role, 'samp': emph_literal_role, 'abbr': abbr_role, + 'index': index_role, } for rolename, func in specific_docroles.iteritems(): diff --git a/sphinx/search.py b/sphinx/search/__init__.py similarity index 62% rename from sphinx/search.py rename to sphinx/search/__init__.py index 729b63b2a..645ebfc81 100644 --- a/sphinx/search.py +++ b/sphinx/search/__init__.py @@ -3,9 +3,9 @@ sphinx.search ~~~~~~~~~~~~~ - Create a search index for offline search. + Create a full-text search index for offline search. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re @@ -14,28 +14,90 @@ import cPickle as pickle from docutils.nodes import comment, Text, NodeVisitor, SkipNode from sphinx.util import jsdump, rpartition -try: - # http://bitbucket.org/methane/porterstemmer/ - from porterstemmer import Stemmer as CStemmer - CSTEMMER = True -except ImportError: - from sphinx.util.stemmer import PorterStemmer - CSTEMMER = False -word_re = re.compile(r'\w+(?u)') +class SearchLanguage(object): + """ + This class is the base class for search natural language preprocessors. If + you want to add support for a new language, you should override the methods + of this class. -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()) + You should override `lang` class property too (e.g. 'en', 'fr' and so on). + + .. attribute:: stopwords + + This is a set of stop words of the target language. Default `stopwords` + is empty. This word is used for building index and embedded in JS. + + .. attribute:: js_stemmer_code + + Return stemmer class of JavaScript version. This class' name should be + ``Stemmer`` and this class must have ``stemWord`` method. This string is + embedded as-is in searchtools.js. + + This class is used to preprocess search word which Sphinx HTML readers + type, before searching index. Default implementation does nothing. + """ + lang = None + stopwords = set() + js_stemmer_code = """ +/** + * Dummy stemmer for languages without stemming rules. + */ +var Stemmer = function() { + this.stemWord = function(w) { + return w; + } +} +""" + + _word_re = re.compile(r'\w+(?u)') + + def __init__(self, options): + self.options = options + self.init(options) + + def init(self, options): + """ + Initialize the class with the options the user has given. + """ + + def split(self, input): + """ + This method splits a sentence into words. Default splitter splits input + at white spaces, which should be enough for most languages except CJK + languages. + """ + return self._word_re.findall(input) + + def stem(self, word): + """ + This method implements stemming algorithm of the Python version. + + Default implementation does nothing. You should implement this if the + language has any stemming rules. + + This class is used to preprocess search words before registering them in + the search index. The stemming of the Python version and the JS version + (given in the js_stemmer_code attribute) must be compatible. + """ + return word + + def word_filter(self, word): + """ + Return true if the target word should be registered in the search index. + This method is called after stemming. + """ + return not (((len(word) < 3) and (12353 < ord(word[0]) < 12436)) or + (ord(word[0]) < 256 and (len(word) < 3 or word in self.stopwords or + word.isdigit()))) + +from sphinx.search import en, ja + +languages = { + 'en': en.SearchEnglish, + 'ja': ja.SearchJapanese, +} class _JavaScriptIndex(object): @@ -67,39 +129,21 @@ class _JavaScriptIndex(object): js_index = _JavaScriptIndex() -if CSTEMMER: - class Stemmer(CStemmer): - - def stem(self, word): - return self(word.lower()) - -else: - class Stemmer(PorterStemmer): - """ - All those porter stemmer implementations look hideous. - make at least the stem method nicer. - """ - - def stem(self, word): - word = word.lower() - return PorterStemmer.stem(self, word, 0, len(word) - 1) - - - class WordCollector(NodeVisitor): """ A special visitor that collects words for the `IndexBuilder`. """ - def __init__(self, document): + def __init__(self, document, lang): NodeVisitor.__init__(self, document) self.found_words = [] + self.lang = lang def dispatch_visit(self, node): if node.__class__ is comment: raise SkipNode if node.__class__ is Text: - self.found_words.extend(word_re.findall(node.astext())) + self.found_words.extend(self.lang.split(node.astext())) class IndexBuilder(object): @@ -112,9 +156,8 @@ class IndexBuilder(object): 'pickle': pickle } - def __init__(self, env): + def __init__(self, env, lang, options): self.env = env - self._stemmer = Stemmer() # filename -> title self._titles = {} # stemmed word -> set(filenames) @@ -123,6 +166,8 @@ class IndexBuilder(object): self._objtypes = {} # objtype index -> objname (localized) self._objnames = {} + # add language-specific SearchLanguage instance + self.lang = languages[lang](options) def load(self, stream, format): """Reconstruct from frozen data.""" @@ -215,17 +260,22 @@ class IndexBuilder(object): """Feed a doctree to the index.""" self._titles[filename] = title - visitor = WordCollector(doctree) + visitor = WordCollector(doctree, self.lang) doctree.walk(visitor) - def add_term(word, stem=self._stemmer.stem): + def add_term(word, stem=self.lang.stem): word = stem(word) - if len(word) < 3 or word in stopwords or word.isdigit(): - return - self._mapping.setdefault(word, set()).add(filename) + if self.lang.word_filter(word): + self._mapping.setdefault(word, set()).add(filename) - for word in word_re.findall(title): + for word in self.lang.split(title): add_term(word) for word in visitor.found_words: add_term(word) + + def context_for_searchtool(self): + return dict( + search_language_stemming_code = self.lang.js_stemmer_code, + search_language_stop_words = jsdump.dumps(self.lang.stopwords), + ) diff --git a/sphinx/search/en.py b/sphinx/search/en.py new file mode 100644 index 000000000..1f3c3731f --- /dev/null +++ b/sphinx/search/en.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +""" + sphinx.search.en + ~~~~~~~~~~~~~~~~ + + English search language: includes the JS porter stemmer. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from sphinx.search import SearchLanguage + +try: + # http://bitbucket.org/methane/porterstemmer/ + from porterstemmer import Stemmer as CStemmer + CSTEMMER = True +except ImportError: + from sphinx.util.stemmer import PorterStemmer + CSTEMMER = False + + +english_stopwords = set(""" +a and are as at +be but by +for +if in into is it +near no not +of on or +such +that the their then there these they this to +was will with +""".split()) + +js_porter_stemmer = """ +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|\ +ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|\ +iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} +""" + + +class SearchEnglish(SearchLanguage): + lang = 'en' + js_stemmer_code = js_porter_stemmer + stopwords = english_stopwords + + def init(self, options): + if CSTEMMER: + class Stemmer(CStemmer): + def stem(self, word): + return self(word.lower()) + else: + class Stemmer(PorterStemmer): + """All those porter stemmer implementations look hideous; + make at least the stem method nicer. + """ + def stem(self, word): + word = word.lower() + return PorterStemmer.stem(self, word, 0, len(word) - 1) + + self.stemmer = Stemmer() + + def stem(self, word): + return self.stemmer.stem(word) diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py new file mode 100644 index 000000000..0a7d83a1c --- /dev/null +++ b/sphinx/search/ja.py @@ -0,0 +1,273 @@ +# -*- coding: utf-8 -*- +""" + sphinx.search.ja + ~~~~~~~~~~~~~~~~ + + Japanese search language: includes routine to split words. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +# Python Version of TinySegmenter +# (http://chasen.org/~taku/software/TinySegmenter/) +# TinySegmenter is super compact Japanese tokenizer. +# +# TinySegmenter was originally developed by Taku Kudo <taku(at)chasen.org>. +# Python Version was developed by xnights <programming.magic(at)gmail.com>. +# For details, see http://programming-magic.com/?id=170 + +import os +import re +import sys + +try: + import MeCab + native_module = True +except ImportError: + native_module = False + +from sphinx.search import SearchLanguage + + +class MecabBinder(object): + def __init__(self, options): + self.ctypes_libmecab = None + self.ctypes_mecab = None + if not native_module: + self.init_ctypes(options) + else: + self.init_native(options) + self.dict_encode = options.get('dic_enc', 'utf-8') + + def split(self, input): + input2 = input.encode(self.dict_encode) + if native_module: + result = self.native.parse(input2) + else: + result = self.ctypes_libmecab.mecab_sparse_tostr( + self.ctypes_mecab, input) + return result.decode(self.dict_encode).split(' ') + + def init_native(self, options): + param = '-Owakati' + dict = options.get('dict') + if dict: + param += ' -d %s' % dict + self.native = MeCab.Tagger(param) + + def init_ctypes(self, options): + import ctypes.util + + lib = options.get('lib') + + if lib is None: + if sys.platform.startswith('win'): + libname = 'libmecab.dll' + else: + libname = 'mecab' + libpath = ctypes.util.find_library(libname) + elif os.path.basename(lib) == lib: + libpath = ctypes.util.find_library(lib) + else: + libpath = None + if os.path.exists(lib): + libpath = lib + if libpath is None: + raise RuntimeError('MeCab dynamic library is not available') + + param = 'mecab -Owakati' + dict = options.get('dict') + if dict: + param += ' -d %s' % dict + + self.ctypes_libmecab = ctypes.CDLL(libpath) + self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p + self.ctypes_mecab = self.libmecab.mecab_new2(param) + + def __del__(self): + if self.ctypes_libmecab: + self.ctypes_libmecab.mecab_destroy(self.ctypes_mecab) + + +class TinySegmenter(object): + patterns_ = dict([(re.compile(pattern), value) for pattern, value in { + u'[一二三四五六七八九十百千万億兆]': u'M', + u'[一-龠々〆ヵヶ]': u'H', + u'[ぁ-ん]': u'I', + u'[ァ-ヴーア-ン゙ー]': u'K', + u'[a-zA-Za-zA-Z]': u'A', + u'[0-90-9]': u'N', + }.iteritems()]) + BIAS__ = -332 + BC1__ = {u'HH':6,u'II':2461,u'KH':406,u'OH':-1378} + BC2__ = {u'AA':-3267,u'AI':2744,u'AN':-878,u'HH':-4070,u'HM':-1711,u'HN':4012,u'HO':3761,u'IA':1327,u'IH':-1184,u'II':-1332,u'IK':1721,u'IO':5492,u'KI':3831,u'KK':-8741,u'MH':-3132,u'MK':3334,u'OO':-2920} + BC3__ = {u'HH':996,u'HI':626,u'HK':-721,u'HN':-1307,u'HO':-836,u'IH':-301,u'KK':2762,u'MK':1079,u'MM':4034,u'OA':-1652,u'OH':266} + BP1__ = {u'BB':295,u'OB':304,u'OO':-125,u'UB':352} + BP2__ = {u'BO':60,u'OO':-1762} + BQ1__ = {u'BHH':1150,u'BHM':1521,u'BII':-1158,u'BIM':886,u'BMH':1208,u'BNH':449,u'BOH':-91,u'BOO':-2597,u'OHI':451,u'OIH':-296,u'OKA':1851,u'OKH':-1020,u'OKK':904,u'OOO':2965} + BQ2__ = {u'BHH':118,u'BHI':-1159,u'BHM':466,u'BIH':-919,u'BKK':-1720,u'BKO':864,u'OHH':-1139,u'OHM':-181,u'OIH':153,u'UHI':-1146} + BQ3__ = {u'BHH':-792,u'BHI':2664,u'BII':-299,u'BKI':419,u'BMH':937,u'BMM':8335,u'BNN':998,u'BOH':775,u'OHH':2174,u'OHM':439,u'OII':280,u'OKH':1798,u'OKI':-793,u'OKO':-2242,u'OMH':-2402,u'OOO':11699} + BQ4__ = {u'BHH':-3895,u'BIH':3761,u'BII':-4654,u'BIK':1348,u'BKK':-1806,u'BMI':-3385,u'BOO':-12396,u'OAH':926,u'OHH':266,u'OHK':-2036,u'ONN':-973} + BW1__ = {u',と':660,u',同':727,u'B1あ':1404,u'B1同':542,u'、と':660,u'、同':727,u'」と':1682,u'あっ':1505,u'いう':1743,u'いっ':-2055,u'いる':672,u'うし':-4817,u'うん':665,u'から':3472,u'がら':600,u'こう':-790,u'こと':2083,u'こん':-1262,u'さら':-4143,u'さん':4573,u'した':2641,u'して':1104,u'すで':-3399,u'そこ':1977,u'それ':-871,u'たち':1122,u'ため':601,u'った':3463,u'つい':-802,u'てい':805,u'てき':1249,u'でき':1127,u'です':3445,u'では':844,u'とい':-4915,u'とみ':1922,u'どこ':3887,u'ない':5713,u'なっ':3015,u'など':7379,u'なん':-1113,u'にし':2468,u'には':1498,u'にも':1671,u'に対':-912,u'の一':-501,u'の中':741,u'ませ':2448,u'まで':1711,u'まま':2600,u'まる':-2155,u'やむ':-1947,u'よっ':-2565,u'れた':2369,u'れで':-913,u'をし':1860,u'を見':731,u'亡く':-1886,u'京都':2558,u'取り':-2784,u'大き':-2604,u'大阪':1497,u'平方':-2314,u'引き':-1336,u'日本':-195,u'本当':-2423,u'毎日':-2113,u'目指':-724,u'B1あ':1404,u'B1同':542,u'」と':1682} + BW2__ = {u'..':-11822,u'11':-669,u'――':-5730,u'−−':-13175,u'いう':-1609,u'うか':2490,u'かし':-1350,u'かも':-602,u'から':-7194,u'かれ':4612,u'がい':853,u'がら':-3198,u'きた':1941,u'くな':-1597,u'こと':-8392,u'この':-4193,u'させ':4533,u'され':13168,u'さん':-3977,u'しい':-1819,u'しか':-545,u'した':5078,u'して':972,u'しな':939,u'その':-3744,u'たい':-1253,u'たた':-662,u'ただ':-3857,u'たち':-786,u'たと':1224,u'たは':-939,u'った':4589,u'って':1647,u'っと':-2094,u'てい':6144,u'てき':3640,u'てく':2551,u'ては':-3110,u'ても':-3065,u'でい':2666,u'でき':-1528,u'でし':-3828,u'です':-4761,u'でも':-4203,u'とい':1890,u'とこ':-1746,u'とと':-2279,u'との':720,u'とみ':5168,u'とも':-3941,u'ない':-2488,u'なが':-1313,u'など':-6509,u'なの':2614,u'なん':3099,u'にお':-1615,u'にし':2748,u'にな':2454,u'によ':-7236,u'に対':-14943,u'に従':-4688,u'に関':-11388,u'のか':2093,u'ので':-7059,u'のに':-6041,u'のの':-6125,u'はい':1073,u'はが':-1033,u'はず':-2532,u'ばれ':1813,u'まし':-1316,u'まで':-6621,u'まれ':5409,u'めて':-3153,u'もい':2230,u'もの':-10713,u'らか':-944,u'らし':-1611,u'らに':-1897,u'りし':651,u'りま':1620,u'れた':4270,u'れて':849,u'れば':4114,u'ろう':6067,u'われ':7901,u'を通':-11877,u'んだ':728,u'んな':-4115,u'一人':602,u'一方':-1375,u'一日':970,u'一部':-1051,u'上が':-4479,u'会社':-1116,u'出て':2163,u'分の':-7758,u'同党':970,u'同日':-913,u'大阪':-2471,u'委員':-1250,u'少な':-1050,u'年度':-8669,u'年間':-1626,u'府県':-2363,u'手権':-1982,u'新聞':-4066,u'日新':-722,u'日本':-7068,u'日米':3372,u'曜日':-601,u'朝鮮':-2355,u'本人':-2697,u'東京':-1543,u'然と':-1384,u'社会':-1276,u'立て':-990,u'第に':-1612,u'米国':-4268,u'11':-669} + BW3__ = {u'あた':-2194,u'あり':719,u'ある':3846,u'い.':-1185,u'い。':-1185,u'いい':5308,u'いえ':2079,u'いく':3029,u'いた':2056,u'いっ':1883,u'いる':5600,u'いわ':1527,u'うち':1117,u'うと':4798,u'えと':1454,u'か.':2857,u'か。':2857,u'かけ':-743,u'かっ':-4098,u'かに':-669,u'から':6520,u'かり':-2670,u'が,':1816,u'が、':1816,u'がき':-4855,u'がけ':-1127,u'がっ':-913,u'がら':-4977,u'がり':-2064,u'きた':1645,u'けど':1374,u'こと':7397,u'この':1542,u'ころ':-2757,u'さい':-714,u'さを':976,u'し,':1557,u'し、':1557,u'しい':-3714,u'した':3562,u'して':1449,u'しな':2608,u'しま':1200,u'す.':-1310,u'す。':-1310,u'する':6521,u'ず,':3426,u'ず、':3426,u'ずに':841,u'そう':428,u'た.':8875,u'た。':8875,u'たい':-594,u'たの':812,u'たり':-1183,u'たる':-853,u'だ.':4098,u'だ。':4098,u'だっ':1004,u'った':-4748,u'って':300,u'てい':6240,u'てお':855,u'ても':302,u'です':1437,u'でに':-1482,u'では':2295,u'とう':-1387,u'とし':2266,u'との':541,u'とも':-3543,u'どう':4664,u'ない':1796,u'なく':-903,u'など':2135,u'に,':-1021,u'に、':-1021,u'にし':1771,u'にな':1906,u'には':2644,u'の,':-724,u'の、':-724,u'の子':-1000,u'は,':1337,u'は、':1337,u'べき':2181,u'まし':1113,u'ます':6943,u'まっ':-1549,u'まで':6154,u'まれ':-793,u'らし':1479,u'られ':6820,u'るる':3818,u'れ,':854,u'れ、':854,u'れた':1850,u'れて':1375,u'れば':-3246,u'れる':1091,u'われ':-605,u'んだ':606,u'んで':798,u'カ月':990,u'会議':860,u'入り':1232,u'大会':2217,u'始め':1681,u'市':965,u'新聞':-5055,u'日,':974,u'日、':974,u'社会':2024,u'カ月':990} + TC1__ = {u'AAA':1093,u'HHH':1029,u'HHM':580,u'HII':998,u'HOH':-390,u'HOM':-331,u'IHI':1169,u'IOH':-142,u'IOI':-1015,u'IOM':467,u'MMH':187,u'OOI':-1832} + TC2__ = {u'HHO':2088,u'HII':-1023,u'HMM':-1154,u'IHI':-1965,u'KKH':703,u'OII':-2649} + TC3__ = {u'AAA':-294,u'HHH':346,u'HHI':-341,u'HII':-1088,u'HIK':731,u'HOH':-1486,u'IHH':128,u'IHI':-3041,u'IHO':-1935,u'IIH':-825,u'IIM':-1035,u'IOI':-542,u'KHH':-1216,u'KKA':491,u'KKH':-1217,u'KOK':-1009,u'MHH':-2694,u'MHM':-457,u'MHO':123,u'MMH':-471,u'NNH':-1689,u'NNO':662,u'OHO':-3393} + TC4__ = {u'HHH':-203,u'HHI':1344,u'HHK':365,u'HHM':-122,u'HHN':182,u'HHO':669,u'HIH':804,u'HII':679,u'HOH':446,u'IHH':695,u'IHO':-2324,u'IIH':321,u'III':1497,u'IIO':656,u'IOO':54,u'KAK':4845,u'KKA':3386,u'KKK':3065,u'MHH':-405,u'MHI':201,u'MMH':-241,u'MMM':661,u'MOM':841} + TQ1__ = {u'BHHH':-227,u'BHHI':316,u'BHIH':-132,u'BIHH':60,u'BIII':1595,u'BNHH':-744,u'BOHH':225,u'BOOO':-908,u'OAKK':482,u'OHHH':281,u'OHIH':249,u'OIHI':200,u'OIIH':-68} + TQ2__ = {u'BIHH':-1401,u'BIII':-1033,u'BKAK':-543,u'BOOO':-5591} + TQ3__ = {u'BHHH':478,u'BHHM':-1073,u'BHIH':222,u'BHII':-504,u'BIIH':-116,u'BIII':-105,u'BMHI':-863,u'BMHM':-464,u'BOMH':620,u'OHHH':346,u'OHHI':1729,u'OHII':997,u'OHMH':481,u'OIHH':623,u'OIIH':1344,u'OKAK':2792,u'OKHH':587,u'OKKA':679,u'OOHH':110,u'OOII':-685} + TQ4__ = {u'BHHH':-721,u'BHHM':-3604,u'BHII':-966,u'BIIH':-607,u'BIII':-2181,u'OAAA':-2763,u'OAKK':180,u'OHHH':-294,u'OHHI':2446,u'OHHO':480,u'OHIH':-1573,u'OIHH':1935,u'OIHI':-493,u'OIIH':626,u'OIII':-4007,u'OKAK':-8156} + TW1__ = {u'につい':-4681,u'東京都':2026} + TW2__ = {u'ある程':-2049,u'いった':-1256,u'ころが':-2434,u'しょう':3873,u'その後':-4430,u'だって':-1049,u'ていた':1833,u'として':-4657,u'ともに':-4517,u'もので':1882,u'一気に':-792,u'初めて':-1512,u'同時に':-8097,u'大きな':-1255,u'対して':-2721,u'社会党':-3216} + TW3__ = {u'いただ':-1734,u'してい':1314,u'として':-4314,u'につい':-5483,u'にとっ':-5989,u'に当た':-6247,u'ので,':-727,u'ので、':-727,u'のもの':-600,u'れから':-3752,u'十二月':-2287} + TW4__ = {u'いう.':8576,u'いう。':8576,u'からな':-2348,u'してい':2958,u'たが,':1516,u'たが、':1516,u'ている':1538,u'という':1349,u'ました':5543,u'ません':1097,u'ようと':-4258,u'よると':5865} + UC1__ = {u'A':484,u'K':93,u'M':645,u'O':-505} + UC2__ = {u'A':819,u'H':1059,u'I':409,u'M':3987,u'N':5775,u'O':646} + UC3__ = {u'A':-1370,u'I':2311} + UC4__ = {u'A':-2643,u'H':1809,u'I':-1032,u'K':-3450,u'M':3565,u'N':3876,u'O':6646} + UC5__ = {u'H':313,u'I':-1238,u'K':-799,u'M':539,u'O':-831} + UC6__ = {u'H':-506,u'I':-253,u'K':87,u'M':247,u'O':-387} + UP1__ = {u'O':-214} + UP2__ = {u'B':69,u'O':935} + UP3__ = {u'B':189} + UQ1__ = {u'BH':21,u'BI':-12,u'BK':-99,u'BN':142,u'BO':-56,u'OH':-95,u'OI':477,u'OK':410,u'OO':-2422} + UQ2__ = {u'BH':216,u'BI':113,u'OK':1759} + UQ3__ = {u'BA':-479,u'BH':42,u'BI':1913,u'BK':-7198,u'BM':3160,u'BN':6427,u'BO':14761,u'OI':-827,u'ON':-3212} + UW1__ = {u',':156,u'、':156,u'「':-463,u'あ':-941,u'う':-127,u'が':-553,u'き':121,u'こ':505,u'で':-201,u'と':-547,u'ど':-123,u'に':-789,u'の':-185,u'は':-847,u'も':-466,u'や':-470,u'よ':182,u'ら':-292,u'り':208,u'れ':169,u'を':-446,u'ん':-137,u'・':-135,u'主':-402,u'京':-268,u'区':-912,u'午':871,u'国':-460,u'大':561,u'委':729,u'市':-411,u'日':-141,u'理':361,u'生':-408,u'県':-386,u'都':-718,u'「':-463,u'・':-135} + UW2__ = {u',':-829,u'、':-829,u'〇':892,u'「':-645,u'」':3145,u'あ':-538,u'い':505,u'う':134,u'お':-502,u'か':1454,u'が':-856,u'く':-412,u'こ':1141,u'さ':878,u'ざ':540,u'し':1529,u'す':-675,u'せ':300,u'そ':-1011,u'た':188,u'だ':1837,u'つ':-949,u'て':-291,u'で':-268,u'と':-981,u'ど':1273,u'な':1063,u'に':-1764,u'の':130,u'は':-409,u'ひ':-1273,u'べ':1261,u'ま':600,u'も':-1263,u'や':-402,u'よ':1639,u'り':-579,u'る':-694,u'れ':571,u'を':-2516,u'ん':2095,u'ア':-587,u'カ':306,u'キ':568,u'ッ':831,u'三':-758,u'不':-2150,u'世':-302,u'中':-968,u'主':-861,u'事':492,u'人':-123,u'会':978,u'保':362,u'入':548,u'初':-3025,u'副':-1566,u'北':-3414,u'区':-422,u'大':-1769,u'天':-865,u'太':-483,u'子':-1519,u'学':760,u'実':1023,u'小':-2009,u'市':-813,u'年':-1060,u'強':1067,u'手':-1519,u'揺':-1033,u'政':1522,u'文':-1355,u'新':-1682,u'日':-1815,u'明':-1462,u'最':-630,u'朝':-1843,u'本':-1650,u'東':-931,u'果':-665,u'次':-2378,u'民':-180,u'気':-1740,u'理':752,u'発':529,u'目':-1584,u'相':-242,u'県':-1165,u'立':-763,u'第':810,u'米':509,u'自':-1353,u'行':838,u'西':-744,u'見':-3874,u'調':1010,u'議':1198,u'込':3041,u'開':1758,u'間':-1257,u'「':-645,u'」':3145,u'ッ':831,u'ア':-587,u'カ':306,u'キ':568} + UW3__ = {u',':4889,u'1':-800,u'−':-1723,u'、':4889,u'々':-2311,u'〇':5827,u'」':2670,u'〓':-3573,u'あ':-2696,u'い':1006,u'う':2342,u'え':1983,u'お':-4864,u'か':-1163,u'が':3271,u'く':1004,u'け':388,u'げ':401,u'こ':-3552,u'ご':-3116,u'さ':-1058,u'し':-395,u'す':584,u'せ':3685,u'そ':-5228,u'た':842,u'ち':-521,u'っ':-1444,u'つ':-1081,u'て':6167,u'で':2318,u'と':1691,u'ど':-899,u'な':-2788,u'に':2745,u'の':4056,u'は':4555,u'ひ':-2171,u'ふ':-1798,u'へ':1199,u'ほ':-5516,u'ま':-4384,u'み':-120,u'め':1205,u'も':2323,u'や':-788,u'よ':-202,u'ら':727,u'り':649,u'る':5905,u'れ':2773,u'わ':-1207,u'を':6620,u'ん':-518,u'ア':551,u'グ':1319,u'ス':874,u'ッ':-1350,u'ト':521,u'ム':1109,u'ル':1591,u'ロ':2201,u'ン':278,u'・':-3794,u'一':-1619,u'下':-1759,u'世':-2087,u'両':3815,u'中':653,u'主':-758,u'予':-1193,u'二':974,u'人':2742,u'今':792,u'他':1889,u'以':-1368,u'低':811,u'何':4265,u'作':-361,u'保':-2439,u'元':4858,u'党':3593,u'全':1574,u'公':-3030,u'六':755,u'共':-1880,u'円':5807,u'再':3095,u'分':457,u'初':2475,u'別':1129,u'前':2286,u'副':4437,u'力':365,u'動':-949,u'務':-1872,u'化':1327,u'北':-1038,u'区':4646,u'千':-2309,u'午':-783,u'協':-1006,u'口':483,u'右':1233,u'各':3588,u'合':-241,u'同':3906,u'和':-837,u'員':4513,u'国':642,u'型':1389,u'場':1219,u'外':-241,u'妻':2016,u'学':-1356,u'安':-423,u'実':-1008,u'家':1078,u'小':-513,u'少':-3102,u'州':1155,u'市':3197,u'平':-1804,u'年':2416,u'広':-1030,u'府':1605,u'度':1452,u'建':-2352,u'当':-3885,u'得':1905,u'思':-1291,u'性':1822,u'戸':-488,u'指':-3973,u'政':-2013,u'教':-1479,u'数':3222,u'文':-1489,u'新':1764,u'日':2099,u'旧':5792,u'昨':-661,u'時':-1248,u'曜':-951,u'最':-937,u'月':4125,u'期':360,u'李':3094,u'村':364,u'東':-805,u'核':5156,u'森':2438,u'業':484,u'氏':2613,u'民':-1694,u'決':-1073,u'法':1868,u'海':-495,u'無':979,u'物':461,u'特':-3850,u'生':-273,u'用':914,u'町':1215,u'的':7313,u'直':-1835,u'省':792,u'県':6293,u'知':-1528,u'私':4231,u'税':401,u'立':-960,u'第':1201,u'米':7767,u'系':3066,u'約':3663,u'級':1384,u'統':-4229,u'総':1163,u'線':1255,u'者':6457,u'能':725,u'自':-2869,u'英':785,u'見':1044,u'調':-562,u'財':-733,u'費':1777,u'車':1835,u'軍':1375,u'込':-1504,u'通':-1136,u'選':-681,u'郎':1026,u'郡':4404,u'部':1200,u'金':2163,u'長':421,u'開':-1432,u'間':1302,u'関':-1282,u'雨':2009,u'電':-1045,u'非':2066,u'駅':1620,u'1':-800,u'」':2670,u'・':-3794,u'ッ':-1350,u'ア':551,u'グ':1319,u'ス':874,u'ト':521,u'ム':1109,u'ル':1591,u'ロ':2201,u'ン':278} + UW4__ = {u',':3930,u'.':3508,u'―':-4841,u'、':3930,u'。':3508,u'〇':4999,u'「':1895,u'」':3798,u'〓':-5156,u'あ':4752,u'い':-3435,u'う':-640,u'え':-2514,u'お':2405,u'か':530,u'が':6006,u'き':-4482,u'ぎ':-3821,u'く':-3788,u'け':-4376,u'げ':-4734,u'こ':2255,u'ご':1979,u'さ':2864,u'し':-843,u'じ':-2506,u'す':-731,u'ず':1251,u'せ':181,u'そ':4091,u'た':5034,u'だ':5408,u'ち':-3654,u'っ':-5882,u'つ':-1659,u'て':3994,u'で':7410,u'と':4547,u'な':5433,u'に':6499,u'ぬ':1853,u'ね':1413,u'の':7396,u'は':8578,u'ば':1940,u'ひ':4249,u'び':-4134,u'ふ':1345,u'へ':6665,u'べ':-744,u'ほ':1464,u'ま':1051,u'み':-2082,u'む':-882,u'め':-5046,u'も':4169,u'ゃ':-2666,u'や':2795,u'ょ':-1544,u'よ':3351,u'ら':-2922,u'り':-9726,u'る':-14896,u'れ':-2613,u'ろ':-4570,u'わ':-1783,u'を':13150,u'ん':-2352,u'カ':2145,u'コ':1789,u'セ':1287,u'ッ':-724,u'ト':-403,u'メ':-1635,u'ラ':-881,u'リ':-541,u'ル':-856,u'ン':-3637,u'・':-4371,u'ー':-11870,u'一':-2069,u'中':2210,u'予':782,u'事':-190,u'井':-1768,u'人':1036,u'以':544,u'会':950,u'体':-1286,u'作':530,u'側':4292,u'先':601,u'党':-2006,u'共':-1212,u'内':584,u'円':788,u'初':1347,u'前':1623,u'副':3879,u'力':-302,u'動':-740,u'務':-2715,u'化':776,u'区':4517,u'協':1013,u'参':1555,u'合':-1834,u'和':-681,u'員':-910,u'器':-851,u'回':1500,u'国':-619,u'園':-1200,u'地':866,u'場':-1410,u'塁':-2094,u'士':-1413,u'多':1067,u'大':571,u'子':-4802,u'学':-1397,u'定':-1057,u'寺':-809,u'小':1910,u'屋':-1328,u'山':-1500,u'島':-2056,u'川':-2667,u'市':2771,u'年':374,u'庁':-4556,u'後':456,u'性':553,u'感':916,u'所':-1566,u'支':856,u'改':787,u'政':2182,u'教':704,u'文':522,u'方':-856,u'日':1798,u'時':1829,u'最':845,u'月':-9066,u'木':-485,u'来':-442,u'校':-360,u'業':-1043,u'氏':5388,u'民':-2716,u'気':-910,u'沢':-939,u'済':-543,u'物':-735,u'率':672,u'球':-1267,u'生':-1286,u'産':-1101,u'田':-2900,u'町':1826,u'的':2586,u'目':922,u'省':-3485,u'県':2997,u'空':-867,u'立':-2112,u'第':788,u'米':2937,u'系':786,u'約':2171,u'経':1146,u'統':-1169,u'総':940,u'線':-994,u'署':749,u'者':2145,u'能':-730,u'般':-852,u'行':-792,u'規':792,u'警':-1184,u'議':-244,u'谷':-1000,u'賞':730,u'車':-1481,u'軍':1158,u'輪':-1433,u'込':-3370,u'近':929,u'道':-1291,u'選':2596,u'郎':-4866,u'都':1192,u'野':-1100,u'銀':-2213,u'長':357,u'間':-2344,u'院':-2297,u'際':-2604,u'電':-878,u'領':-1659,u'題':-792,u'館':-1984,u'首':1749,u'高':2120,u'「':1895,u'」':3798,u'・':-4371,u'ッ':-724,u'ー':-11870,u'カ':2145,u'コ':1789,u'セ':1287,u'ト':-403,u'メ':-1635,u'ラ':-881,u'リ':-541,u'ル':-856,u'ン':-3637} + UW5__ = {u',':465,u'.':-299,u'1':-514,u'E2':-32768,u']':-2762,u'、':465,u'。':-299,u'「':363,u'あ':1655,u'い':331,u'う':-503,u'え':1199,u'お':527,u'か':647,u'が':-421,u'き':1624,u'ぎ':1971,u'く':312,u'げ':-983,u'さ':-1537,u'し':-1371,u'す':-852,u'だ':-1186,u'ち':1093,u'っ':52,u'つ':921,u'て':-18,u'で':-850,u'と':-127,u'ど':1682,u'な':-787,u'に':-1224,u'の':-635,u'は':-578,u'べ':1001,u'み':502,u'め':865,u'ゃ':3350,u'ょ':854,u'り':-208,u'る':429,u'れ':504,u'わ':419,u'を':-1264,u'ん':327,u'イ':241,u'ル':451,u'ン':-343,u'中':-871,u'京':722,u'会':-1153,u'党':-654,u'務':3519,u'区':-901,u'告':848,u'員':2104,u'大':-1296,u'学':-548,u'定':1785,u'嵐':-1304,u'市':-2991,u'席':921,u'年':1763,u'思':872,u'所':-814,u'挙':1618,u'新':-1682,u'日':218,u'月':-4353,u'査':932,u'格':1356,u'機':-1508,u'氏':-1347,u'田':240,u'町':-3912,u'的':-3149,u'相':1319,u'省':-1052,u'県':-4003,u'研':-997,u'社':-278,u'空':-813,u'統':1955,u'者':-2233,u'表':663,u'語':-1073,u'議':1219,u'選':-1018,u'郎':-368,u'長':786,u'間':1191,u'題':2368,u'館':-689,u'1':-514,u'E2':-32768,u'「':363,u'イ':241,u'ル':451,u'ン':-343} + UW6__ = {u',':227,u'.':808,u'1':-270,u'E1':306,u'、':227,u'。':808,u'あ':-307,u'う':189,u'か':241,u'が':-73,u'く':-121,u'こ':-200,u'じ':1782,u'す':383,u'た':-428,u'っ':573,u'て':-1014,u'で':101,u'と':-105,u'な':-253,u'に':-149,u'の':-417,u'は':-236,u'も':-206,u'り':187,u'る':-135,u'を':195,u'ル':-673,u'ン':-496,u'一':-277,u'中':201,u'件':-800,u'会':624,u'前':302,u'区':1792,u'員':-1212,u'委':798,u'学':-960,u'市':887,u'広':-695,u'後':535,u'業':-697,u'相':753,u'社':-507,u'福':974,u'空':-822,u'者':1811,u'連':463,u'郎':1082,u'1':-270,u'E1':306,u'ル':-673,u'ン':-496} + + # ctype_ + def ctype_(self, char): + for pattern, value in self.patterns_.iteritems(): + if pattern.match(char): + return value + return u'O' + # ts_ + def ts_(self, dict, key): + if key in dict: + return dict[key] + return 0 + + # segment + def split(self, input): + if not input: + return [] + + result = [] + seg = [u'B3',u'B2',u'B1'] + ctype = [u'O',u'O',u'O'] + for t in input: + seg.append(t) + ctype.append(self.ctype_(t)) + seg.append(u'E1') + seg.append(u'E2') + seg.append(u'E3') + ctype.append(u'O') + ctype.append(u'O') + ctype.append(u'O') + word = seg[3] + p1 = u'U' + p2 = u'U' + p3 = u'U' + + for i in range(4, len(seg) - 3): + score = self.BIAS__ + w1 = seg[i-3] + w2 = seg[i-2] + w3 = seg[i-1] + w4 = seg[i] + w5 = seg[i+1] + w6 = seg[i+2] + c1 = ctype[i-3] + c2 = ctype[i-2] + c3 = ctype[i-1] + c4 = ctype[i] + c5 = ctype[i+1] + c6 = ctype[i+2] + score += self.ts_(self.UP1__, p1) + score += self.ts_(self.UP2__, p2) + score += self.ts_(self.UP3__, p3) + score += self.ts_(self.BP1__, p1 + p2) + score += self.ts_(self.BP2__, p2 + p3) + score += self.ts_(self.UW1__, w1) + score += self.ts_(self.UW2__, w2) + score += self.ts_(self.UW3__, w3) + score += self.ts_(self.UW4__, w4) + score += self.ts_(self.UW5__, w5) + score += self.ts_(self.UW6__, w6) + score += self.ts_(self.BW1__, w2 + w3) + score += self.ts_(self.BW2__, w3 + w4) + score += self.ts_(self.BW3__, w4 + w5) + score += self.ts_(self.TW1__, w1 + w2 + w3) + score += self.ts_(self.TW2__, w2 + w3 + w4) + score += self.ts_(self.TW3__, w3 + w4 + w5) + score += self.ts_(self.TW4__, w4 + w5 + w6) + score += self.ts_(self.UC1__, c1) + score += self.ts_(self.UC2__, c2) + score += self.ts_(self.UC3__, c3) + score += self.ts_(self.UC4__, c4) + score += self.ts_(self.UC5__, c5) + score += self.ts_(self.UC6__, c6) + score += self.ts_(self.BC1__, c2 + c3) + score += self.ts_(self.BC2__, c3 + c4) + score += self.ts_(self.BC3__, c4 + c5) + score += self.ts_(self.TC1__, c1 + c2 + c3) + score += self.ts_(self.TC2__, c2 + c3 + c4) + score += self.ts_(self.TC3__, c3 + c4 + c5) + score += self.ts_(self.TC4__, c4 + c5 + c6) +# score += self.ts_(self.TC5__, c4 + c5 + c6) + score += self.ts_(self.UQ1__, p1 + c1) + score += self.ts_(self.UQ2__, p2 + c2) + score += self.ts_(self.UQ1__, p3 + c3) + score += self.ts_(self.BQ1__, p2 + c2 + c3) + score += self.ts_(self.BQ2__, p2 + c3 + c4) + score += self.ts_(self.BQ3__, p3 + c2 + c3) + score += self.ts_(self.BQ4__, p3 + c3 + c4) + score += self.ts_(self.TQ1__, p2 + c1 + c2 + c3) + score += self.ts_(self.TQ2__, p2 + c2 + c3 + c4) + score += self.ts_(self.TQ3__, p3 + c1 + c2 + c3) + score += self.ts_(self.TQ4__, p3 + c2 + c3 + c4) + p = u'O' + if score > 0: + result.append(word) + word = u'' + p = u'B' + p1 = p2 + p2 = p3 + p3 = p + word += seg[i] + + result.append(word) + return result + + +class SearchJapanese(SearchLanguage): + """ + Japanese search implementation: uses no stemmer, but word splitting is quite + complicated. + """ + lang = 'ja' + + def init(self, options): + type = options.get('type', 'default') + if type not in ('mecab', 'default'): + raise ValueError(("Japanese tokenizer's type should be 'mecab'" + " or 'default'")) + self.libmecab = None + if type == 'mecab': + self.splitter = MecabBinder(options) + else: + self.splitter = TinySegmenter() + + def split(self, input): + return self.splitter.split(input) + + def word_filter(self, stemmed_word): + return len(stemmed_word) > 1 diff --git a/sphinx/setup_command.py b/sphinx/setup_command.py index e2d83bc6c..ebbcf27b8 100644 --- a/sphinx/setup_command.py +++ b/sphinx/setup_command.py @@ -8,7 +8,7 @@ :author: Sebastian Wiesner :contact: basti.wiesner@gmx.net - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,7 +22,8 @@ from sphinx.util.console import darkred, nocolor, color_terminal class BuildDoc(Command): - """Distutils command to build Sphinx documentation. + """ + Distutils command to build Sphinx documentation. The Sphinx build can then be triggered from distutils, and some Sphinx options can be set in ``setup.py`` or ``setup.cfg`` instead of Sphinx own @@ -35,13 +36,13 @@ class BuildDoc(Command): cmdclass = {'build_sphinx': BuildDoc} name = 'My project' - version = 1.2 - release = 1.2.0 + version = '1.2' + release = '1.2.0' setup( name=name, author='Bernard Montgomery', version=release, - cmdclass={'build_sphinx': BuildDoc}, + cmdclass=cmdclass, # these are optional and override conf.py settings command_options={ 'build_sphinx': { @@ -110,7 +111,6 @@ class BuildDoc(Command): build = self.get_finalized_command('build') self.build_dir = os.path.join(build.build_base, 'sphinx') self.mkpath(self.build_dir) - self.ensure_dirname('build_dir') self.doctree_dir = os.path.join(self.build_dir, 'doctrees') self.mkpath(self.doctree_dir) self.builder_target_dir = os.path.join(self.build_dir, self.builder) @@ -137,14 +137,11 @@ class BuildDoc(Command): freshenv=self.fresh_env) try: - if self.all_files: - app.builder.build_all() - else: - app.builder.build_update() + app.build(force_all=self.all_files) except Exception, err: from docutils.utils import SystemMessage if isinstance(err, SystemMessage): - sys.stderr, darkred('reST markup error:') + print >>sys.stderr, darkred('reST markup error:') print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace') else: diff --git a/sphinx/texinputs/Makefile b/sphinx/texinputs/Makefile index d5a73f5bb..f219a2fe6 100644 --- a/sphinx/texinputs/Makefile +++ b/sphinx/texinputs/Makefile @@ -14,6 +14,15 @@ all-pdf: $(ALLPDF) all-dvi: $(ALLDVI) all-ps: all-dvi for f in *.dvi; do dvips $$f; done +all-pdf-ja: $(wildcard *.tex) + ebb $(wildcard *.pdf *.png *.gif *.jpeg) + platex -kanji=utf8 $(LATEXOPTS) '$<' + platex -kanji=utf8 $(LATEXOPTS) '$<' + platex -kanji=utf8 $(LATEXOPTS) '$<' + -mendex -U -f -d '$(basename $<).dic' -s python.ist '$(basename $<).idx' + platex -kanji=utf8 $(LATEXOPTS) '$<' + platex -kanji=utf8 $(LATEXOPTS) '$<' + dvipdfmx '$(basename $<).dvi' zip: all-$(FMT) mkdir $(ARCHIVEPREFIX)docs-$(FMT) @@ -49,8 +58,7 @@ bz2: tar pdflatex $(LATEXOPTS) '$<' clean: - rm -f *.pdf *.dvi *.ps - rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla + rm -f *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla .PHONY: all all-pdf all-dvi all-ps clean diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index be8a6c15d..21a3d8941 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -16,6 +16,7 @@ \RequirePackage{amsmath} % for \text \RequirePackage{makeidx} \RequirePackage{framed} +\RequirePackage{ifthen} \RequirePackage{color} % For highlighted code. \RequirePackage{fancyvrb} @@ -137,15 +138,11 @@ % Play with vspace to be able to keep the indentation. \newlength\distancetoright -\newlength\leftsidespace \def\mycolorbox#1{% - \setlength\leftsidespace{\@totalleftmargin}% \setlength\distancetoright{\linewidth}% \advance\distancetoright -\@totalleftmargin % - \noindent\hspace*{\@totalleftmargin}% \fcolorbox{VerbatimBorderColor}{VerbatimColor}{% \begin{minipage}{\distancetoright}% - \noindent\hspace*{-\leftsidespace}% #1 \end{minipage}% }% @@ -178,23 +175,6 @@ } -% Index-entry generation support. -% - -% Command to generate two index entries (using subentries) -\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}} - -% And three entries (using only one level of subentries) -\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}} - -% And four (again, using only one level of subentries) -\newcommand{\indexiv}[4]{ -\index{#1!#2 #3 #4} -\index{#2!#3 #4, #1} -\index{#3!#4, #1 #2} -\index{#4!#1 #2 #3} -} - % \moduleauthor{name}{email} \newcommand{\moduleauthor}[2]{} @@ -209,7 +189,7 @@ {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} \titleformat{\subsubsection}{\py@HeaderFamily}% {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\paragraph}{\large\py@HeaderFamily}% +\titleformat{\paragraph}{\small\py@HeaderFamily}% {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor} % {fulllineitems} is the main environment for object descriptions. @@ -240,21 +220,12 @@ \addtolength{\py@argswidth}{\linewidth}% \item[#1\code{(}\py@sigparams{#2}{#3}]} -% This version is being checked in for the historical record; it shows -% how I've managed to get some aspects of this to work. It will not -% be used in practice, so a subsequent revision will change things -% again. This version has problems, but shows how to do something -% that proved more tedious than I'd expected, so I don't want to lose -% the example completely. +% Production lists % -\newcommand{\grammartoken}[1]{\texttt{#1}} -\newenvironment{productionlist}[1][\@undefined]{ - \def\optional##1{{\Large[}##1{\Large]}} - \def\production##1##2{\hypertarget{grammar-token-##1}{}% - \code{##1}&::=&\code{##2}\\} - \def\productioncont##1{& &\code{##1}\\} - \def\token##1{##1} - \let\grammartoken=\token +\newenvironment{productionlist}{ +% \def\optional##1{{\Large[}##1{\Large]}} + \def\production##1##2{\\\code{##1}&::=&\code{##2}} + \def\productioncont##1{\\& &\code{##1}} \parindent=2em \indent \begin{tabular}{lcl} @@ -268,11 +239,11 @@ \newcommand{\py@heavybox}{ \setlength{\fboxrule}{1pt} - \setlength{\fboxsep}{7pt} + \setlength{\fboxsep}{6pt} \setlength{\py@noticelength}{\linewidth} \addtolength{\py@noticelength}{-2\fboxsep} \addtolength{\py@noticelength}{-2\fboxrule} - \setlength{\shadowsize}{3pt} + %\setlength{\shadowsize}{3pt} \Sbox \minipage{\py@noticelength} } @@ -282,15 +253,26 @@ \fbox{\TheSbox} } +\newcommand{\py@lightbox}{{% + \setlength\parskip{0pt}\par + \rule[0ex]{\linewidth}{0.5pt}% + \par\vspace{-0.5ex}% + }} +\newcommand{\py@endlightbox}{{% + \setlength{\parskip}{0pt}% + \par\rule[0.5ex]{\linewidth}{0.5pt}% + \par\vspace{-0.5ex}% + }} + % Some are quite plain: -\newcommand{\py@noticestart@note}{} -\newcommand{\py@noticeend@note}{} -\newcommand{\py@noticestart@hint}{} -\newcommand{\py@noticeend@hint}{} -\newcommand{\py@noticestart@important}{} -\newcommand{\py@noticeend@important}{} -\newcommand{\py@noticestart@tip}{} -\newcommand{\py@noticeend@tip}{} +\newcommand{\py@noticestart@note}{\py@lightbox} +\newcommand{\py@noticeend@note}{\py@endlightbox} +\newcommand{\py@noticestart@hint}{\py@lightbox} +\newcommand{\py@noticeend@hint}{\py@endlightbox} +\newcommand{\py@noticestart@important}{\py@lightbox} +\newcommand{\py@noticeend@important}{\py@endlightbox} +\newcommand{\py@noticestart@tip}{\py@lightbox} +\newcommand{\py@noticeend@tip}{\py@endlightbox} % Others gets more visible distinction: \newcommand{\py@noticestart@warning}{\py@heavybox} @@ -307,7 +289,7 @@ \newenvironment{notice}[2]{ \def\py@noticetype{#1} \csname py@noticestart@#1\endcsname - \par\strong{#2} + \strong{#2} }{\csname py@noticeend@\py@noticetype\endcsname} % Allow the release number to be specified independently of the @@ -446,6 +428,10 @@ linkcolor=InnerLinkColor,filecolor=OuterLinkColor, menucolor=OuterLinkColor,urlcolor=OuterLinkColor, citecolor=InnerLinkColor]{hyperref} +% Fix anchor placement for figures with captions. +% (Note: we don't use a package option here; instead, we give an explicit +% \capstart for figures that actually have a caption.) +\RequirePackage{hypcap} % From docutils.writers.latex2e \providecommand{\DUspan}[2]{% @@ -458,3 +444,21 @@ {#2}% node content }% close "span" } + +\providecommand*{\DUprovidelength}[2]{ + \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +} + +\DUprovidelength{\DUlineblockindent}{2.5em} +\ifthenelse{\isundefined{\DUlineblock}}{ + \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} +}{} diff --git a/sphinx/themes/agogo/layout.html b/sphinx/themes/agogo/layout.html index 4a7e263ba..6668a7f67 100644 --- a/sphinx/themes/agogo/layout.html +++ b/sphinx/themes/agogo/layout.html @@ -5,7 +5,7 @@ Sphinx layout template for the agogo theme, originally written by Andi Albrecht. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} @@ -22,7 +22,7 @@ <h1><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></h1> {%- endblock %} <div class="rel"> - {%- for rellink in rellinks %} + {%- for rellink in rellinks|reverse %} <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}" {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a> {%- if not loop.last %}{{ reldelim2 }}{% endif %} @@ -67,7 +67,7 @@ <div class="footer-wrapper"> <div class="footer"> <div class="left"> - {%- for rellink in rellinks %} + {%- for rellink in rellinks|reverse %} <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}" {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a> {%- if not loop.last %}{{ reldelim2 }}{% endif %} diff --git a/sphinx/themes/agogo/static/agogo.css_t b/sphinx/themes/agogo/static/agogo.css_t index 10f03c47a..904fd7bef 100644 --- a/sphinx/themes/agogo/static/agogo.css_t +++ b/sphinx/themes/agogo/static/agogo.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- agogo theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -326,6 +326,37 @@ div.footer .left { /* Styles copied from basic theme */ +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + clear: both; + text-align: center; +} + +.align-right { + text-align: right; +} + /* -- search page ----------------------------------------------------------- */ ul.search { diff --git a/sphinx/themes/basic/defindex.html b/sphinx/themes/basic/defindex.html index f337faece..ce8d3af67 100644 --- a/sphinx/themes/basic/defindex.html +++ b/sphinx/themes/basic/defindex.html @@ -4,7 +4,7 @@ Default template for the "index" page. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "layout.html" %} diff --git a/sphinx/themes/basic/domainindex.html b/sphinx/themes/basic/domainindex.html index 0aca7e696..947a01ea8 100644 --- a/sphinx/themes/basic/domainindex.html +++ b/sphinx/themes/basic/domainindex.html @@ -4,7 +4,7 @@ Template for domain indices (module index, ...). - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "layout.html" %} @@ -19,7 +19,7 @@ {% endblock %} {% block body %} - {%- set curr_group = 0 %} + {%- set groupid = idgen() %} <h1>{{ indextitle }}</h1> @@ -33,15 +33,14 @@ <table class="indextable modindextable" cellspacing="0" cellpadding="2"> {%- for letter, entries in content %} <tr class="pcap"><td></td><td> </td><td></td></tr> - <tr class="cap"><td></td><td><a name="cap-{{ letter }}"> - <strong>{{ letter }}</strong></a></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 %} - {%- if grouptype == 1 %}{% set curr_group = curr_group + 1 %}{% endif %} - <tr{% if grouptype == 2 %} class="cg-{{ curr_group }}"{% endif %}> + <tr{% if grouptype == 2 %} class="cg-{{ groupid.current() }}"{% endif %}> <td>{% if grouptype == 1 -%} - <img src="{{ pathto('_static/minus.png', 1) }}" id="toggle-{{ curr_group }}" - class="toggler" style="display: none" alt="-" /> + <img src="{{ pathto('_static/minus.png', 1) }}" class="toggler" + id="toggle-{{ groupid.next() }}" style="display: none" alt="-" /> {%- endif %}</td> <td>{% if grouptype == 2 %}   {% endif %} {% if page %}<a href="{{ pathto(page) }}#{{ anchor }}">{% endif -%} diff --git a/sphinx/themes/basic/genindex-single.html b/sphinx/themes/basic/genindex-single.html index 1e98ba9c9..eff8c1ce2 100644 --- a/sphinx/themes/basic/genindex-single.html +++ b/sphinx/themes/basic/genindex-single.html @@ -4,34 +4,51 @@ Template for a "single" page of a split index. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} +{% macro indexentries(firstname, links) %} + <dt> + {%- if links -%} + <a href="{{ links[0][1] }}"> + {%- if links[0][0] %}<strong>{% endif -%} + {{ firstname|e }} + {%- if links[0][0] %}</strong>{% endif -%} + </a> + + {%- for ismain, link in links[1:] -%} + , <a href="{{ link }}">{% if ismain %}<strong>{% endif -%} + [{{ loop.index }}] + {%- if ismain %}</strong>{% endif -%} + </a> + {%- endfor %} + {%- else %} + {{ firstname|e }} + {%- endif %} + </dt> +{% endmacro %} + {% extends "layout.html" %} {% set title = _('Index') %} {% block body %} - <h1 id="index">{% trans key=key %}Index – {{ key }}{% endtrans %}</h1> +<h1 id="index">{% trans key=key %}Index – {{ key }}{% endtrans %}</h1> -<table width="100%" class="indextable"><tr> +<table style="width: 100%" class="indextable"><tr> {%- for column in entries|slice(2) if column %} - <td width="33%" valign="top"><dl> - {%- for entryname, (links, subitems) in column %} - <dt>{% if links %}<a href="{{ links[0] }}">{{ entryname|e }}</a> - {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor %} - {%- else %}{{ entryname|e }}{% endif %}</dt> - {%- if subitems %} - <dd><dl> - {%- for subentryname, subentrylinks in subitems %} - <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a> - {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%} - </dt> + <td style="width: 33%" valign="top"><dl> + {%- for entryname, (links, subitems) in column %} + {{ indexentries(entryname, links) }} + {%- if subitems %} + <dd><dl> + {%- for subentryname, subentrylinks in subitems %} + {{ indexentries(subentryname, subentrylinks) }} + {%- endfor %} + </dl></dd> + {%- endif -%} {%- endfor %} - </dl></dd> - {%- endif -%} -{%- endfor %} -</dl></td> -{%- endfor %} + </dl></td> + {%- endfor %} </tr></table> {% endblock %} diff --git a/sphinx/themes/basic/genindex-split.html b/sphinx/themes/basic/genindex-split.html index d068a96a6..6da88a173 100644 --- a/sphinx/themes/basic/genindex-split.html +++ b/sphinx/themes/basic/genindex-split.html @@ -4,7 +4,7 @@ Template for a "split" index overview page. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "layout.html" %} diff --git a/sphinx/themes/basic/genindex.html b/sphinx/themes/basic/genindex.html index 4d46380f1..7bc002b6c 100644 --- a/sphinx/themes/basic/genindex.html +++ b/sphinx/themes/basic/genindex.html @@ -4,42 +4,60 @@ Template for an "all-in-one" index. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} +{% macro indexentries(firstname, links) %} + <dt> + {%- if links -%} + <a href="{{ links[0][1] }}"> + {%- if links[0][0] %}<strong>{% endif -%} + {{ firstname|e }} + {%- if links[0][0] %}</strong>{% endif -%} + </a> + + {%- for ismain, link in links[1:] -%} + , <a href="{{ link }}">{% if ismain %}<strong>{% endif -%} + [{{ loop.index }}] + {%- if ismain %}</strong>{% endif -%} + </a> + {%- endfor %} + {%- else %} + {{ firstname|e }} + {%- endif %} + </dt> +{% endmacro %} + {% extends "layout.html" %} {% set title = _('Index') %} {% block body %} - <h1 id="index">{{ _('Index') }}</h1> +<h1 id="index">{{ _('Index') }}</h1> - <div class="genindex-jumpbox"> - {% for key, dummy in genindexentries -%} - <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %} - {%- endfor %} - </div> +<div class="genindex-jumpbox"> + {% for key, dummy in genindexentries -%} + <a href="#{{ key }}"><strong>{{ key }}</strong></a> + {% if not loop.last %}| {% endif %} + {%- endfor %} +</div> - {%- for key, entries in genindexentries %} +{%- for key, entries in genindexentries %} <h2 id="{{ key }}">{{ key }}</h2> -<table width="100%" class="indextable genindextable"><tr> +<table style="width: 100%" class="indextable genindextable"><tr> {%- for column in entries|slice(2) if column %} - <td width="33%" valign="top"><dl> - {%- for entryname, (links, subitems) in column %} - <dt>{% if links %}<a href="{{ links[0] }}">{{ entryname|e }}</a> - {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor %} - {%- else %}{{ entryname|e }}{% endif %}</dt> - {%- if subitems %} - <dd><dl> - {%- for subentryname, subentrylinks in subitems %} - <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a> - {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%} - </dt> + <td style="width: 33%" valign="top"><dl> + {%- for entryname, (links, subitems) in column %} + {{ indexentries(entryname, links) }} + {%- if subitems %} + <dd><dl> + {%- for subentryname, subentrylinks in subitems %} + {{ indexentries(subentryname, subentrylinks) }} + {%- endfor %} + </dl></dd> + {%- endif -%} {%- endfor %} - </dl></dd> - {%- endif -%} -{%- endfor %} -</dl></td> -{%- endfor %} + </dl></td> + {%- endfor %} </tr></table> {% endfor %} diff --git a/sphinx/themes/basic/globaltoc.html b/sphinx/themes/basic/globaltoc.html index 7422888c5..ee191faf1 100644 --- a/sphinx/themes/basic/globaltoc.html +++ b/sphinx/themes/basic/globaltoc.html @@ -4,7 +4,7 @@ Sphinx sidebar template: global table of contents. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3> diff --git a/sphinx/themes/basic/layout.html b/sphinx/themes/basic/layout.html index e31e85443..9fb989cbe 100644 --- a/sphinx/themes/basic/layout.html +++ b/sphinx/themes/basic/layout.html @@ -4,7 +4,7 @@ Master layout template for Sphinx themes. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- block doctype -%} @@ -16,7 +16,13 @@ {%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and (sidebars != []) %} {%- set url_root = pathto('', 1) %} +{# XXX necessary? #} {%- if url_root == '#' %}{% set url_root = '' %}{% endif %} +{%- if not embedded and docstitle %} + {%- set titlesuffix = " — "|safe + docstitle|e %} +{%- else %} + {%- set titlesuffix = "" %} +{%- endif %} {%- macro relbar() %} <div class="related"> @@ -78,24 +84,7 @@ {%- endif %} {%- endmacro %} -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" /> - {{ metatags }} - {%- if not embedded and docstitle %} - {%- set titlesuffix = " — "|safe + docstitle|e %} - {%- else %} - {%- set titlesuffix = "" %} - {%- endif %} - {%- block htmltitle %} - <title>{{ title|striptags|e }}{{ titlesuffix }} - {%- endblock %} - - - {%- for cssfile in css_files %} - - {%- endfor %} - {%- if not embedded %} +{%- macro script() %} {%- endfor %} +{%- endmacro %} + +{%- macro css() %} + + + {%- for cssfile in css_files %} + + {%- endfor %} +{%- endmacro %} + + + + + {{ metatags }} + {%- block htmltitle %} + {{ title|striptags|e }}{{ titlesuffix }} + {%- endblock %} + {{ css() }} + {%- if not embedded %} + {{ script() }} {%- if use_opensearch %} Search +

    + From here you can search these documents. Enter your search + words into the box below and click "search". +

    +
    + + + +
    +{%- if search_performed %} +

    Search Results

    + {%- if not search_results %} +

    Your search did not match any results.

    + {%- endif %} +{%- endif %} +
    + {%- if search_results %} + + {%- endif %} +
    diff --git a/sphinx/themes/basic/sourcelink.html b/sphinx/themes/basic/sourcelink.html index 8fa7563b4..53f2f6b16 100644 --- a/sphinx/themes/basic/sourcelink.html +++ b/sphinx/themes/basic/sourcelink.html @@ -4,7 +4,7 @@ Sphinx sidebar template: "show source" link. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- if show_source and has_source and sourcename %} diff --git a/sphinx/themes/basic/static/ajax-loader.gif b/sphinx/themes/basic/static/ajax-loader.gif new file mode 100644 index 000000000..61faf8cab Binary files /dev/null and b/sphinx/themes/basic/static/ajax-loader.gif differ diff --git a/sphinx/themes/basic/static/basic.css b/sphinx/themes/basic/static/basic.css_t similarity index 93% rename from sphinx/themes/basic/static/basic.css rename to sphinx/themes/basic/static/basic.css_t index 69f30d4fb..1be372847 100644 --- a/sphinx/themes/basic/static/basic.css +++ b/sphinx/themes/basic/static/basic.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -49,7 +49,7 @@ div.sphinxsidebarwrapper { div.sphinxsidebar { float: left; - width: 230px; + width: {{ theme_sidebarwidth|toint }}px; margin-left: -100%; font-size: 90%; } @@ -213,6 +213,24 @@ p.rubric { font-weight: bold; } +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + .align-left { text-align: left; } @@ -395,7 +413,7 @@ dl.glossary dt { } .footnote:target { - background-color: #ffa + background-color: #ffa; } .line-block { @@ -426,6 +444,7 @@ dl.glossary dt { pre { overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { diff --git a/sphinx/themes/basic/static/comment-bright.png b/sphinx/themes/basic/static/comment-bright.png new file mode 100644 index 000000000..551517b8c Binary files /dev/null and b/sphinx/themes/basic/static/comment-bright.png differ diff --git a/sphinx/themes/basic/static/comment-close.png b/sphinx/themes/basic/static/comment-close.png new file mode 100644 index 000000000..09b54be46 Binary files /dev/null and b/sphinx/themes/basic/static/comment-close.png differ diff --git a/sphinx/themes/basic/static/comment.png b/sphinx/themes/basic/static/comment.png new file mode 100644 index 000000000..92feb52b8 Binary files /dev/null and b/sphinx/themes/basic/static/comment.png differ diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js index eeea95ea5..8b9bd2c0e 100644 --- a/sphinx/themes/basic/static/doctools.js +++ b/sphinx/themes/basic/static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilties for all documentation. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/basic/static/down-pressed.png b/sphinx/themes/basic/static/down-pressed.png new file mode 100644 index 000000000..6f7ad7827 Binary files /dev/null and b/sphinx/themes/basic/static/down-pressed.png differ diff --git a/sphinx/themes/basic/static/down.png b/sphinx/themes/basic/static/down.png new file mode 100644 index 000000000..3003a8877 Binary files /dev/null and b/sphinx/themes/basic/static/down.png differ diff --git a/sphinx/themes/basic/static/searchtools.js b/sphinx/themes/basic/static/searchtools.js_t similarity index 67% rename from sphinx/themes/basic/static/searchtools.js rename to sphinx/themes/basic/static/searchtools.js_t index 5cbfe004b..6be7489fb 100644 --- a/sphinx/themes/basic/static/searchtools.js +++ b/sphinx/themes/basic/static/searchtools.js_t @@ -1,10 +1,10 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~ + * searchtools.js_t + * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -36,188 +36,7 @@ jQuery.makeSearchSummary = function(text, keywords, hlwords) { return rv; } -/** - * Porter Stemmer - */ -var PorterStemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - +{{ search_language_stemming_code|safe }} /** * Search Module @@ -300,14 +119,10 @@ var Search = { }, query : function(query) { - var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in', - 'if', 'for', 'no', 'there', 'their', 'was', 'is', - 'be', 'to', 'that', 'but', 'they', 'not', 'such', - 'with', 'by', 'a', 'on', 'these', 'of', 'will', - 'this', 'near', 'the', 'or', 'at']; + var stopwords = {{ search_language_stop_words }}; - // stem the searchterms and add them to the correct list - var stemmer = new PorterStemmer(); + // Stem the searchterms and add them to the correct list + var stemmer = new Stemmer(); var searchterms = []; var excluded = []; var hlterms = []; diff --git a/sphinx/themes/basic/static/up-pressed.png b/sphinx/themes/basic/static/up-pressed.png new file mode 100644 index 000000000..8bd587afe Binary files /dev/null and b/sphinx/themes/basic/static/up-pressed.png differ diff --git a/sphinx/themes/basic/static/up.png b/sphinx/themes/basic/static/up.png new file mode 100644 index 000000000..b94625680 Binary files /dev/null and b/sphinx/themes/basic/static/up.png differ diff --git a/sphinx/themes/basic/static/websupport.js b/sphinx/themes/basic/static/websupport.js new file mode 100644 index 000000000..cbb609232 --- /dev/null +++ b/sphinx/themes/basic/static/websupport.js @@ -0,0 +1,808 @@ +/* + * websupport.js + * ~~~~~~~~~~~~~ + * + * sphinx.websupport utilties for all documentation. + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +(function($) { + $.fn.autogrow = function() { + return this.each(function() { + var textarea = this; + + $.fn.autogrow.resize(textarea); + + $(textarea) + .focus(function() { + textarea.interval = setInterval(function() { + $.fn.autogrow.resize(textarea); + }, 500); + }) + .blur(function() { + clearInterval(textarea.interval); + }); + }); + }; + + $.fn.autogrow.resize = function(textarea) { + var lineHeight = parseInt($(textarea).css('line-height'), 10); + var lines = textarea.value.split('\n'); + var columns = textarea.cols; + var lineCount = 0; + $.each(lines, function() { + lineCount += Math.ceil(this.length / columns) || 1; + }); + var height = lineHeight * (lineCount + 1); + $(textarea).css('height', height); + }; +})(jQuery); + +(function($) { + var comp, by; + + function init() { + initEvents(); + initComparator(); + } + + function initEvents() { + $('a.comment-close').live("click", function(event) { + event.preventDefault(); + hide($(this).attr('id').substring(2)); + }); + $('a.vote').live("click", function(event) { + event.preventDefault(); + handleVote($(this)); + }); + $('a.reply').live("click", function(event) { + event.preventDefault(); + openReply($(this).attr('id').substring(2)); + }); + $('a.close-reply').live("click", function(event) { + event.preventDefault(); + closeReply($(this).attr('id').substring(2)); + }); + $('a.sort-option').live("click", function(event) { + event.preventDefault(); + handleReSort($(this)); + }); + $('a.show-proposal').live("click", function(event) { + event.preventDefault(); + showProposal($(this).attr('id').substring(2)); + }); + $('a.hide-proposal').live("click", function(event) { + event.preventDefault(); + hideProposal($(this).attr('id').substring(2)); + }); + $('a.show-propose-change').live("click", function(event) { + event.preventDefault(); + showProposeChange($(this).attr('id').substring(2)); + }); + $('a.hide-propose-change').live("click", function(event) { + event.preventDefault(); + hideProposeChange($(this).attr('id').substring(2)); + }); + $('a.accept-comment').live("click", function(event) { + event.preventDefault(); + acceptComment($(this).attr('id').substring(2)); + }); + $('a.delete-comment').live("click", function(event) { + event.preventDefault(); + deleteComment($(this).attr('id').substring(2)); + }); + $('a.comment-markup').live("click", function(event) { + event.preventDefault(); + toggleCommentMarkupBox($(this).attr('id').substring(2)); + }); + } + + /** + * Set comp, which is a comparator function used for sorting and + * inserting comments into the list. + */ + function setComparator() { + // If the first three letters are "asc", sort in ascending order + // and remove the prefix. + if (by.substring(0,3) == 'asc') { + var i = by.substring(3); + comp = function(a, b) { return a[i] - b[i]; }; + } else { + // Otherwise sort in descending order. + comp = function(a, b) { return b[by] - a[by]; }; + } + + // Reset link styles and format the selected sort option. + $('a.sel').attr('href', '#').removeClass('sel'); + $('a.by' + by).removeAttr('href').addClass('sel'); + } + + /** + * Create a comp function. If the user has preferences stored in + * the sortBy cookie, use those, otherwise use the default. + */ + function initComparator() { + by = 'rating'; // Default to sort by rating. + // If the sortBy cookie is set, use that instead. + if (document.cookie.length > 0) { + var start = document.cookie.indexOf('sortBy='); + if (start != -1) { + start = start + 7; + var end = document.cookie.indexOf(";", start); + if (end == -1) { + end = document.cookie.length; + by = unescape(document.cookie.substring(start, end)); + } + } + } + setComparator(); + } + + /** + * Show a comment div. + */ + function show(id) { + $('#ao' + id).hide(); + $('#ah' + id).show(); + var context = $.extend({id: id}, opts); + var popup = $(renderTemplate(popupTemplate, context)).hide(); + popup.find('textarea[name="proposal"]').hide(); + popup.find('a.by' + by).addClass('sel'); + var form = popup.find('#cf' + id); + form.submit(function(event) { + event.preventDefault(); + addComment(form); + }); + $('#s' + id).after(popup); + popup.slideDown('fast', function() { + getComments(id); + }); + } + + /** + * Hide a comment div. + */ + function hide(id) { + $('#ah' + id).hide(); + $('#ao' + id).show(); + var div = $('#sc' + id); + div.slideUp('fast', function() { + div.remove(); + }); + } + + /** + * Perform an ajax request to get comments for a node + * and insert the comments into the comments tree. + */ + function getComments(id) { + $.ajax({ + type: 'GET', + url: opts.getCommentsURL, + data: {node: id}, + success: function(data, textStatus, request) { + var ul = $('#cl' + id); + var speed = 100; + $('#cf' + id) + .find('textarea[name="proposal"]') + .data('source', data.source); + + if (data.comments.length === 0) { + ul.html('
  • No comments yet.
  • '); + ul.data('empty', true); + } else { + // If there are comments, sort them and put them in the list. + var comments = sortComments(data.comments); + speed = data.comments.length * 100; + appendComments(comments, ul); + ul.data('empty', false); + } + $('#cn' + id).slideUp(speed + 200); + ul.slideDown(speed); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem retrieving the comments.'); + }, + dataType: 'json' + }); + } + + /** + * Add a comment via ajax and insert the comment into the comment tree. + */ + function addComment(form) { + var node_id = form.find('input[name="node"]').val(); + var parent_id = form.find('input[name="parent"]').val(); + var text = form.find('textarea[name="comment"]').val(); + var proposal = form.find('textarea[name="proposal"]').val(); + + if (text == '') { + showError('Please enter a comment.'); + return; + } + + // Disable the form that is being submitted. + form.find('textarea,input').attr('disabled', 'disabled'); + + // Send the comment to the server. + $.ajax({ + type: "POST", + url: opts.addCommentURL, + dataType: 'json', + data: { + node: node_id, + parent: parent_id, + text: text, + proposal: proposal + }, + success: function(data, textStatus, error) { + // Reset the form. + if (node_id) { + hideProposeChange(node_id); + } + form.find('textarea') + .val('') + .add(form.find('input')) + .removeAttr('disabled'); + var ul = $('#cl' + (node_id || parent_id)); + if (ul.data('empty')) { + $(ul).empty(); + ul.data('empty', false); + } + insertComment(data.comment); + var ao = $('#ao' + node_id); + ao.find('img').attr({'src': opts.commentBrightImage}); + if (node_id) { + // if this was a "root" comment, remove the commenting box + // (the user can get it back by reopening the comment popup) + $('#ca' + node_id).slideUp(); + } + }, + error: function(request, textStatus, error) { + form.find('textarea,input').removeAttr('disabled'); + showError('Oops, there was a problem adding the comment.'); + } + }); + } + + /** + * Recursively append comments to the main comment list and children + * lists, creating the comment tree. + */ + function appendComments(comments, ul) { + $.each(comments, function() { + var div = createCommentDiv(this); + ul.append($(document.createElement('li')).html(div)); + appendComments(this.children, div.find('ul.comment-children')); + // To avoid stagnating data, don't store the comments children in data. + this.children = null; + div.data('comment', this); + }); + } + + /** + * After adding a new comment, it must be inserted in the correct + * location in the comment tree. + */ + function insertComment(comment) { + var div = createCommentDiv(comment); + + // To avoid stagnating data, don't store the comments children in data. + comment.children = null; + div.data('comment', comment); + + var ul = $('#cl' + (comment.node || comment.parent)); + var siblings = getChildren(ul); + + var li = $(document.createElement('li')); + li.hide(); + + // Determine where in the parents children list to insert this comment. + for(i=0; i < siblings.length; i++) { + if (comp(comment, siblings[i]) <= 0) { + $('#cd' + siblings[i].id) + .parent() + .before(li.html(div)); + li.slideDown('fast'); + return; + } + } + + // If we get here, this comment rates lower than all the others, + // or it is the only comment in the list. + ul.append(li.html(div)); + li.slideDown('fast'); + } + + function acceptComment(id) { + $.ajax({ + type: 'POST', + url: opts.acceptCommentURL, + data: {id: id}, + success: function(data, textStatus, request) { + $('#cm' + id).fadeOut('fast'); + $('#cd' + id).removeClass('moderate'); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem accepting the comment.'); + } + }); + } + + function deleteComment(id) { + $.ajax({ + type: 'POST', + url: opts.deleteCommentURL, + data: {id: id}, + success: function(data, textStatus, request) { + var div = $('#cd' + id); + if (data == 'delete') { + // Moderator mode: remove the comment and all children immediately + div.slideUp('fast', function() { + div.remove(); + }); + return; + } + // User mode: only mark the comment as deleted + div + .find('span.user-id:first') + .text('[deleted]').end() + .find('div.comment-text:first') + .text('[deleted]').end() + .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) + .remove(); + var comment = div.data('comment'); + comment.username = '[deleted]'; + comment.text = '[deleted]'; + div.data('comment', comment); + }, + error: function(request, textStatus, error) { + showError('Oops, there was a problem deleting the comment.'); + } + }); + } + + function showProposal(id) { + $('#sp' + id).hide(); + $('#hp' + id).show(); + $('#pr' + id).slideDown('fast'); + } + + function hideProposal(id) { + $('#hp' + id).hide(); + $('#sp' + id).show(); + $('#pr' + id).slideUp('fast'); + } + + function showProposeChange(id) { + $('#pc' + id).hide(); + $('#hc' + id).show(); + var textarea = $('#pt' + id); + textarea.val(textarea.data('source')); + $.fn.autogrow.resize(textarea[0]); + textarea.slideDown('fast'); + } + + function hideProposeChange(id) { + $('#hc' + id).hide(); + $('#pc' + id).show(); + var textarea = $('#pt' + id); + textarea.val('').removeAttr('disabled'); + textarea.slideUp('fast'); + } + + function toggleCommentMarkupBox(id) { + $('#mb' + id).toggle(); + } + + /** Handle when the user clicks on a sort by link. */ + function handleReSort(link) { + var classes = link.attr('class').split(/\s+/); + for (var i=0; iThank you! Your comment will show up ' + + 'once it is has been approved by a moderator.'); + } + // Prettify the comment rating. + comment.pretty_rating = comment.rating + ' point' + + (comment.rating == 1 ? '' : 's'); + // Make a class (for displaying not yet moderated comments differently) + comment.css_class = comment.displayed ? '' : ' moderate'; + // Create a div for this comment. + var context = $.extend({}, opts, comment); + var div = $(renderTemplate(commentTemplate, context)); + + // If the user has voted on this comment, highblight the correct arrow. + if (comment.vote) { + var direction = (comment.vote == 1) ? 'u' : 'd'; + div.find('#' + direction + 'v' + comment.id).hide(); + div.find('#' + direction + 'u' + comment.id).show(); + } + + if (opts.moderator || comment.text != '[deleted]') { + div.find('a.reply').show(); + if (comment.proposal_diff) + div.find('#sp' + comment.id).show(); + if (opts.moderator && !comment.displayed) + div.find('#cm' + comment.id).show(); + if (opts.moderator || (opts.username == comment.username)) + div.find('#dc' + comment.id).show(); + } + return div; + } + + /** + * A simple template renderer. Placeholders such as <%id%> are replaced + * by context['id'] with items being escaped. Placeholders such as <#id#> + * are not escaped. + */ + function renderTemplate(template, context) { + var esc = $(document.createElement('div')); + + function handle(ph, escape) { + var cur = context; + $.each(ph.split('.'), function() { + cur = cur[this]; + }); + return escape ? esc.text(cur || "").html() : cur; + } + + return template.replace(/<([%#])([\w\.]*)\1>/g, function() { + return handle(arguments[2], arguments[1] == '%' ? true : false); + }); + } + + /** Flash an error message briefly. */ + function showError(message) { + $(document.createElement('div')).attr({'class': 'popup-error'}) + .append($(document.createElement('div')) + .attr({'class': 'error-message'}).text(message)) + .appendTo('body') + .fadeIn("slow") + .delay(2000) + .fadeOut("slow"); + } + + /** Add a link the user uses to open the comments popup. */ + $.fn.comment = function() { + return this.each(function() { + var id = $(this).attr('id').substring(1); + var count = COMMENT_METADATA[id]; + var title = count + ' comment' + (count == 1 ? '' : 's'); + var image = count > 0 ? opts.commentBrightImage : opts.commentImage; + var addcls = count == 0 ? ' nocomment' : ''; + $(this) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-open' + addcls, + id: 'ao' + id + }) + .append($(document.createElement('img')).attr({ + src: image, + alt: 'comment', + title: title + })) + .click(function(event) { + event.preventDefault(); + show($(this).attr('id').substring(2)); + }) + ) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-close hidden', + id: 'ah' + id + }) + .append($(document.createElement('img')).attr({ + src: opts.closeCommentImage, + alt: 'close', + title: 'close' + })) + .click(function(event) { + event.preventDefault(); + hide($(this).attr('id').substring(2)); + }) + ); + }); + }; + + var opts = { + processVoteURL: '/_process_vote', + addCommentURL: '/_add_comment', + getCommentsURL: '/_get_comments', + acceptCommentURL: '/_accept_comment', + deleteCommentURL: '/_delete_comment', + commentImage: '/static/_static/comment.png', + closeCommentImage: '/static/_static/comment-close.png', + loadingImage: '/static/_static/ajax-loader.gif', + commentBrightImage: '/static/_static/comment-bright.png', + upArrow: '/static/_static/up.png', + downArrow: '/static/_static/down.png', + upArrowPressed: '/static/_static/up-pressed.png', + downArrowPressed: '/static/_static/down-pressed.png', + voting: false, + moderator: false + }; + + if (typeof COMMENT_OPTIONS != "undefined") { + opts = jQuery.extend(opts, COMMENT_OPTIONS); + } + + var popupTemplate = '\ +
    \ +

    \ + Sort by:\ + best rated\ + newest\ + oldest\ +

    \ +
    Comments
    \ +
    \ + loading comments...
    \ +
      \ +
      \ +

      Add a comment\ + (markup):

      \ +
      \ + reStructured text markup: *emph*, **strong**, \ + ``code``, \ + code blocks: :: and an indented block after blank line
      \ +
      \ + \ +

      \ + \ + Propose a change ▹\ + \ + \ + Propose a change ▿\ + \ +

      \ + \ + \ + \ + \ +
      \ +
      \ +
      '; + + var commentTemplate = '\ +
      \ +
      \ +
      \ + \ + \ + \ + \ + \ + \ +
      \ +
      \ + \ + \ + \ + \ + \ + \ +
      \ +
      \ +
      \ +

      \ + <%username%>\ + <%pretty_rating%>\ + <%time.delta%>\ +

      \ +
      <#text#>
      \ +

      \ + \ + reply ▿\ + proposal ▹\ + proposal ▿\ + \ + \ +

      \ +
      \
      +<#proposal_diff#>\
      +        
      \ +
        \ +
        \ +
        \ +
        \ + '; + + var replyTemplate = '\ +
      • \ +
        \ +
        \ + \ + \ + \ + \ + \ +
        \ +
        \ +
      • '; + + $(document).ready(function() { + init(); + }); +})(jQuery); + +$(document).ready(function() { + // add comment anchors for all paragraphs that are commentable + $('.sphinx-has-comment').comment(); + + // highlight search words in search results + $("div.context").each(function() { + var params = $.getQueryParameters(); + var terms = (params.q) ? params.q[0].split(/\s+/) : []; + var result = $(this); + $.each(terms, function() { + result.highlightText(this.toLowerCase(), 'highlighted'); + }); + }); + + // directly open comment window if requested + var anchor = document.location.hash; + if (anchor.substring(0, 9) == '#comment-') { + $('#ao' + anchor.substring(9)).click(); + document.location.hash = '#s' + anchor.substring(9); + } +}); diff --git a/sphinx/themes/basic/theme.conf b/sphinx/themes/basic/theme.conf index d1fe6d1f9..f7283730b 100644 --- a/sphinx/themes/basic/theme.conf +++ b/sphinx/themes/basic/theme.conf @@ -5,3 +5,4 @@ pygments_style = none [options] nosidebar = false +sidebarwidth = 230 \ No newline at end of file diff --git a/sphinx/themes/default/layout.html b/sphinx/themes/default/layout.html index 43ee2cdf4..d91a56555 100644 --- a/sphinx/themes/default/layout.html +++ b/sphinx/themes/default/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the default theme. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} diff --git a/sphinx/themes/default/static/default.css_t b/sphinx/themes/default/static/default.css_t index f200a0fea..85c9436a9 100644 --- a/sphinx/themes/default/static/default.css_t +++ b/sphinx/themes/default/static/default.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- default theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -32,7 +32,7 @@ div.documentwrapper { } div.bodywrapper { - margin: 0 0 0 230px; + margin: 0 0 0 {{ theme_sidebarwidth|toint }}px; } div.body { @@ -43,7 +43,7 @@ div.body { {%- if theme_rightsidebar|tobool %} div.bodywrapper { - margin: 0 230px 0 0; + margin: 0 {{ theme_sidebarwidth|toint }}px 0 0; } {%- endif %} @@ -147,6 +147,12 @@ div.sphinxsidebar input { font-size: 1em; } +{% if theme_collapsiblesidebar|tobool %} +/* for collapsible sidebar */ +div#sidebarbutton { + background-color: {{ theme_sidebarbtncolor }}; +} +{% endif %} /* -- hyperlink styles ------------------------------------------------------ */ @@ -174,6 +180,11 @@ a.external:hover { text-decoration: none; border-bottom: none; } + +a.external:visited { + text-decoration: none; + border-bottom: 1px dashed {{ theme_visitedlinkcolor }}; +} {% endif %} /* -- body styles ----------------------------------------------------------- */ diff --git a/sphinx/themes/default/static/sidebar.js b/sphinx/themes/default/static/sidebar.js index be206ede9..a45e1926a 100644 --- a/sphinx/themes/default/static/sidebar.js +++ b/sphinx/themes/default/static/sidebar.js @@ -16,7 +16,7 @@ * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,6 +29,9 @@ $(function() { var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); + // for some reason, the document has no sidebar; do not run into errors + if (!sidebar.length) return; + // original margin-left of the bodywrapper and width of the sidebar // with the sidebar expanded var bw_margin_expanded = bodywrapper.css('margin-left'); @@ -91,6 +94,7 @@ $(function() { '
        «
        ' ); var sidebarbutton = $('#sidebarbutton'); + light_color = sidebarbutton.css('background-color'); // find the height of the viewport to center the '<<' in the page var viewport_height; if (window.innerHeight) @@ -144,4 +148,4 @@ $(function() { add_sidebar_button(); var sidebarbutton = $('#sidebarbutton'); set_position_from_cookie(); -}); \ No newline at end of file +}); diff --git a/sphinx/themes/default/theme.conf b/sphinx/themes/default/theme.conf index ad5586b5e..59704aca0 100644 --- a/sphinx/themes/default/theme.conf +++ b/sphinx/themes/default/theme.conf @@ -12,6 +12,7 @@ externalrefs = false footerbgcolor = #11303d footertextcolor = #ffffff sidebarbgcolor = #1c4e63 +sidebarbtncolor = #3c6e83 sidebartextcolor = #ffffff sidebarlinkcolor = #98dbcc relbarbgcolor = #133f52 diff --git a/sphinx/themes/epub/epub-cover.html b/sphinx/themes/epub/epub-cover.html index ef54631f8..f80889250 100644 --- a/sphinx/themes/epub/epub-cover.html +++ b/sphinx/themes/epub/epub-cover.html @@ -4,7 +4,7 @@ Sample template for the html cover page. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "layout.html" %} diff --git a/sphinx/themes/epub/layout.html b/sphinx/themes/epub/layout.html index 8a348beda..24395a66a 100644 --- a/sphinx/themes/epub/layout.html +++ b/sphinx/themes/epub/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the epub theme. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} diff --git a/sphinx/themes/epub/static/epub.css b/sphinx/themes/epub/static/epub.css index de21c4626..d2c51751a 100644 --- a/sphinx/themes/epub/static/epub.css +++ b/sphinx/themes/epub/static/epub.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- epub theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -343,6 +343,7 @@ dl.glossary dt { pre { font-family: "LiberationNarrow", monospace; overflow: auto; + overflow-y: hidden; } td.linenos pre { diff --git a/sphinx/themes/haiku/layout.html b/sphinx/themes/haiku/layout.html index c62580893..719dba770 100644 --- a/sphinx/themes/haiku/layout.html +++ b/sphinx/themes/haiku/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the haiku theme. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} diff --git a/sphinx/themes/haiku/static/haiku.css_t b/sphinx/themes/haiku/static/haiku.css_t index 93007dfb9..19f4e0bfd 100644 --- a/sphinx/themes/haiku/static/haiku.css_t +++ b/sphinx/themes/haiku/static/haiku.css_t @@ -16,7 +16,7 @@ * Braden Ewing * Humdinger * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -292,7 +292,7 @@ li { line-height: 1.3; } -div.content li { +div.content ul > li { -moz-background-clip:border; -moz-background-inline-policy:continuous; -moz-background-origin:padding; diff --git a/sphinx/themes/nature/static/nature.css_t b/sphinx/themes/nature/static/nature.css_t index d0aa912b2..a98bd4209 100644 --- a/sphinx/themes/nature/static/nature.css_t +++ b/sphinx/themes/nature/static/nature.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- nature theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -28,7 +28,7 @@ div.documentwrapper { } div.bodywrapper { - margin: 0 0 0 230px; + margin: 0 0 0 {{ theme_sidebarwidth|toint }}px; } hr { diff --git a/sphinx/themes/pyramid/layout.html b/sphinx/themes/pyramid/layout.html new file mode 100644 index 000000000..1887361ee --- /dev/null +++ b/sphinx/themes/pyramid/layout.html @@ -0,0 +1,24 @@ +{% extends "basic/layout.html" %} + +{%- block extrahead %} + + + +{% endblock %} + +{% block header %} +{%- if logo %} +
        + +
        +{%- 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 000000000..263fbd586 Binary files /dev/null and b/sphinx/themes/pyramid/static/dialog-note.png differ diff --git a/sphinx/themes/pyramid/static/dialog-seealso.png b/sphinx/themes/pyramid/static/dialog-seealso.png new file mode 100644 index 000000000..3eb7b05c8 Binary files /dev/null and b/sphinx/themes/pyramid/static/dialog-seealso.png differ diff --git a/sphinx/themes/pyramid/static/dialog-topic.png b/sphinx/themes/pyramid/static/dialog-topic.png new file mode 100644 index 000000000..2ac57475c Binary files /dev/null and b/sphinx/themes/pyramid/static/dialog-topic.png differ diff --git a/sphinx/themes/pyramid/static/dialog-warning.png b/sphinx/themes/pyramid/static/dialog-warning.png new file mode 100644 index 000000000..7233d45d8 Binary files /dev/null and b/sphinx/themes/pyramid/static/dialog-warning.png differ diff --git a/sphinx/themes/pyramid/static/epub.css b/sphinx/themes/pyramid/static/epub.css new file mode 100644 index 000000000..28dff738b --- /dev/null +++ b/sphinx/themes/pyramid/static/epub.css @@ -0,0 +1,310 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: {{ theme_bodyfont }}; + font-size: 100%; + background-color: {{ theme_footerbgcolor }}; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: {{ theme_sidebarbgcolor }}; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: {{ theme_bgcolor }}; + color: {{ theme_textcolor }}; + padding: 0 20px 30px 20px; +} + +{%- if theme_rightsidebar|tobool %} +div.bodywrapper { + margin: 0 230px 0 0; +} +{%- endif %} + +div.footer { + color: {{ theme_footertextcolor }}; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: {{ theme_footertextcolor }}; + text-decoration: underline; +} + +div.related { + background-color: {{ theme_relbarbgcolor }}; + line-height: 30px; + color: {{ theme_relbartextcolor }}; +} + +div.related a { + color: {{ theme_relbarlinkcolor }}; +} + +div.sphinxsidebar { + {%- if theme_stickysidebar|tobool %} + top: 30px; + bottom: 0; + margin: 0; + position: fixed; + overflow: auto; + height: auto; + {%- endif %} + {%- if theme_rightsidebar|tobool %} + float: right; + {%- if theme_stickysidebar|tobool %} + right: 0; + {%- endif %} + {%- endif %} +} + +{%- if theme_stickysidebar|tobool %} +/* this is nice, but it it leads to hidden headings when jumping + to an anchor */ +/* +div.related { + position: fixed; +} + +div.documentwrapper { + margin-top: 30px; +} +*/ +{%- endif %} + +div.sphinxsidebar h3 { + font-family: {{ theme_headfont }}; + color: {{ theme_sidebartextcolor }}; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: {{ theme_sidebartextcolor }}; +} + +div.sphinxsidebar h4 { + font-family: {{ theme_headfont }}; + color: {{ theme_sidebartextcolor }}; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: {{ theme_sidebartextcolor }}; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: {{ theme_sidebartextcolor }}; +} + +div.sphinxsidebar a { + color: {{ theme_sidebarlinkcolor }}; +} + +div.sphinxsidebar input { + border: 1px solid {{ theme_sidebarlinkcolor }}; + font-family: sans-serif; + font-size: 1em; +} + +{% if theme_collapsiblesidebar|tobool %} +/* for collapsible sidebar */ +div#sidebarbutton { + background-color: {{ theme_sidebarbtncolor }}; +} +{% endif %} + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: {{ theme_linkcolor }}; + text-decoration: none; +} + +a:visited { + color: {{ theme_visitedlinkcolor }}; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +{% if theme_externalrefs|tobool %} +a.external { + text-decoration: none; + border-bottom: 1px dashed {{ theme_linkcolor }}; +} + +a.external:hover { + text-decoration: none; + border-bottom: none; +} + +a.external:visited { + text-decoration: none; + border-bottom: 1px dashed {{ theme_visitedlinkcolor }}; +} +{% endif %} + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: {{ theme_headfont }}; + background-color: {{ theme_headbgcolor }}; + font-weight: normal; + color: {{ theme_headtextcolor }}; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: {{ theme_headlinkcolor }}; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: {{ theme_headlinkcolor }}; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: {{ theme_codebgcolor }}; + color: {{ theme_codetextcolor }}; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: {{ theme_bodyfont }}; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} diff --git a/sphinx/themes/pyramid/static/footerbg.png b/sphinx/themes/pyramid/static/footerbg.png new file mode 100644 index 000000000..1fbc873da Binary files /dev/null and b/sphinx/themes/pyramid/static/footerbg.png differ diff --git a/sphinx/themes/pyramid/static/headerbg.png b/sphinx/themes/pyramid/static/headerbg.png new file mode 100644 index 000000000..0596f2020 Binary files /dev/null and b/sphinx/themes/pyramid/static/headerbg.png differ diff --git a/sphinx/themes/pyramid/static/ie6.css b/sphinx/themes/pyramid/static/ie6.css new file mode 100644 index 000000000..74baa5d5a --- /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 000000000..2369cfb7d Binary files /dev/null and b/sphinx/themes/pyramid/static/middlebg.png differ diff --git a/sphinx/themes/pyramid/static/pyramid.css_t b/sphinx/themes/pyramid/static/pyramid.css_t new file mode 100644 index 000000000..442cbec06 --- /dev/null +++ b/sphinx/themes/pyramid/static/pyramid.css_t @@ -0,0 +1,323 @@ +/* + * pylons.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- pylons theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: "Nobile", sans-serif; + font-size: 100%; + background-color: #393939; + color: #ffffff; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 {{ theme_sidebarwidth }}px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.document { + background-color: #eee; +} + +div.header { + width:100%; + background: #f4ad32 url(headerbg.png) repeat-x 0 top; + border-bottom: 2px solid #ffffff; +} + +div.logo { + text-align: center; + padding-top: 10px; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; + font-size: 1em; + border: 2px solid #ddd; + border-right-style: none; + overflow: auto; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 13px 0; + text-align: center; + font-size: 75%; + background: transparent; + clear:both; +} + +div.footer a { + color: #ffffff; + text-decoration: none; +} + +div.footer a:hover { + color: #e88f00; + text-decoration: underline; +} + +div.related { + line-height: 30px; + color: #373839; + font-size: 0.8em; + background-color: #eee; +} + +div.related a { + color: #1b61d6; +} + +div.related ul { + padding-left: {{ theme_sidebarwidth|toint + 10 }}px; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper{ + padding: 10px 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: "Neuton", sans-serif; + color: #373839; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 5px 10px; + border-bottom: 2px solid #ddd; +} + +div.sphinxsidebar h4{ + font-size: 1.3em; +} + +div.sphinxsidebar h3 a { + color: #000000; +} + + +div.sphinxsidebar p { + color: #888; + padding: 5px 20px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 10px 20px; + padding: 0; + color: #373839; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar input[type=text]{ + margin-left: 20px; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 2px solid #c6d880; + background-color: #e6efc2; + width: 40%; + float: right; + border-right-style: none; + border-left-style: none; + padding: 10px 20px; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- body styles ----------------------------------------------------------- */ + +a, a .pre { + color: #1b61d6; + text-decoration: none; +} + +a:hover, a:hover .pre { + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: "Neuton", sans-serif; + background-color: #ffffff; + font-weight: normal; + color: #373839; + margin: 30px 0px 10px 0px; + padding: 5px 0; +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 150%; background-color: #ffffff; } +div.body h3 { font-size: 120%; background-color: #ffffff; } +div.body h4 { font-size: 110%; background-color: #ffffff; } +div.body h5 { font-size: 100%; background-color: #ffffff; } +div.body h6 { font-size: 100%; background-color: #ffffff; } + +a.headerlink { + color: #1b61d6; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + text-decoration: underline; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.highlight{ + background-color: white; +} + +div.note { + border: 2px solid #7a9eec; + border-right-style: none; + border-left-style: none; + padding: 10px 20px 10px 60px; + background: #e1ecfe url(dialog-note.png) no-repeat 10px 8px; +} + +div.seealso { + background: #fff6bf url(dialog-seealso.png) no-repeat 10px 8px; + border: 2px solid #ffd324; + border-left-style: none; + border-right-style: none; + padding: 10px 20px 10px 60px; +} + +div.topic { + background: #eeeeee; + border: 2px solid #C6C9CB; + padding: 10px 20px; + border-right-style: none; + border-left-style: none; +} + +div.warning { + background: #fbe3e4 url(dialog-warning.png) no-repeat 10px 8px; + border: 2px solid #fbc2c4; + border-right-style: none; + border-left-style: none; + padding: 10px 20px 10px 60px; +} + +p.admonition-title { + display: none; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + background-color: #fafafa; + color: #222; + line-height: 1.2em; + border: 2px solid #C6C9CB; + font-size: 1.1em; + margin: 1.5em 0 1.5em 0; + border-right-style: none; + border-left-style: none; +} + +tt { + background-color: transparent; + color: #222; + font-size: 1.1em; + font-family: monospace; +} + +.viewcode-back { + font-family: "Nobile", sans-serif; +} + +div.viewcode-block:target { + background-color: #fff6bf; + border: 2px solid #ffd324; + border-left-style: none; + border-right-style: none; + padding: 10px 20px; +} + +table.highlighttable { + width: 100%; +} + +table.highlighttable td { + padding: 0; +} + +a em.std-term { + color: #007f00; +} + +a:hover em.std-term { + text-decoration: underline; +} + +.download { + font-family: "Nobile", sans-serif; + font-weight: normal; + font-style: normal; +} + +tt.xref { + font-weight: normal; + font-style: normal; +} diff --git a/sphinx/themes/pyramid/static/transparent.gif b/sphinx/themes/pyramid/static/transparent.gif new file mode 100644 index 000000000..0341802e5 Binary files /dev/null and b/sphinx/themes/pyramid/static/transparent.gif differ diff --git a/sphinx/themes/pyramid/theme.conf b/sphinx/themes/pyramid/theme.conf new file mode 100644 index 000000000..409579fdd --- /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/layout.html b/sphinx/themes/scrolls/layout.html index afec8415d..92cb694db 100644 --- a/sphinx/themes/scrolls/layout.html +++ b/sphinx/themes/scrolls/layout.html @@ -5,7 +5,7 @@ Sphinx layout template for the scrolls theme, originally written by Armin Ronacher. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} diff --git a/sphinx/themes/scrolls/static/scrolls.css_t b/sphinx/themes/scrolls/static/scrolls.css_t index 589f91abd..e3d26ea39 100644 --- a/sphinx/themes/scrolls/static/scrolls.css_t +++ b/sphinx/themes/scrolls/static/scrolls.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- scrolls theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/sphinxdoc/layout.html b/sphinx/themes/sphinxdoc/layout.html index 2d653f9fc..c93191851 100644 --- a/sphinx/themes/sphinxdoc/layout.html +++ b/sphinx/themes/sphinxdoc/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the sphinxdoc theme. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} diff --git a/sphinx/themes/sphinxdoc/static/sphinxdoc.css b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t similarity index 97% rename from sphinx/themes/sphinxdoc/static/sphinxdoc.css rename to sphinx/themes/sphinxdoc/static/sphinxdoc.css_t index c7e6e335a..f535696b2 100644 --- a/sphinx/themes/sphinxdoc/static/sphinxdoc.css +++ b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t @@ -5,7 +5,7 @@ * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -38,7 +38,7 @@ div.document { } div.bodywrapper { - margin: 0 240px 0 0; + margin: 0 {{ theme_sidebarwidth|toint + 10 }}px 0 0; border-right: 1px solid #ccc; } @@ -88,7 +88,7 @@ div.sphinxsidebarwrapper { div.sphinxsidebar { margin: 0; padding: 0.5em 15px 15px 0; - width: 210px; + width: {{ theme_sidebarwidth|toint - 20 }}px; float: right; font-size: 1em; text-align: left; diff --git a/sphinx/themes/traditional/static/traditional.css b/sphinx/themes/traditional/static/traditional.css_t similarity index 94% rename from sphinx/themes/traditional/static/traditional.css rename to sphinx/themes/traditional/static/traditional.css_t index c9980fa57..51567255b 100644 --- a/sphinx/themes/traditional/static/traditional.css +++ b/sphinx/themes/traditional/static/traditional.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- traditional docs.python.org theme. * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -23,7 +23,7 @@ div.documentwrapper { } div.bodywrapper { - margin: 0 230px 0 0; + margin: 0 {{ theme_sidebarwidth }}px 0 0; } div.body { @@ -40,7 +40,7 @@ div.sphinxsidebarwrapper { div.sphinxsidebar { float: right; margin-left: -100%; - width: 230px; + width: {{ theme_sidebarwidth }}px; } div.clearer { @@ -667,38 +667,6 @@ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { font-style: italic; } -form.comment { - margin: 0; - padding: 10px 30px 10px 30px; - background-color: #eee; -} - -form.comment h3 { - background-color: #326591; - color: white; - margin: -10px -30px 10px -30px; - padding: 5px; - font-size: 1.4em; -} - -form.comment input, -form.comment textarea { - border: 1px solid #ccc; - padding: 2px; - font-family: sans-serif; - font-size: 13px; -} - -form.comment input[type="text"] { - width: 240px; -} - -form.comment textarea { - width: 100%; - height: 200px; - margin-bottom: 10px; -} - /* :::: PRINT :::: */ @media print { div.documentwrapper { diff --git a/sphinx/theming.py b/sphinx/theming.py index 0d0f28634..68d11a490 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -5,7 +5,7 @@ Theming support for HTML builders. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -30,13 +30,13 @@ class Theme(object): themes = {} @classmethod - def init_themes(cls, builder): + def init_themes(cls, confdir, theme_path, warn=None): """Search all theme paths for available themes.""" - cls.themepath = list(builder.config.html_theme_path) + cls.themepath = list(theme_path) cls.themepath.append(path.join(package_dir, 'themes')) for themedir in cls.themepath[::-1]: - themedir = path.join(builder.confdir, themedir) + themedir = path.join(confdir, themedir) if not path.isdir(themedir): continue for theme in os.listdir(themedir): @@ -48,8 +48,9 @@ class Theme(object): tname = theme[:-4] tinfo = zfile except Exception: - builder.warn('file %r on theme path is not a valid ' - 'zipfile or contains no theme' % theme) + if warn: + warn('file %r on theme path is not a valid ' + 'zipfile or contains no theme' % theme) continue else: if not path.isfile(path.join(themedir, theme, THEMECONF)): @@ -98,8 +99,7 @@ class Theme(object): self.base = Theme(inherit) def get_confstr(self, section, name, default=NODEFAULT): - """ - Return the value for a theme configuration setting, searching the + """Return the value for a theme configuration setting, searching the base theme chain. """ try: @@ -114,9 +114,7 @@ class Theme(object): return default def get_options(self, overrides): - """ - Return a dictionary of theme options and their values. - """ + """Return a dictionary of theme options and their values.""" chain = [self.themeconf] base = self.base while base is not None: @@ -135,8 +133,7 @@ class Theme(object): return options def get_dirchain(self): - """ - Return a list of theme directories, beginning with this theme's, + """Return a list of theme directories, beginning with this theme's, then the base theme's, then that one's base theme's, etc. """ chain = [self.themedir] @@ -147,9 +144,7 @@ class Theme(object): return chain def cleanup(self): - """ - Remove temporary directories. - """ + """Remove temporary directories.""" if self.themedir_created: try: shutil.rmtree(self.themedir) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 8d1298cd3..8218c04a9 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -5,7 +5,7 @@ Utility functions for Sphinx. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,6 +18,8 @@ import tempfile import posixpath import traceback from os import path +from codecs import open +from collections import deque import docutils from docutils.utils import relative_path @@ -48,8 +50,7 @@ def docname_join(basedocname, docname): def get_matching_files(dirname, exclude_matchers=()): - """ - Get all file names in a directory, recursively. + """Get all file names in a directory, recursively. Exclude files and dirs matching some matcher in *exclude_matchers*. """ @@ -75,9 +76,8 @@ def get_matching_files(dirname, exclude_matchers=()): def get_matching_docs(dirname, suffix, exclude_matchers=()): - """ - Get all file names (without suffix) matching a suffix in a - directory, recursively. + """Get all file names (without suffix) matching a suffix in a directory, + recursively. Exclude files and dirs matching a pattern in *exclude_patterns*. """ @@ -114,9 +114,9 @@ class FilenameUniqDict(dict): def purge_doc(self, docname): for filename, (docs, _) in self.items(): docs.discard(docname) - #if not docs: - # del self[filename] - # self._existing.discard(filename) + if not docs: + del self[filename] + self._existing.discard(filename) def __getstate__(self): return self._existing @@ -140,8 +140,8 @@ def copy_static_entry(source, targetdir, builder, context={}, target = path.join(targetdir, path.basename(source)) if source.lower().endswith('_t') and builder.templates: # templated! - fsrc = open(source, 'rb') - fdst = open(target[:-2], 'wb') + fsrc = open(source, 'r', encoding='utf-8') + fdst = open(target[:-2], 'w', encoding='utf-8') fdst.write(builder.templates.render_string(fsrc.read(), context)) fsrc.close() fdst.close() @@ -162,17 +162,24 @@ def copy_static_entry(source, targetdir, builder, context={}, shutil.copytree(source, target) +_DEBUG_HEADER = '''\ +# Sphinx version: %s +# Python version: %s +# Docutils version: %s %s +# Jinja2 version: %s +''' + def save_traceback(): - """ - Save the current exception's traceback in a temporary file. - """ + """Save the current exception's traceback in a temporary file.""" + import platform exc = traceback.format_exc() fd, path = tempfile.mkstemp('.log', 'sphinx-err-') - os.write(fd, '# Sphinx version: %s\n' % sphinx.__version__) - os.write(fd, '# Docutils version: %s %s\n' % (docutils.__version__, - docutils.__version_details__)) - os.write(fd, '# Jinja2 version: %s\n' % jinja2.__version__) - os.write(fd, exc) + os.write(fd, (_DEBUG_HEADER % + (sphinx.__version__, + platform.python_version(), + docutils.__version__, docutils.__version_details__, + jinja2.__version__)).encode('utf-8')) + os.write(fd, exc.encode('utf-8')) os.close(fd) return path @@ -202,7 +209,7 @@ def get_module_source(modname): lfilename = filename.lower() if lfilename.endswith('.pyo') or lfilename.endswith('.pyc'): filename = filename[:-1] - elif not lfilename.endswith('.py'): + elif not (lfilename.endswith('.py') or lfilename.endswith('.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) @@ -225,8 +232,7 @@ class Tee(object): def parselinenos(spec, total): - """ - Parse a line number spec (such as "1,2,4-6") and return a list of + """Parse a line number spec (such as "1,2,4-6") and return a list of wanted line numbers. """ items = list() @@ -279,10 +285,16 @@ def rpartition(s, t): return '', s +def split_into(n, type, value): + """Split an index entry into a given number of parts at semicolons.""" + parts = map(lambda x: x.strip(), value.split(';', n-1)) + if sum(1 for part in parts if part) < n: + raise ValueError('invalid %s index entry %r' % (type, value)) + return parts + + def format_exception_cut_frames(x=1): - """ - Format an exception with traceback, but only the last x frames. - """ + """Format an exception with traceback, but only the last x frames.""" typ, val, tb = sys.exc_info() #res = ['Traceback (most recent call last):\n'] res = [] @@ -290,3 +302,34 @@ def format_exception_cut_frames(x=1): res += tbres[-x:] res += traceback.format_exception_only(typ, val) return ''.join(res) + + +class PeekableIterator(object): + """ + An iterator which wraps any iterable and makes it possible to peek to see + what's the next item. + """ + def __init__(self, iterable): + self.remaining = deque() + self._iterator = iter(iterable) + + def __iter__(self): + return self + + def next(self): + """Return the next item from the iterator.""" + if self.remaining: + return self.remaining.popleft() + return self._iterator.next() + + def push(self, item): + """Push the `item` on the internal stack, it will be returned on the + next :meth:`next` call. + """ + self.remaining.append(item) + + def peek(self): + """Return the next item without changing the state of the iterator.""" + item = self.next() + self.push(item) + return item diff --git a/sphinx/util/compat.py b/sphinx/util/compat.py index 3fbfe4b26..1a263cff1 100644 --- a/sphinx/util/compat.py +++ b/sphinx/util/compat.py @@ -5,7 +5,7 @@ Stuff for docutils compatibility. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/console.py b/sphinx/util/console.py index b0f03921c..ac85034d9 100644 --- a/sphinx/util/console.py +++ b/sphinx/util/console.py @@ -5,7 +5,7 @@ Format colored console output. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index 1ae49c6c5..896319f56 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -6,7 +6,7 @@ "Doc fields" are reST field lists in object descriptions that will be domain-specifically transformed to a more appealing presentation. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -129,26 +129,40 @@ class TypedField(GroupedField): is_typed = True def __init__(self, name, names=(), typenames=(), label=None, - rolename=None, typerolename=None): - GroupedField.__init__(self, name, names, label, rolename, False) + rolename=None, typerolename=None, can_collapse=False): + GroupedField.__init__(self, name, names, label, rolename, can_collapse) self.typenames = typenames self.typerolename = typerolename def make_field(self, types, domain, items): - fieldname = nodes.field_name('', self.label) - listnode = self.list_type() - for fieldarg, content in items: + def handle_item(fieldarg, content): par = nodes.paragraph() par += self.make_xref(self.rolename, domain, fieldarg, nodes.strong) if fieldarg in types: - typename = u''.join(n.astext() for n in types[fieldarg]) par += nodes.Text(' (') - par += self.make_xref(self.typerolename, domain, typename) + # 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 = u''.join(n.astext() for n in fieldtype) + par += self.make_xref(self.typerolename, domain, typename) + else: + par += fieldtype par += nodes.Text(')') par += nodes.Text(' -- ') par += content - listnode += nodes.list_item('', par) - fieldbody = nodes.field_body('', listnode) + return par + + fieldname = nodes.field_name('', self.label) + if len(items) == 1 and self.can_collapse: + fieldarg, content = items[0] + bodynode = 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) @@ -160,7 +174,7 @@ class DocFieldTransformer(object): def __init__(self, directive): self.domain = directive.domain - if not hasattr(directive, '_doc_field_type_map'): + if '_doc_field_type_map' not in directive.__class__.__dict__: directive.__class__._doc_field_type_map = \ self.preprocess_fieldtypes(directive.__class__.doc_field_types) self.typemap = directive._doc_field_type_map diff --git a/sphinx/util/docstrings.py b/sphinx/util/docstrings.py index 538af653e..ba81bf00e 100644 --- a/sphinx/util/docstrings.py +++ b/sphinx/util/docstrings.py @@ -5,33 +5,36 @@ Utilities for docstring processing. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import sys -def prepare_docstring(s): - """ - Convert a docstring into lines of parseable reST. Return it as a list of - lines usable for inserting into a docutils ViewList (used as argument - of nested_parse().) An empty line is added to act as a separator between - this docstring and following content. +def prepare_docstring(s, ignore=1): + """Convert a docstring into lines of parseable reST. Remove common leading + indentation, where the indentation of a given number of lines (usually just + one) is ignored. + + Return the docstring as a list of lines usable for inserting into a docutils + ViewList (used as argument of nested_parse().) An empty line is added to + act as a separator between this docstring and following content. """ lines = s.expandtabs().splitlines() - # Find minimum indentation of any non-blank lines after first line. + # Find minimum indentation of any non-blank lines after ignored lines. margin = sys.maxint - for line in lines[1:]: + for line in lines[ignore:]: content = len(line.lstrip()) if content: indent = len(line) - content margin = min(margin, indent) - # Remove indentation. - if lines: - lines[0] = lines[0].lstrip() + # Remove indentation from ignored lines. + for i in range(ignore): + if i < len(lines): + lines[i] = lines[i].lstrip() if margin < sys.maxint: - for i in range(1, len(lines)): lines[i] = lines[i][margin:] + for i in range(ignore, len(lines)): lines[i] = lines[i][margin:] # Remove any leading blank lines. while lines and not lines[0]: lines.pop(0) @@ -42,9 +45,8 @@ def prepare_docstring(s): def prepare_commentdoc(s): - """ - Extract documentation comment lines (starting with #:) and return them as a - list of lines. Returns an empty list if there is no documentation. + """Extract documentation comment lines (starting with #:) and return them + as a list of lines. Returns an empty list if there is no documentation. """ result = [] lines = [line.strip() for line in s.expandtabs().splitlines()] diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 4f1cf9228..ff6c222d2 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -5,10 +5,48 @@ Helpers for inspecting Python modules. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import sys + +# this imports the standard library inspect module without resorting to +# relatively import this module +inspect = __import__('inspect') + + +if sys.version_info >= (2, 5): + from functools import partial + def getargspec(func): + """Like inspect.getargspec but supports functools.partial as well.""" + if inspect.ismethod(func): + func = func.im_func + parts = 0, () + if type(func) is partial: + parts = len(func.args), func.keywords.keys() + func = func.func + if not inspect.isfunction(func): + raise TypeError('%r is not a Python function' % func) + args, varargs, varkw = inspect.getargs(func.func_code) + func_defaults = func.func_defaults + if func_defaults: + func_defaults = list(func_defaults) + if parts[0]: + args = args[parts[0]:] + if parts[1]: + for arg in parts[1]: + i = args.index(arg) - len(args) + del args[i] + try: + del func_defaults[i] + except IndexError: + pass + return inspect.ArgSpec(args, varargs, varkw, func_defaults) +else: + getargspec = inspect.getargspec + + def isdescriptor(x): """Check if the object is some kind of descriptor.""" for item in '__get__', '__set__', '__delete__': @@ -41,3 +79,12 @@ def safe_getmembers(object, predicate=None): results.append((key, value)) results.sort() return results + + +def safe_repr(object): + """A repr() implementation that returns text safe to use in reST context.""" + try: + s = repr(object) + except Exception: + raise ValueError + return s.replace('\n', ' ') diff --git a/sphinx/util/jsdump.py b/sphinx/util/jsdump.py index e357128c2..191e24191 100644 --- a/sphinx/util/jsdump.py +++ b/sphinx/util/jsdump.py @@ -6,12 +6,14 @@ This module implements a simple JavaScript serializer. Uses the basestring encode function from simplejson by Bob Ippolito. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re +from sphinx.util.pycompat import u + _str_re = re.compile(r'"(\\\\|\\"|[^"])*"') _int_re = re.compile(r'\d+') _name_re = re.compile(r'[a-zA-Z]\w*') @@ -50,7 +52,7 @@ def encode_string(s): return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' def decode_string(s): - return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s) + return ESCAPED.sub(lambda m: eval(u + '"' + m.group() + '"'), s) reswords = set("""\ diff --git a/sphinx/util/jsonimpl.py b/sphinx/util/jsonimpl.py index 21f285d30..cf5ddb424 100644 --- a/sphinx/util/jsonimpl.py +++ b/sphinx/util/jsonimpl.py @@ -5,7 +5,7 @@ JSON serializer implementation wrapper. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,8 +13,10 @@ import UserString try: import json + # json-py's json module has no JSONEncoder; this will raise AttributeError + # if json-py is imported instead of the built-in json module JSONEncoder = json.JSONEncoder -except ImportError: +except (ImportError, AttributeError): try: import simplejson as json JSONEncoder = json.JSONEncoder @@ -39,5 +41,8 @@ def dumps(obj, *args, **kwds): kwds['cls'] = SphinxJSONEncoder return json.dumps(obj, *args, **kwds) -load = json.load -loads = json.loads +def load(*args, **kwds): + return json.load(*args, **kwds) + +def loads(*args, **kwds): + return json.loads(*args, **kwds) diff --git a/sphinx/util/matching.py b/sphinx/util/matching.py index c459aca2d..fa6cb7e0b 100644 --- a/sphinx/util/matching.py +++ b/sphinx/util/matching.py @@ -5,7 +5,7 @@ Pattern-matching utility functions for Sphinx. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,8 +13,7 @@ import re def _translate_pattern(pat): - """ - Translate a shell-style glob pattern to a regular expression. + """Translate a shell-style glob pattern to a regular expression. Adapted from the fnmatch module, but enhanced so that single stars don't match slashes. @@ -65,16 +64,14 @@ def compile_matchers(patterns): _pat_cache = {} def patmatch(name, pat): - """ - Return if name matches pat. Adapted from fnmatch module. - """ + """Return if name matches pat. Adapted from fnmatch module.""" if pat not in _pat_cache: _pat_cache[pat] = re.compile(_translate_pattern(pat)) return _pat_cache[pat].match(name) def patfilter(names, pat): - """ - Return the subset of the list NAMES that match PAT. + """Return the subset of the list NAMES that match PAT. + Adapted from fnmatch module. """ if pat not in _pat_cache: diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 97b585696..a241f5742 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -5,16 +5,17 @@ Docutils node-related utility functions for Sphinx. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re -import types from docutils import nodes from sphinx import addnodes +from sphinx.locale import pairindextypes +from sphinx.util.pycompat import class_types # \x00 means the "<" was backslash-escaped @@ -22,7 +23,28 @@ explicit_title_re = re.compile(r'^(.+?)\s*(?$', re.DOTALL) caption_ref_re = explicit_title_re # b/w compat alias +def extract_messages(doctree): + """Extract translatable messages from a document tree.""" + for node in doctree.traverse(nodes.TextElement): + if isinstance(node, (nodes.Invisible, nodes.Inline)): + continue + # orphan + # XXX ignore all metadata (== docinfo) + if isinstance(node, nodes.field_name) and node.children[0] == 'orphan': + continue + msg = node.rawsource.replace('\n', ' ').strip() + # XXX nodes rendering empty are likely a bug in sphinx.addnodes + if msg: + yield node, msg + + def nested_parse_with_titles(state, content, node): + """Version of state.nested_parse() that allows titles and does not require + titles to have the same decoration as the calling document. + + This is useful when the parsed content comes from a completely different + context, such as docstrings. + """ # hack around title style bookkeeping surrounding_title_styles = state.memo.title_styles surrounding_section_level = state.memo.section_level @@ -51,6 +73,46 @@ def split_explicit_title(text): return False, text, text +indextypes = [ + 'single', 'pair', 'double', 'triple', 'see', 'seealso', +] + +def process_index_entry(entry, targetid): + indexentries = [] + entry = entry.strip() + oentry = entry + main = '' + if entry.startswith('!'): + main = 'main' + entry = entry[1:].lstrip() + for type in pairindextypes: + if entry.startswith(type+':'): + value = entry[len(type)+1:].strip() + value = pairindextypes[type] + '; ' + value + indexentries.append(('pair', value, targetid, main)) + break + else: + for type in indextypes: + if entry.startswith(type+':'): + value = entry[len(type)+1:].strip() + if type == 'double': + type = 'pair' + indexentries.append((type, value, targetid, main)) + break + # shorthand notation for single entries + else: + for value in oentry.split(','): + value = value.strip() + main = '' + if value.startswith('!'): + main = 'main' + value = value[1:].lstrip() + if not value: + continue + indexentries.append(('single', value, targetid, main)) + return indexentries + + def inline_all_toctrees(builder, docnameset, docname, tree, colorfunc): """Inline all toctrees in the *tree*. @@ -115,7 +177,7 @@ def _new_traverse(self, condition=None, if include_self and descend and not siblings and not ascend: if condition is None: return self._all_traverse([]) - elif isinstance(condition, (types.ClassType, type)): + elif isinstance(condition, class_types): return self._fast_traverse(condition, []) return self._old_traverse(condition, include_self, descend, siblings, ascend) diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py index beab38cbd..487a5afcd 100644 --- a/sphinx/util/osutil.py +++ b/sphinx/util/osutil.py @@ -5,12 +5,13 @@ Operating system-related utility functions for Sphinx. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os import re +import sys import time import errno import shutil @@ -58,8 +59,8 @@ def ensuredir(path): def walk(top, topdown=True, followlinks=False): - """ - Backport of os.walk from 2.6, where the followlinks argument was added. + """Backport of os.walk from 2.6, where the *followlinks* argument was + added. """ names = os.listdir(top) @@ -124,7 +125,10 @@ no_fn_re = re.compile(r'[^a-zA-Z0-9_-]') def make_filename(string): return no_fn_re.sub('', string) - -def ustrftime(format, *args): - # strftime for unicode strings - return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8') +if sys.version_info < (3, 0): + def ustrftime(format, *args): + # strftime for unicode strings + return time.strftime(unicode(format).encode('utf-8'), *args) \ + .decode('utf-8') +else: + ustrftime = time.strftime diff --git a/sphinx/util/png.py b/sphinx/util/png.py index 2cb2aa9d8..50c72efdc 100644 --- a/sphinx/util/png.py +++ b/sphinx/util/png.py @@ -5,25 +5,25 @@ PNG image manipulation helpers. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import struct import binascii +from sphinx.util.pycompat import b + LEN_IEND = 12 LEN_DEPTH = 22 DEPTH_CHUNK_LEN = struct.pack('!i', 10) -DEPTH_CHUNK_START = 'tEXtDepth\x00' -IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82' +DEPTH_CHUNK_START = b('tEXtDepth\x00') +IEND_CHUNK = b('\x00\x00\x00\x00IEND\xAE\x42\x60\x82') def read_png_depth(filename): - """ - Read the special tEXt chunk indicating the depth from a PNG file. - """ + """Read the special tEXt chunk indicating the depth from a PNG file.""" result = None f = open(filename, 'rb') try: @@ -39,8 +39,8 @@ def read_png_depth(filename): def write_png_depth(filename, depth): - """ - Write the special tEXt chunk indicating the depth to a PNG file. + """Write the special tEXt chunk indicating the depth to a PNG file. + The chunk is placed immediately before the special IEND chunk. """ data = struct.pack('!i', depth) diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py index bdd9507df..a95c9332c 100644 --- a/sphinx/util/pycompat.py +++ b/sphinx/util/pycompat.py @@ -5,7 +5,7 @@ Stuff for Python version compatibility. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,11 +13,104 @@ import sys import codecs import encodings +# ------------------------------------------------------------------------------ +# Python 2/3 compatibility -try: +if sys.version_info >= (3, 0): + # Python 3 + class_types = (type,) + # the ubiquitous "bytes" helper functions + def b(s): + return s.encode('utf-8') + bytes = bytes + # prefix for Unicode strings + u = '' + # support for running 2to3 over config files + def convert_with_2to3(filepath): + from lib2to3.refactor import RefactoringTool, get_fixers_from_package + from lib2to3.pgen2.parse import ParseError + fixers = get_fixers_from_package('lib2to3.fixes') + refactoring_tool = RefactoringTool(fixers) + source = refactoring_tool._read_python_source(filepath)[0] + try: + tree = refactoring_tool.refactor_string(source, 'conf.py') + except ParseError, err: + # do not propagate lib2to3 exceptions + lineno, offset = err.context[1] + # try to match ParseError details with SyntaxError details + raise SyntaxError(err.msg, (filepath, lineno, offset, err.value)) + return unicode(tree) + +else: + # Python 2 + from types import ClassType + class_types = (type, ClassType) + b = str + bytes = str + u = 'u' + # no need to refactor on 2.x versions + convert_with_2to3 = None + + +# ------------------------------------------------------------------------------ +# Missing builtins and itertools in Python < 2.6 + +if sys.version_info >= (2, 6): + # Python >= 2.6 + next = next + + from itertools import product + try: + from itertools import zip_longest # Python 3 name + except ImportError: + from itertools import izip_longest as zip_longest + +else: + # Python < 2.6 + from itertools import izip, repeat, chain + + # this is on Python 2, where the method is called "next" (it is refactored + # to __next__ by 2to3, but in that case never executed) + def next(iterator): + return iterator.next() + + # These replacement functions have been taken from the Python 2.6 + # itertools documentation. + def product(*args, **kwargs): + pools = map(tuple, args) * kwargs.get('repeat', 1) + result = [[]] + for pool in pools: + result = [x + [y] for x in result for y in pool] + for prod in result: + yield tuple(prod) + + def zip_longest(*args, **kwds): + # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- + fillvalue = kwds.get('fillvalue') + def sentinel(counter = ([fillvalue]*(len(args)-1)).pop): + yield counter() # yields the fillvalue, or raises IndexError + fillers = repeat(fillvalue) + iters = [chain(it, sentinel(), fillers) for it in args] + try: + for tup in izip(*iters): + yield tup + except IndexError: + pass + + +# ------------------------------------------------------------------------------ +# Missing builtins and codecs in Python < 2.5 + +if sys.version_info >= (2, 5): + # Python >= 2.5 + base_exception = BaseException any = any all = all -except NameError: + +else: + # Python 2.4 + base_exception = Exception + def all(gen): for i in gen: if not i: @@ -30,8 +123,6 @@ except NameError: return True return False - -if sys.version_info < (2, 5): # Python 2.4 doesn't know the utf-8-sig encoding, so deliver it here def my_search_function(encoding): diff --git a/sphinx/util/smartypants.py b/sphinx/util/smartypants.py index 75888ea4d..a92327dcc 100644 --- a/sphinx/util/smartypants.py +++ b/sphinx/util/smartypants.py @@ -1,5 +1,6 @@ r""" -This is based on SmartyPants.py by `Chad Miller`_. +This is based on SmartyPants.py by `Chad Miller`_ , +version 1.5_1.6. Copyright and License ===================== @@ -75,14 +76,15 @@ import re def sphinx_smarty_pants(t): t = t.replace('"', '"') - t = educateDashesOldSchool(t) - t = educateQuotes(t) + t = educate_dashes_oldschool(t) + t = educate_quotes(t) t = t.replace('"', '"') return t # Constants for quote education. punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]""" +end_of_word_class = r"""[\s.,;:!?)]""" close_class = r"""[^\ \t\r\n\[\{\(\-]""" dec_dashes = r"""–|—""" @@ -117,8 +119,8 @@ opening_double_quotes_regex = re.compile(r""" closing_double_quotes_regex = re.compile(r""" #(%s)? # character that indicates the quote should be closing " - (?=\s) - """ % (close_class,), re.VERBOSE) + (?=%s) + """ % (close_class, end_of_word_class), re.VERBOSE) closing_double_quotes_regex_2 = re.compile(r""" (%s) # character that indicates the quote should be closing @@ -151,7 +153,7 @@ closing_single_quotes_regex_2 = re.compile(r""" (\s | s\b) """ % (close_class,), re.VERBOSE) -def educateQuotes(s): +def educate_quotes(s): """ Parameter: String. @@ -190,7 +192,7 @@ def educateQuotes(s): return s.replace('"', "“") -def educateQuotesLatex(s, dquotes=("``", "''")): +def educate_quotes_latex(s, dquotes=("``", "''")): """ Parameter: String. @@ -233,7 +235,7 @@ def educateQuotesLatex(s, dquotes=("``", "''")): replace("\x03", "`").replace("\x04", "'") -def educateBackticks(s): +def educate_backticks(s): """ Parameter: String. Returns: The string, with ``backticks'' -style double quotes @@ -244,7 +246,7 @@ def educateBackticks(s): return s.replace("``", "“").replace("''", "”") -def educateSingleBackticks(s): +def educate_single_backticks(s): """ Parameter: String. Returns: The string, with `backticks' -style single quotes @@ -256,7 +258,7 @@ def educateSingleBackticks(s): return s.replace('`', "‘").replace("'", "’") -def educateDashesOldSchool(s): +def educate_dashes_oldschool(s): """ Parameter: String. @@ -267,7 +269,7 @@ def educateDashesOldSchool(s): return s.replace('---', "—").replace('--', "–") -def educateDashesOldSchoolInverted(s): +def educate_dashes_oldschool_inverted(s): """ Parameter: String. @@ -275,7 +277,7 @@ def educateDashesOldSchoolInverted(s): an em-dash HTML entity, and each "---" translated to an en-dash HTML entity. Two reasons why: First, unlike the en- and em-dash syntax supported by - EducateDashesOldSchool(), it's compatible with existing + educate_dashes_oldschool(), it's compatible with existing entries written before SmartyPants 1.1, back when "--" was only used for em-dashes. Second, em-dashes are more common than en-dashes, and so it sort of makes sense that @@ -285,8 +287,7 @@ def educateDashesOldSchoolInverted(s): return s.replace('---', "–").replace('--', "—") - -def educateEllipses(s): +def educate_ellipses(s): """ Parameter: String. Returns: The string, with each instance of "..." translated to @@ -296,11 +297,3 @@ def educateEllipses(s): Example output: Huh…? """ return s.replace('...', "…").replace('. . .', "…") - - -__author__ = "Chad Miller " -__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400" -__url__ = "http://wiki.chad.org/SmartyPantsPy" -__description__ = \ - "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries" \ - " in pyblosxom" diff --git a/sphinx/util/tags.py b/sphinx/util/tags.py index 3f98e0ac1..7499634da 100644 --- a/sphinx/util/tags.py +++ b/sphinx/util/tags.py @@ -3,7 +3,7 @@ sphinx.util.tags ~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/texescape.py b/sphinx/util/texescape.py index 4cabd9b20..f968f2e4c 100644 --- a/sphinx/util/texescape.py +++ b/sphinx/util/texescape.py @@ -5,7 +5,7 @@ TeX escaping helper. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/websupport.py b/sphinx/util/websupport.py new file mode 100644 index 000000000..d9b472135 --- /dev/null +++ b/sphinx/util/websupport.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +""" + sphinx.util.websupport + ~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +def is_commentable(node): + #return node.__class__.__name__ in ('paragraph', 'literal_block') + return node.__class__.__name__ == 'paragraph' diff --git a/sphinx/versioning.py b/sphinx/versioning.py new file mode 100644 index 000000000..d45ed1d3f --- /dev/null +++ b/sphinx/versioning.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +""" + sphinx.versioning + ~~~~~~~~~~~~~~~~~ + + Implements the low-level algorithms Sphinx uses for the versioning of + doctrees. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +from uuid import uuid4 +from operator import itemgetter + +from sphinx.util.pycompat import product, zip_longest, all + + +# anything below that ratio is considered equal/changed +VERSIONING_RATIO = 65 + + +def add_uids(doctree, condition): + """Add a unique id to every node in the `doctree` which matches the + condition and yield the nodes. + + :param doctree: + A :class:`docutils.nodes.document` instance. + + :param condition: + A callable which returns either ``True`` or ``False`` for a given node. + """ + for node in doctree.traverse(condition): + node.uid = uuid4().hex + yield node + + +def merge_doctrees(old, new, condition): + """Merge the `old` doctree with the `new` one while looking at nodes + matching the `condition`. + + Each node which replaces another one or has been added to the `new` doctree + will be yielded. + + :param condition: + A callable which returns either ``True`` or ``False`` for a given node. + """ + old_iter = old.traverse(condition) + new_iter = new.traverse(condition) + old_nodes = [] + new_nodes = [] + ratios = {} + seen = set() + # compare the nodes each doctree in order + for old_node, new_node in zip_longest(old_iter, new_iter): + if old_node is None: + new_nodes.append(new_node) + continue + if new_node is None: + old_nodes.append(old_node) + continue + ratio = get_ratio(old_node.rawsource, new_node.rawsource) + if ratio == 0: + new_node.uid = old_node.uid + seen.add(new_node) + else: + ratios[old_node, new_node] = ratio + old_nodes.append(old_node) + new_nodes.append(new_node) + # calculate the ratios for each unequal pair of nodes, should we stumble + # on a pair which is equal we set the uid and add it to the seen ones + for old_node, new_node in product(old_nodes, new_nodes): + if new_node in seen or (old_node, new_node) in ratios: + continue + ratio = get_ratio(old_node.rawsource, new_node.rawsource) + if ratio == 0: + new_node.uid = old_node.uid + seen.add(new_node) + else: + ratios[old_node, new_node] = ratio + # choose the old node with the best ratio for each new node and set the uid + # as long as the ratio is under a certain value, in which case we consider + # them not changed but different + ratios = sorted(ratios.iteritems(), key=itemgetter(1)) + for (old_node, new_node), ratio in ratios: + if new_node in seen: + continue + else: + seen.add(new_node) + if ratio < VERSIONING_RATIO: + new_node.uid = old_node.uid + else: + new_node.uid = uuid4().hex + yield new_node + # create new uuids for any new node we left out earlier, this happens + # if one or more nodes are simply added. + for new_node in set(new_nodes) - seen: + new_node.uid = uuid4().hex + yield new_node + + +def get_ratio(old, new): + """Return a "similiarity ratio" (in percent) representing the similarity + between the two strings where 0 is equal and anything above less than equal. + """ + if not all([old, new]): + return VERSIONING_RATIO + return levenshtein_distance(old, new) / (len(old) / 100.0) + + +def levenshtein_distance(a, b): + """Return the Levenshtein edit distance between two strings *a* and *b*.""" + if a == b: + return 0 + if len(a) < len(b): + a, b = b, a + if not a: + return len(b) + previous_row = xrange(len(b) + 1) + for i, column1 in enumerate(a): + current_row = [i + 1] + for j, column2 in enumerate(b): + insertions = previous_row[j + 1] + 1 + deletions = current_row[j] + 1 + substitutions = previous_row[j] + (column1 != column2) + current_row.append(min(insertions, deletions, substitutions)) + previous_row = current_row + return previous_row[-1] diff --git a/sphinx/websupport/__init__.py b/sphinx/websupport/__init__.py new file mode 100644 index 000000000..e054812e3 --- /dev/null +++ b/sphinx/websupport/__init__.py @@ -0,0 +1,456 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport + ~~~~~~~~~~~~~~~~~ + + Base Module for web support functions. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import cgi +import sys +import cPickle as pickle +import posixpath +from os import path + +from jinja2 import Environment, FileSystemLoader + +from docutils.core import publish_parts + +from sphinx.application import Sphinx +from sphinx.util.osutil import ensuredir +from sphinx.util.jsonimpl import dumps as dump_json +from sphinx.websupport import errors +from sphinx.websupport.search import BaseSearch, SEARCH_ADAPTERS +from sphinx.websupport.storage import StorageBackend + + +class WebSupport(object): + """The main API class for the web support package. All interactions + with the web support package should occur through this class. + """ + def __init__(self, + srcdir=None, # only required for building + builddir='', # the dir with data/static/doctrees subdirs + datadir=None, # defaults to builddir/data + staticdir=None, # defaults to builddir/static + doctreedir=None, # defaults to builddir/doctrees + search=None, # defaults to no search + storage=None, # defaults to SQLite in datadir + status=sys.stdout, + warning=sys.stderr, + moderation_callback=None, + allow_anonymous_comments=True, + docroot='', + staticroot='static', + ): + # directories + self.srcdir = srcdir + self.builddir = builddir + self.outdir = path.join(builddir, 'data') + self.datadir = datadir or self.outdir + self.staticdir = staticdir or path.join(self.builddir, 'static') + self.doctreedir = staticdir or path.join(self.builddir, 'doctrees') + # web server virtual paths + self.staticroot = staticroot.strip('/') + self.docroot = docroot.strip('/') + + self.status = status + self.warning = warning + self.moderation_callback = moderation_callback + self.allow_anonymous_comments = allow_anonymous_comments + + self._init_templating() + self._init_search(search) + self._init_storage(storage) + + self._globalcontext = None + + self._make_base_comment_options() + + def _init_storage(self, storage): + if isinstance(storage, StorageBackend): + self.storage = storage + else: + # If a StorageBackend isn't provided, use the default + # SQLAlchemy backend. + from sphinx.websupport.storage.sqlalchemystorage \ + import SQLAlchemyStorage + if not storage: + # no explicit DB path given; create default sqlite database + db_path = path.join(self.datadir, 'db', 'websupport.db') + ensuredir(path.dirname(db_path)) + storage = 'sqlite:///' + db_path + self.storage = SQLAlchemyStorage(storage) + + def _init_templating(self): + import sphinx + template_path = path.join(path.dirname(sphinx.__file__), + 'themes', 'basic') + loader = FileSystemLoader(template_path) + self.template_env = Environment(loader=loader) + + def _init_search(self, search): + if isinstance(search, BaseSearch): + self.search = search + else: + mod, cls = SEARCH_ADAPTERS[search or 'null'] + mod = 'sphinx.websupport.search.' + mod + SearchClass = getattr(__import__(mod, None, None, [cls]), cls) + search_path = path.join(self.datadir, 'search') + self.search = SearchClass(search_path) + self.results_template = \ + self.template_env.get_template('searchresults.html') + + def build(self): + """Build the documentation. Places the data into the `outdir` + directory. Use it like this:: + + support = WebSupport(srcdir, builddir, search='xapian') + support.build() + + This will read reStructured text files from `srcdir`. Then it will + build the pickles and search index, placing them into `builddir`. + It will also save node data to the database. + """ + if not self.srcdir: + raise RuntimeError('No srcdir associated with WebSupport object') + app = Sphinx(self.srcdir, self.srcdir, self.outdir, self.doctreedir, + 'websupport', status=self.status, warning=self.warning) + app.builder.set_webinfo(self.staticdir, self.staticroot, + self.search, self.storage) + + self.storage.pre_build() + app.build() + self.storage.post_build() + + def get_globalcontext(self): + """Load and return the "global context" pickle.""" + if not self._globalcontext: + infilename = path.join(self.datadir, 'globalcontext.pickle') + f = open(infilename, 'rb') + try: + self._globalcontext = pickle.load(f) + finally: + f.close() + return self._globalcontext + + def get_document(self, docname, username='', moderator=False): + """Load and return a document from a pickle. The document will + be a dict object which can be used to render a template:: + + support = WebSupport(datadir=datadir) + support.get_document('index', username, moderator) + + In most cases `docname` will be taken from the request path and + passed directly to this function. In Flask, that would be something + like this:: + + @app.route('/') + def index(docname): + username = g.user.name if g.user else '' + moderator = g.user.moderator if g.user else False + try: + document = support.get_document(docname, username, + moderator) + except DocumentNotFoundError: + abort(404) + render_template('doc.html', document=document) + + The document dict that is returned contains the following items + to be used during template rendering. + + * **body**: The main body of the document as HTML + * **sidebar**: The sidebar of the document as HTML + * **relbar**: A div containing links to related documents + * **title**: The title of the document + * **css**: Links to css files used by Sphinx + * **script**: Javascript containing comment options + + This raises :class:`~sphinx.websupport.errors.DocumentNotFoundError` + if a document matching `docname` is not found. + + :param docname: the name of the document to load. + """ + docpath = path.join(self.datadir, 'pickles', docname) + if path.isdir(docpath): + infilename = docpath + '/index.fpickle' + if not docname: + docname = 'index' + else: + docname += '/index' + else: + infilename = docpath + '.fpickle' + + try: + f = open(infilename, 'rb') + except IOError: + raise errors.DocumentNotFoundError( + 'The document "%s" could not be found' % docname) + try: + document = pickle.load(f) + finally: + f.close() + + comment_opts = self._make_comment_options(username, moderator) + comment_meta = self._make_metadata( + self.storage.get_metadata(docname, moderator)) + + document['script'] = comment_opts + comment_meta + document['script'] + return document + + def get_search_results(self, q): + """Perform a search for the query `q`, and create a set + of search results. Then render the search results as html and + return a context dict like the one created by + :meth:`get_document`:: + + document = support.get_search_results(q) + + :param q: the search query + """ + results = self.search.query(q) + ctx = { + 'q': q, + 'search_performed': True, + 'search_results': results, + 'docroot': '../', # XXX + } + document = { + 'body': self.results_template.render(ctx), + 'title': 'Search Results', + 'sidebar': '', + 'relbar': '' + } + return document + + def get_data(self, node_id, username=None, moderator=False): + """Get the comments and source associated with `node_id`. If + `username` is given vote information will be included with the + returned comments. The default CommentBackend returns a dict with + two keys, *source*, and *comments*. *source* is raw source of the + node and is used as the starting point for proposals a user can + add. *comments* is a list of dicts that represent a comment, each + having the following items: + + ============= ====================================================== + Key Contents + ============= ====================================================== + text The comment text. + username The username that was stored with the comment. + id The comment's unique identifier. + rating The comment's current rating. + age The time in seconds since the comment was added. + time A dict containing time information. It contains the + following keys: year, month, day, hour, minute, second, + iso, and delta. `iso` is the time formatted in ISO + 8601 format. `delta` is a printable form of how old + the comment is (e.g. "3 hours ago"). + vote If `user_id` was given, this will be an integer + representing the vote. 1 for an upvote, -1 for a + downvote, or 0 if unvoted. + node The id of the node that the comment is attached to. + If the comment's parent is another comment rather than + a node, this will be null. + parent The id of the comment that this comment is attached + to if it is not attached to a node. + children A list of all children, in this format. + proposal_diff An HTML representation of the differences between the + the current source and the user's proposed source. + ============= ====================================================== + + :param node_id: the id of the node to get comments for. + :param username: the username of the user viewing the comments. + :param moderator: whether the user is a moderator. + """ + return self.storage.get_data(node_id, username, moderator) + + def delete_comment(self, comment_id, username='', moderator=False): + """Delete a comment. + + If `moderator` is True, the comment and all descendants will be deleted + from the database, and the function returns ``True``. + + If `moderator` is False, the comment will be marked as deleted (but not + removed from the database so as not to leave any comments orphaned), but + only if the `username` matches the `username` on the comment. The + username and text files are replaced with "[deleted]" . In this case, + the function returns ``False``. + + This raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError` + if moderator is False and `username` doesn't match username on the + comment. + + :param comment_id: the id of the comment to delete. + :param username: the username requesting the deletion. + :param moderator: whether the requestor is a moderator. + """ + return self.storage.delete_comment(comment_id, username, moderator) + + def add_comment(self, text, node_id='', parent_id='', displayed=True, + username=None, time=None, proposal=None, + moderator=False): + """Add a comment to a node or another comment. Returns the comment + in the same format as :meth:`get_comments`. If the comment is being + attached to a node, pass in the node's id (as a string) with the + node keyword argument:: + + comment = support.add_comment(text, node_id=node_id) + + If the comment is the child of another comment, provide the parent's + id (as a string) with the parent keyword argument:: + + comment = support.add_comment(text, parent_id=parent_id) + + If you would like to store a username with the comment, pass + in the optional `username` keyword argument:: + + comment = support.add_comment(text, node=node_id, + username=username) + + :param parent_id: the prefixed id of the comment's parent. + :param text: the text of the comment. + :param displayed: for moderation purposes + :param username: the username of the user making the comment. + :param time: the time the comment was created, defaults to now. + """ + if username is None: + if self.allow_anonymous_comments: + username = 'Anonymous' + else: + raise errors.UserNotAuthorizedError() + parsed = self._parse_comment_text(text) + comment = self.storage.add_comment(parsed, displayed, username, + time, proposal, node_id, + parent_id, moderator) + comment['original_text'] = text + if not displayed and self.moderation_callback: + self.moderation_callback(comment) + return comment + + def process_vote(self, comment_id, username, value): + """Process a user's vote. The web support package relies + on the API user to perform authentication. The API user will + typically receive a comment_id and value from a form, and then + make sure the user is authenticated. A unique username must be + passed in, which will also be used to retrieve the user's past + voting data. An example, once again in Flask:: + + @app.route('/docs/process_vote', methods=['POST']) + def process_vote(): + if g.user is None: + abort(401) + comment_id = request.form.get('comment_id') + value = request.form.get('value') + if value is None or comment_id is None: + abort(400) + support.process_vote(comment_id, g.user.name, value) + return "success" + + :param comment_id: the comment being voted on + :param username: the unique username of the user voting + :param value: 1 for an upvote, -1 for a downvote, 0 for an unvote. + """ + value = int(value) + if not -1 <= value <= 1: + raise ValueError('vote value %s out of range (-1, 1)' % value) + self.storage.process_vote(comment_id, username, value) + + def update_username(self, old_username, new_username): + """To remain decoupled from a webapp's authentication system, the + web support package stores a user's username with each of their + comments and votes. If the authentication system allows a user to + change their username, this can lead to stagnate data in the web + support system. To avoid this, each time a username is changed, this + method should be called. + + :param old_username: The original username. + :param new_username: The new username. + """ + self.storage.update_username(old_username, new_username) + + def accept_comment(self, comment_id, moderator=False): + """Accept a comment that is pending moderation. + + This raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError` + if moderator is False. + + :param comment_id: The id of the comment that was accepted. + :param moderator: Whether the user making the request is a moderator. + """ + if not moderator: + raise errors.UserNotAuthorizedError() + self.storage.accept_comment(comment_id) + + def _make_base_comment_options(self): + """Helper method to create the part of the COMMENT_OPTIONS javascript + that remains the same throughout the lifetime of the + :class:`~sphinx.websupport.WebSupport` object. + """ + self.base_comment_opts = {} + + if self.docroot != '': + comment_urls = [ + ('addCommentURL', '_add_comment'), + ('getCommentsURL', '_get_comments'), + ('processVoteURL', '_process_vote'), + ('acceptCommentURL', '_accept_comment'), + ('deleteCommentURL', '_delete_comment') + ] + for key, value in comment_urls: + self.base_comment_opts[key] = \ + '/' + posixpath.join(self.docroot, value) + if self.staticroot != 'static': + static_urls = [ + ('commentImage', 'comment.png'), + ('closeCommentImage', 'comment-close.png'), + ('loadingImage', 'ajax-loader.gif'), + ('commentBrightImage', 'comment-bright.png'), + ('upArrow', 'up.png'), + ('upArrowPressed', 'up-pressed.png'), + ('downArrow', 'down.png'), + ('downArrowPressed', 'down-pressed.png') + ] + for key, value in static_urls: + self.base_comment_opts[key] = \ + '/' + posixpath.join(self.staticroot, '_static', value) + + def _make_comment_options(self, username, moderator): + """Helper method to create the parts of the COMMENT_OPTIONS + javascript that are unique to each request. + + :param username: The username of the user making the request. + :param moderator: Whether the user making the request is a moderator. + """ + rv = self.base_comment_opts.copy() + if username: + rv.update({ + 'voting': True, + 'username': username, + 'moderator': moderator, + }) + return '''\ + + ''' % dump_json(rv) + + def _make_metadata(self, data): + return '''\ + + ''' % dump_json(data) + + def _parse_comment_text(self, text): + settings = {'file_insertion_enabled': False, + 'raw_enabled': False, + 'output_encoding': 'unicode'} + try: + ret = publish_parts(text, writer_name='html', + settings_overrides=settings)['fragment'] + except Exception: + ret = cgi.escape(text) + return ret diff --git a/sphinx/websupport/errors.py b/sphinx/websupport/errors.py new file mode 100644 index 000000000..225b10c86 --- /dev/null +++ b/sphinx/websupport/errors.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.errors + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Contains Error classes for the web support package. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +class DocumentNotFoundError(Exception): + pass + + +class UserNotAuthorizedError(Exception): + pass + + +class CommentNotAllowedError(Exception): + pass + + +class NullSearchException(Exception): + pass diff --git a/sphinx/websupport/search/__init__.py b/sphinx/websupport/search/__init__.py new file mode 100644 index 000000000..385c3fa97 --- /dev/null +++ b/sphinx/websupport/search/__init__.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.search + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Server side search support for the web support package. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + + +class BaseSearch(object): + def __init__(self, path): + pass + + def init_indexing(self, changed=[]): + """Called by the builder to initialize the search indexer. `changed` + is a list of pagenames that will be reindexed. You may want to remove + these from the search index before indexing begins. + + :param changed: a list of pagenames that will be re-indexed + """ + pass + + def finish_indexing(self): + """Called by the builder when writing has been completed. Use this + to perform any finalization or cleanup actions after indexing is + complete. + """ + pass + + def feed(self, pagename, title, doctree): + """Called by the builder to add a doctree to the index. Converts the + `doctree` to text and passes it to :meth:`add_document`. You probably + won't want to override this unless you need access to the `doctree`. + Override :meth:`add_document` instead. + + :param pagename: the name of the page to be indexed + :param title: the title of the page to be indexed + :param doctree: is the docutils doctree representation of the page + """ + self.add_document(pagename, title, doctree.astext()) + + def add_document(self, pagename, title, text): + """Called by :meth:`feed` to add a document to the search index. + This method should should do everything necessary to add a single + document to the search index. + + `pagename` is name of the page being indexed. It is the combination + of the source files relative path and filename, + minus the extension. For example, if the source file is + "ext/builders.rst", the `pagename` would be "ext/builders". This + will need to be returned with search results when processing a + query. + + :param pagename: the name of the page being indexed + :param title: the page's title + :param text: the full text of the page + """ + raise NotImplementedError() + + def query(self, q): + """Called by the web support api to get search results. This method + compiles the regular expression to be used when :meth:`extracting + context `, then calls :meth:`handle_query`. You + won't want to override this unless you don't want to use the included + :meth:`extract_context` method. Override :meth:`handle_query` instead. + + :param q: the search query string. + """ + self.context_re = re.compile('|'.join(q.split()), re.I) + return self.handle_query(q) + + def handle_query(self, q): + """Called by :meth:`query` to retrieve search results for a search + query `q`. This should return an iterable containing tuples of the + following format:: + + (, , <context>) + + `path` and `title` are the same values that were passed to + :meth:`add_document`, and `context` should be a short text snippet + of the text surrounding the search query in the document. + + The :meth:`extract_context` method is provided as a simple way + to create the `context`. + + :param q: the search query + """ + raise NotImplementedError() + + def extract_context(self, text, length=240): + """Extract the context for the search query from the document's + full `text`. + + :param text: the full text of the document to create the context for + :param length: the length of the context snippet to return. + """ + res = self.context_re.search(text) + if res is None: + return '' + context_start = max(res.start() - length/2, 0) + context_end = context_start + length + context = ''.join([context_start > 0 and '...' or '', + text[context_start:context_end], + context_end < len(text) and '...' or '']) + + try: + return unicode(context, errors='ignore') + except TypeError: + return context + + def context_for_searchtool(self): + """Required by the HTML builder.""" + return {} + + +# The built-in search adapters. +SEARCH_ADAPTERS = { + 'xapian': ('xapiansearch', 'XapianSearch'), + 'whoosh': ('whooshsearch', 'WhooshSearch'), + 'null': ('nullsearch', 'NullSearch'), +} diff --git a/sphinx/websupport/search/nullsearch.py b/sphinx/websupport/search/nullsearch.py new file mode 100644 index 000000000..61f2d2fba --- /dev/null +++ b/sphinx/websupport/search/nullsearch.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.search.nullsearch + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + The default search adapter, does nothing. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from sphinx.websupport.search import BaseSearch +from sphinx.websupport.errors import NullSearchException + + +class NullSearch(BaseSearch): + """A search adapter that does nothing. Used when no search adapter + is specified. + """ + def feed(self, pagename, title, doctree): + pass + + def query(self, q): + raise NullSearchException('No search adapter specified.') diff --git a/sphinx/websupport/search/whooshsearch.py b/sphinx/websupport/search/whooshsearch.py new file mode 100644 index 000000000..1ed3d714b --- /dev/null +++ b/sphinx/websupport/search/whooshsearch.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.search.whooshsearch + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Whoosh search adapter. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from whoosh import index +from whoosh.fields import Schema, ID, TEXT +from whoosh.qparser import QueryParser +from whoosh.analysis import StemmingAnalyzer + +from sphinx.util.osutil import ensuredir +from sphinx.websupport.search import BaseSearch + + +class WhooshSearch(BaseSearch): + """The whoosh search adapter for sphinx web support.""" + + # Define the Whoosh Schema for the search index. + schema = Schema(path=ID(stored=True, unique=True), + title=TEXT(field_boost=2.0, stored=True), + text=TEXT(analyzer=StemmingAnalyzer(), stored=True)) + + def __init__(self, db_path): + ensuredir(db_path) + if index.exists_in(db_path): + self.index = index.open_dir(db_path) + else: + self.index = index.create_in(db_path, schema=self.schema) + self.qparser = QueryParser('text', self.schema) + + def init_indexing(self, changed=[]): + for changed_path in changed: + self.index.delete_by_term('path', changed_path) + self.index_writer = self.index.writer() + + def finish_indexing(self): + self.index_writer.commit() + + def add_document(self, pagename, title, text): + self.index_writer.add_document(path=unicode(pagename), + title=title, + text=text) + + def handle_query(self, q): + searcher = self.index.searcher() + whoosh_results = searcher.search(self.qparser.parse(q)) + results = [] + for result in whoosh_results: + context = self.extract_context(result['text']) + results.append((result['path'], + result.get('title', ''), + context)) + return results diff --git a/sphinx/websupport/search/xapiansearch.py b/sphinx/websupport/search/xapiansearch.py new file mode 100644 index 000000000..0615be842 --- /dev/null +++ b/sphinx/websupport/search/xapiansearch.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.search.xapiansearch + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Xapian search adapter. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import xapian + +from sphinx.util.osutil import ensuredir +from sphinx.websupport.search import BaseSearch + + +class XapianSearch(BaseSearch): + # Adapted from the GSOC 2009 webapp project. + + # Xapian metadata constants + DOC_PATH = 0 + DOC_TITLE = 1 + + def __init__(self, db_path): + self.db_path = db_path + + def init_indexing(self, changed=[]): + ensuredir(self.db_path) + self.database = xapian.WritableDatabase(self.db_path, + xapian.DB_CREATE_OR_OPEN) + self.indexer = xapian.TermGenerator() + stemmer = xapian.Stem("english") + self.indexer.set_stemmer(stemmer) + + def finish_indexing(self): + # Ensure the db lock is removed. + del self.database + + def add_document(self, path, title, text): + self.database.begin_transaction() + # sphinx_page_path is used to easily retrieve documents by path. + sphinx_page_path = '"sphinxpagepath%s"' % path.replace('/', '_') + # Delete the old document if it exists. + self.database.delete_document(sphinx_page_path) + + doc = xapian.Document() + doc.set_data(text) + doc.add_value(self.DOC_PATH, path) + doc.add_value(self.DOC_TITLE, title) + self.indexer.set_document(doc) + self.indexer.index_text(text) + doc.add_term(sphinx_page_path) + for word in text.split(): + doc.add_posting(word, 1) + self.database.add_document(doc) + self.database.commit_transaction() + + def handle_query(self, q): + database = xapian.Database(self.db_path) + enquire = xapian.Enquire(database) + qp = xapian.QueryParser() + stemmer = xapian.Stem("english") + qp.set_stemmer(stemmer) + qp.set_database(database) + qp.set_stemming_strategy(xapian.QueryParser.STEM_SOME) + query = qp.parse_query(q) + + # Find the top 100 results for the query. + enquire.set_query(query) + matches = enquire.get_mset(0, 100) + + results = [] + + for m in matches: + context = self.extract_context(m.document.get_data()) + results.append((m.document.get_value(self.DOC_PATH), + m.document.get_value(self.DOC_TITLE), + ''.join(context) )) + + return results diff --git a/sphinx/websupport/storage/__init__.py b/sphinx/websupport/storage/__init__.py new file mode 100644 index 000000000..77292812b --- /dev/null +++ b/sphinx/websupport/storage/__init__.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.storage + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Storage for the websupport package. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +class StorageBackend(object): + def pre_build(self): + """Called immediately before the build process begins. Use this + to prepare the StorageBackend for the addition of nodes. + """ + pass + + def has_node(self, id): + """Check to see if a node exists. + + :param id: the id to check for. + """ + raise NotImplementedError() + + def add_node(self, id, document, source): + """Add a node to the StorageBackend. + + :param id: a unique id for the comment. + :param document: the name of the document the node belongs to. + :param source: the source files name. + """ + raise NotImplementedError() + + def post_build(self): + """Called after a build has completed. Use this to finalize the + addition of nodes if needed. + """ + pass + + def add_comment(self, text, displayed, username, time, + proposal, node_id, parent_id, moderator): + """Called when a comment is being added. + + :param text: the text of the comment + :param displayed: whether the comment should be displayed + :param username: the name of the user adding the comment + :param time: a date object with the time the comment was added + :param proposal: the text of the proposal the user made + :param node_id: the id of the node that the comment is being added to + :param parent_id: the id of the comment's parent comment. + :param moderator: whether the user adding the comment is a moderator + """ + raise NotImplementedError() + + def delete_comment(self, comment_id, username, moderator): + """Delete a comment. + + Raises :class:`~sphinx.websupport.errors.UserNotAuthorizedError` + if moderator is False and `username` doesn't match the username + on the comment. + + :param comment_id: The id of the comment being deleted. + :param username: The username of the user requesting the deletion. + :param moderator: Whether the user is a moderator. + """ + raise NotImplementedError() + + def get_metadata(self, docname, moderator): + """Get metadata for a document. This is currently just a dict + of node_id's with associated comment counts. + + :param docname: the name of the document to get metadata for. + :param moderator: whether the requester is a moderator. + """ + raise NotImplementedError() + + def get_data(self, node_id, username, moderator): + """Called to retrieve all data for a node. This should return a + dict with two keys, *source* and *comments* as described by + :class:`~sphinx.websupport.WebSupport`'s + :meth:`~sphinx.websupport.WebSupport.get_data` method. + + :param node_id: The id of the node to get data for. + :param username: The name of the user requesting the data. + :param moderator: Whether the requestor is a moderator. + """ + raise NotImplementedError() + + def process_vote(self, comment_id, username, value): + """Process a vote that is being cast. `value` will be either -1, 0, + or 1. + + :param comment_id: The id of the comment being voted on. + :param username: The username of the user casting the vote. + :param value: The value of the vote being cast. + """ + raise NotImplementedError() + + def update_username(self, old_username, new_username): + """If a user is allowed to change their username this method should + be called so that there is not stagnate data in the storage system. + + :param old_username: The username being changed. + :param new_username: What the username is being changed to. + """ + raise NotImplementedError() + + def accept_comment(self, comment_id): + """Called when a moderator accepts a comment. After the method is + called the comment should be displayed to all users. + + :param comment_id: The id of the comment being accepted. + """ + raise NotImplementedError() diff --git a/sphinx/websupport/storage/differ.py b/sphinx/websupport/storage/differ.py new file mode 100644 index 000000000..33fe54f34 --- /dev/null +++ b/sphinx/websupport/storage/differ.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.storage.differ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + A differ for creating an HTML representations of proposal diffs + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +from cgi import escape +from difflib import Differ + + +class CombinedHtmlDiff(object): + """Create an HTML representation of the differences between two pieces + of text. + """ + highlight_regex = re.compile(r'([\+\-\^]+)') + + def __init__(self, source, proposal): + proposal = escape(proposal) + + differ = Differ() + self.diff = list(differ.compare(source.splitlines(1), + proposal.splitlines(1))) + + def make_text(self): + return '\n'.join(self.diff) + + def make_html(self): + """Return the HTML representation of the differences between + `source` and `proposal`. + + :param source: the original text + :param proposal: the proposed text + """ + html = [] + diff = self.diff[:] + line = diff.pop(0) + next = diff.pop(0) + while True: + html.append(self._handle_line(line, next)) + line = next + try: + next = diff.pop(0) + except IndexError: + html.append(self._handle_line(line)) + break + return ''.join(html).rstrip() + + def _handle_line(self, line, next=None): + """Handle an individual line in a diff.""" + prefix = line[0] + text = line[2:] + + if prefix == ' ': + return text + elif prefix == '?': + return '' + + if next is not None and next[0] == '?': + tag = prefix == '+' and 'ins' or 'del' + text = self._highlight_text(text, next, tag) + css_class = prefix == '+' and 'prop-added' or 'prop-removed' + + return '<span class="%s">%s</span>\n' % (css_class, text.rstrip()) + + def _highlight_text(self, text, next, tag): + """Highlight the specific changes made to a line by adding + <ins> and <del> tags. + """ + next = next[2:] + new_text = [] + start = 0 + for match in self.highlight_regex.finditer(next): + new_text.append(text[start:match.start()]) + new_text.append('<%s>' % tag) + new_text.append(text[match.start():match.end()]) + new_text.append('</%s>' % tag) + start = match.end() + new_text.append(text[start:]) + return ''.join(new_text) diff --git a/sphinx/websupport/storage/sqlalchemy_db.py b/sphinx/websupport/storage/sqlalchemy_db.py new file mode 100644 index 000000000..dc2ec6a74 --- /dev/null +++ b/sphinx/websupport/storage/sqlalchemy_db.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.storage.sqlalchemy_db + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + SQLAlchemy table and mapper definitions used by the + :class:`sphinx.websupport.storage.sqlalchemystorage.SQLAlchemyStorage`. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from datetime import datetime + +from sqlalchemy import Column, Integer, Text, String, Boolean, \ + ForeignKey, DateTime +from sqlalchemy.orm import relation, sessionmaker, aliased +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() +Session = sessionmaker() + +db_prefix = 'sphinx_' + + +class Node(Base): + """Data about a Node in a doctree.""" + __tablename__ = db_prefix + 'nodes' + + id = Column(String(32), primary_key=True) + document = Column(String(256), nullable=False) + source = Column(Text, nullable=False) + + def nested_comments(self, username, moderator): + """Create a tree of comments. First get all comments that are + descendants of this node, then convert them to a tree form. + + :param username: the name of the user to get comments for. + :param moderator: whether the user is moderator. + """ + session = Session() + + if username: + # If a username is provided, create a subquery to retrieve all + # votes by this user. We will outerjoin with the comment query + # with this subquery so we have a user's voting information. + sq = session.query(CommentVote).\ + filter(CommentVote.username == username).subquery() + cvalias = aliased(CommentVote, sq) + q = session.query(Comment, cvalias.value).outerjoin(cvalias) + else: + # If a username is not provided, we don't need to join with + # CommentVote. + q = session.query(Comment) + + # Filter out all comments not descending from this node. + q = q.filter(Comment.path.like(str(self.id) + '.%')) + + # Filter out all comments that are not moderated yet. + if not moderator: + q = q.filter(Comment.displayed == True) + + # Retrieve all results. Results must be ordered by Comment.path + # so that we can easily transform them from a flat list to a tree. + results = q.order_by(Comment.path).all() + session.close() + + return self._nest_comments(results, username) + + def _nest_comments(self, results, username): + """Given the flat list of results, convert the list into a + tree. + + :param results: the flat list of comments + :param username: the name of the user requesting the comments. + """ + comments = [] + list_stack = [comments] + for r in results: + comment, vote = r if username else (r, 0) + + inheritance_chain = comment.path.split('.')[1:] + + if len(inheritance_chain) == len(list_stack) + 1: + parent = list_stack[-1][-1] + list_stack.append(parent['children']) + elif len(inheritance_chain) < len(list_stack): + while len(inheritance_chain) < len(list_stack): + list_stack.pop() + + list_stack[-1].append(comment.serializable(vote=vote)) + + return comments + + def __init__(self, id, document, source): + self.id = id + self.document = document + self.source = source + + +class CommentVote(Base): + """A vote a user has made on a Comment.""" + __tablename__ = db_prefix + 'commentvote' + + username = Column(String(64), primary_key=True) + comment_id = Column(Integer, ForeignKey(db_prefix + 'comments.id'), + primary_key=True) + # -1 if downvoted, +1 if upvoted, 0 if voted then unvoted. + value = Column(Integer, nullable=False) + + def __init__(self, comment_id, username, value): + self.comment_id = comment_id + self.username = username + self.value = value + + +class Comment(Base): + """An individual Comment being stored.""" + __tablename__ = db_prefix + 'comments' + + id = Column(Integer, primary_key=True) + rating = Column(Integer, nullable=False) + time = Column(DateTime, nullable=False) + text = Column(Text, nullable=False) + displayed = Column(Boolean, index=True, default=False) + username = Column(String(64)) + proposal = Column(Text) + proposal_diff = Column(Text) + path = Column(String(256), index=True) + + node_id = Column(String, ForeignKey(db_prefix + 'nodes.id')) + node = relation(Node, backref="comments") + + votes = relation(CommentVote, backref="comment", + cascade="all") + + def __init__(self, text, displayed, username, rating, time, + proposal, proposal_diff): + self.text = text + self.displayed = displayed + self.username = username + self.rating = rating + self.time = time + self.proposal = proposal + self.proposal_diff = proposal_diff + + def set_path(self, node_id, parent_id): + """Set the materialized path for this comment.""" + # This exists because the path can't be set until the session has + # been flushed and this Comment has an id. + if node_id: + self.node_id = node_id + self.path = '%s.%s' % (node_id, self.id) + else: + session = Session() + parent_path = session.query(Comment.path).\ + filter(Comment.id == parent_id).one().path + session.close() + self.node_id = parent_path.split('.')[0] + self.path = '%s.%s' % (parent_path, self.id) + + def serializable(self, vote=0): + """Creates a serializable representation of the comment. This is + converted to JSON, and used on the client side. + """ + delta = datetime.now() - self.time + + time = {'year': self.time.year, + 'month': self.time.month, + 'day': self.time.day, + 'hour': self.time.hour, + 'minute': self.time.minute, + 'second': self.time.second, + 'iso': self.time.isoformat(), + 'delta': self.pretty_delta(delta)} + + path = self.path.split('.') + node = path[0] + parent = path[-2] if len(path) > 2 else None + + return {'text': self.text, + 'username': self.username or 'Anonymous', + 'id': self.id, + 'node': node, + 'parent': parent, + 'rating': self.rating, + 'displayed': self.displayed, + 'age': delta.seconds, + 'time': time, + 'vote': vote or 0, + 'proposal_diff': self.proposal_diff, + 'children': []} + + def pretty_delta(self, delta): + """Create a pretty representation of the Comment's age. + (e.g. 2 minutes). + """ + days = delta.days + seconds = delta.seconds + hours = seconds / 3600 + minutes = seconds / 60 + + if days == 0: + dt = (minutes, 'minute') if hours == 0 else (hours, 'hour') + else: + dt = (days, 'day') + + return '%s %s ago' % dt if dt[0] == 1 else '%s %ss ago' % dt diff --git a/sphinx/websupport/storage/sqlalchemystorage.py b/sphinx/websupport/storage/sqlalchemystorage.py new file mode 100644 index 000000000..e6eccfe97 --- /dev/null +++ b/sphinx/websupport/storage/sqlalchemystorage.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +""" + sphinx.websupport.storage.sqlalchemystorage + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An SQLAlchemy storage backend. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from datetime import datetime + +import sqlalchemy +from sqlalchemy.orm import aliased +from sqlalchemy.sql import func + +if sqlalchemy.__version__[:3] < '0.5': + raise ImportError('SQLAlchemy version 0.5 or greater is required for this ' + 'storage backend; you have version %s' % sqlalchemy.__version__) + +from sphinx.websupport.errors import CommentNotAllowedError, \ + UserNotAuthorizedError +from sphinx.websupport.storage import StorageBackend +from sphinx.websupport.storage.sqlalchemy_db import Base, Node, \ + Comment, CommentVote, Session +from sphinx.websupport.storage.differ import CombinedHtmlDiff + + +class SQLAlchemyStorage(StorageBackend): + """ + A :class:`.StorageBackend` using SQLAlchemy. + """ + + def __init__(self, uri): + self.engine = sqlalchemy.create_engine(uri) + Base.metadata.bind = self.engine + Base.metadata.create_all() + Session.configure(bind=self.engine) + + def pre_build(self): + self.build_session = Session() + + def has_node(self, id): + session = Session() + node = session.query(Node).filter(Node.id == id).first() + session.close() + return bool(node) + + def add_node(self, id, document, source): + node = Node(id, document, source) + self.build_session.add(node) + self.build_session.flush() + + def post_build(self): + self.build_session.commit() + self.build_session.close() + + def add_comment(self, text, displayed, username, time, + proposal, node_id, parent_id, moderator): + session = Session() + proposal_diff = None + proposal_diff_text = None + + if node_id and proposal: + node = session.query(Node).filter(Node.id == node_id).one() + differ = CombinedHtmlDiff(node.source, proposal) + proposal_diff = differ.make_html() + proposal_diff_text = differ.make_text() + elif parent_id: + parent = session.query(Comment.displayed).\ + filter(Comment.id == parent_id).one() + if not parent.displayed: + raise CommentNotAllowedError( + "Can't add child to a parent that is not displayed") + + comment = Comment(text, displayed, username, 0, + time or datetime.now(), proposal, proposal_diff) + session.add(comment) + session.flush() + # We have to flush the session before setting the path so the + # Comment has an id. + comment.set_path(node_id, parent_id) + session.commit() + d = comment.serializable() + d['document'] = comment.node.document + d['proposal_diff_text'] = proposal_diff_text + session.close() + return d + + def delete_comment(self, comment_id, username, moderator): + session = Session() + comment = session.query(Comment).\ + filter(Comment.id == comment_id).one() + if moderator: + # moderator mode: delete the comment and all descendants + # find descendants via path + session.query(Comment).filter( + Comment.path.like(comment.path + '.%')).delete(False) + session.delete(comment) + session.commit() + session.close() + return True + elif comment.username == username: + # user mode: do not really delete, but remove text and proposal + comment.username = '[deleted]' + comment.text = '[deleted]' + comment.proposal = '' + session.commit() + session.close() + return False + else: + session.close() + raise UserNotAuthorizedError() + + def get_metadata(self, docname, moderator): + session = Session() + subquery = session.query( + Comment.id, Comment.node_id, + func.count('*').label('comment_count')).group_by( + Comment.node_id).subquery() + nodes = session.query(Node.id, subquery.c.comment_count).outerjoin( + (subquery, Node.id==subquery.c.node_id)).filter( + Node.document==docname) + session.close() + session.commit() + return dict([(k, v or 0) for k, v in nodes]) + + def get_data(self, node_id, username, moderator): + session = Session() + node = session.query(Node).filter(Node.id == node_id).one() + session.close() + comments = node.nested_comments(username, moderator) + return {'source': node.source, + 'comments': comments} + + def process_vote(self, comment_id, username, value): + session = Session() + + subquery = session.query(CommentVote).filter( + CommentVote.username == username).subquery() + vote_alias = aliased(CommentVote, subquery) + q = session.query(Comment, vote_alias).outerjoin(vote_alias).filter( + Comment.id == comment_id) + comment, vote = q.one() + + if vote is None: + vote = CommentVote(comment_id, username, value) + comment.rating += value + else: + comment.rating += value - vote.value + vote.value = value + + session.add(vote) + session.commit() + session.close() + + def update_username(self, old_username, new_username): + session = Session() + + session.query(Comment).filter(Comment.username == old_username).\ + update({Comment.username: new_username}) + session.query(CommentVote).\ + filter(CommentVote.username == old_username).\ + update({CommentVote.username: new_username}) + + session.commit() + session.close() + + def accept_comment(self, comment_id): + session = Session() + session.query(Comment).filter(Comment.id == comment_id).update( + {Comment.displayed: True} + ) + + session.commit() + session.close() diff --git a/sphinx/writers/__init__.py b/sphinx/writers/__init__.py index da3b9abf5..880e4fdbf 100644 --- a/sphinx/writers/__init__.py +++ b/sphinx/writers/__init__.py @@ -5,6 +5,6 @@ Custom docutils writers. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index ae01f65ef..eb5c76fa9 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -5,7 +5,7 @@ docutils writers handling Sphinx' custom nodes. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,7 +21,7 @@ from sphinx.locale import admonitionlabels, versionlabels, _ from sphinx.util.smartypants import sphinx_smarty_pants try: - import Image # check for the Python Imaging Library + from PIL import Image # check for the Python Imaging Library except ImportError: Image = None @@ -59,7 +59,11 @@ class HTMLTranslator(BaseTranslator): self.highlightlang = builder.config.highlight_language self.highlightlinenothreshold = sys.maxint self.protect_literal_text = 0 - self.add_permalinks = builder.config.html_add_permalinks + self.permalink_text = builder.config.html_add_permalinks + # support backwards-compatible setting to a bool + if not isinstance(self.permalink_text, basestring): + self.permalink_text = self.permalink_text and u'\u00B6' or '' + self.permalink_text = self.encode(self.permalink_text) self.secnumber_suffix = builder.config.html_secnumber_suffix def visit_start_of_file(self, node): @@ -81,11 +85,12 @@ class HTMLTranslator(BaseTranslator): and node['ids'] and node['first']: self.body.append('<!--[%s]-->' % node['ids'][0]) def depart_desc_signature(self, node): - if node['ids'] and self.add_permalinks and self.builder.add_permalinks: + if node['ids'] and self.permalink_text and self.builder.add_permalinks: self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] + - u'title="%s">\u00B6</a>' % - _('Permalink to this definition')) + u'title="%s">%s</a>' % ( + _('Permalink to this definition'), + self.permalink_text)) self.body.append('</dt>\n') def visit_desc_addname(self, node): @@ -159,7 +164,7 @@ class HTMLTranslator(BaseTranslator): # overwritten def visit_reference(self, node): atts = {'class': 'reference'} - if node.get('internal'): + if node.get('internal') or 'refuri' not in node: atts['class'] += ' internal' else: atts['class'] += ' external' @@ -180,7 +185,7 @@ class HTMLTranslator(BaseTranslator): atts['title'] = node['reftitle'] self.body.append(self.starttag(node, 'a', '', **atts)) - if node.hasattr('secnumber'): + if node.get('secnumber'): self.body.append(('%s' + self.secnumber_suffix) % '.'.join(map(str, node['secnumber']))) @@ -202,14 +207,14 @@ class HTMLTranslator(BaseTranslator): self.depart_admonition(node) def add_secnumber(self, node): - if node.hasattr('secnumber'): + if node.get('secnumber'): self.body.append('.'.join(map(str, node['secnumber'])) + self.secnumber_suffix) elif isinstance(node.parent, nodes.section): anchorname = '#' + node.parent['ids'][0] if anchorname not in self.builder.secnumbers: anchorname = '' # try first heading which has no anchor - if anchorname in self.builder.secnumbers: + if self.builder.secnumbers.get(anchorname): numbers = self.builder.secnumbers[anchorname] self.body.append('.'.join(map(str, numbers)) + self.secnumber_suffix) @@ -232,8 +237,10 @@ class HTMLTranslator(BaseTranslator): lang = node['language'] if node.has_key('linenos'): linenos = node['linenos'] - highlighted = self.highlighter.highlight_block(node.rawsource, - lang, linenos) + def warner(msg): + self.builder.warn(msg, (self.builder.current_docname, node.line)) + highlighted = self.highlighter.highlight_block( + node.rawsource, lang, linenos, warn=warner) starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang) self.body.append(starttag + highlighted + '</div>\n') @@ -242,11 +249,14 @@ class HTMLTranslator(BaseTranslator): def visit_doctest_block(self, node): self.visit_literal_block(node) + # overwritten to add the <div> (for XHTML compliance) + def visit_block_quote(self, node): + self.body.append(self.starttag(node, 'blockquote') + '<div>') + def depart_block_quote(self, node): + self.body.append('</div></blockquote>\n') + # overwritten def visit_literal(self, node): - if len(node.children) == 1 and \ - node.children[0] in ('None', 'True', 'False'): - node['classes'].append('xref') self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal')) self.protect_literal_text += 1 @@ -479,24 +489,57 @@ class HTMLTranslator(BaseTranslator): def depart_abbreviation(self, node): self.body.append('</abbr>') + def visit_termsep(self, node): + self.body.append('<br />') + raise nodes.SkipNode + def depart_title(self, node): close_tag = self.context[-1] - if (self.add_permalinks and self.builder.add_permalinks and + if (self.permalink_text and self.builder.add_permalinks and node.parent.hasattr('ids') and node.parent['ids']): aname = node.parent['ids'][0] # add permalink anchor if close_tag.startswith('</h'): self.body.append(u'<a class="headerlink" href="#%s" ' % aname + - u'title="%s">\u00B6</a>' % - _('Permalink to this headline')) + u'title="%s">%s</a>' % ( + _('Permalink to this headline'), + self.permalink_text)) elif close_tag.startswith('</a></h'): self.body.append(u'</a><a class="headerlink" href="#%s" ' % aname + - u'title="%s">\u00B6' % - _('Permalink to this headline')) + u'title="%s">%s' % ( + _('Permalink to this headline'), + self.permalink_text)) BaseTranslator.depart_title(self, node) + # overwritten to add even/odd classes + + def visit_table(self, node): + self._table_row_index = 0 + return BaseTranslator.visit_table(self, node) + + def visit_row(self, node): + self._table_row_index += 1 + if self._table_row_index % 2 == 0: + node['classes'].append('row-even') + else: + node['classes'].append('row-odd') + self.body.append(self.starttag(node, 'tr', '')) + node.column = 0 + + def visit_field_list(self, node): + self._fieldlist_row_index = 0 + return BaseTranslator.visit_field_list(self, node) + + def visit_field(self, node): + self._fieldlist_row_index += 1 + if self._fieldlist_row_index % 2 == 0: + node['classes'].append('field-even') + else: + node['classes'].append('field-odd') + self.body.append(self.starttag(node, 'tr', '', CLASS='field')) + def unknown_visit(self, node): raise NotImplementedError('Unknown node: ' + node.__class__.__name__) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 5674b388c..ccd7a8bf2 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -8,7 +8,7 @@ Much of this code is adapted from Dave Kuhlman's "docpy" writer from his docutils sandbox. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,9 +23,11 @@ from sphinx import addnodes from sphinx import highlighting from sphinx.errors import SphinxError from sphinx.locale import admonitionlabels, versionlabels, _ +from sphinx.util import split_into from sphinx.util.osutil import ustrftime +from sphinx.util.pycompat import any from sphinx.util.texescape import tex_escape_map, tex_replace_map -from sphinx.util.smartypants import educateQuotesLatex +from sphinx.util.smartypants import educate_quotes_latex HEADER = r'''%% Generated by Sphinx. \def\sphinxdocclass{%(docclass)s} @@ -101,8 +103,10 @@ class ExtBabel(Babel): return '\\shorthandoff{"}' return '' - _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy() - _ISO639_TO_BABEL['sl'] = 'slovene' +# in latest trunk, the attribute is called Babel.language_codes and already +# includes Slovene +if hasattr(Babel, '_ISO639_TO_BABEL'): + Babel._ISO639_TO_BABEL['sl'] = 'slovene' class Table(object): @@ -112,6 +116,7 @@ class Table(object): self.colspec = None self.rowcount = 0 self.had_head = False + self.has_problematic = False self.has_verbatim = False self.caption = None self.longtable = False @@ -190,6 +195,14 @@ class LaTeXTranslator(nodes.NodeVisitor): lang = babel.get_language() if lang: self.elements['classoptions'] += ',' + babel.get_language() + elif builder.config.language == 'ja': + self.elements['classoptions'] += ',english,dvipdfm' + # not elements of babel, but this should be above sphinx.sty. + # because pTeX (Japanese TeX) cannot handle this count. + self.elements['babel'] += r'\newcount\pdfoutput\pdfoutput=0' + # to make the pdf with correct encoded hyperref bookmarks + self.elements['preamble'] += \ + r'\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}' else: self.builder.warn('no Babel option known for language %r' % builder.config.language) @@ -224,10 +237,14 @@ class LaTeXTranslator(nodes.NodeVisitor): else: self.top_sectionlevel = 1 self.next_section_ids = set() + self.next_figure_ids = set() + self.next_table_ids = set() # flags self.verbatim = None self.in_title = 0 self.in_production_list = 0 + self.in_footnote = 0 + self.in_caption = 0 self.first_document = 1 self.this_is_the_title = 1 self.literal_whitespace = 0 @@ -250,10 +267,10 @@ class LaTeXTranslator(nodes.NodeVisitor): '\\label{%s}' % self.idescape(id) def hyperlink(self, id): - return '{\\hyperref[%s]{' % (self.idescape(id)) + return '{\\hyperref[%s]{' % self.idescape(id) def hyperpageref(self, id): - return '\\autopageref*{%s}' % (self.idescape(id)) + return '\\autopageref*{%s}' % self.idescape(id) def idescape(self, id): return str(unicode(id).translate(tex_replace_map)) @@ -314,7 +331,7 @@ class LaTeXTranslator(nodes.NodeVisitor): # ... and all others are the appendices self.body.append(u'\n\\appendix\n') self.first_document = -1 - if node.has_key('docname'): + if 'docname' in node: self.body.append(self.hypertarget(':doc')) # "- 1" because the level is increased before the title is visited self.sectionlevel = self.top_sectionlevel - 1 @@ -406,8 +423,9 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_production(self, node): if node['tokenname']: - self.body.append('\\production{%s}{' % - self.encode(node['tokenname'])) + tn = node['tokenname'] + self.body.append(self.hypertarget('grammar-token-' + tn)) + self.body.append('\\production{%s}{' % self.encode(tn)) else: self.body.append('\\productioncont{') def depart_production(self, node): @@ -426,10 +444,8 @@ class LaTeXTranslator(nodes.NodeVisitor): elif self.this_is_the_title: if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text): - self.builder.warn( - 'document title is not a single Text node', - '%s:%s' % (self.builder.env.doc2path(self.curfilestack[-1]), - node.line or '')) + self.builder.warn('document title is not a single Text node', + (self.curfilestack[-1], node.line)) if not self.elements['title']: # text needs to be escaped since it is inserted into # the output literally @@ -462,8 +478,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.builder.warn( 'encountered title node not in section, topic, table, ' 'admonition or sidebar', - '%s:%s' % (self.builder.env.doc2path(self.curfilestack[-1]), - node.line or '')) + (self.curfilestack[-1], node.line or '')) self.body.append('\\textbf{') self.context.append('}\n') self.in_title = 1 @@ -482,6 +497,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_desc(self, node): self.body.append('\n\n\\begin{fulllineitems}\n') + if self.table: + self.table.has_problematic = True def depart_desc(self, node): self.body.append('\n\\end{fulllineitems}\n\n') @@ -581,9 +598,11 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode def visit_collected_footnote(self, node): + self.in_footnote += 1 self.body.append('\\footnote{') def depart_collected_footnote(self, node): self.body.append('}') + self.in_footnote -= 1 def visit_label(self, node): if isinstance(node.parent, nodes.citation): @@ -612,17 +631,25 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body = self._body if not self.table.longtable and self.table.caption is not None: self.body.append(u'\n\\begin{threeparttable}\n' - u'\\caption{%s}\n' % self.table.caption) + u'\\capstart\\caption{%s}\n' % self.table.caption) if self.table.longtable: self.body.append('\n\\begin{longtable}') + endmacro = '\\end{longtable}\n\n' elif self.table.has_verbatim: self.body.append('\n\\begin{tabular}') + endmacro = '\\end{tabular}\n\n' + elif self.table.has_problematic and not self.table.colspec: + # if the user has given us tabularcolumns, accept them and use + # tabulary nevertheless + self.body.append('\n\\begin{tabular}') + endmacro = '\\end{tabular}\n\n' else: self.body.append('\n\\begin{tabulary}{\\linewidth}') + endmacro = '\\end{tabulary}\n\n' if self.table.colspec: self.body.append(self.table.colspec) else: - if self.table.has_verbatim: + if self.table.has_problematic: colwidth = 0.95 / self.table.colcount colspec = ('p{%.3f\\linewidth}|' % colwidth) * \ self.table.colcount @@ -633,7 +660,10 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('{|' + ('L|' * self.table.colcount) + '}\n') if self.table.longtable and self.table.caption is not None: self.body.append(u'\\caption{%s} \\\\\n' % self.table.caption) - + if self.table.caption is not None: + for id in self.next_table_ids: + self.body.append(self.hypertarget(id, anchor=False)) + self.next_table_ids.clear() if self.table.longtable: self.body.append('\\hline\n') self.body.append('\\endfirsthead\n\n') @@ -651,12 +681,7 @@ class LaTeXTranslator(nodes.NodeVisitor): else: self.body.append('\\hline\n') self.body.extend(self.tablebody) - if self.table.longtable: - self.body.append('\\end{longtable}\n\n') - elif self.table.has_verbatim: - self.body.append('\\end{tabular}\n\n') - else: - self.body.append('\\end{tabulary}\n\n') + self.body.append(endmacro) if not self.table.longtable and self.table.caption is not None: self.body.append('\\end{threeparttable}\n\n') self.table = None @@ -676,25 +701,25 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.next_table_colspec: self.table.colspec = '{%s}\n' % self.next_table_colspec self.next_table_colspec = None -# self.body.append('\\hline\n') -# self.table.had_head = True + # self.body.append('\\hline\n') + # self.table.had_head = True def depart_thead(self, node): - self.body.append('\\hline\n') + pass def visit_tbody(self, node): if not self.table.had_head: self.visit_thead(node) def depart_tbody(self, node): - self.body.append('\\hline\n') + pass def visit_row(self, node): self.table.col = 0 def depart_row(self, node): - self.body.append('\\\\\n') + self.body.append('\\\\\\hline\n') self.table.rowcount += 1 def visit_entry(self, node): - if node.has_key('morerows') or node.has_key('morecols'): + if 'morerows' in node or 'morecols' in node: raise UnsupportedError('%s:%s: column or row spanning cells are ' 'not yet implemented.' % (self.curfilestack[-1], node.line or '')) @@ -721,6 +746,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_bullet_list(self, node): if not self.compact_list: self.body.append('\\begin{itemize}\n' ) + if self.table: + self.table.has_problematic = True def depart_bullet_list(self, node): if not self.compact_list: self.body.append('\\end{itemize}\n' ) @@ -729,6 +756,8 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\\begin{enumerate}\n' ) if 'start' in node: self.body.append('\\setcounter{enumi}{%d}\n' % (node['start'] - 1)) + if self.table: + self.table.has_problematic = True def depart_enumerated_list(self, node): self.body.append('\\end{enumerate}\n' ) @@ -741,6 +770,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_definition_list(self, node): self.body.append('\\begin{description}\n') + if self.table: + self.table.has_problematic = True def depart_definition_list(self, node): self.body.append('\\end{description}\n') @@ -751,13 +782,17 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_term(self, node): ctx = '}] \\leavevmode' - if node.has_key('ids') and node['ids']: + if node.get('ids'): ctx += self.hypertarget(node['ids'][0]) self.body.append('\\item[{') self.context.append(ctx) def depart_term(self, node): self.body.append(self.context.pop()) + def visit_termsep(self, node): + self.body.append(', ') + raise nodes.SkipNode + def visit_classifier(self, node): self.body.append('{[}') def depart_classifier(self, node): @@ -770,6 +805,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_field_list(self, node): self.body.append('\\begin{quote}\\begin{description}\n') + if self.table: + self.table.has_problematic = True def depart_field_list(self, node): self.body.append('\\end{description}\\end{quote}\n') @@ -791,6 +828,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_centered(self, node): self.body.append('\n\\begin{center}') + if self.table: + self.table.has_problematic = True def depart_centered(self, node): self.body.append('\n\\end{center}') @@ -800,6 +839,8 @@ class LaTeXTranslator(nodes.NodeVisitor): self.compact_list += 1 self.body.append('\\begin{itemize}\\setlength{\\itemsep}{0pt}' '\\setlength{\\parskip}{0pt}\n') + if self.table: + self.table.has_problematic = True def depart_hlist(self, node): self.compact_list -= 1 self.body.append('\\end{itemize}\n') @@ -833,20 +874,20 @@ class LaTeXTranslator(nodes.NodeVisitor): post = [] include_graphics_options = [] is_inline = self.is_inline(node) - if attrs.has_key('scale'): + if 'scale' in attrs: # Could also be done with ``scale`` option to # ``\includegraphics``; doing it this way for consistency. pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,)) post.append('}') - if attrs.has_key('width'): + if 'width' in attrs: w = self.latex_image_length(attrs['width']) if w: include_graphics_options.append('width=%s' % w) - if attrs.has_key('height'): + if 'height' in attrs: h = self.latex_image_length(attrs['height']) if h: include_graphics_options.append('height=%s' % h) - if attrs.has_key('align'): + if 'align' in attrs: align_prepost = { # By default latex aligns the top of an image. (1, 'top'): ('', ''), @@ -887,13 +928,17 @@ class LaTeXTranslator(nodes.NodeVisitor): pass def visit_figure(self, node): - if node.has_key('width') and node.get('align', '') in ('left', 'right'): + ids = '' + for id in self.next_figure_ids: + ids += self.hypertarget(id, anchor=False) + self.next_figure_ids.clear() + if 'width' in node and node.get('align', '') in ('left', 'right'): self.body.append('\\begin{wrapfigure}{%s}{%s}\n\\centering' % (node['align'] == 'right' and 'r' or 'l', node['width'])) - self.context.append('\\end{wrapfigure}\n') + self.context.append(ids + '\\end{wrapfigure}\n') else: - if (not node.attributes.has_key('align') or + if (not 'align' in node.attributes or node.attributes['align'] == 'center'): # centering does not add vertical space like center. align = '\n\\centering' @@ -903,14 +948,18 @@ class LaTeXTranslator(nodes.NodeVisitor): align = '\\begin{flush%s}' % node.attributes['align'] align_end = '\\end{flush%s}' % node.attributes['align'] self.body.append('\\begin{figure}[htbp]%s\n' % align) - self.context.append('%s\\end{figure}\n' % align_end) + if any(isinstance(child, nodes.caption) for child in node): + self.body.append('\\capstart\n') + self.context.append(ids + align_end + '\\end{figure}\n') def depart_figure(self, node): self.body.append(self.context.pop()) def visit_caption(self, node): + self.in_caption += 1 self.body.append('\\caption{') def depart_caption(self, node): self.body.append('}') + self.in_caption -= 1 def visit_legend(self, node): self.body.append('{\\small ') @@ -983,6 +1032,20 @@ class LaTeXTranslator(nodes.NodeVisitor): self.next_section_ids.add(node['refid']) self.next_section_ids.update(node['ids']) return + elif isinstance(next, nodes.figure): + # labels for figures go in the figure body, not before + if node.get('refid'): + self.next_figure_ids.add(node['refid']) + self.next_figure_ids.update(node['ids']) + return + elif isinstance(next, nodes.table): + # same for tables, but only if they have a caption + for n in node: + if isinstance(n, nodes.title): + if node.get('refid'): + self.next_table_ids.add(node['refid']) + self.next_table_ids.update(node['ids']) + return except IndexError: pass if 'refuri' in node: @@ -1001,27 +1064,39 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\n\\end{flushright}\n') def visit_index(self, node, scre=re.compile(r';\s*')): + if not node.get('inline', True): + self.body.append('\n') entries = node['entries'] - for type, string, tid, _ in entries: - if type == 'single': - self.body.append(r'\index{%s}' % - scre.sub('!', self.encode(string))) - elif type == 'pair': - parts = tuple(self.encode(x.strip()) - for x in string.split(';', 1)) - try: - self.body.append(r'\indexii{%s}{%s}' % parts) - except TypeError: - self.builder.warn('invalid pair index entry %r' % string) - elif type == 'triple': - parts = tuple(self.encode(x.strip()) - for x in string.split(';', 2)) - try: - self.body.append(r'\indexiii{%s}{%s}{%s}' % parts) - except TypeError: - self.builder.warn('invalid triple index entry %r' % string) - else: - self.builder.warn('unknown index entry type %s found' % type) + for type, string, tid, ismain in entries: + m = '' + if ismain: + m = '|textbf' + try: + if type == 'single': + p = scre.sub('!', self.encode(string)) + self.body.append(r'\index{%s%s}' % (p, m)) + elif type == 'pair': + p1, p2 = map(self.encode, split_into(2, 'pair', string)) + self.body.append(r'\index{%s!%s%s}\index{%s!%s%s}' % + (p1, p2, m, p2, p1, m)) + elif type == 'triple': + p1, p2, p3 = map(self.encode, + split_into(3, 'triple', string)) + self.body.append( + r'\index{%s!%s %s%s}\index{%s!%s, %s%s}' + r'\index{%s!%s %s%s}' % + (p1, p2, p3, m, p2, p3, p1, m, p3, p1, p2, m)) + elif type == 'see': + p1, p2 = map(self.encode, split_into(2, 'see', string)) + self.body.append(r'\index{%s|see{%s}}' % (p1, p2)) + elif type == 'seealso': + p1, p2 = map(self.encode, split_into(2, 'seealso', string)) + self.body.append(r'\index{%s|see{%s}}' % (p1, p2)) + else: + self.builder.warn( + 'unknown index entry type %s found' % type) + except ValueError, err: + self.builder.warn(str(err)) raise nodes.SkipNode def visit_raw(self, node): @@ -1039,11 +1114,17 @@ class LaTeXTranslator(nodes.NodeVisitor): uri.startswith('https:') or uri.startswith('ftp:'): self.body.append('\\href{%s}{' % self.encode_uri(uri)) # if configured, put the URL after the link - if self.builder.config.latex_show_urls and \ - node.astext() != uri: + show_urls = self.builder.config.latex_show_urls + if node.astext() != uri and show_urls and show_urls != 'no': if uri.startswith('mailto:'): uri = uri[7:] - self.context.append('} (%s)' % self.encode_uri(uri)) + if show_urls == 'footnote' and not \ + (self.in_footnote or self.in_caption): + # obviously, footnotes in footnotes are not going to work + self.context.append( + r'}\footnote{%s}' % self.encode_uri(uri)) + else: # all other true values (b/w compat) + self.context.append('} (%s)' % self.encode_uri(uri)) else: self.context.append('}') elif uri.startswith('#'): @@ -1073,17 +1154,9 @@ class LaTeXTranslator(nodes.NodeVisitor): self.context.append('}} (%s)' % self.hyperpageref(id)) else: self.context.append('}}') - elif uri.startswith('@token'): - if self.in_production_list: - self.body.append('\\token{') - else: - self.body.append('\\grammartoken{') - self.context.append('}') else: - self.builder.warn( - 'unusable reference target found: %s' % uri, - '%s:%s' % (self.builder.env.doc2path(self.curfilestack[-1]), - node.line or '')) + self.builder.warn('unusable reference target found: %s' % uri, + (self.curfilestack[-1], node.line)) self.context.append('') def depart_reference(self, node): self.body.append(self.context.pop()) @@ -1154,7 +1227,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.no_contractions -= 1 if self.in_title: self.body.append(r'\texttt{%s}' % content) - elif node.has_key('role') and node['role'] == 'samp': + elif node.get('role') == 'samp': self.body.append(r'\samp{%s}' % content) else: self.body.append(r'\code{%s}' % content) @@ -1171,6 +1244,10 @@ class LaTeXTranslator(nodes.NodeVisitor): if used: self.body.append('\\footnotemark[%s]' % num) else: + if self.in_caption: + raise UnsupportedError('%s:%s: footnotes in float captions ' + 'are not supported by LaTeX' % + (self.curfilestack[-1], node.line)) footnode.walkabout(self) self.footnotestack[-1][num][1] = True raise nodes.SkipChildren @@ -1183,18 +1260,22 @@ class LaTeXTranslator(nodes.NodeVisitor): code = self.verbatim.rstrip('\n') lang = self.hlsettingstack[-1][0] linenos = code.count('\n') >= self.hlsettingstack[-1][1] - 1 - if node.has_key('language'): + if 'language' in node: # code-block directives lang = node['language'] - if node.has_key('linenos'): + if 'linenos' in node: linenos = node['linenos'] - hlcode = self.highlighter.highlight_block(code, lang, linenos) + def warner(msg): + self.builder.warn(msg, (self.curfilestack[-1], node.line)) + hlcode = self.highlighter.highlight_block(code, lang, linenos, + warn=warner) # workaround for Unicode issue hlcode = hlcode.replace(u'€', u'@texteuro[]') # must use original Verbatim environment and "tabular" environment if self.table: hlcode = hlcode.replace('\\begin{Verbatim}', '\\begin{OriginalVerbatim}') + self.table.has_problematic = True self.table.has_verbatim = True # get consistent trailer hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim} @@ -1205,31 +1286,21 @@ class LaTeXTranslator(nodes.NodeVisitor): visit_doctest_block = visit_literal_block depart_doctest_block = depart_literal_block - def visit_line_block(self, node): - """line-block: - * whitespace (including linebreaks) is significant - * inline markup is supported. - * serif typeface - """ - self.body.append('{\\raggedright{}') - self.literal_whitespace += 1 - def depart_line_block(self, node): - self.literal_whitespace -= 1 - # remove the last \\ - del self.body[-1] - self.body.append('}\n') - def visit_line(self, node): - self._line_start = len(self.body) + self.body.append('\item[] ') def depart_line(self, node): - if self._line_start == len(self.body): - # no output in this line -- add a nonbreaking space, else the - # \\ command will give an error - self.body.append('~') - if self.table is not None: - self.body.append('\\newline\n') + self.body.append('\n') + + def visit_line_block(self, node): + if isinstance(node.parent, nodes.line_block): + self.body.append('\\item[]\n' + '\\begin{DUlineblock}{\\DUlineblockindent}\n') else: - self.body.append('\\\\\n') + self.body.append('\n\\begin{DUlineblock}{0em}\n') + if self.table: + self.table.has_problematic = True + def depart_line_block(self, node): + self.body.append('\\end{DUlineblock}\n') def visit_block_quote(self, node): # If the block quote contains a single object and that object @@ -1243,6 +1314,8 @@ class LaTeXTranslator(nodes.NodeVisitor): done = 1 if not done: self.body.append('\\begin{quote}\n') + if self.table: + self.table.has_problematic = True def depart_block_quote(self, node): done = 0 if len(node.children) == 1: @@ -1279,6 +1352,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_option_list(self, node): self.body.append('\\begin{optionlist}{3cm}\n') + if self.table: + self.table.has_problematic = True def depart_option_list(self, node): self.body.append('\\end{optionlist}\n') @@ -1373,7 +1448,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.verbatim += node.astext() else: text = self.encode(node.astext()) - self.body.append(educateQuotesLatex(text)) + self.body.append(educate_quotes_latex(text)) def depart_Text(self, node): pass diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 5f93c7ebb..e6bccca78 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -5,7 +5,7 @@ Manual page writer, extended for Sphinx custom nodes. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -161,6 +161,10 @@ class ManualPageTranslator(BaseTranslator): def depart_versionmodified(self, node): self.depart_paragraph(node) + def visit_termsep(self, node): + self.body.append(', ') + raise nodes.SkipNode + # overwritten -- we don't want source comments to show up def visit_comment(self, node): raise nodes.SkipNode @@ -235,6 +239,19 @@ class ManualPageTranslator(BaseTranslator): self.body.append(self.defs['reference'][0]) self.body.append(node.astext()) self.body.append(self.defs['reference'][1]) + + uri = node.get('refuri', '') + if uri.startswith('mailto:') or uri.startswith('http:') or \ + uri.startswith('https:') or uri.startswith('ftp:'): + # if configured, put the URL after the link + if self.builder.config.man_show_urls and \ + node.astext() != uri: + if uri.startswith('mailto:'): + uri = uri[7:] + self.body.extend([ + ' <', + self.defs['strong'][0], uri, self.defs['strong'][1], + '>']) raise nodes.SkipNode def visit_centered(self, node): diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py new file mode 100644 index 000000000..c5c3aabe2 --- /dev/null +++ b/sphinx/writers/texinfo.py @@ -0,0 +1,1256 @@ +# -*- coding: utf-8 -*- +""" + sphinx.writers.texinfo + ~~~~~~~~~~~~~~~~~~~~~~ + + Custom docutils writer for Texinfo. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +from os import path + +from docutils import nodes, writers + +from sphinx import addnodes +from sphinx.locale import versionlabels + + +TEMPLATE = """\ +\\input texinfo @c -*-texinfo-*- +@c %%**start of header +@setfilename %(filename)s +@documentencoding UTF-8 +@copying +Generated by Sphinx +@end copying +@settitle %(title)s +@defindex ge +@paragraphindent %(paragraphindent)s +@exampleindent %(exampleindent)s +@afourlatex +%(direntry)s +@c %%**end of header + +@titlepage +@title %(title)s +@author %(author)s +@end titlepage +@contents + +@c %%** start of user preamble +%(preamble)s +@c %%** end of user preamble + +@ifnottex +@node Top +@top %(title)s +@end ifnottex + +@c %%**start of body +%(body)s +@c %%**end of body +@bye +""" + + +def find_subsections(section): + """Return a list of subsections for the given ``section``.""" + result = [] + for child in section.children: + if isinstance(child, nodes.section): + result.append(child) + continue + result.extend(find_subsections(child)) + return result + + +## 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(s): + """Return a string with Texinfo command characters escaped.""" + s = s.replace('@', '@@') + s = s.replace('{', '@{') + s = s.replace('}', '@}') + # Prevent "--" from being converted to an "em dash" + # s = s.replace('-', '@w{-}') + return s + +def escape_arg(s): + """Return an escaped string suitable for use as an argument + to a Texinfo command.""" + s = escape(s) + # Commas are the argument delimeters + s = s.replace(',', '@comma{}') + # Normalize white space + s = ' '.join(s.split()).strip() + return s + +def escape_id(s): + """Return an escaped string suitable for node names, menu entries, + and xrefs anchors.""" + bad_chars = ',:.()@{}' + for bc in bad_chars: + s = s.replace(bc, ' ') + s = ' '.join(s.split()).strip() + return s + +class TexinfoWriter(writers.Writer): + """Texinfo writer for generating Texinfo documents.""" + supported = ('texinfo', 'texi') + + settings_spec = ( + 'Texinfo Specific Options', + None, + ( + ("Name of the resulting Info file to be created by 'makeinfo'. " + "Should probably end with '.info'.", + ['--texinfo-filename'], + {'default': '', 'metavar': '<file>'}), + + ('Specify the Info dir entry category.', + ['--texinfo-dir-category'], + {'default': 'Miscellaneous', 'metavar': '<name>'}), + + ('The name to use for the Info dir entry. ' + 'If not provided, no entry will be created.', + ['--texinfo-dir-entry'], + {'default': '', 'metavar': '<name>'}), + + ('A brief description (one or two lines) to use for the ' + 'Info dir entry.', + ['--texinfo-dir-description'], + {'default': '', 'metavar': '<desc>'}), + ) + ) + + settings_defaults = {} + settings_default_overrides = {'docinfo_xform': 0} + + output = None + + visitor_attributes = ('output', 'fragment') + + def __init__(self, builder): + writers.Writer.__init__(self) + self.builder = builder + + def translate(self): + self.visitor = visitor = TexinfoTranslator(self.document, self.builder) + self.document.walkabout(visitor) + visitor.finish() + for attr in self.visitor_attributes: + setattr(self, attr, getattr(visitor, attr)) + + +class TexinfoTranslator(nodes.NodeVisitor): + + ignore_missing_images = False + + default_elements = { + 'filename': '', + 'title': '', + 'paragraphindent': 2, + 'exampleindent': 4, + 'direntry': '', + 'preamble': '', + 'body': '', + } + + def __init__(self, document, builder): + nodes.NodeVisitor.__init__(self, document) + self.builder = builder + self.init_settings() + + self.written_ids = set() # node names and anchors in output + self.referenced_ids = set() # node names and anchors that should + # be in output + self.node_names = {} # node name --> node's name to display + self.node_menus = {} # node name --> node's menu entries + self.rellinks = {} # node name --> (next, previous, up) + + self.collect_node_names() + self.collect_node_menus() + self.collect_rellinks() + + self.short_ids = {} + self.body = [] + self.context = [] + self.previous_section = None + self.section_level = 0 + self.seen_title = False + self.next_section_targets = [] + self.escape_newlines = 0 + self.curfilestack = [] + + def finish(self): + while self.referenced_ids: + # Handle xrefs with missing anchors + r = self.referenced_ids.pop() + if r not in self.written_ids: + self.document.reporter.info( + "Unknown cross-reference target: `%s'" % r) + self.add_text('@anchor{%s}@w{%s}\n' % (r, ' ' * 30)) + self.fragment = ''.join(self.body).strip() + '\n' + self.elements['body'] = self.fragment + self.output = TEMPLATE % self.elements + + + ## Helper routines + + def init_settings(self): + settings = self.settings = self.document.settings + elements = self.elements = self.default_elements.copy() + elements.update({ + # if empty, the title is set to the first section title + 'title': settings.title, + 'author': escape_arg(settings.author), + # if empty, use basename of input file + 'filename': settings.texinfo_filename, + }) + # Title + title = elements['title'] + if not title: + title = self.document.next_node(nodes.title) + title = (title and title.astext()) or '<untitled>' + elements['title'] = escape_id(title) or '<untitled>' + # Filename + if not elements['filename']: + elements['filename'] = self.document.get('source') or 'untitled' + if elements['filename'][-4:] in ('.txt', '.rst'): + elements['filename'] = elements['filename'][:-4] + elements['filename'] += '.info' + # Direntry + if settings.texinfo_dir_entry: + elements['direntry'] = ('@dircategory %s\n' + '@direntry\n' + '* %s: (%s). %s\n' + '@end direntry\n') % ( + escape_id(settings.texinfo_dir_category), + escape_id(settings.texinfo_dir_entry), + elements['filename'], + escape_arg(settings.texinfo_dir_description)) + # allow the user to override them all + elements.update(settings.texinfo_elements) + + def collect_node_names(self): + """Generates a unique id for each section. + + Assigns the attribute ``node_name`` to each section.""" + self.document['node_name'] = 'Top' + self.node_names['Top'] = 'Top' + self.written_ids.update(('Top', 'top')) + + for section in self.document.traverse(nodes.section): + title = section.next_node(nodes.Titular) + name = (title and title.astext()) or '<untitled>' + node_id = name = escape_id(name) or '<untitled>' + assert node_id and name + nth, suffix = 1, '' + while (node_id + suffix).lower() in self.written_ids: + nth += 1 + suffix = '<%s>' % nth + node_id += suffix + assert node_id not in self.node_names + assert node_id not in self.written_ids + assert node_id.lower() not in self.written_ids + section['node_name'] = node_id + self.node_names[node_id] = name + self.written_ids.update((node_id, node_id.lower())) + + def collect_node_menus(self): + """Collect the menu entries for each "node" section.""" + node_menus = self.node_menus + for node in ([self.document] + + self.document.traverse(nodes.section)): + assert 'node_name' in node and node['node_name'] + entries = tuple(s['node_name'] + for s in find_subsections(node)) + node_menus[node['node_name']] = entries + # Try to find a suitable "Top" node + title = self.document.next_node(nodes.title) + top = (title and title.parent) or self.document + if not isinstance(top, (nodes.document, nodes.section)): + top = self.document + if top is not self.document: + entries = node_menus[top['node_name']] + entries += node_menus['Top'][1:] + node_menus['Top'] = entries + del node_menus[top['node_name']] + top['node_name'] = 'Top' + + def collect_rellinks(self): + """Collect the relative links (next, previous, up) for each "node".""" + rellinks = self.rellinks + node_menus = self.node_menus + for id, entries in node_menus.items(): + rellinks[id] = ['', '', ''] + # Up's + for id, entries in node_menus.items(): + for e in entries: + rellinks[e][2] = id + # Next's and prev's + for id, entries in node_menus.items(): + for i, id in enumerate(entries): + # First child's prev is empty + if i != 0: + rellinks[id][1] = entries[i-1] + # Last child's next is empty + if i != len(entries) - 1: + rellinks[id][0] = entries[i+1] + # Top's next is its first child + try: + first = node_menus['Top'][0] + except IndexError: + pass + else: + rellinks['Top'][0] = first + rellinks[first][1] = 'Top' + + def add_text(self, text, fresh=False): + """Add some text to the output. + + Optional argument ``fresh`` means to insert a newline before + the text if the last character out was not a newline.""" + if fresh: + if self.body and not self.body[-1].endswith('\n'): + self.body.append('\n') + self.body.append(text) + + def rstrip(self): + """Strip trailing whitespace from the current output.""" + while self.body and not self.body[-1].strip(): + del self.body[-1] + if not self.body: + return + self.body[-1] = self.body[-1].rstrip() + + def add_menu_entries(self, entries): + for entry in entries: + name = self.node_names[entry] + if name == entry: + self.add_text('* %s::\n' % name, fresh=1) + else: + self.add_text('* %s: %s.\n' % (name, entry), fresh=1) + + def add_menu(self, section, master=False): + entries = self.node_menus[section['node_name']] + if not entries: + return + self.add_text('\n@menu\n') + self.add_menu_entries(entries) + if master: + # Write the "detailed menu" + started_detail = False + for entry in entries: + subentries = self.node_menus[entry] + if not subentries: + continue + if not started_detail: + started_detail = True + self.add_text('\n@detailmenu\n' + ' --- The Detailed Node Listing ---\n') + self.add_text('\n%s\n\n' % self.node_names[entry]) + self.add_menu_entries(subentries) + if started_detail: + self.rstrip() + self.add_text('\n@end detailmenu\n') + self.rstrip() + self.add_text('\n@end menu\n\n') + + + def tex_image_length(self, width_str): + match = re.match('(\d*\.?\d*)\s*(\S*)', width_str) + if not match: + # fallback + return width_str + res = width_str + amount, unit = match.groups()[:2] + if not unit or unit == "px": + # pixels: let TeX alone + return '' + elif unit == "%": + # a4paper: textwidth=418.25368pt + res = "%d.0pt" % (float(amount) * 4.1825368) + return res + + ## xref handling + + def get_short_id(self, id): + """Return a shorter 'id' associated with ``id``.""" + # Shorter ids improve paragraph filling in places + # that the id is hidden by Emacs. + try: + sid = self.short_ids[id] + except KeyError: + sid = hex(len(self.short_ids))[2:] + self.short_ids[id] = sid + return sid + + def add_anchor(self, id, msg_node=None): + # Anchors can be referenced by their original id + # or by the generated shortened id + id = escape_id(id).lower() + ids = (self.get_short_id(id), id) + for id in ids: + if id not in self.written_ids: + self.add_text('@anchor{%s}' % id) + self.written_ids.add(id) + + def add_xref(self, ref, name, node): + ref = self.get_short_id(escape_id(ref).lower()) + name = ' '.join(name.split()).strip() + if not name or ref == name: + self.add_text('@pxref{%s}' % ref) + else: + self.add_text('@pxref{%s,,%s}' % (ref, name)) + self.referenced_ids.add(ref) + + ## Visiting + + def visit_document(self, node): + pass + def depart_document(self, node): + pass + + def visit_Text(self, node): + s = escape(node.astext()) + if self.escape_newlines: + s = s.replace('\n', ' ') + self.add_text(s) + def depart_Text(self, node): + pass + + def visit_section(self, node): + self.next_section_targets.extend(node.get('ids', [])) + if not self.seen_title: + return + if self.previous_section: + self.add_menu(self.previous_section) + else: + self.add_menu(self.document, master=True) + + node_name = node['node_name'] + pointers = tuple([node_name] + self.rellinks[node_name]) + self.add_text('\n@node %s,%s,%s,%s\n' % pointers) + if node_name != node_name.lower(): + self.add_text('@anchor{%s}' % node_name.lower()) + for id in self.next_section_targets: + self.add_anchor(id, node) + + self.next_section_targets = [] + self.previous_section = node + self.section_level += 1 + + def depart_section(self, node): + self.section_level -= 1 + + headings = ( + '@unnumbered', + '@chapter', + '@section', + '@subsection', + '@subsubsection', + ) + + rubrics = ( + '@heading', + '@subheading', + '@subsubheading', + ) + + def visit_title(self, node): + if not self.seen_title: + self.seen_title = 1 + raise nodes.SkipNode + parent = node.parent + if isinstance(parent, nodes.table): + return + if isinstance(parent, nodes.Admonition): + raise nodes.SkipNode + elif isinstance(parent, nodes.sidebar): + self.visit_rubric(node) + elif isinstance(parent, nodes.topic): + raise nodes.SkipNode + elif not isinstance(parent, nodes.section): + self.document.reporter.warning( + 'encountered title node not in section, topic, table, ' + 'admonition or sidebar', base_node=node) + self.visit_rubric(node) + else: + try: + heading = self.headings[self.section_level] + except IndexError: + heading = self.headings[-1] + self.add_text('%s ' % heading, fresh=1) + + def depart_title(self, node): + self.add_text('', fresh=1) + + def visit_rubric(self, node): + try: + rubric = self.rubrics[self.section_level] + except IndexError: + rubric = self.rubrics[-1] + self.add_text('%s ' % rubric, fresh=1) + def depart_rubric(self, node): + self.add_text('', fresh=1) + + def visit_subtitle(self, node): + self.add_text('\n\n@noindent\n') + def depart_subtitle(self, node): + self.add_text('\n\n') + + ## References + + def visit_target(self, node): + if node.get('ids'): + self.add_anchor(node['ids'][0], node) + elif node.get('refid'): + # Section targets need to go after the start of the section. + next = node.next_node(ascend=1, siblings=1) + while isinstance(next, nodes.target): + next = next.next_node(ascend=1, siblings=1) + if isinstance(next, nodes.section): + self.next_section_targets.append(node['refid']) + return + self.add_anchor(node['refid'], node) + elif node.get('refuri'): + pass + else: + self.document.reporter.error("Unknown target type: %r" % node) + + def visit_reference(self, node): + if isinstance(node.parent, nodes.title): + return + if isinstance(node[0], nodes.image): + return + if isinstance(node.parent, addnodes.desc_type): + return + name = node.get('name', node.astext()).strip() + if node.get('refid'): + self.add_xref(escape_id(node['refid']), + escape_id(name), node) + raise nodes.SkipNode + if not node.get('refuri'): + self.document.reporter.error("Unknown reference type: %s" % node) + return + uri = node['refuri'] + if uri.startswith('#'): + self.add_xref(escape_id(uri[1:]), escape_id(name), node) + elif uri.startswith('%'): + id = uri[1:] + if '#' in id: + src, id = uri[1:].split('#', 1) + assert '#' not in id + self.add_xref(escape_id(id), escape_id(name), node) + elif uri.startswith('mailto:'): + uri = escape_arg(uri[7:]) + name = escape_arg(name) + if not name or name == uri: + self.add_text('@email{%s}' % uri) + else: + self.add_text('@email{%s,%s}' % (uri, name)) + elif uri.startswith('info:'): + uri = uri[5:].replace('_', ' ') + uri = escape_arg(uri) + id = 'Top' + if '#' in uri: + uri, id = uri.split('#', 1) + id = escape_id(id) + name = escape_id(name) + if name == id: + self.add_text('@pxref{%s,,,%s}' % (id, uri)) + else: + self.add_text('@pxref{%s,,%s,%s}' % (id, name, uri)) + else: + uri = escape_arg(uri) + name = escape_arg(name) + if not name or uri == name: + self.add_text('@indicateurl{%s}' % uri) + else: + self.add_text('@uref{%s,%s}' % (uri, name)) + raise nodes.SkipNode + + def depart_reference(self, node): + pass + + def visit_title_reference(self, node): + text = node.astext() + self.add_text('@cite{%s}' % escape_arg(text)) + raise nodes.SkipNode + def depart_title_reference(self, node): + pass + + ## Blocks + + def visit_paragraph(self, node): + if 'continued' in node or isinstance(node.parent, nodes.compound): + self.add_text('@noindent\n', fresh=1) + def depart_paragraph(self, node): + self.add_text('\n\n') + + def visit_block_quote(self, node): + self.rstrip() + self.add_text('\n\n@quotation\n') + def depart_block_quote(self, node): + self.rstrip() + self.add_text('\n@end quotation\n\n') + + def visit_literal_block(self, node): + self.rstrip() + self.add_text('\n\n@example\n') + def depart_literal_block(self, node): + self.rstrip() + self.add_text('\n@end example\n\n' + '@noindent\n') + + visit_doctest_block = visit_literal_block + depart_doctest_block = depart_literal_block + + def visit_line_block(self, node): + self.add_text('@display\n', fresh=1) + def depart_line_block(self, node): + self.add_text('@end display\n', fresh=1) + + def visit_line(self, node): + self.rstrip() + self.add_text('\n') + self.escape_newlines += 1 + def depart_line(self, node): + self.add_text('@w{ }\n') + self.escape_newlines -= 1 + + ## Inline + + def visit_strong(self, node): + self.add_text('@strong{') + def depart_strong(self, node): + self.add_text('}') + + def visit_emphasis(self, node): + self.add_text('@emph{') + def depart_emphasis(self, node): + self.add_text('}') + + def visit_literal(self, node): + self.add_text('@code{') + def depart_literal(self, node): + self.add_text('}') + + def visit_superscript(self, node): + self.add_text('@w{^') + def depart_superscript(self, node): + self.add_text('}') + + def visit_subscript(self, node): + self.add_text('@w{[') + def depart_subscript(self, node): + self.add_text(']}') + + ## Footnotes + + def visit_footnote(self, node): + self.visit_block_quote(node) + def depart_footnote(self, node): + self.depart_block_quote(node) + + def visit_footnote_reference(self, node): + self.add_text('@w{(') + def depart_footnote_reference(self, node): + self.add_text(')}') + + visit_citation = visit_footnote + depart_citation = depart_footnote + + def visit_citation_reference(self, node): + self.add_text('@w{[') + def depart_citation_reference(self, node): + self.add_text(']}') + + ## Lists + + def visit_bullet_list(self, node): + bullet = node.get('bullet', '*') + self.rstrip() + self.add_text('\n\n@itemize %s\n' % bullet) + def depart_bullet_list(self, node): + self.rstrip() + self.add_text('\n@end itemize\n\n') + + def visit_enumerated_list(self, node): + # Doesn't support Roman numerals + enum = node.get('enumtype', 'arabic') + starters = {'arabic': '', + 'loweralpha': 'a', + 'upperalpha': 'A',} + start = node.get('start', starters.get(enum, '')) + self.rstrip() + self.add_text('\n\n@enumerate %s\n' % start) + def depart_enumerated_list(self, node): + self.rstrip() + self.add_text('\n@end enumerate\n\n') + + def visit_list_item(self, node): + self.rstrip() + self.add_text('\n@item\n') + def depart_list_item(self, node): + pass + + ## Option List + + def visit_option_list(self, node): + self.add_text('\n@table @option\n') + def depart_option_list(self, node): + self.rstrip() + self.add_text('\n@end table\n\n') + + def visit_option_list_item(self, node): + pass + def depart_option_list_item(self, node): + pass + + def visit_option_group(self, node): + self.at_item_x = '@item' + def depart_option_group(self, node): + pass + + def visit_option(self, node): + self.add_text(self.at_item_x + ' ', fresh=1) + self.at_item_x = '@itemx' + def depart_option(self, node): + pass + + def visit_option_string(self, node): + pass + def depart_option_string(self, node): + pass + + def visit_option_argument(self, node): + self.add_text(node.get('delimiter', ' ')) + def depart_option_argument(self, node): + pass + + def visit_description(self, node): + self.add_text('', fresh=1) + def depart_description(self, node): + pass + + ## Definitions + + def visit_definition_list(self, node): + self.add_text('\n@table @asis\n') + def depart_definition_list(self, node): + self.rstrip() + self.add_text('\n@end table\n\n') + + def visit_definition_list_item(self, node): + self.at_item_x = '@item' + def depart_definition_list_item(self, node): + pass + + def visit_term(self, node): + if node.get('ids') and node['ids'][0]: + self.add_anchor(node['ids'][0], node) + self.add_text(self.at_item_x + ' ', fresh=1) + self.at_item_x = '@itemx' + def depart_term(self, node): + pass + + def visit_termsep(self, node): + self.add_text(self.at_item_x + ' ', fresh=1) + + def visit_classifier(self, node): + self.add_text(' : ') + def depart_classifier(self, node): + pass + + def visit_definition(self, node): + self.add_text('', fresh=1) + def depart_definition(self, node): + pass + + ## Tables + + def visit_table(self, node): + self.entry_sep = '@item' + def depart_table(self, node): + self.rstrip() + self.add_text('\n@end multitable\n\n') + + def visit_tabular_col_spec(self, node): + pass + def depart_tabular_col_spec(self, node): + pass + + def visit_colspec(self, node): + self.colwidths.append(node['colwidth']) + if len(self.colwidths) != self.n_cols: + return + self.add_text('@multitable ', fresh=1) + for i, n in enumerate(self.colwidths): + self.add_text('{%s} ' %('x' * (n+2))) + def depart_colspec(self, node): + pass + + def visit_tgroup(self, node): + self.colwidths = [] + self.n_cols = node['cols'] + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + self.entry_sep = '@headitem' + def depart_thead(self, node): + pass + + def visit_tbody(self, node): + pass + def depart_tbody(self, node): + pass + + def visit_row(self, node): + pass + def depart_row(self, node): + self.entry_sep = '@item' + + def visit_entry(self, node): + self.rstrip() + self.add_text('\n%s ' % self.entry_sep) + self.entry_sep = '@tab' + def depart_entry(self, node): + for i in xrange(node.get('morecols', 0)): + self.add_text('@tab\n', fresh=1) + self.add_text('', fresh=1) + + ## Field Lists + + def visit_field_list(self, node): + self.add_text('\n@itemize @w\n') + def depart_field_list(self, node): + self.rstrip() + self.add_text('\n@end itemize\n\n') + + def visit_field(self, node): + if not isinstance(node.parent, nodes.field_list): + self.visit_field_list(None) + def depart_field(self, node): + if not isinstance(node.parent, nodes.field_list): + self.depart_field_list(None) + + def visit_field_name(self, node): + self.add_text('@item ', fresh=1) + def depart_field_name(self, node): + self.add_text(':') + + def visit_field_body(self, node): + self.add_text('', fresh=1) + def depart_field_body(self, node): + pass + + ## Admonitions + + def visit_admonition(self, node): + title = escape(node[0].astext()) + self.add_text('\n@cartouche\n' + '@quotation %s\n' % title) + def depart_admonition(self, node): + self.rstrip() + self.add_text('\n@end quotation\n' + '@end cartouche\n\n') + + def _make_visit_admonition(typ): + def visit(self, node): + title = escape(typ) + self.add_text('\n@cartouche\n' + '@quotation %s\n' % title) + return visit + + visit_attention = _make_visit_admonition('Attention') + visit_caution = _make_visit_admonition('Caution') + visit_danger = _make_visit_admonition('Danger') + visit_error = _make_visit_admonition('Error') + visit_important = _make_visit_admonition('Important') + visit_note = _make_visit_admonition('Note') + visit_tip = _make_visit_admonition('Tip') + visit_hint = _make_visit_admonition('Hint') + visit_warning = _make_visit_admonition('Warning') + + depart_attention = depart_admonition + depart_caution = depart_admonition + depart_danger = depart_admonition + depart_error = depart_admonition + depart_important = depart_admonition + depart_note = depart_admonition + depart_tip = depart_admonition + depart_hint = depart_admonition + depart_warning = depart_admonition + + ## Misc + + def visit_docinfo(self, node): + # No 'docinfo_xform' + raise nodes.SkipNode + + def visit_topic(self, node): + # Ignore TOC's since we have to have a "menu" anyway + if 'contents' in node.get('classes', []): + raise nodes.SkipNode + title = node[0] + self.visit_rubric(title) + self.add_text('%s\n' % escape(title.astext())) + self.visit_block_quote(node) + def depart_topic(self, node): + self.depart_block_quote(node) + + def visit_generated(self, node): + raise nodes.SkipNode + def depart_generated(self, node): + pass + + def visit_transition(self, node): + self.add_text('\n\n@noindent\n' + '@exdent @w{%s}\n\n' + '@noindent\n' % ('_' * 70)) + def depart_transition(self, node): + pass + + def visit_attribution(self, node): + self.add_text('@flushright\n', fresh=1) + def depart_attribution(self, node): + self.add_text('@end flushright\n', fresh=1) + + def visit_raw(self, node): + format = node.get('format', '').split() + if 'texinfo' in format or 'texi' in format: + self.add_text(node.astext()) + raise nodes.SkipNode + def depart_raw(self, node): + pass + + def visit_figure(self, node): + self.add_text('\n@float Figure\n') + def depart_figure(self, node): + self.rstrip() + self.add_text('\n@end float\n\n') + + def visit_caption(self, node): + if not isinstance(node.parent, nodes.figure): + self.document.reporter.warning('Caption not inside a figure.', + base_node=node) + return + self.add_text('@caption{', fresh=1) + def depart_caption(self, node): + if isinstance(node.parent, nodes.figure): + self.rstrip() + self.add_text('}\n') + + def visit_image(self, node): + if node['uri'] in self.builder.images: + uri = self.builder.images[node['uri']] + else: + # missing image! + if self.ignore_missing_images: + return + uri = node['uri'] + if uri.find('://') != -1: + # ignore remote images + return + name, ext = path.splitext(uri) + attrs = node.attributes + # ignored in non-tex output + width = self.tex_image_length(attrs.get('width', '')) + height = self.tex_image_length(attrs.get('height', '')) + alt = escape_arg(attrs.get('alt', '')) + self.add_text('\n\n@image{%s,%s,%s,%s,%s}\n\n' % + (name, width, height, alt, ext[1:])) + def depart_image(self, node): + pass + + def visit_compound(self, node): + pass + def depart_compound(self, node): + pass + + def visit_sidebar(self, node): + pass + def depart_sidebar(self, node): + pass + + def visit_label(self, node): + self.add_text('@w{(') + def depart_label(self, node): + self.add_text(')} ') + + def visit_legend(self, node): + pass + def depart_legend(self, node): + pass + + def visit_substitution_reference(self, node): + pass + def depart_substitution_reference(self, node): + pass + + def visit_substitution_definition(self, node): + raise nodes.SkipNode + def depart_substitution_definition(self, node): + pass + + def visit_system_message(self, node): + self.add_text('\n@format\n' + '---------- SYSTEM MESSAGE -----------\n') + def depart_system_message(self, node): + self.rstrip() + self.add_text('\n------------------------------------\n' + '@end format\n') + + def visit_comment(self, node): + for line in node.astext().splitlines(): + self.add_text('@c %s\n' % line, fresh=1) + raise nodes.SkipNode + + def visit_problematic(self, node): + self.add_text('>') + def depart_problematic(self, node): + self.add_text('<') + + def unimplemented_visit(self, node): + self.document.reporter.error("Unimplemented node type: `%s'" + % node.__class__.__name__, base_node=node) + + def unknown_visit(self, node): + self.document.reporter.error("Unknown node type: `%s'" + % node.__class__.__name__, base_node=node) + def unknown_departure(self, node): + pass + + ### Sphinx specific + + def visit_productionlist(self, node): + self.visit_literal_block(None) + names = [] + for production in node: + names.append(production['tokenname']) + maxlen = max(len(name) for name in names) + for production in node: + if production['tokenname']: + s = production['tokenname'].ljust(maxlen) + ' ::=' + lastname = production['tokenname'] + else: + s = '%s ' % (' '*len(lastname)) + self.add_text(escape(s)) + self.add_text(escape(production.astext() + '\n')) + self.depart_literal_block(None) + raise nodes.SkipNode + def depart_productionlist(self, node): + pass + + def visit_literal_emphasis(self, node): + self.add_text('@code{') + def depart_literal_emphasis(self, node): + self.add_text('}') + + def visit_module(self, node): + modname = escape_id(node['modname']) + self.add_anchor(modname, node) + + def visit_index(self, node): + # Throws off table alignment + if isinstance(node.parent, nodes.term): + return + for entry in node['entries']: + typ, text, tid, text2 = entry + text = text.replace('!', ' ').replace(';', ' ') + text = escape_id(text) + self.add_text('@geindex %s\n' % text, fresh=1) + + def visit_autosummary_table(self, node): + pass + def depart_autosummary_table(self, node): + pass + + def visit_todo_node(self, node): + self.visit_transition(node) + self.visit_admonition(node) + def depart_todo_node(self, node): + self.depart_admonition(node) + self.visit_transition(node) + + def visit_refcount(self, node): + self.add_text('\n') + def depart_refcount(self, node): + self.add_text('\n\n') + + def visit_versionmodified(self, node): + intro = versionlabels[node['type']] % node['version'] + if node.children: + intro += ': ' + else: + intro += '.' + self.add_text('%s' % escape(intro), fresh=1) + def depart_versionmodified(self, node): + self.rstrip() + self.add_text('\n\n', fresh=1) + + def visit_start_of_file(self, node): + self.curfilestack.append(node.get('docname', '')) + if node.get('docname'): + self.next_section_targets.append(node['docname']) + def depart_start_of_file(self, node): + self.curfilestack.pop() + + def visit_centered(self, node): + txt = escape_arg(node.astext()) + self.add_text('@center %s\n' % txt, fresh=1) + raise nodes.SkipNode + def depart_centered(self, node): + pass + + def visit_seealso(self, node): + pass + def depart_seealso(self, node): + pass + + def visit_meta(self, node): + raise nodes.SkipNode + def depart_meta(self, node): + pass + + def visit_glossary(self, node): + pass + def depart_glossary(self, node): + pass + + def visit_acks(self, node): + pass + def depart_acks(self, node): + pass + + def visit_highlightlang(self, node): + pass + def depart_highlightlang(self, node): + pass + + ## Desc + + desc_map = { + 'function' : 'Function', + 'class': 'Class', + 'method': 'Method', + 'classmethod': 'Class Method', + 'staticmethod': 'Static Method', + 'exception': 'Exception', + 'data': 'Data', + 'attribute': 'Attribute', + 'opcode': 'Opcode', + 'cfunction': 'C Function', + 'cmember': 'C Member', + 'cmacro': 'C Macro', + 'ctype': 'C Type', + 'cvar': 'C Variable', + 'cmdoption': 'Option', + 'describe': 'Description', + } + + def visit_desc(self, node): + self.at_deffnx = '@deffn' + def depart_desc(self, node): + self.rstrip() + self.add_text('@end deffn\n\n', fresh=1) + def visit_desc_signature(self, node): + self.desctype = node.parent['desctype'].strip() + if self.desctype != 'describe' and node['ids']: + self.add_anchor(node['ids'][0], node) + typ = self.desc_map.get(self.desctype, self.desctype) + self.add_text('%s {%s} ' % (self.at_deffnx, escape_arg(typ)), fresh=1) + self.at_deffnx = '@deffnx' + def depart_desc_signature(self, node): + self.add_text("", fresh=1) + + def visit_desc_name(self, node): + pass + def depart_desc_name(self, node): + pass + + def visit_desc_addname(self, node): + pass + def depart_desc_addname(self, node): + pass + + def visit_desc_type(self, node): + pass + def depart_desc_type(self, node): + pass + + def visit_desc_returns(self, node): + self.add_text(' -> ') + def depart_desc_returns(self, node): + pass + + def visit_desc_parameterlist(self, node): + self.add_text(' (') + self.first_param = 1 + def depart_desc_parameterlist(self, node): + self.add_text(')') + + def visit_desc_parameter(self, node): + if not self.first_param: + self.add_text(', ') + else: + self.first_param = 0 + self.add_text(escape(node.astext())) + raise nodes.SkipNode + def depart_desc_parameter(self, node): + pass + + def visit_desc_optional(self, node): + self.add_text('[') + def depart_desc_optional(self, node): + self.add_text(']') + + def visit_desc_annotation(self, node): + raise nodes.SkipNode + def depart_desc_annotation(self, node): + pass + + def visit_desc_content(self, node): + self.add_text("", fresh=1) + def depart_desc_content(self, node): + pass + + def visit_inline(self, node): + # stub + pass + def depart_inline(self, node): + pass + + def visit_abbreviation(self, node): + self.add_text('@abbr{') + if node.hasattr('explanation'): + self.context.append(', %s}' % escape_arg(node['explanation'])) + else: + self.context.append('}') + def depart_abbreviation(self, node): + self.body.append(self.context.pop()) + + def visit_download_reference(self, node): + pass + def depart_download_reference(self, node): + pass + + def visit_hlist(self, node): + # stub + self.visit_bullet_list(node) + def depart_hlist(self, node): + self.depart_bullet_list(node) + + def visit_hlistcol(self, node): + pass + def depart_hlistcol(self, node): + pass diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py index 98528d5ba..1a7d2a7df 100644 --- a/sphinx/writers/text.py +++ b/sphinx/writers/text.py @@ -5,10 +5,10 @@ Custom docutils writer for plain text. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ - +import os import re import textwrap @@ -52,6 +52,14 @@ class TextTranslator(nodes.NodeVisitor): def __init__(self, document, builder): nodes.NodeVisitor.__init__(self, document) + newlines = builder.config.text_newlines + if newlines == 'windows': + self.nl = '\r\n' + elif newlines == 'native': + self.nl = os.linesep + else: + self.nl = '\n' + self.sectionchars = builder.config.text_sectionchars self.states = [[]] self.stateindent = [0] self.list_counter = [] @@ -98,9 +106,9 @@ class TextTranslator(nodes.NodeVisitor): self.new_state(0) def depart_document(self, node): self.end_state() - self.body = '\n'.join(line and (' '*indent + line) - for indent, lines in self.states[0] - for line in lines) + self.body = self.nl.join(line and (' '*indent + line) + for indent, lines in self.states[0] + for line in lines) # XXX header/footer? def visit_highlightlang(self, node): @@ -225,7 +233,7 @@ class TextTranslator(nodes.NodeVisitor): def visit_desc_content(self, node): self.new_state() - self.add_text('\n') + self.add_text(self.nl) def depart_desc_content(self, node): self.end_state() @@ -251,7 +259,7 @@ class TextTranslator(nodes.NodeVisitor): lastname = production['tokenname'] else: self.add_text('%s ' % (' '*len(lastname))) - self.add_text(production.astext() + '\n') + self.add_text(production.astext() + self.nl) self.end_state(wrap=False) raise nodes.SkipNode @@ -351,7 +359,7 @@ class TextTranslator(nodes.NodeVisitor): 'not implemented.') self.new_state(0) def depart_entry(self, node): - text = '\n'.join('\n'.join(x[1]) for x in self.states.pop()) + text = self.nl.join(self.nl.join(x[1]) for x in self.states.pop()) self.stateindent.pop() self.table[-1].append(text) @@ -387,10 +395,10 @@ class TextTranslator(nodes.NodeVisitor): for width in realwidths: out.append(char * (width+2)) out.append('+') - self.add_text(''.join(out) + '\n') + self.add_text(''.join(out) + self.nl) def writerow(row): - lines = map(None, *row) + lines = zip(*row) for line in lines: out = ['|'] for i, cell in enumerate(line): @@ -399,7 +407,7 @@ class TextTranslator(nodes.NodeVisitor): else: out.append(' ' * (realwidths[i] + 2)) out.append('|') - self.add_text(''.join(out) + '\n') + self.add_text(''.join(out) + self.nl) for i, row in enumerate(fmted_rows): if separator and i == separator: @@ -475,6 +483,10 @@ class TextTranslator(nodes.NodeVisitor): if not self._li_has_classifier: self.end_state(end=None) + def visit_termsep(self, node): + self.add_text(', ') + raise nodes.SkipNode + def visit_classifier(self, node): self.add_text(' : ') def depart_classifier(self, node): @@ -651,9 +663,9 @@ class TextTranslator(nodes.NodeVisitor): self.add_text('*') def visit_literal(self, node): - self.add_text('``') + self.add_text('"') def depart_literal(self, node): - self.add_text('``') + self.add_text('"') def visit_subscript(self, node): self.add_text('_') diff --git a/sphinx/writers/websupport.py b/sphinx/writers/websupport.py new file mode 100644 index 000000000..f75cd47b1 --- /dev/null +++ b/sphinx/writers/websupport.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +""" + sphinx.writers.websupport + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + sphinx.websupport writer that adds comment-related annotations. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from sphinx.writers.html import HTMLTranslator +from sphinx.util.websupport import is_commentable + + +class WebSupportTranslator(HTMLTranslator): + """ + Our custom HTML translator. + """ + + def __init__(self, builder, *args, **kwargs): + HTMLTranslator.__init__(self, builder, *args, **kwargs) + self.comment_class = 'sphinx-has-comment' + + def dispatch_visit(self, node): + if is_commentable(node): + self.handle_visit_commentable(node) + HTMLTranslator.dispatch_visit(self, node) + + def handle_visit_commentable(self, node): + # We will place the node in the HTML id attribute. If the node + # already has an id (for indexing purposes) put an empty + # span with the existing id directly before this node's HTML. + self.add_db_node(node) + if node.attributes['ids']: + self.body.append('<span id="%s"></span>' + % node.attributes['ids'][0]) + node.attributes['ids'] = ['s%s' % node.uid] + node.attributes['classes'].append(self.comment_class) + + def add_db_node(self, node): + storage = self.builder.storage + if not storage.has_node(node.uid): + storage.add_node(id=node.uid, + document=self.builder.cur_docname, + source=node.rawsource or node.astext()) diff --git a/tests/coverage.py b/tests/coverage.py index 117fd4f29..95f6f8440 100755 --- a/tests/coverage.py +++ b/tests/coverage.py @@ -362,8 +362,9 @@ class coverage: settings[o[2:]] = 1 elif o[2:] + '=' in long_opts: settings[o[2:]+'='] = a - else: #pragma: no cover - pass # Can't get here, because getopt won't return anything unknown. + else: #pragma: no cover + # Can't get here, because getopt won't return anything unknown. + pass if settings.get('help'): help_fn() @@ -645,20 +646,23 @@ class coverage: def find_docstring_pass_pair(self, tree, spots): for i in range(1, len(tree)): - if self.is_string_constant(tree[i]) and self.is_pass_stmt(tree[i+1]): + if (self.is_string_constant(tree[i]) + and self.is_pass_stmt(tree[i+1])): first_line = self.first_line_of_tree(tree[i]) last_line = self.last_line_of_tree(tree[i+1]) self.record_multiline(spots, first_line, last_line) def is_string_constant(self, tree): try: - return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.expr_stmt + return (tree[0] == symbol.stmt + and tree[1][1][1][0] == symbol.expr_stmt) except: return False def is_pass_stmt(self, tree): try: - return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.pass_stmt + return (tree[0] == symbol.stmt + and tree[1][1][1][0] == symbol.pass_stmt) except: return False @@ -761,7 +765,7 @@ class coverage: pairs = [] while i < len(statements) and j < len(lines): if statements[i] == lines[j]: - if start == None: + if start is None: start = lines[j] end = lines[j] j = j + 1 @@ -831,7 +835,8 @@ class coverage: def morf_name_compare(self, x, y): return cmp(self.morf_name(x), self.morf_name(y)) - def report(self, morfs, show_missing=1, ignore_errors=0, file=None, omit_prefixes=[]): + def report(self, morfs, show_missing=1, ignore_errors=0, file=None, + omit_prefixes=[]): if not isinstance(morfs, types.ListType): morfs = [morfs] # On windows, the shell doesn't expand wildcards. Do it here. @@ -898,19 +903,23 @@ class coverage: blank_re = re.compile(r"\s*(#|$)") else_re = re.compile(r"\s*else\s*:\s*(#|$)") - def annotate(self, morfs, directory=None, ignore_errors=0, omit_prefixes=[]): + def annotate(self, morfs, directory=None, ignore_errors=0, + omit_prefixes=[]): morfs = self.filter_by_prefix(morfs, omit_prefixes) for morf in morfs: try: - filename, statements, excluded, missing, _ = self.analysis2(morf) - self.annotate_file(filename, statements, excluded, missing, directory) + (filename, statements, excluded, + missing, _) = self.analysis2(morf) + self.annotate_file(filename, statements, excluded, missing, + directory) except KeyboardInterrupt: raise except: if not ignore_errors: raise - def annotate_file(self, filename, statements, excluded, missing, directory=None): + def annotate_file(self, filename, statements, excluded, missing, + directory=None): source = open(filename, 'r') if directory: dest_file = os.path.join(directory, diff --git a/tests/etree13/ElementTree.py b/tests/etree13/ElementTree.py index d37325049..f459c7f8f 100644 --- a/tests/etree13/ElementTree.py +++ b/tests/etree13/ElementTree.py @@ -1425,12 +1425,16 @@ class XMLParser(object): err.position = value.lineno, value.offset raise err - def _fixtext(self, text): - # convert text string to ascii, if possible - try: - return text.encode("ascii") - except UnicodeError: + if sys.version_info >= (3, 0): + def _fixtext(self, text): return text + else: + def _fixtext(self, text): + # convert text string to ascii, if possible + try: + return text.encode("ascii") + except UnicodeError: + return text def _fixname(self, key): # expand qname, and convert name string to ascii, if possible diff --git a/tests/path.py b/tests/path.py index ceb895f50..8e9afeaa8 100644 --- a/tests/path.py +++ b/tests/path.py @@ -1,953 +1,196 @@ -""" path.py - An object representing a path to a file or directory. - -Example: - -from path import path -d = path('/home/guido/bin') -for f in d.files('*.py'): - f.chmod(0755) - -This module requires Python 2.2 or later. - - -URL: http://www.jorendorff.com/articles/python/path -Author: Jason Orendorff <jason.orendorff\x40gmail\x2ecom> (and others - see the url!) -Date: 9 Mar 2007 +#!/usr/bin/env python +# coding: utf-8 """ + path + ~~~~ + + :copyright: Copyright 2010 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import os +import sys +import shutil +from codecs import open -# TODO -# - Tree-walking functions don't avoid symlink loops. Matt Harrison -# sent me a patch for this. -# - Bug in write_text(). It doesn't support Universal newline mode. -# - Better error message in listdir() when self isn't a -# directory. (On Windows, the error message really sucks.) -# - Make sure everything has a good docstring. -# - Add methods for regex find and replace. -# - guess_content_type() method? -# - Perhaps support arguments to touch(). - -from __future__ import generators - -import sys, warnings, os, fnmatch, glob, shutil, codecs - -__version__ = '2.2' -__all__ = ['path'] - -# Platform-specific support for path.owner -if os.name == 'nt': - try: - import win32security - except ImportError: - win32security = None -else: - try: - import pwd - except ImportError: - pwd = None - -# Pre-2.3 support. Are unicode filenames supported? -_base = str -_getcwd = os.getcwd -try: - if os.path.supports_unicode_filenames: - _base = unicode - _getcwd = os.getcwdu -except AttributeError: - pass - -# Pre-2.3 workaround for booleans -try: - True, False -except NameError: - True, False = 1, 0 - -# Pre-2.3 workaround for basestring. -try: - basestring -except NameError: - basestring = (str, unicode) - -# Universal newline support -_textmode = 'r' -if hasattr(file, 'newlines'): - _textmode = 'U' +FILESYSTEMENCODING = sys.getfilesystemencoding() or sys.getdefaultencoding() -class TreeWalkWarning(Warning): - pass - -class path(_base): - """ Represents a filesystem path. - - For documentation on individual methods, consult their - counterparts in os.path. +class path(str): """ + Represents a path which behaves like a string. + """ + if sys.version_info < (3, 0): + def __new__(cls, s, encoding=FILESYSTEMENCODING, errors='strict'): + if isinstance(s, unicode): + s = s.encode(encoding, errors=errors) + return str.__new__(cls, s) + return str.__new__(cls, s) - # --- Special Python methods. + @property + def parent(self): + """ + The name of the directory the file or directory is in. + """ + return self.__class__(os.path.dirname(self)) - def __repr__(self): - return 'path(%s)' % _base.__repr__(self) + def abspath(self): + """ + Returns the absolute path. + """ + return self.__class__(os.path.abspath(self)) - # Adding a path and a string yields a path. - def __add__(self, more): + def isabs(self): + """ + Returns ``True`` if the path is absolute. + """ + return os.path.isabs(self) + + def isdir(self): + """ + Returns ``True`` if the path is a directory. + """ + return os.path.isdir(self) + + def isfile(self): + """ + Returns ``True`` if the path is a file. + """ + return os.path.isfile(self) + + def islink(self): + """ + Returns ``True`` if the path is a symbolic link. + """ + return os.path.islink(self) + + def ismount(self): + """ + Returns ``True`` if the path is a mount point. + """ + return os.path.ismount(self) + + def rmtree(self, ignore_errors=False, onerror=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, symlinks=False): + """ + 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) + + def movetree(self, destination): + """ + 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): + """ + Removes a file. + """ + os.unlink(self) + + def write_text(self, text, **kwargs): + """ + Writes the given `text` to the file. + """ + f = open(self, 'w', **kwargs) try: - resultStr = _base.__add__(self, more) - except TypeError: #Python bug - resultStr = NotImplemented - if resultStr is NotImplemented: - return resultStr - return self.__class__(resultStr) + f.write(text) + finally: + f.close() - def __radd__(self, other): - if isinstance(other, basestring): - return self.__class__(other.__add__(self)) - else: - return NotImplemented - - # The / operator joins paths. - def __div__(self, rel): - """ fp.__div__(rel) == fp / rel == fp.joinpath(rel) - - Join two path components, adding a separator character if - needed. + def text(self, **kwargs): """ - return self.__class__(os.path.join(self, rel)) - - # Make the / operator work even when true division is enabled. - __truediv__ = __div__ - - def getcwd(cls): - """ Return the current working directory as a path object. """ - return cls(_getcwd()) - getcwd = classmethod(getcwd) - - - # --- Operations on path strings. - - isabs = os.path.isabs - def abspath(self): return self.__class__(os.path.abspath(self)) - def normcase(self): return self.__class__(os.path.normcase(self)) - def normpath(self): return self.__class__(os.path.normpath(self)) - def realpath(self): return self.__class__(os.path.realpath(self)) - def expanduser(self): return self.__class__(os.path.expanduser(self)) - def expandvars(self): return self.__class__(os.path.expandvars(self)) - def dirname(self): return self.__class__(os.path.dirname(self)) - basename = os.path.basename - - def expand(self): - """ Clean up a filename by calling expandvars(), - expanduser(), and normpath() on it. - - This is commonly everything needed to clean up a filename - read from a configuration file, for example. + Returns the text in the file. """ - return self.expandvars().expanduser().normpath() - - def _get_namebase(self): - base, ext = os.path.splitext(self.name) - return base - - def _get_ext(self): - f, ext = os.path.splitext(_base(self)) - return ext - - def _get_drive(self): - drive, r = os.path.splitdrive(self) - return self.__class__(drive) - - parent = property( - dirname, None, None, - """ This path's parent directory, as a new path object. - - For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib') - """) - - name = property( - basename, None, None, - """ The name of this file or directory without the full path. - - For example, path('/usr/local/lib/libpython.so').name == 'libpython.so' - """) - - namebase = property( - _get_namebase, None, None, - """ The same as path.name, but with one file extension stripped off. - - For example, path('/home/guido/python.tar.gz').name == 'python.tar.gz', - but path('/home/guido/python.tar.gz').namebase == 'python.tar' - """) - - ext = property( - _get_ext, None, None, - """ The file extension, for example '.py'. """) - - drive = property( - _get_drive, None, None, - """ The drive specifier, for example 'C:'. - This is always empty on systems that don't use drive specifiers. - """) - - def splitpath(self): - """ p.splitpath() -> Return (p.parent, p.name). """ - parent, child = os.path.split(self) - return self.__class__(parent), child - - def splitdrive(self): - """ p.splitdrive() -> Return (p.drive, <the rest of p>). - - Split the drive specifier from this path. If there is - no drive specifier, p.drive is empty, so the return value - is simply (path(''), p). This is always the case on Unix. - """ - drive, rel = os.path.splitdrive(self) - return self.__class__(drive), rel - - def splitext(self): - """ p.splitext() -> Return (p.stripext(), p.ext). - - Split the filename extension from this path and return - the two parts. Either part may be empty. - - The extension is everything from '.' to the end of the - last path segment. This has the property that if - (a, b) == p.splitext(), then a + b == p. - """ - filename, ext = os.path.splitext(self) - return self.__class__(filename), ext - - def stripext(self): - """ p.stripext() -> Remove one file extension from the path. - - For example, path('/home/guido/python.tar.gz').stripext() - returns path('/home/guido/python.tar'). - """ - return self.splitext()[0] - - if hasattr(os.path, 'splitunc'): - def splitunc(self): - unc, rest = os.path.splitunc(self) - return self.__class__(unc), rest - - def _get_uncshare(self): - unc, r = os.path.splitunc(self) - return self.__class__(unc) - - uncshare = property( - _get_uncshare, None, None, - """ The UNC mount point for this path. - This is empty for paths on local drives. """) - - def joinpath(self, *args): - """ Join two or more path components, adding a separator - character (os.sep) if needed. Returns a new path - object. - """ - return self.__class__(os.path.join(self, *args)) - - def splitall(self): - r""" Return a list of the path components in this path. - - The first item in the list will be a path. Its value will be - either os.curdir, os.pardir, empty, or the root directory of - this path (for example, '/' or 'C:\\'). The other items in - the list will be strings. - - path.path.joinpath(*result) will yield the original path. - """ - parts = [] - loc = self - while loc != os.curdir and loc != os.pardir: - prev = loc - loc, child = prev.splitpath() - if loc == prev: - break - parts.append(child) - parts.append(loc) - parts.reverse() - return parts - - def relpath(self): - """ Return this path as a relative path, - based from the current working directory. - """ - cwd = self.__class__(os.getcwd()) - return cwd.relpathto(self) - - def relpathto(self, dest): - """ Return a relative path from self to dest. - - If there is no relative path from self to dest, for example if - they reside on different drives in Windows, then this returns - dest.abspath(). - """ - origin = self.abspath() - dest = self.__class__(dest).abspath() - - orig_list = origin.normcase().splitall() - # Don't normcase dest! We want to preserve the case. - dest_list = dest.splitall() - - if orig_list[0] != os.path.normcase(dest_list[0]): - # Can't get here from there. - return dest - - # Find the location where the two paths start to differ. - i = 0 - for start_seg, dest_seg in zip(orig_list, dest_list): - if start_seg != os.path.normcase(dest_seg): - break - i += 1 - - # Now i is the point where the two paths diverge. - # Need a certain number of "os.pardir"s to work up - # from the origin to the point of divergence. - segments = [os.pardir] * (len(orig_list) - i) - # Need to add the diverging part of dest_list. - segments += dest_list[i:] - if len(segments) == 0: - # If they happen to be identical, use os.curdir. - relpath = os.curdir - else: - relpath = os.path.join(*segments) - return self.__class__(relpath) - - # --- Listing, searching, walking, and matching - - def listdir(self, pattern=None): - """ D.listdir() -> List of items in this directory. - - Use D.files() or D.dirs() instead if you want a listing - of just files or just subdirectories. - - The elements of the list are path objects. - - With the optional 'pattern' argument, this only lists - items whose names match the given pattern. - """ - names = os.listdir(self) - if pattern is not None: - names = fnmatch.filter(names, pattern) - return [self / child for child in names] - - def dirs(self, pattern=None): - """ D.dirs() -> List of this directory's subdirectories. - - The elements of the list are path objects. - This does not walk recursively into subdirectories - (but see path.walkdirs). - - With the optional 'pattern' argument, this only lists - directories whose names match the given pattern. For - example, d.dirs('build-*'). - """ - return [p for p in self.listdir(pattern) if p.isdir()] - - def files(self, pattern=None): - """ D.files() -> List of the files in this directory. - - The elements of the list are path objects. - This does not walk into subdirectories (see path.walkfiles). - - With the optional 'pattern' argument, this only lists files - whose names match the given pattern. For example, - d.files('*.pyc'). - """ - - return [p for p in self.listdir(pattern) if p.isfile()] - - def walk(self, pattern=None, errors='strict'): - """ D.walk() -> iterator over files and subdirs, recursively. - - The iterator yields path objects naming each child item of - this directory and its descendants. This requires that - D.isdir(). - - This performs a depth-first traversal of the directory tree. - Each directory is returned just before all its children. - - The errors= keyword argument controls behavior when an - error occurs. The default is 'strict', which causes an - exception. The other allowed values are 'warn', which - reports the error via warnings.warn(), and 'ignore'. - """ - if errors not in ('strict', 'warn', 'ignore'): - raise ValueError("invalid errors parameter") - + f = open(self, mode='U', **kwargs) try: - childList = self.listdir() - except Exception: - if errors == 'ignore': - return - elif errors == 'warn': - warnings.warn( - "Unable to list directory '%s': %s" - % (self, sys.exc_info()[1]), - TreeWalkWarning) - return - else: - raise - - for child in childList: - if pattern is None or child.fnmatch(pattern): - yield child - try: - isdir = child.isdir() - except Exception: - if errors == 'ignore': - isdir = False - elif errors == 'warn': - warnings.warn( - "Unable to access '%s': %s" - % (child, sys.exc_info()[1]), - TreeWalkWarning) - isdir = False - else: - raise - - if isdir: - for item in child.walk(pattern, errors): - yield item - - def walkdirs(self, pattern=None, errors='strict'): - """ D.walkdirs() -> iterator over subdirs, recursively. - - With the optional 'pattern' argument, this yields only - directories whose names match the given pattern. For - example, mydir.walkdirs('*test') yields only directories - with names ending in 'test'. - - The errors= keyword argument controls behavior when an - error occurs. The default is 'strict', which causes an - exception. The other allowed values are 'warn', which - reports the error via warnings.warn(), and 'ignore'. - """ - if errors not in ('strict', 'warn', 'ignore'): - raise ValueError("invalid errors parameter") - - try: - dirs = self.dirs() - except Exception: - if errors == 'ignore': - return - elif errors == 'warn': - warnings.warn( - "Unable to list directory '%s': %s" - % (self, sys.exc_info()[1]), - TreeWalkWarning) - return - else: - raise - - for child in dirs: - if pattern is None or child.fnmatch(pattern): - yield child - for subsubdir in child.walkdirs(pattern, errors): - yield subsubdir - - def walkfiles(self, pattern=None, errors='strict'): - """ D.walkfiles() -> iterator over files in D, recursively. - - The optional argument, pattern, limits the results to files - with names that match the pattern. For example, - mydir.walkfiles('*.tmp') yields only files with the .tmp - extension. - """ - if errors not in ('strict', 'warn', 'ignore'): - raise ValueError("invalid errors parameter") - - try: - childList = self.listdir() - except Exception: - if errors == 'ignore': - return - elif errors == 'warn': - warnings.warn( - "Unable to list directory '%s': %s" - % (self, sys.exc_info()[1]), - TreeWalkWarning) - return - else: - raise - - for child in childList: - try: - isfile = child.isfile() - isdir = not isfile and child.isdir() - except: - if errors == 'ignore': - continue - elif errors == 'warn': - warnings.warn( - "Unable to access '%s': %s" - % (self, sys.exc_info()[1]), - TreeWalkWarning) - continue - else: - raise - - if isfile: - if pattern is None or child.fnmatch(pattern): - yield child - elif isdir: - for f in child.walkfiles(pattern, errors): - yield f - - def fnmatch(self, pattern): - """ Return True if self.name matches the given pattern. - - pattern - A filename pattern with wildcards, - for example '*.py'. - """ - return fnmatch.fnmatch(self.name, pattern) - - def glob(self, pattern): - """ Return a list of path objects that match the pattern. - - pattern - a path relative to this directory, with wildcards. - - For example, path('/users').glob('*/bin/*') returns a list - of all the files users have in their bin directories. - """ - cls = self.__class__ - return [cls(s) for s in glob.glob(_base(self / pattern))] - - - # --- Reading or writing an entire file at once. - - def open(self, mode='r'): - """ Open this file. Return a file object. """ - return file(self, mode) + return f.read() + finally: + f.close() def bytes(self): - """ Open this file, read all bytes, return them as a string. """ - f = self.open('rb') + """ + Returns the bytes in the file. + """ + f = open(self, mode='rb') try: return f.read() finally: f.close() def write_bytes(self, bytes, append=False): - """ Open this file and write the given bytes to it. + """ + Writes the given `bytes` to the file. - Default behavior is to overwrite any existing file. - Call p.write_bytes(bytes, append=True) to append instead. + :param append: + If ``True`` given `bytes` are added at the end of the file. """ if append: mode = 'ab' else: mode = 'wb' - f = self.open(mode) + f = open(self, mode=mode) try: f.write(bytes) finally: f.close() - def text(self, encoding=None, errors='strict'): - r""" Open this file, read it in, return the content as a string. - - This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r' - are automatically translated to '\n'. - - Optional arguments: - - encoding - The Unicode encoding (or character set) of - the file. If present, the content of the file is - decoded and returned as a unicode object; otherwise - it is returned as an 8-bit str. - errors - How to handle Unicode errors; see help(str.decode) - for the options. Default is 'strict'. + def exists(self): """ - if encoding is None: - # 8-bit - f = self.open(_textmode) - try: - return f.read() - finally: - f.close() - else: - # Unicode - f = codecs.open(self, 'r', encoding, errors) - # (Note - Can't use 'U' mode here, since codecs.open - # doesn't support 'U' mode, even in Python 2.3.) - try: - t = f.read() - finally: - f.close() - return (t.replace(u'\r\n', u'\n') - .replace(u'\r\x85', u'\n') - .replace(u'\r', u'\n') - .replace(u'\x85', u'\n') - .replace(u'\u2028', u'\n')) - - def write_text(self, text, encoding=None, errors='strict', linesep=os.linesep, append=False): - r""" Write the given text to this file. - - The default behavior is to overwrite any existing file; - to append instead, use the 'append=True' keyword argument. - - There are two differences between path.write_text() and - path.write_bytes(): newline handling and Unicode handling. - See below. - - Parameters: - - - text - str/unicode - The text to be written. - - - encoding - str - The Unicode encoding that will be used. - This is ignored if 'text' isn't a Unicode string. - - - errors - str - How to handle Unicode encoding errors. - Default is 'strict'. See help(unicode.encode) for the - options. This is ignored if 'text' isn't a Unicode - string. - - - linesep - keyword argument - str/unicode - The sequence of - characters to be used to mark end-of-line. The default is - os.linesep. You can also specify None; this means to - leave all newlines as they are in 'text'. - - - append - keyword argument - bool - Specifies what to do if - the file already exists (True: append to the end of it; - False: overwrite it.) The default is False. - - - --- Newline handling. - - write_text() converts all standard end-of-line sequences - ('\n', '\r', and '\r\n') to your platform's default end-of-line - sequence (see os.linesep; on Windows, for example, the - end-of-line marker is '\r\n'). - - If you don't like your platform's default, you can override it - using the 'linesep=' keyword argument. If you specifically want - write_text() to preserve the newlines as-is, use 'linesep=None'. - - This applies to Unicode text the same as to 8-bit text, except - there are three additional standard Unicode end-of-line sequences: - u'\x85', u'\r\x85', and u'\u2028'. - - (This is slightly different from when you open a file for - writing with fopen(filename, "w") in C or file(filename, 'w') - in Python.) - - - --- Unicode - - If 'text' isn't Unicode, then apart from newline handling, the - bytes are written verbatim to the file. The 'encoding' and - 'errors' arguments are not used and must be omitted. - - If 'text' is Unicode, it is first converted to bytes using the - specified 'encoding' (or the default encoding if 'encoding' - isn't specified). The 'errors' argument applies only to this - conversion. - + Returns ``True`` if the path exist. """ - if isinstance(text, unicode): - if linesep is not None: - # Convert all standard end-of-line sequences to - # ordinary newline characters. - text = (text.replace(u'\r\n', u'\n') - .replace(u'\r\x85', u'\n') - .replace(u'\r', u'\n') - .replace(u'\x85', u'\n') - .replace(u'\u2028', u'\n')) - text = text.replace(u'\n', linesep) - if encoding is None: - encoding = sys.getdefaultencoding() - bytes = text.encode(encoding, errors) - else: - # It is an error to specify an encoding if 'text' is - # an 8-bit string. - assert encoding is None + return os.path.exists(self) - if linesep is not None: - text = (text.replace('\r\n', '\n') - .replace('\r', '\n')) - bytes = text.replace('\n', linesep) - - self.write_bytes(bytes, append) - - def lines(self, encoding=None, errors='strict', retain=True): - r""" Open this file, read all lines, return them in a list. - - Optional arguments: - encoding - The Unicode encoding (or character set) of - the file. The default is None, meaning the content - of the file is read as 8-bit characters and returned - as a list of (non-Unicode) str objects. - errors - How to handle Unicode errors; see help(str.decode) - for the options. Default is 'strict' - retain - If true, retain newline characters; but all newline - character combinations ('\r', '\n', '\r\n') are - translated to '\n'. If false, newline characters are - stripped off. Default is True. - - This uses 'U' mode in Python 2.3 and later. + def lexists(self): """ - if encoding is None and retain: - f = self.open(_textmode) - try: - return f.readlines() - finally: - f.close() - else: - return self.text(encoding, errors).splitlines(retain) - - def write_lines(self, lines, encoding=None, errors='strict', - linesep=os.linesep, append=False): - r""" Write the given lines of text to this file. - - By default this overwrites any existing file at this path. - - This puts a platform-specific newline sequence on every line. - See 'linesep' below. - - lines - A list of strings. - - encoding - A Unicode encoding to use. This applies only if - 'lines' contains any Unicode strings. - - errors - How to handle errors in Unicode encoding. This - also applies only to Unicode strings. - - linesep - The desired line-ending. This line-ending is - applied to every line. If a line already has any - standard line ending ('\r', '\n', '\r\n', u'\x85', - u'\r\x85', u'\u2028'), that will be stripped off and - this will be used instead. The default is os.linesep, - which is platform-dependent ('\r\n' on Windows, '\n' on - Unix, etc.) Specify None to write the lines as-is, - like file.writelines(). - - Use the keyword argument append=True to append lines to the - file. The default is to overwrite the file. Warning: - When you use this with Unicode data, if the encoding of the - existing data in the file is different from the encoding - you specify with the encoding= parameter, the result is - mixed-encoding data, which can really confuse someone trying - to read the file later. + Returns ``True`` if the path exists unless it is a broken symbolic + link. """ - if append: - mode = 'ab' - else: - mode = 'wb' - f = self.open(mode) - try: - for line in lines: - isUnicode = isinstance(line, unicode) - if linesep is not None: - # Strip off any existing line-end and add the - # specified linesep string. - if isUnicode: - if line[-2:] in (u'\r\n', u'\x0d\x85'): - line = line[:-2] - elif line[-1:] in (u'\r', u'\n', - u'\x85', u'\u2028'): - line = line[:-1] - else: - if line[-2:] == '\r\n': - line = line[:-2] - elif line[-1:] in ('\r', '\n'): - line = line[:-1] - line += linesep - if isUnicode: - if encoding is None: - encoding = sys.getdefaultencoding() - line = line.encode(encoding, errors) - f.write(line) - finally: - f.close() - - # --- Methods for querying the filesystem. - - exists = os.path.exists - isdir = os.path.isdir - isfile = os.path.isfile - islink = os.path.islink - ismount = os.path.ismount - - if hasattr(os.path, 'samefile'): - samefile = os.path.samefile - - getatime = os.path.getatime - atime = property( - getatime, None, None, - """ Last access time of the file. """) - - getmtime = os.path.getmtime - mtime = property( - getmtime, None, None, - """ Last-modified time of the file. """) - - if hasattr(os.path, 'getctime'): - getctime = os.path.getctime - ctime = property( - getctime, None, None, - """ Creation time of the file. """) - - getsize = os.path.getsize - size = property( - getsize, None, None, - """ Size of the file, in bytes. """) - - if hasattr(os, 'access'): - def access(self, mode): - """ Return true if current user has access to this path. - - mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK - """ - return os.access(self, mode) - - def stat(self): - """ Perform a stat() system call on this path. """ - return os.stat(self) - - def lstat(self): - """ Like path.stat(), but do not follow symbolic links. """ - return os.lstat(self) - - def get_owner(self): - r""" Return the name of the owner of this file or directory. - - This follows symbolic links. - - On Windows, this returns a name of the form ur'DOMAIN\User Name'. - On Windows, a group can own a file or directory. - """ - if os.name == 'nt': - if win32security is None: - raise Exception("path.owner requires win32all to be installed") - desc = win32security.GetFileSecurity( - self, win32security.OWNER_SECURITY_INFORMATION) - sid = desc.GetSecurityDescriptorOwner() - account, domain, typecode = win32security.LookupAccountSid(None, sid) - return domain + u'\\' + account - else: - if pwd is None: - raise NotImplementedError("path.owner is not implemented on this platform.") - st = self.stat() - return pwd.getpwuid(st.st_uid).pw_name - - owner = property( - get_owner, None, None, - """ Name of the owner of this file or directory. """) - - if hasattr(os, 'statvfs'): - def statvfs(self): - """ Perform a statvfs() system call on this path. """ - return os.statvfs(self) - - if hasattr(os, 'pathconf'): - def pathconf(self, name): - return os.pathconf(self, name) - - - # --- Modifying operations on files and directories - - def utime(self, times): - """ Set the access and modified times of this file. """ - os.utime(self, times) - - def chmod(self, mode): - os.chmod(self, mode) - - if hasattr(os, 'chown'): - def chown(self, uid, gid): - os.chown(self, uid, gid) - - def rename(self, new): - os.rename(self, new) - - def renames(self, new): - os.renames(self, new) - - - # --- Create/delete operations on directories - - def mkdir(self, mode=0777): - os.mkdir(self, mode) + return os.path.lexists(self) def makedirs(self, mode=0777): + """ + Recursively create directories. + """ os.makedirs(self, mode) - def rmdir(self): - os.rmdir(self) - - def removedirs(self): - os.removedirs(self) - - - # --- Modifying operations on files - - def touch(self): - """ Set the access/modified times of this file to the current time. - Create the file if it does not exist. + def joinpath(self, *args): """ - fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0666) - os.close(fd) - os.utime(self, None) + Joins the path with the argument given and returns the result. + """ + return self.__class__(os.path.join(self, *map(self.__class__, args))) - def remove(self): - os.remove(self) - - def unlink(self): - os.unlink(self) - - - # --- Links - - if hasattr(os, 'link'): - def link(self, newpath): - """ Create a hard link at 'newpath', pointing to this file. """ - os.link(self, newpath) - - if hasattr(os, 'symlink'): - def symlink(self, newlink): - """ Create a symbolic link at 'newlink', pointing here. """ - os.symlink(self, newlink) - - if hasattr(os, 'readlink'): - def readlink(self): - """ Return the path to which this symbolic link points. - - The result may be an absolute or a relative path. - """ - return self.__class__(os.readlink(self)) - - def readlinkabs(self): - """ Return the path to which this symbolic link points. - - The result is always an absolute path. - """ - p = self.readlink() - if p.isabs(): - return p - else: - return (self.parent / p).abspath() - - - # --- High-level functions from shutil - - copyfile = shutil.copyfile - copymode = shutil.copymode - copystat = shutil.copystat - copy = shutil.copy - copy2 = shutil.copy2 - copytree = shutil.copytree - if hasattr(shutil, 'move'): - move = shutil.move - rmtree = shutil.rmtree - - - # --- Special stuff from os - - if hasattr(os, 'chroot'): - def chroot(self): - os.chroot(self) - - if hasattr(os, 'startfile'): - def startfile(self): - os.startfile(self) + __div__ = __truediv__ = joinpath + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, str.__repr__(self)) diff --git a/tests/root/autodoc.txt b/tests/root/autodoc.txt index c718feb4c..5c03f947c 100644 --- a/tests/root/autodoc.txt +++ b/tests/root/autodoc.txt @@ -26,3 +26,9 @@ Just testing a few autodoc possibilities... .. autoclass:: CustomDict :show-inheritance: :members: + + +.. automodule:: autodoc_fodder + :noindex: + + .. autoclass:: MarkupError diff --git a/tests/root/autodoc_fodder.py b/tests/root/autodoc_fodder.py new file mode 100644 index 000000000..e5fd74139 --- /dev/null +++ b/tests/root/autodoc_fodder.py @@ -0,0 +1,7 @@ + +class MarkupError(object): + """ + .. note:: This is a docstring with a + small markup error which should have + correct location information. + """ diff --git a/tests/root/bom.po b/tests/root/bom.po new file mode 100644 index 000000000..c6025eb1e --- /dev/null +++ b/tests/root/bom.po @@ -0,0 +1,12 @@ +#, fuzzy +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "File with UTF-8 BOM" +msgstr "Datei mit UTF-8" + +msgid "This file has a UTF-8 \"BOM\"." +msgstr "This file has umlauts: äöü." diff --git a/tests/root/conf.py b/tests/root/conf.py index 2b6d6a9af..b97ddfcc1 100644 --- a/tests/root/conf.py +++ b/tests/root/conf.py @@ -22,7 +22,7 @@ copyright = '2010, Georg Brandl & Team' version = '0.6' release = '0.6alpha1' today_fmt = '%B %d, %Y' -#unused_docs = [] +# unused_docs = [] exclude_patterns = ['_build', '**/excluded.*'] keep_warnings = True pygments_style = 'sphinx' @@ -49,6 +49,11 @@ latex_documents = [ latex_additional_files = ['svgimg.svg'] +texinfo_documents = [ + ('contents', 'SphinxTests', 'Sphinx Tests', + 'Georg Brandl \\and someone else', 'Sphinx Testing', 'Miscellaneous'), +] + value_from_conf_py = 84 coverage_c_path = ['special/*.h'] @@ -91,3 +96,4 @@ def setup(app): app.add_directive('clsdir', ClassDirective) app.add_object_type('userdesc', 'userdescrole', '%s (userdesc)', userdesc_parse, objname='user desc') + app.add_javascript('file://moo.js') diff --git a/tests/root/contents.txt b/tests/root/contents.txt index e052e04b2..280953b46 100644 --- a/tests/root/contents.txt +++ b/tests/root/contents.txt @@ -26,6 +26,7 @@ Contents: extensions doctest extensions + versioning/index Python <http://python.org/> diff --git a/tests/root/doctest.txt b/tests/root/doctest.txt index 35cdd589c..d029cd880 100644 --- a/tests/root/doctest.txt +++ b/tests/root/doctest.txt @@ -30,7 +30,7 @@ Special directives .. testcode:: - print 1+1 + print(1+1) .. testoutput:: @@ -50,30 +50,31 @@ Special directives .. testsetup:: * - from math import floor + def squared(x): + return x * x .. doctest:: - >>> floor(1.2) - 1.0 + >>> squared(2) + 4 .. testcode:: - print floor(1.2) + print(squared(2)) .. testoutput:: - 1.0 + 4 - >>> floor(1.2) - 1.0 + >>> squared(2) + 4 * options for testcode/testoutput blocks .. testcode:: :hide: - print 'Output text.' + print('Output text.') .. testoutput:: :hide: @@ -85,36 +86,44 @@ Special directives .. testsetup:: group1 - from math import ceil + def add(x, y): + return x + y - ``ceil`` is now known in "group1", but not in others. + + ``add`` is now known in "group1", but not in others. .. doctest:: group1 - >>> ceil(0.8) - 1.0 + >>> add(1, 1) + 2 .. doctest:: group2 - >>> ceil(0.8) + >>> add(1, 1) Traceback (most recent call last): ... - NameError: name 'ceil' is not defined + NameError: name 'add' is not defined Interleaving testcode/testoutput: .. testcode:: group1 - print ceil(0.8) + print(squared(3)) .. testcode:: group2 - print floor(0.8) + print(squared(4)) .. testoutput:: group1 - 1.0 + 9 .. testoutput:: group2 - 0.0 + 16 + + +.. testcleanup:: * + + import test_doctest + test_doctest.cleanup_call() diff --git a/tests/root/literal.inc b/tests/root/literal.inc index d5b9890c9..694f15ed9 100644 --- a/tests/root/literal.inc +++ b/tests/root/literal.inc @@ -1,7 +1,7 @@ # Literally included file using Python highlighting # -*- coding: utf-8 -*- -foo = u"Including Unicode characters: üöä" +foo = "Including Unicode characters: üöä" class Foo: pass diff --git a/tests/root/markup.txt b/tests/root/markup.txt index a72285ed7..71197689a 100644 --- a/tests/root/markup.txt +++ b/tests/root/markup.txt @@ -34,6 +34,16 @@ Option list: -h help --help also help +Line block: + +| line1 +| line2 +| line3 +| line4 +| line5 +| line6 +| line7 + Body directives ^^^^^^^^^^^^^^^ @@ -132,6 +142,8 @@ Adding \n to test unescaping. Test :abbr:`abbr (abbreviation)` and another :abbr:`abbr (abbreviation)`. +Testing the :index:`index` role, also available with +:index:`explicit <pair: title; explicit>` title. .. _with: @@ -146,6 +158,8 @@ Tables .. tabularcolumns:: |L|p{5cm}|R| +.. _my-table: + .. table:: my table +----+----------------+----+ @@ -227,13 +241,25 @@ This tests :CLASS:`role names in uppercase`. * Monty Python .. glossary:: + :sorted: boson Particle with integer spin. - fermion + *fermion* Particle with half-integer spin. + tauon + myon + electron + Examples for fermions. + + über + Gewisse + + änhlich + Dinge + .. productionlist:: try_stmt: `try1_stmt` | `try2_stmt` try1_stmt: "try" ":" `suite` @@ -253,6 +279,8 @@ Index markup double: entry; double triple: index; entry; triple keyword: with + see: from; to + seealso: fromalso; toalso Invalid index markup... @@ -261,6 +289,11 @@ Invalid index markup... pair: keyword: +.. index:: + !Main, !Other + !single: entry; pair + +:index:`!Main` .. _ölabel: diff --git a/tests/root/objects.txt b/tests/root/objects.txt index ca3d0eb76..51ecee911 100644 --- a/tests/root/objects.txt +++ b/tests/root/objects.txt @@ -13,6 +13,9 @@ Testing object descriptions .. 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 @@ -41,12 +44,23 @@ Testing object descriptions .. 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 hour: The year. - :type hour: TimeInt + :param year: The year. + :type year: TimeInt :param TimeInt minute: The minute. :param isdst: whether it's DST :type isdst: * some complex @@ -57,6 +71,10 @@ Testing object descriptions :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 C items @@ -143,3 +161,14 @@ User markup Referencing :userdescrole:`myobj`. + + +CPP domain +========== + +.. cpp:class:: n::Array<T,d> + + .. cpp:function:: T& operator[]( unsigned j ) + + .. cpp:function:: const T& operator[]( unsigned j ) const + diff --git a/tests/root/subdir.po b/tests/root/subdir.po new file mode 100644 index 000000000..f515f2207 --- /dev/null +++ b/tests/root/subdir.po @@ -0,0 +1,9 @@ +#, fuzzy +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Including in subdir" +msgstr "translation" diff --git a/tests/root/versioning/added.txt b/tests/root/versioning/added.txt new file mode 100644 index 000000000..22a70739c --- /dev/null +++ b/tests/root/versioning/added.txt @@ -0,0 +1,20 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. + +Woho another paragraph, if this test fails we really have a problem because +this means the algorithm itself fails and not the diffing algorithm which is +pretty much doomed anyway as it probably fails for some kind of language +respecting certain nodes anyway but we can't work around that anyway. diff --git a/tests/root/versioning/deleted.txt b/tests/root/versioning/deleted.txt new file mode 100644 index 000000000..a1a9c4c91 --- /dev/null +++ b/tests/root/versioning/deleted.txt @@ -0,0 +1,12 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/root/versioning/deleted_end.txt b/tests/root/versioning/deleted_end.txt new file mode 100644 index 000000000..f30e63007 --- /dev/null +++ b/tests/root/versioning/deleted_end.txt @@ -0,0 +1,11 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. diff --git a/tests/root/versioning/index.txt b/tests/root/versioning/index.txt new file mode 100644 index 000000000..9d098f750 --- /dev/null +++ b/tests/root/versioning/index.txt @@ -0,0 +1,13 @@ +Versioning Stuff +================ + +.. toctree:: + + original + added + insert + deleted + deleted_end + modified + insert_beginning + insert_similar diff --git a/tests/root/versioning/insert.txt b/tests/root/versioning/insert.txt new file mode 100644 index 000000000..1c157cc90 --- /dev/null +++ b/tests/root/versioning/insert.txt @@ -0,0 +1,18 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +So this paragraph is just something I inserted in this document to test if our +algorithm notices that this paragraph is not just a changed version. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/root/versioning/insert_beginning.txt b/tests/root/versioning/insert_beginning.txt new file mode 100644 index 000000000..57102a76c --- /dev/null +++ b/tests/root/versioning/insert_beginning.txt @@ -0,0 +1,18 @@ +Versioning test text +==================== + +Apperantly inserting a paragraph at the beginning of a document caused +problems earlier so this document should be used to test that. + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/root/versioning/insert_similar.txt b/tests/root/versioning/insert_similar.txt new file mode 100644 index 000000000..ee9b5305c --- /dev/null +++ b/tests/root/versioning/insert_similar.txt @@ -0,0 +1,17 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/root/versioning/modified.txt b/tests/root/versioning/modified.txt new file mode 100644 index 000000000..49cdad935 --- /dev/null +++ b/tests/root/versioning/modified.txt @@ -0,0 +1,17 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. Inserting something silly as a modification, btw. have +you seen the typo below?. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. So this is a small +modification by adding something to this paragraph. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hoep it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/root/versioning/original.txt b/tests/root/versioning/original.txt new file mode 100644 index 000000000..b3fe06094 --- /dev/null +++ b/tests/root/versioning/original.txt @@ -0,0 +1,15 @@ +Versioning test text +==================== + +So the thing is I need some kind of text - not the lorem ipsum stuff, that +doesn't work out that well - to test :mod:`sphinx.versioning`. I couldn't find +a good text for that under public domain so I thought the easiest solution is +to write one by myself. It's not really interesting, in fact it is *really* +boring. + +Anyway I need more than one paragraph, at least three for the original +document, I think, and another one for two different ones. + +So the previous paragraph was a bit short because I don't want to test this +only on long paragraphs, I hope it was short enough to cover most stuff. +Anyway I see this lacks ``some markup`` so I have to add a **little** bit. diff --git a/tests/run.py b/tests/run.py index 0cb41442c..40c4fbed8 100755 --- a/tests/run.py +++ b/tests/run.py @@ -6,12 +6,22 @@ This script runs the Sphinx unit test suite. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import sys -from os import path +from os import path, chdir, listdir + +if sys.version_info >= (3, 0): + print('Copying and converting sources to build/lib/tests...') + from distutils.util import copydir_run_2to3 + testroot = path.dirname(__file__) or '.' + newroot = path.join(testroot, path.pardir, 'build') + newroot = path.join(newroot, listdir(newroot)[0], 'tests') + copydir_run_2to3(testroot, newroot) + # switch to the converted dir so nose tests the right tests + chdir(newroot) # always test the sphinx package from this directory sys.path.insert(0, path.join(path.dirname(__file__), path.pardir)) @@ -19,8 +29,8 @@ sys.path.insert(0, path.join(path.dirname(__file__), path.pardir)) try: import nose except ImportError: - print "The nose package is needed to run the Sphinx test suite." + print("The nose package is needed to run the Sphinx test suite.") sys.exit(1) -print "Running Sphinx test suite..." +print("Running Sphinx test suite...") nose.main() diff --git a/tests/test_application.py b/tests/test_application.py index 3d287a57c..4baabcec9 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -5,7 +5,7 @@ Test the Sphinx class. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -45,9 +45,11 @@ def test_output(): app = TestApp(status=status, warning=warnings) try: status.truncate(0) # __init__ writes to status + status.seek(0) app.info("Nothing here...") assert status.getvalue() == "Nothing here...\n" status.truncate(0) + status.seek(0) app.info("Nothing here...", True) assert status.getvalue() == "Nothing here..." diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py index 8f983471c..965064c37 100644 --- a/tests/test_autodoc.py +++ b/tests/test_autodoc.py @@ -6,10 +6,13 @@ Test the autodoc extension. This tests mainly the Documenters; the auto directives are tested in a test source file translated by test_build. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import sys +from StringIO import StringIO + from util import * from docutils.statemachine import ViewList @@ -23,6 +26,7 @@ def setup_module(): app = TestApp() app.builder.env.app = app + app.builder.env.temp_data['docname'] = 'dummy' app.connect('autodoc-process-docstring', process_docstring) app.connect('autodoc-process-signature', process_signature) app.connect('autodoc-skip-member', skip_member) @@ -30,6 +34,8 @@ def setup_module(): options = Struct( inherited_members = False, undoc_members = False, + private_members = False, + special_members = False, show_inheritance = False, noindex = False, synopsis = '', @@ -335,6 +341,7 @@ def test_generate(): inst = AutoDirective._registry[objtype](directive, name) inst.generate(**kw) assert directive.result + #print '\n'.join(directive.result) assert len(_warnings) == 0, _warnings del directive.result[:] @@ -416,13 +423,18 @@ def test_generate(): ('attribute', 'test_autodoc.Class.attr'), ('attribute', 'test_autodoc.Class.docattr'), ('attribute', 'test_autodoc.Class.udocattr'), + ('attribute', 'test_autodoc.Class.mdocattr'), ('attribute', 'test_autodoc.Class.inst_attr_comment'), - ('attribute', 'test_autodoc.Class.inst_attr_string') + ('attribute', 'test_autodoc.Class.inst_attr_inline'), + ('attribute', 'test_autodoc.Class.inst_attr_string'), + ('method', 'test_autodoc.Class.moore'), ]) options.members = ALL assert_processes(should, 'class', 'Class') options.undoc_members = True - should.append(('method', 'test_autodoc.Class.undocmeth')) + should.extend((('attribute', 'test_autodoc.Class.skipattr'), + ('method', 'test_autodoc.Class.undocmeth'), + ('method', 'test_autodoc.Class.roger'))) assert_processes(should, 'class', 'Class') options.inherited_members = True should.append(('method', 'test_autodoc.Class.inheritedmeth')) @@ -484,17 +496,50 @@ def test_generate(): ' .. py:attribute:: Class.prop', ' .. py:attribute:: Class.docattr', ' .. py:attribute:: Class.udocattr', + ' .. py:attribute:: Class.mdocattr', + ' .. py:classmethod:: Class.roger(a, e=5, f=6)', + ' .. py:classmethod:: Class.moore(a, e, f) -> happiness', ' .. py:attribute:: Class.inst_attr_comment', ' .. py:attribute:: Class.inst_attr_string', ' .. py:method:: Class.inheritedmeth()', ], 'class', 'Class', member_order='bysource', all_members=True) + del directive.env.temp_data['py:module'] + + # test attribute initialized to class instance from other module + directive.env.temp_data['autodoc:class'] = 'test_autodoc.Class' + assert_result_contains(u' should be documented as well - s\xfc\xdf', + 'attribute', 'mdocattr') + del directive.env.temp_data['autodoc:class'] + + # test autodoc_docstring_signature + assert_result_contains( + '.. py:method:: DocstringSig.meth(FOO, BAR=1) -> BAZ', 'method', + 'test_autodoc.DocstringSig.meth') + assert_result_contains( + ' rest of docstring', 'method', 'test_autodoc.DocstringSig.meth') + assert_result_contains( + '.. py:classmethod:: Class.moore(a, e, f) -> happiness', 'method', + 'test_autodoc.Class.moore') + + # test new attribute documenter behavior + directive.env.temp_data['py:module'] = 'test_autodoc' + options.undoc_members = True + assert_processes([('class', 'test_autodoc.AttCls'), + ('attribute', 'test_autodoc.AttCls.a1'), + ('attribute', 'test_autodoc.AttCls.a2'), + ], 'class', 'AttCls') + assert_result_contains( + ' :annotation: = hello world', 'attribute', 'AttCls.a1') + assert_result_contains( + ' :annotation: = None', 'attribute', 'AttCls.a2') # --- generate fodder ------------ __all__ = ['Class'] +#: documentation for the integer integer = 1 class CustomEx(Exception): @@ -514,6 +559,21 @@ class CustomDataDescriptor(object): return self return 42 +def _funky_classmethod(name, b, c, d, docstring=None): + """Generates a classmethod for a class from a template by filling out + some arguments.""" + def template(cls, a, b, c, d=4, e=5, f=6): + return a, b, c, d, e, f + if sys.version_info >= (2, 5): + from functools import partial + function = partial(template, b=b, c=c, d=d) + else: + def function(cls, a, e=5, f=6): + return template(a, b, c, d, e, f) + function.__name__ = name + function.__doc__ = docstring + return classmethod(function) + class Base(object): def inheritedmeth(self): """Inherited function.""" @@ -552,7 +612,17 @@ class Class(Base): udocattr = 'quux' u"""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 @@ -580,3 +650,20 @@ class Outer(object): # should be documented as an alias factory = dict + + +class DocstringSig(object): + def meth(self): + """meth(FOO, BAR=1) -> BAZ +First line of docstring + + rest of docstring + """ + +class StrRepr(str): + def __repr__(self): + return self + +class AttCls(object): + a1 = StrRepr('hello\nworld') + a2 = None diff --git a/tests/test_autosummary.py b/tests/test_autosummary.py index 7e3093676..7783cc7bf 100644 --- a/tests/test_autosummary.py +++ b/tests/test_autosummary.py @@ -5,12 +5,10 @@ Test the autosummary extension. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import string - from util import * from sphinx.ext.autosummary import mangle_signature @@ -27,7 +25,7 @@ def test_mangle_signature(): (a, b, c='foobar()', d=123) :: (a, b[, c, d]) """ - TEST = [map(string.strip, x.split("::")) for x in TEST.split("\n") + TEST = [map(lambda x: x.strip(), x.split("::")) for x in TEST.split("\n") if '::' in x] for inp, outp in TEST: res = mangle_signature(inp).strip().replace(u"\u00a0", " ") diff --git a/tests/test_build.py b/tests/test_build.py index d571febd7..5f24f89ac 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -5,7 +5,7 @@ Test all builders that have no special checks. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_build_gettext.py b/tests/test_build_gettext.py new file mode 100644 index 000000000..ab68289e3 --- /dev/null +++ b/tests/test_build_gettext.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" + test_build_gettext + ~~~~~~~~~~~~~~~~~~ + + Test the build process with gettext builder with the test root. + + :copyright: Copyright 2010 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import gettext +import os +from subprocess import Popen, PIPE + +from util import * +from util import SkipTest + + +def teardown_module(): + (test_root / '_build').rmtree(True) + + +@with_app(buildername='gettext') +def test_all(app): + # Generic build; should fail only when the builder is horribly broken. + app.builder.build_all() + + +@with_app(buildername='gettext') +def test_build(app): + # Do messages end up in the correct location? + app.builder.build(['extapi', 'subdir/includes']) + # top-level documents end up in a message catalog + assert (app.outdir / 'extapi.pot').isfile() + # directory items are grouped into sections + assert (app.outdir / 'subdir.pot').isfile() + + +@with_app(buildername='gettext') +def test_gettext(app): + app.builder.build(['markup']) + + (app.outdir / 'en' / 'LC_MESSAGES').makedirs() + cwd = os.getcwd() + os.chdir(app.outdir) + try: + try: + p = Popen(['msginit', '--no-translator', '-i', 'markup.pot', + '--locale', 'en_US'], + stdout=PIPE, stderr=PIPE) + except OSError: + raise SkipTest # most likely msginit was not found + else: + stdout, stderr = p.communicate() + if p.returncode != 0: + print stdout + print stderr + assert False, 'msginit exited with return code %s' % \ + p.returncode + assert (app.outdir / 'en_US.po').isfile(), 'msginit failed' + try: + p = Popen(['msgfmt', 'en_US.po', '-o', + os.path.join('en', 'LC_MESSAGES', 'test_root.mo')], + stdout=PIPE, stderr=PIPE) + except OSError: + raise SkipTest # most likely msgfmt was not found + else: + stdout, stderr = p.communicate() + if p.returncode != 0: + print stdout + print stderr + assert False, 'msgfmt exited with return code %s' % \ + p.returncode + assert (app.outdir / 'en' / 'LC_MESSAGES' / 'test_root.mo').isfile(), \ + 'msgfmt failed' + finally: + os.chdir(cwd) + + _ = gettext.translation('test_root', app.outdir, languages=['en']).gettext + assert _("Testing various markup") == u"Testing various markup" diff --git a/tests/test_build_html.py b/tests/test_build_html.py index bafee243a..7e68f8dbb 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -5,14 +5,14 @@ Test the HTML builder and check output against XPath. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os import re -import difflib import htmlentitydefs +import sys from StringIO import StringIO try: @@ -32,25 +32,43 @@ def teardown_module(): html_warnfile = StringIO() ENV_WARNINGS = """\ +%(root)s/autodoc_fodder.py:docstring of autodoc_fodder\\.MarkupError:2: \ +\\(WARNING/2\\) Explicit markup ends without a blank line; unexpected \ +unindent\\.\\n? %(root)s/images.txt:9: WARNING: image file not readable: foo.png %(root)s/images.txt:23: WARNING: nonlocal image URI found: \ http://www.python.org/logo.png %(root)s/includes.txt:\\d*: \\(WARNING/2\\) Encoding 'utf-8-sig' used for \ -reading included file u'wrongenc.inc' seems to be wrong, try giving an \ -:encoding: option -%(root)s/includes.txt:4: WARNING: download file not readable: nonexisting.png -%(root)s/objects.txt:79: WARNING: using old C markup; please migrate to \ +reading included file u'.*?wrongenc.inc' seems to be wrong, try giving an \ +:encoding: option\\n? +%(root)s/includes.txt:4: WARNING: download file not readable: .*?nonexisting.png +%(root)s/objects.txt:\\d*: WARNING: using old C markup; please migrate to \ new-style markup \(e.g. c:function instead of cfunction\), see \ http://sphinx.pocoo.org/domains.html """ HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' -%(root)s/markup.txt:: WARNING: invalid index entry u'' +%(root)s/markup.txt:: WARNING: invalid single index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'keyword; ' """ +if sys.version_info >= (3, 0): + ENV_WARNINGS = remove_unicode_literals(ENV_WARNINGS) + HTML_WARNINGS = remove_unicode_literals(HTML_WARNINGS) + + +def tail_check(check): + rex = re.compile(check) + def checker(nodes): + for node in nodes: + if node.tail and rex.search(node.tail): + return True + assert False, '%r not found in tail of any nodes %s' % (check, nodes) + return checker + + HTML_XPATH = { 'images.html': [ (".//img[@src='_images/img.png']", ''), @@ -152,10 +170,12 @@ HTML_XPATH = { 'objects.html': [ (".//dt[@id='mod.Cls.meth1']", ''), (".//dt[@id='errmod.Error']", ''), + (".//dt/tt", r'long\(parameter,\s* list\)'), + (".//dt/tt", 'another one'), (".//a[@href='#mod.Cls'][@class='reference internal']", ''), (".//dl[@class='userdesc']", ''), (".//dt[@id='userdesc-myobj']", ''), - (".//a[@href='#userdesc-myobj']", ''), + (".//a[@href='#userdesc-myobj'][@class='reference internal']", ''), # C references (".//span[@class='pre']", 'CFunction()'), (".//a[@href='#Sphinx_DoSomething']", ''), @@ -172,6 +192,14 @@ HTML_XPATH = { 'Testing various markup'), # custom sidebar (".//h4", 'Custom sidebar'), + # docfields + (".//td[@class='field-body']/strong", '^moo$'), + (".//td[@class='field-body']/strong", + tail_check(r'\(Moo\) .* Moo')), + (".//td[@class='field-body']/ul/li/strong", '^hour$'), + (".//td[@class='field-body']/ul/li/em", '^DuplicateType$'), + (".//td[@class='field-body']/ul/li/em", + tail_check(r'.* Some parameter')), ], 'contents.html': [ (".//meta[@name='hc'][@content='hcval']", ''), @@ -190,6 +218,8 @@ HTML_XPATH = { (".//li/a[@href='search.html']/em", 'Search Page'), # custom sidebar only for contents (".//h4", 'Contents sidebar'), + # custom JavaScript + (".//script[@src='file://moo.js']", ''), ], 'bom.html': [ (".//title", " File with UTF-8 BOM"), @@ -202,6 +232,14 @@ HTML_XPATH = { '_static/statictmpl.html': [ (".//project", 'Sphinx <Tests>'), ], + 'genindex.html': [ + # index entries + (".//a/strong", "Main"), + (".//a/strong", "[1]"), + (".//a/strong", "Other"), + (".//a", "entry"), + (".//dt/a", "double"), + ] } if pygments: @@ -214,7 +252,7 @@ if pygments: (".//div[@class='inc-lines highlight-text']//pre", r'^class Foo:\n pass\nclass Bar:\n$'), (".//div[@class='inc-startend highlight-text']//pre", - ur'^foo = u"Including Unicode characters: üöä"\n$'), + ur'^foo = "Including Unicode characters: üöä"\n$'), (".//div[@class='inc-preappend highlight-text']//pre", r'(?m)^START CODE$'), (".//div[@class='inc-pyobj-dedent highlight-python']//span", @@ -285,8 +323,8 @@ def test_html(app): html_warnings_exp = HTML_WARNINGS % {'root': re.escape(app.srcdir)} assert re.match(html_warnings_exp + '$', html_warnings), \ 'Warnings don\'t match:\n' + \ - '\n'.join(difflib.ndiff(html_warnings_exp.splitlines(), - html_warnings.splitlines())) + '--- Expected (regex):\n' + html_warnings_exp + \ + '--- Got:\n' + html_warnings for fname, paths in HTML_XPATH.iteritems(): parser = NslessParser() diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 6a20746b6..68a8c07c6 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -5,14 +5,13 @@ Test the build process with LaTeX builder with the test root. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os import re import sys -import difflib from StringIO import StringIO from subprocess import Popen, PIPE @@ -31,8 +30,12 @@ latex_warnfile = StringIO() LATEX_WARNINGS = ENV_WARNINGS + """\ None:None: WARNING: no matching candidate for image URI u'foo.\\*' WARNING: invalid pair index entry u'' +WARNING: invalid pair index entry u'keyword; ' """ +if sys.version_info >= (3, 0): + LATEX_WARNINGS = remove_unicode_literals(LATEX_WARNINGS) + @with_app(buildername='latex', warning=latex_warnfile, cleanenv=True) def test_latex(app): @@ -42,8 +45,9 @@ def test_latex(app): latex_warnings_exp = LATEX_WARNINGS % {'root': app.srcdir} assert re.match(latex_warnings_exp + '$', latex_warnings), \ 'Warnings don\'t match:\n' + \ - '\n'.join(difflib.ndiff(latex_warnings_exp.splitlines(), - latex_warnings.splitlines())) + '--- Expected (regex):\n' + latex_warnings_exp + \ + '--- Got:\n' + latex_warnings + # file from latex_additional_files assert (app.outdir / 'svgimg.svg').isfile() diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py new file mode 100644 index 000000000..ce689a696 --- /dev/null +++ b/tests/test_build_texinfo.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +""" + test_build_texinfo + ~~~~~~~~~~~~~~~~~~ + + Test the build process with Texinfo builder with the test root. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os +import re +import sys +from StringIO import StringIO +from subprocess import Popen, PIPE + +from sphinx.writers.texinfo import TexinfoTranslator + +from util import * +from test_build_html import ENV_WARNINGS + + +def teardown_module(): + (test_root / '_build').rmtree(True) + + +texinfo_warnfile = StringIO() + +TEXINFO_WARNINGS = ENV_WARNINGS + """\ +None:None: WARNING: no matching candidate for image URI u'foo.\\*' +""" + +if sys.version_info >= (3, 0): + TEXINFO_WARNINGS = remove_unicode_literals(TEXINFO_WARNINGS) + + +@with_app(buildername='texinfo', warning=texinfo_warnfile, cleanenv=True) +def test_texinfo(app): + TexinfoTranslator.ignore_missing_images = True + app.builder.build_all() + texinfo_warnings = texinfo_warnfile.getvalue().replace(os.sep, '/') + texinfo_warnings_exp = TEXINFO_WARNINGS % {'root': app.srcdir} + assert re.match(texinfo_warnings_exp + '$', texinfo_warnings), \ + 'Warnings don\'t match:\n' + \ + '--- Expected (regex):\n' + texinfo_warnings_exp + \ + '--- Got:\n' + texinfo_warnings + # now, try to run makeinfo over it + cwd = os.getcwd() + os.chdir(app.outdir) + try: + try: + p = Popen(['makeinfo', '--no-split', 'SphinxTests.texi'], + stdout=PIPE, stderr=PIPE) + except OSError: + pass # most likely makeinfo was not found + else: + stdout, stderr = p.communicate() + retcode = p.returncode + if retcode != 0: + print stdout + print stderr + del app.cleanup_trees[:] + assert False, 'makeinfo exited with return code %s' % retcode + finally: + os.chdir(cwd) diff --git a/tests/test_config.py b/tests/test_config.py index cb4e11056..b07a71bf1 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,9 +6,10 @@ Test the sphinx.config.Config class and its handling in the Application class. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import sys from util import * @@ -38,7 +39,7 @@ def test_core_config(app): # complex default values assert 'html_title' not in cfg.__dict__ - assert cfg.html_title == 'Sphinx <Tests> v0.6alpha1 documentation' + assert cfg.html_title == 'Sphinx <Tests> 0.6alpha1 documentation' # complex default values mustn't raise for valuename in cfg.config_values: @@ -84,11 +85,23 @@ def test_extension_values(app): @with_tempdir def test_errors_warnings(dir): # test the error for syntax errors in the config file - write_file(dir / 'conf.py', 'project = \n') + write_file(dir / 'conf.py', u'project = \n', 'ascii') raises_msg(ConfigError, 'conf.py', Config, dir, 'conf.py', {}, None) + # test the automatic conversion of 2.x only code in configs + write_file(dir / 'conf.py', u'# -*- coding: utf-8\n\n' + u'project = u"Jägermeister"\n', 'utf-8') + cfg = Config(dir, 'conf.py', {}, None) + cfg.init_values() + assert cfg.project == u'Jägermeister' + # test the warning for bytestrings with non-ascii content - write_file(dir / 'conf.py', '# -*- coding: latin-1\nproject = "foo\xe4"\n') + # bytestrings with non-ascii content are a syntax error in python3 so we + # skip the test there + if sys.version_info >= (3, 0): + return + write_file(dir / 'conf.py', u'# -*- coding: latin-1\nproject = "fooä"\n', + 'latin-1') cfg = Config(dir, 'conf.py', {}, None) warned = [False] def warn(msg): diff --git a/tests/test_coverage.py b/tests/test_coverage.py index 1262ebf5b..c554c52c7 100644 --- a/tests/test_coverage.py +++ b/tests/test_coverage.py @@ -5,7 +5,7 @@ Test the coverage builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,13 +27,15 @@ def test_build(app): assert ' * function\n' not in py_undoc # these two are documented assert ' * Class\n' not in py_undoc # in autodoc.txt + assert ' * mod -- No module named mod' # in the "failed import" section + c_undoc = (app.outdir / 'c.txt').text() assert c_undoc.startswith('Undocumented C API elements\n' '===========================\n') assert 'api.h' in c_undoc assert ' * Py_SphinxTest' in c_undoc - undoc_py, undoc_c = pickle.loads((app.outdir / 'undoc.pickle').text()) + undoc_py, undoc_c = pickle.loads((app.outdir / 'undoc.pickle').bytes()) assert len(undoc_c) == 1 # the key is the full path to the header file, which isn't testable assert undoc_c.values()[0] == [('function', 'Py_SphinxTest')] diff --git a/tests/test_cpp_domain.py b/tests/test_cpp_domain.py index 1e7226021..296de1c87 100644 --- a/tests/test_cpp_domain.py +++ b/tests/test_cpp_domain.py @@ -5,7 +5,7 @@ Tests the C++ Domain - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_doctest.py b/tests/test_doctest.py index b4b6bbe21..577fcb00e 100644 --- a/tests/test_doctest.py +++ b/tests/test_doctest.py @@ -5,7 +5,7 @@ Test the doctest extension. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -15,10 +15,20 @@ import StringIO from util import * status = StringIO.StringIO() +cleanup_called = 0 @with_app(buildername='doctest', status=status) def test_build(app): + global cleanup_called + cleanup_called = 0 app.builder.build_all() if app.statuscode != 0: print >>sys.stderr, status.getvalue() assert False, 'failures in doctests' + # in doctest.txt, there are two named groups and the default group, + # so the cleanup function must be called three times + assert cleanup_called == 3, 'testcleanup did not get executed enough times' + +def cleanup_call(): + global cleanup_called + cleanup_called += 1 diff --git a/tests/test_env.py b/tests/test_env.py index 4ecbaac49..e62db33bd 100644 --- a/tests/test_env.py +++ b/tests/test_env.py @@ -5,9 +5,10 @@ Test the BuildEnvironment class. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import sys from util import * @@ -28,7 +29,7 @@ def teardown_module(): def warning_emitted(file, text): for warning in warnings: - if len(warning) == 2 and file+':' in warning[1] and text in warning[0]: + if len(warning) == 2 and file in warning[1] and text in warning[0]: return True return False @@ -46,16 +47,18 @@ def test_first_update(): assert 'subdir/excluded' not in env.found_docs def test_images(): - assert warning_emitted('images.txt', 'image file not readable: foo.png') - assert warning_emitted('images.txt', 'nonlocal image URI found: ' + assert warning_emitted('images', 'image file not readable: foo.png') + assert warning_emitted('images', 'nonlocal image URI found: ' 'http://www.python.org/logo.png') tree = env.get_doctree('images') app._warning.reset() htmlbuilder = StandaloneHTMLBuilder(app) htmlbuilder.post_process_images(tree) - assert "no matching candidate for image URI u'foo.*'" in \ - app._warning.content[-1] + image_uri_message = "no matching candidate for image URI u'foo.*'" + if sys.version_info >= (3, 0): + image_uri_message = remove_unicode_literals(image_uri_message) + assert image_uri_message in app._warning.content[-1] assert set(htmlbuilder.images.keys()) == \ set(['subdir/img.png', 'img.png', 'subdir/simg.png', 'svgimg.svg']) assert set(htmlbuilder.images.values()) == \ @@ -64,8 +67,7 @@ def test_images(): app._warning.reset() latexbuilder = LaTeXBuilder(app) latexbuilder.post_process_images(tree) - assert "no matching candidate for image URI u'foo.*'" in \ - app._warning.content[-1] + assert image_uri_message in app._warning.content[-1] assert set(latexbuilder.images.keys()) == \ set(['subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf', 'svgimg.pdf']) diff --git a/tests/test_highlighting.py b/tests/test_highlighting.py index 7496690be..949552c1e 100644 --- a/tests/test_highlighting.py +++ b/tests/test_highlighting.py @@ -5,7 +5,7 @@ Test the Pygments highlighting bridge. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 135cc3e11..930108e95 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -5,7 +5,7 @@ Test locale features. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_intersphinx.py b/tests/test_intersphinx.py index 622243e60..839a3e3d2 100644 --- a/tests/test_intersphinx.py +++ b/tests/test_intersphinx.py @@ -5,13 +5,16 @@ Test the intersphinx extension. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import zlib import posixpath -from cStringIO import StringIO +try: + from io import BytesIO +except ImportError: + from cStringIO import StringIO as BytesIO from docutils import nodes @@ -28,23 +31,23 @@ inventory_v1 = '''\ # Version: 1.0 module mod foo.html module.cls class foo.html -''' +'''.encode('utf-8') inventory_v2 = '''\ # Sphinx inventory version 2 # Project: foo # Version: 2.0 # The remainder of this file is compressed with zlib. -''' + zlib.compress('''\ +'''.encode('utf-8') + zlib.compress('''\ module1 py:module 0 foo.html#module-module1 Long Module desc module2 py:module 0 foo.html#module-$ - module1.func py:function 1 sub/foo.html#$ - CFunc c:function 2 cfunc.html#CFunc - -''') +'''.encode('utf-8')) def test_read_inventory_v1(): - f = StringIO(inventory_v1) + f = BytesIO(inventory_v1) f.readline() invdata = read_inventory_v1(f, '/util', posixpath.join) assert invdata['py:module']['module'] == \ @@ -54,12 +57,12 @@ def test_read_inventory_v1(): def test_read_inventory_v2(): - f = StringIO(inventory_v2) + f = BytesIO(inventory_v2) f.readline() invdata1 = read_inventory_v2(f, '/util', posixpath.join) # try again with a small buffer size to test the chunking algorithm - f = StringIO(inventory_v2) + f = BytesIO(inventory_v2) f.readline() invdata2 = read_inventory_v2(f, '/util', posixpath.join, bufsize=5) @@ -80,7 +83,10 @@ def test_read_inventory_v2(): def test_missing_reference(tempdir, app): inv_file = tempdir / 'inventory' write_file(inv_file, inventory_v2) - app.config.intersphinx_mapping = {'http://docs.python.org/': inv_file} + app.config.intersphinx_mapping = { + 'http://docs.python.org/': inv_file, + 'py3k': ('http://docs.python.org/py3k/', inv_file), + } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly @@ -91,22 +97,58 @@ def test_missing_reference(tempdir, app): ('foo', '2.0', 'http://docs.python.org/foo.html#module-module2', '-') # create fake nodes and check referencing - contnode = nodes.emphasis('foo') - refnode = addnodes.pending_xref('') - refnode['reftarget'] = 'module1.func' - refnode['reftype'] = 'func' - refnode['refdomain'] = 'py' - rn = missing_reference(app, app.env, refnode, contnode) + 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(*args, **kwds): + node, contnode = fake_node(*args, **kwds) + return missing_reference(app, app.env, node, contnode) + + # check resolution when a target is found + rn = reference_check('py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference) assert rn['refuri'] == 'http://docs.python.org/sub/foo.html#module1.func' assert rn['reftitle'] == '(in foo v2.0)' - assert rn[0] is contnode + assert rn[0].astext() == 'foo' # create unresolvable nodes and check None return value - refnode['reftype'] = 'foo' - assert missing_reference(app, app.env, refnode, contnode) is None + assert reference_check('py', 'foo', 'module1.func', 'foo') is None + assert reference_check('py', 'func', 'foo', 'foo') is None + assert reference_check('py', 'func', 'foo', 'foo') is None - refnode['reftype'] = 'function' - refnode['reftarget'] = 'foo.func' - assert missing_reference(app, app.env, refnode, contnode) is None + # check handling of prefixes + + # prefix given, target found: prefix is stripped + rn = reference_check('py', 'mod', 'py3k:module2', 'py3k:module2') + assert rn[0].astext() == 'module2' + + # prefix given, but not in title: nothing stripped + rn = reference_check('py', 'mod', 'py3k:module2', 'module2') + assert rn[0].astext() == 'module2' + + # prefix given, but explicit: nothing stripped + rn = reference_check('py', 'mod', 'py3k:module2', 'py3k:module2', + refexplicit=True) + assert rn[0].astext() == 'py3k:module2' + + # prefix given, target not found and nonexplicit title: prefix is 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() == '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' diff --git a/tests/test_intl.py b/tests/test_intl.py new file mode 100644 index 000000000..9459a1b76 --- /dev/null +++ b/tests/test_intl.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +""" + test_intl + ~~~~~~~~~ + + Test message patching for internationalization purposes. Runs the text + builder in the test root. + + :copyright: Copyright 2010 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from subprocess import Popen, PIPE + +from util import * +from util import SkipTest + + +def setup_module(): + (test_root / 'xx' / 'LC_MESSAGES').makedirs() + # Compile all required catalogs into binary format (*.mo). + for catalog in 'bom', 'subdir': + try: + p = Popen(['msgfmt', test_root / '%s.po' % catalog, '-o', + test_root / 'xx' / 'LC_MESSAGES' / '%s.mo' % catalog], + stdout=PIPE, stderr=PIPE) + except OSError: + raise SkipTest # most likely msgfmt was not found + else: + stdout, stderr = p.communicate() + if p.returncode != 0: + print stdout + print stderr + assert False, 'msgfmt exited with return code %s' % p.returncode + assert (test_root / 'xx' / 'LC_MESSAGES' / ('%s.mo' % catalog) + ).isfile(), 'msgfmt failed' + + +def teardown_module(): + (test_root / '_build').rmtree(True) + (test_root / 'xx').rmtree(True) + + +@with_app(buildername='text', + confoverrides={'language': 'xx', 'locale_dirs': ['.']}) +def test_simple(app): + app.builder.build(['bom']) + result = (app.outdir / 'bom.txt').text(encoding='utf-8') + expect = (u"\nDatei mit UTF-8" + u"\n***************\n" # underline matches new translation + u"\nThis file has umlauts: äöü.\n") + assert result == expect + + +@with_app(buildername='text', + confoverrides={'language': 'xx', 'locale_dirs': ['.']}) +def test_subdir(app): + app.builder.build(['subdir/includes']) + result = (app.outdir / 'subdir' / 'includes.txt').text(encoding='utf-8') + assert result.startswith(u"\ntranslation\n***********\n\n") diff --git a/tests/test_markup.py b/tests/test_markup.py index 31817df62..09f617f47 100644 --- a/tests/test_markup.py +++ b/tests/test_markup.py @@ -5,7 +5,7 @@ Test various Sphinx-specific markup extensions. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,6 +17,7 @@ from docutils import frontend, utils, nodes from docutils.parsers import rst from sphinx.util import texescape +from sphinx.util.pycompat import b from sphinx.writers.html import HTMLWriter, SmartyPantsHTMLTranslator from sphinx.writers.latex import LaTeXWriter, LaTeXTranslator @@ -50,7 +51,7 @@ class ForgivingLaTeXTranslator(LaTeXTranslator, ForgivingTranslator): def verify_re(rst, html_expected, latex_expected): - document = utils.new_document('test data', settings) + document = utils.new_document(b('test data'), settings) document['file'] = 'dummy' parser.parse(rst, document) for msg in document.traverse(nodes.system_message): diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 8fb6cb214..1652b49b2 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -5,7 +5,7 @@ Test our handling of metadata in files with bibliographic metadata. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py index cb40d27cf..798d8d56b 100644 --- a/tests/test_quickstart.py +++ b/tests/test_quickstart.py @@ -5,7 +5,7 @@ Test the sphinx.quickstart module. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -36,8 +36,13 @@ def mock_raw_input(answers, needanswer=False): return '' return raw_input +try: + real_raw_input = raw_input +except NameError: + real_raw_input = input + def teardown_module(): - qs.raw_input = __builtin__.raw_input + qs.term_input = real_raw_input qs.TERM_ENCODING = getattr(sys.stdin, 'encoding', None) coloron() @@ -51,7 +56,7 @@ def test_do_prompt(): 'Q5': 'no', 'Q6': 'foo', } - qs.raw_input = mock_raw_input(answers) + qs.term_input = mock_raw_input(answers) try: qs.do_prompt(d, 'k1', 'Q1') except AssertionError: @@ -79,13 +84,18 @@ def test_quickstart_defaults(tempdir): 'Author name': 'Georg Brandl', 'Project version': '0.1', } - qs.raw_input = mock_raw_input(answers) + qs.term_input = mock_raw_input(answers) qs.inner_main([]) conffile = tempdir / 'conf.py' assert conffile.isfile() ns = {} - execfile(conffile, ns) + f = open(conffile, 'U') + try: + code = compile(f.read(), conffile, 'exec') + finally: + f.close() + exec code in ns assert ns['extensions'] == [] assert ns['templates_path'] == ['_templates'] assert ns['source_suffix'] == '.rst' @@ -112,8 +122,8 @@ def test_quickstart_all_answers(tempdir): 'Root path': tempdir, 'Separate source and build': 'y', 'Name prefix for templates': '.', - 'Project name': 'STASI\xe2\x84\xa2', - 'Author name': 'Wolfgang Sch\xc3\xa4uble & G\'Beckstein', + 'Project name': u'STASI™'.encode('utf-8'), + 'Author name': u'Wolfgang Schäuble & G\'Beckstein'.encode('utf-8'), 'Project version': '2.0', 'Project release': '2.0.1', 'Source file suffix': '.txt', @@ -131,14 +141,19 @@ def test_quickstart_all_answers(tempdir): 'Create Windows command file': 'no', 'Do you want to use the epub builder': 'yes', } - qs.raw_input = mock_raw_input(answers, needanswer=True) + qs.term_input = mock_raw_input(answers, needanswer=True) qs.TERM_ENCODING = 'utf-8' qs.inner_main([]) conffile = tempdir / 'source' / 'conf.py' assert conffile.isfile() ns = {} - execfile(conffile, ns) + f = open(conffile, 'U') + try: + code = compile(f.read(), conffile, 'exec') + finally: + f.close() + exec code in ns assert ns['extensions'] == ['sphinx.ext.autodoc', 'sphinx.ext.doctest'] assert ns['templates_path'] == ['.templates'] assert ns['source_suffix'] == '.txt' @@ -156,6 +171,10 @@ def test_quickstart_all_answers(tempdir): assert ns['man_pages'] == [ ('contents', 'stasi', u'STASI™ Documentation', [u'Wolfgang Schäuble & G\'Beckstein'], 1)] + assert ns['texinfo_documents'] == [ + ('contents', 'STASI', u'STASI™ Documentation', + u'Wolfgang Schäuble & G\'Beckstein', 'STASI', + 'One line description of project.', 'Miscellaneous'),] assert (tempdir / 'build').isdir() assert (tempdir / 'source' / '.static').isdir() diff --git a/tests/test_rst_domain.py b/tests/test_rst_domain.py index 10617095d..db5c5c07f 100644 --- a/tests/test_rst_domain.py +++ b/tests/test_rst_domain.py @@ -5,7 +5,7 @@ Tests the reStructuredText domain. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_search.py b/tests/test_search.py index 0b5b158b8..d9dcfb81b 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -5,7 +5,7 @@ Test the search index builder. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,6 +13,7 @@ from docutils import frontend, utils from docutils.parsers import rst from sphinx.search import IndexBuilder +from sphinx.util.pycompat import b settings = parser = None @@ -31,11 +32,11 @@ test that non-comments are indexed: fermion ''' def test_wordcollector(): - doc = utils.new_document('test data', settings) + doc = utils.new_document(b('test data'), settings) doc['file'] = 'dummy' parser.parse(FILE_CONTENTS, doc) - ix = IndexBuilder(None) + ix = IndexBuilder(None, 'en', {}) ix.feed('filename', 'title', doc) assert 'boson' not in ix._mapping assert 'fermion' in ix._mapping diff --git a/tests/test_searchadapters.py b/tests/test_searchadapters.py new file mode 100644 index 000000000..c20a74e3a --- /dev/null +++ b/tests/test_searchadapters.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +""" + test_searchadapters + ~~~~~~~~~~~~~~~~~~~ + + Test the Web Support Package search adapters. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os, sys +from StringIO import StringIO + +from nose import SkipTest + +from sphinx.websupport import WebSupport + +from test_websupport import sqlalchemy_missing +from util import * + + +def clear_builddir(): + (test_root / 'websupport').rmtree(True) + + +def teardown_module(): + (test_root / 'generated').rmtree(True) + clear_builddir() + + +def search_adapter_helper(adapter): + clear_builddir() + + settings = {'builddir': os.path.join(test_root, 'websupport'), + 'status': StringIO(), + 'warning': StringIO()} + settings.update({'srcdir': test_root, + 'search': adapter}) + support = WebSupport(**settings) + support.build() + + s = support.search + + # Test the adapters query method. A search for "Epigraph" should return + # one result. + results = s.query(u'Epigraph') + assert len(results) == 1, \ + '%s search adapter returned %s search result(s), should have been 1'\ + % (adapter, len(results)) + + # Make sure documents are properly updated by the search adapter. + s.init_indexing(changed=['markup']) + s.add_document(u'markup', u'title', u'SomeLongRandomWord') + s.finish_indexing() + # Now a search for "Epigraph" should return zero results. + results = s.query(u'Epigraph') + assert len(results) == 0, \ + '%s search adapter returned %s search result(s), should have been 0'\ + % (adapter, len(results)) + # A search for "SomeLongRandomWord" should return one result. + results = s.query(u'SomeLongRandomWord') + assert len(results) == 1, \ + '%s search adapter returned %s search result(s), should have been 1'\ + % (adapter, len(results)) + # Make sure it works through the WebSupport API + html = support.get_search_results(u'SomeLongRandomWord') + + +@skip_unless_importable('xapian', 'needs xapian bindings installed') +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +def test_xapian(): + search_adapter_helper('xapian') + + +@skip_unless_importable('whoosh', 'needs whoosh package installed') +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +def test_whoosh(): + search_adapter_helper('whoosh') diff --git a/tests/test_theming.py b/tests/test_theming.py index 0cad0f8d1..c924223c5 100644 --- a/tests/test_theming.py +++ b/tests/test_theming.py @@ -5,7 +5,7 @@ Test the Theme class. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -25,7 +25,8 @@ def test_theme_api(app): # test Theme class API assert set(Theme.themes.keys()) == \ set(['basic', 'default', 'scrolls', 'agogo', 'sphinxdoc', 'haiku', - 'traditional', 'testtheme', 'ziptheme', 'epub', 'nature']) + 'traditional', 'testtheme', 'ziptheme', 'epub', 'nature', + 'pyramid']) assert Theme.themes['testtheme'][1] is None assert isinstance(Theme.themes['ziptheme'][1], zipfile.ZipFile) diff --git a/tests/test_versioning.py b/tests/test_versioning.py new file mode 100644 index 000000000..018c70931 --- /dev/null +++ b/tests/test_versioning.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" + test_versioning + ~~~~~~~~~~~~~~~ + + Test the versioning implementation. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import pickle + +from util import * + +from docutils.statemachine import ViewList +from docutils.parsers.rst.directives.html import MetaBody + +from sphinx import addnodes +from sphinx.versioning import add_uids, merge_doctrees, get_ratio +from sphinx.util.pycompat import all + +def setup_module(): + global app, original, original_uids + app = TestApp() + app.builder.env.app = app + app.connect('doctree-resolved', on_doctree_resolved) + app.build() + original = doctrees['versioning/original'] + original_uids = [n.uid for n in add_uids(original, is_paragraph)] + +def teardown_module(): + app.cleanup() + (test_root / '_build').rmtree(True) + +doctrees = {} + +def on_doctree_resolved(app, doctree, docname): + doctrees[docname] = doctree + +def is_paragraph(node): + return node.__class__.__name__ == 'paragraph' + +def test_get_ratio(): + assert get_ratio('', 'a') + assert get_ratio('a', '') + +def test_add_uids(): + assert len(original_uids) == 3 + +def test_picklablility(): + # we have to modify the doctree so we can pickle it + copy = original.copy() + copy.reporter = None + copy.transformer = None + copy.settings.warning_stream = None + copy.settings.env = None + copy.settings.record_dependencies = None + for metanode in copy.traverse(MetaBody.meta): + metanode.__class__ = addnodes.meta + loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL)) + assert all(getattr(n, 'uid', False) for n in loaded.traverse(is_paragraph)) + +def test_modified(): + modified = doctrees['versioning/modified'] + new_nodes = list(merge_doctrees(original, modified, is_paragraph)) + uids = [n.uid for n in modified.traverse(is_paragraph)] + assert not new_nodes + assert original_uids == uids + +def test_added(): + added = doctrees['versioning/added'] + new_nodes = list(merge_doctrees(original, added, is_paragraph)) + uids = [n.uid for n in added.traverse(is_paragraph)] + assert len(new_nodes) == 1 + assert original_uids == uids[:-1] + +def test_deleted(): + deleted = doctrees['versioning/deleted'] + new_nodes = list(merge_doctrees(original, deleted, is_paragraph)) + uids = [n.uid for n in deleted.traverse(is_paragraph)] + assert not new_nodes + assert original_uids[::2] == uids + +def test_deleted_end(): + deleted_end = doctrees['versioning/deleted_end'] + new_nodes = list(merge_doctrees(original, deleted_end, is_paragraph)) + uids = [n.uid for n in deleted_end.traverse(is_paragraph)] + assert not new_nodes + assert original_uids[:-1] == uids + +def test_insert(): + insert = doctrees['versioning/insert'] + new_nodes = list(merge_doctrees(original, insert, is_paragraph)) + uids = [n.uid for n in insert.traverse(is_paragraph)] + assert len(new_nodes) == 1 + assert original_uids[0] == uids[0] + assert original_uids[1:] == uids[2:] + +def test_insert_beginning(): + insert_beginning = doctrees['versioning/insert_beginning'] + new_nodes = list(merge_doctrees(original, insert_beginning, is_paragraph)) + uids = [n.uid for n in insert_beginning.traverse(is_paragraph)] + assert len(new_nodes) == 1 + assert len(uids) == 4 + assert original_uids == uids[1:] + assert original_uids[0] != uids[0] + +def test_insert_similar(): + insert_similar = doctrees['versioning/insert_similar'] + new_nodes = list(merge_doctrees(original, insert_similar, is_paragraph)) + uids = [n.uid for n in insert_similar.traverse(is_paragraph)] + assert len(new_nodes) == 1 + assert new_nodes[0].rawsource == u'Anyway I need more' + assert original_uids[0] == uids[0] + assert original_uids[1:] == uids[2:] diff --git a/tests/test_websupport.py b/tests/test_websupport.py new file mode 100644 index 000000000..9cf64338a --- /dev/null +++ b/tests/test_websupport.py @@ -0,0 +1,279 @@ +# -*- coding: utf-8 -*- +""" + test_websupport + ~~~~~~~~~~~~~~~ + + Test the Web Support Package + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os +from StringIO import StringIO + +try: + from functools import wraps +except ImportError: + # functools is new in 2.5 + wraps = lambda f: (lambda w: w) + +from nose import SkipTest + +from sphinx.websupport import WebSupport +from sphinx.websupport.errors import * +from sphinx.websupport.storage import StorageBackend +from sphinx.websupport.storage.differ import CombinedHtmlDiff +try: + from sphinx.websupport.storage.sqlalchemystorage import Session, \ + SQLAlchemyStorage, Comment, CommentVote + from sphinx.websupport.storage.sqlalchemy_db import Node + sqlalchemy_missing = False +except ImportError: + sqlalchemy_missing = True + +from util import * + + +default_settings = {'builddir': os.path.join(test_root, 'websupport'), + 'status': StringIO(), + 'warning': StringIO()} + +def teardown_module(): + (test_root / 'generated').rmtree(True) + (test_root / 'websupport').rmtree(True) + + +def with_support(*args, **kwargs): + """Make a WebSupport object and pass it the test.""" + settings = default_settings.copy() + settings.update(kwargs) + + def generator(func): + @wraps(func) + def new_func(*args2, **kwargs2): + support = WebSupport(**settings) + func(support, *args2, **kwargs2) + return new_func + return generator + + +class NullStorage(StorageBackend): + pass + + +@with_support(storage=NullStorage()) +def test_no_srcdir(support): + """Make sure the correct exception is raised if srcdir is not given.""" + raises(RuntimeError, support.build) + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support(srcdir=test_root) +def test_build(support): + support.build() + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_get_document(support): + raises(DocumentNotFoundError, support.get_document, 'nonexisting') + + contents = support.get_document('contents') + assert contents['title'] and contents['body'] \ + and contents['sidebar'] and contents['relbar'] + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_comments(support): + session = Session() + nodes = session.query(Node).all() + first_node = nodes[0] + second_node = nodes[1] + + # Create a displayed comment and a non displayed comment. + comment = support.add_comment('First test comment', + node_id=first_node.id, + username='user_one') + hidden_comment = support.add_comment('Hidden comment', + node_id=first_node.id, + displayed=False) + # Make sure that comments can't be added to a comment where + # displayed == False, since it could break the algorithm that + # converts a nodes comments to a tree. + raises(CommentNotAllowedError, support.add_comment, 'Not allowed', + parent_id=str(hidden_comment['id'])) + # Add a displayed and not displayed child to the displayed comment. + support.add_comment('Child test comment', parent_id=str(comment['id']), + username='user_one') + support.add_comment('Hidden child test comment', + parent_id=str(comment['id']), displayed=False) + # Add a comment to another node to make sure it isn't returned later. + support.add_comment('Second test comment', + node_id=second_node.id, + username='user_two') + + # Access the comments as a moderator. + data = support.get_data(first_node.id, moderator=True) + comments = data['comments'] + children = comments[0]['children'] + assert len(comments) == 2 + assert comments[1]['text'] == 'Hidden comment' + assert len(children) == 2 + assert children[1]['text'] == 'Hidden child test comment' + + # Access the comments without being a moderator. + data = support.get_data(first_node.id) + comments = data['comments'] + children = comments[0]['children'] + assert len(comments) == 1 + assert comments[0]['text'] == 'First test comment' + assert len(children) == 1 + assert children[0]['text'] == 'Child test comment' + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_voting(support): + session = Session() + nodes = session.query(Node).all() + node = nodes[0] + + comment = support.get_data(node.id)['comments'][0] + + def check_rating(val): + data = support.get_data(node.id) + comment = data['comments'][0] + assert comment['rating'] == val, '%s != %s' % (comment['rating'], val) + + support.process_vote(comment['id'], 'user_one', '1') + support.process_vote(comment['id'], 'user_two', '1') + support.process_vote(comment['id'], 'user_three', '1') + check_rating(3) + support.process_vote(comment['id'], 'user_one', '-1') + check_rating(1) + support.process_vote(comment['id'], 'user_one', '0') + check_rating(2) + + # Make sure a vote with value > 1 or < -1 can't be cast. + raises(ValueError, support.process_vote, comment['id'], 'user_one', '2') + raises(ValueError, support.process_vote, comment['id'], 'user_one', '-2') + + # Make sure past voting data is associated with comments when they are + # fetched. + data = support.get_data(str(node.id), username='user_two') + comment = data['comments'][0] + assert comment['vote'] == 1, '%s != 1' % comment['vote'] + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_proposals(support): + session = Session() + node = session.query(Node).first() + + data = support.get_data(node.id) + + source = data['source'] + proposal = source[:5] + source[10:15] + 'asdf' + source[15:] + + comment = support.add_comment('Proposal comment', + node_id=node.id, + proposal=proposal) + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_user_delete_comments(support): + def get_comment(): + session = Session() + node = session.query(Node).first() + session.close() + return support.get_data(node.id)['comments'][0] + + comment = get_comment() + assert comment['username'] == 'user_one' + # Make sure other normal users can't delete someone elses comments. + raises(UserNotAuthorizedError, support.delete_comment, + comment['id'], username='user_two') + # Now delete the comment using the correct username. + support.delete_comment(comment['id'], username='user_one') + comment = get_comment() + assert comment['username'] == '[deleted]' + assert comment['text'] == '[deleted]' + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_moderator_delete_comments(support): + def get_comment(): + session = Session() + node = session.query(Node).first() + session.close() + return support.get_data(node.id, moderator=True)['comments'][1] + + comment = get_comment() + support.delete_comment(comment['id'], username='user_two', + moderator=True) + comment = get_comment() + assert comment['username'] == '[deleted]' + assert comment['text'] == '[deleted]' + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support() +def test_update_username(support): + support.update_username('user_two', 'new_user_two') + session = Session() + comments = session.query(Comment).\ + filter(Comment.username == 'user_two').all() + assert len(comments) == 0 + votes = session.query(CommentVote).\ + filter(CommentVote.username == 'user_two') + assert len(comments) == 0 + comments = session.query(Comment).\ + filter(Comment.username == 'new_user_two').all() + assert len(comments) == 1 + votes = session.query(CommentVote).\ + filter(CommentVote.username == 'new_user_two') + assert len(comments) == 1 + + +called = False +def moderation_callback(comment): + global called + called = True + + +@skip_if(sqlalchemy_missing, 'needs sqlalchemy') +@with_support(moderation_callback=moderation_callback) +def test_moderation(support): + session = Session() + nodes = session.query(Node).all() + node = nodes[7] + session.close() + accepted = support.add_comment('Accepted Comment', node_id=node.id, + displayed=False) + rejected = support.add_comment('Rejected comment', node_id=node.id, + displayed=False) + # Make sure the moderation_callback is called. + assert called == True + # Make sure the user must be a moderator. + raises(UserNotAuthorizedError, support.accept_comment, accepted['id']) + raises(UserNotAuthorizedError, support.reject_comment, accepted['id']) + support.accept_comment(accepted['id'], moderator=True) + support.reject_comment(rejected['id'], moderator=True) + comments = support.get_data(node.id)['comments'] + assert len(comments) == 1 + comments = support.get_data(node.id, moderator=True)['comments'] + assert len(comments) == 1 + + +def test_differ(): + source = 'Lorem ipsum dolor sit amet,\nconsectetur adipisicing elit,\n' \ + 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' + prop = 'Lorem dolor sit amet,\nconsectetur nihil adipisicing elit,\n' \ + 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' + differ = CombinedHtmlDiff(source, prop) + differ.make_html() diff --git a/tests/util.py b/tests/util.py index 1b24af0e2..3711de724 100644 --- a/tests/util.py +++ b/tests/util.py @@ -3,7 +3,7 @@ Sphinx test suite utilities ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -11,6 +11,8 @@ import sys import StringIO import tempfile import shutil +import re +from codecs import open try: from functools import wraps @@ -23,15 +25,15 @@ from sphinx.ext.autodoc import AutoDirective from path import path -from nose import tools +from nose import tools, SkipTest __all__ = [ - 'test_root', - 'raises', 'raises_msg', 'Struct', + 'test_root', 'raises', 'raises_msg', + 'skip_if', 'skip_unless', 'skip_unless_importable', 'Struct', 'ListOutput', 'TestApp', 'with_app', 'gen_with_app', 'path', 'with_tempdir', 'write_file', - 'sprint', + 'sprint', 'remove_unicode_literals', ] @@ -69,6 +71,30 @@ def raises_msg(exc, msg, func, *args, **kwds): raise AssertionError('%s did not raise %s' % (func.__name__, _excstr(exc))) +def skip_if(condition, msg=None): + """Decorator to skip test if condition is true.""" + def deco(test): + @tools.make_decorator(test) + def skipper(*args, **kwds): + if condition: + raise SkipTest(msg or 'conditional skip') + return test(*args, **kwds) + return skipper + return deco + +def skip_unless(condition, msg=None): + """Decorator to skip test if condition is false.""" + return skip_if(not condition, msg) + +def skip_unless_importable(module, msg=None): + """Decorator to skip test if module is not importable.""" + try: + __import__(module) + except ImportError: + return skip_if(True, msg) + else: + return skip_if(False, msg) + class Struct(object): def __init__(self, **kwds): @@ -191,11 +217,21 @@ def with_tempdir(func): return new_func -def write_file(name, contents): - f = open(str(name), 'wb') +def write_file(name, contents, encoding=None): + if encoding is None: + mode = 'wb' + if isinstance(contents, unicode): + contents = contents.encode('ascii') + else: + mode = 'w' + f = open(str(name), 'wb', encoding=encoding) f.write(contents) f.close() def sprint(*args): sys.stderr.write(' '.join(map(str, args)) + '\n') + +_unicode_literals_re = re.compile(r'u(".*?")|u(\'.*?\')') +def remove_unicode_literals(s): + return _unicode_literals_re.sub(lambda x: x.group(1) or x.group(2), s) diff --git a/tox.ini b/tox.ini index 95a877274..01d12ee6e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist=du06,du05 +envlist=py24,py25,py26,py27,py31,pypy,du07,du06,du05 [testenv] deps=nose @@ -7,8 +7,35 @@ commands= nosetests sphinx-build -W -b html -d {envtmpdir}/doctrees doc {envtmpdir}/html +[testenv:py24] +deps= + nose + simplejson + +[testenv:py25] +deps= + nose + simplejson + +[testenv:py31] +deps=https://bitbucket.org/jpellerin/nose3/get/tip.zip + +[testenv:pypy] +deps= + nose + simplejson + [testenv:du05] -deps=docutils==0.5 +deps= + nose + docutils==0.5 [testenv:du06] -deps=docutils==0.6 +deps= + nose + docutils==0.6 + +[testenv:du07] +deps= + nose + docutils==0.7 diff --git a/utils/check_sources.py b/utils/check_sources.py index 0571ab1e8..6b030d5d8 100755 --- a/utils/check_sources.py +++ b/utils/check_sources.py @@ -7,15 +7,21 @@ Make sure each Python file has a correct file header including copyright and license information. - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import sys, os, re -import getopt import cStringIO +from optparse import OptionParser from os.path import join, splitext, abspath +if sys.version_info >= (3, 0): + def b(s): + return s.encode('utf-8') +else: + b = str + checkers = {} @@ -30,26 +36,26 @@ def checker(*suffixes, **kwds): name_mail_re = r'[\w ]+(<.*?>)?' -copyright_re = re.compile(r'^ :copyright: Copyright 200\d(-20\d\d)? ' - r'by %s(, %s)*[,.]$' % - (name_mail_re, name_mail_re)) -license_re = re.compile(r" :license: (.*?).\n") -copyright_2_re = re.compile(r'^ %s(, %s)*[,.]$' % - (name_mail_re, name_mail_re)) -coding_re = re.compile(r'coding[:=]\s*([-\w.]+)') -not_ix_re = re.compile(r'\bnot\s+\S+?\s+i[sn]\s\S+') -is_const_re = re.compile(r'if.*?==\s+(None|False|True)\b') +copyright_re = re.compile(b(r'^ :copyright: Copyright 200\d(-20\d\d)? ' + r'by %s(, %s)*[,.]$' % + (name_mail_re, name_mail_re))) +license_re = re.compile(b(r" :license: (.*?).\n")) +copyright_2_re = re.compile(b(r'^ %s(, %s)*[,.]$' % + (name_mail_re, name_mail_re))) +coding_re = re.compile(b(r'coding[:=]\s*([-\w.]+)')) +not_ix_re = re.compile(b(r'\bnot\s+\S+?\s+i[sn]\s\S+')) +is_const_re = re.compile(b(r'if.*?==\s+(None|False|True)\b')) -misspellings = ["developement", "adress", "verificate", # ALLOW-MISSPELLING - "informations"] # ALLOW-MISSPELLING +misspellings = [b("developement"), b("adress"), # ALLOW-MISSPELLING + b("verificate"), b("informations")] # ALLOW-MISSPELLING - -@checker('.py') -def check_syntax(fn, lines): - try: - compile(''.join(lines), fn, "exec") - except SyntaxError, err: - yield 0, "not compilable: %s" % err +if sys.version_info < (3, 0): + @checker('.py') + def check_syntax(fn, lines): + try: + compile(b('').join(lines), fn, "exec") + except SyntaxError, err: + yield 0, "not compilable: %s" % err @checker('.py') @@ -61,8 +67,8 @@ def check_style_and_encoding(fn, lines): if lno < 2: co = coding_re.search(line) if co: - encoding = co.group(1) - if line.strip().startswith('#'): + encoding = co.group(1).decode('ascii') + if line.strip().startswith(b('#')): continue #m = not_ix_re.search(line) #if m: @@ -82,7 +88,7 @@ def check_style_and_encoding(fn, lines): def check_fileheader(fn, lines): # line number correction c = 1 - if lines[0:1] == ['#!/usr/bin/env python\n']: + if lines[0:1] == [b('#!/usr/bin/env python\n')]: lines = lines[1:] c = 2 @@ -91,38 +97,38 @@ def check_fileheader(fn, lines): for lno, l in enumerate(lines): llist.append(l) if lno == 0: - if l == '# -*- coding: rot13 -*-\n': + if l == b('# -*- coding: rot13 -*-\n'): # special-case pony package return - elif l != '# -*- coding: utf-8 -*-\n': + elif l != b('# -*- coding: utf-8 -*-\n'): yield 1, "missing coding declaration" elif lno == 1: - if l != '"""\n' and l != 'r"""\n': + if l != b('"""\n') and l != b('r"""\n'): yield 2, 'missing docstring begin (""")' else: docopen = True elif docopen: - if l == '"""\n': + if l == b('"""\n'): # end of docstring if lno <= 4: yield lno+c, "missing module name in docstring" break - if l != "\n" and l[:4] != ' ' and docopen: + if l != b("\n") and l[:4] != b(' ') and docopen: yield lno+c, "missing correct docstring indentation" if lno == 2: # if not in package, don't check the module name modname = fn[:-3].replace('/', '.').replace('.__init__', '') while modname: - if l.lower()[4:-1] == modname: + if l.lower()[4:-1] == b(modname): break modname = '.'.join(modname.split('.')[1:]) else: yield 3, "wrong module name in docstring heading" modnamelen = len(l.strip()) elif lno == 3: - if l.strip() != modnamelen * "~": + if l.strip() != modnamelen * b("~"): yield 4, "wrong module name underline, should be ~~~...~" else: @@ -145,16 +151,16 @@ def check_fileheader(fn, lines): @checker('.py', '.html', '.rst') def check_whitespace_and_spelling(fn, lines): for lno, line in enumerate(lines): - if "\t" in line: + if b("\t") in line: yield lno+1, "OMG TABS!!!1 " - if line[:-1].rstrip(' \t') != line[:-1]: + if line[:-1].rstrip(b(' \t')) != line[:-1]: yield lno+1, "trailing whitespace" for word in misspellings: - if word in line and 'ALLOW-MISSPELLING' not in line: + if word in line and b('ALLOW-MISSPELLING') not in line: yield lno+1, '"%s" used' % word -bad_tags = ('<u>', '<s>', '<strike>', '<center>', '<font') +bad_tags = map(b, ['<u>', '<s>', '<strike>', '<center>', '<font']) @checker('.html') def check_xhtml(fn, lines): @@ -165,34 +171,32 @@ def check_xhtml(fn, lines): def main(argv): - try: - gopts, args = getopt.getopt(argv[1:], "vi:") - except getopt.GetoptError: - print "Usage: %s [-v] [-i ignorepath]* [path]" % argv[0] - return 2 - opts = {} - for opt, val in gopts: - if opt == '-i': - val = abspath(val) - opts.setdefault(opt, []).append(val) + parser = OptionParser(usage='Usage: %prog [-v] [-i ignorepath]* [path]') + parser.add_option('-v', '--verbose', dest='verbose', default=False, + action='store_true') + parser.add_option('-i', '--ignore-path', dest='ignored_paths', + default=[], action='append') + options, args = parser.parse_args(argv[1:]) if len(args) == 0: path = '.' elif len(args) == 1: path = args[0] else: - print "Usage: %s [-v] [-i ignorepath]* [path]" % argv[0] - return 2 + print args + parser.error('No more then one path supported') - verbose = '-v' in opts + verbose = options.verbose + ignored_paths = set(abspath(p) for p in options.ignored_paths) num = 0 out = cStringIO.StringIO() for root, dirs, files in os.walk(path): - if '.svn' in dirs: - dirs.remove('.svn') - if '-i' in opts and abspath(root) in opts['-i']: + for vcs_dir in ['.svn', '.hg', '.git']: + if vcs_dir in dirs: + dirs.remove(vcs_dir) + if abspath(root) in ignored_paths: del dirs[:] continue in_check_pkg = root.startswith('./sphinx') @@ -201,7 +205,7 @@ def main(argv): fn = join(root, fn) if fn[:2] == './': fn = fn[2:] - if '-i' in opts and abspath(fn) in opts['-i']: + if abspath(fn) in ignored_paths: continue ext = splitext(fn)[1] @@ -213,8 +217,11 @@ def main(argv): print "Checking %s..." % fn try: - f = open(fn, 'r') - lines = list(f) + f = open(fn, 'rb') + try: + lines = list(f) + finally: + f.close() except (IOError, OSError), err: print "%s: cannot open: %s" % (fn, err) num += 1 diff --git a/utils/convert.py b/utils/convert.py new file mode 100644 index 000000000..f025c49a0 --- /dev/null +++ b/utils/convert.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# coding: utf-8 +""" + Converts files with 2to3 + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Creates a Python 3 version of each file. + + The Python3 version of a file foo.py will be called foo3.py. + + :copyright: Copyright 2010 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import os +import sys +from glob import iglob +from optparse import OptionParser +from shutil import copy +from distutils.util import run_2to3 + +def main(argv): + parser = OptionParser(usage='%prog [path]') + parser.add_option('-i', '--ignorepath', dest='ignored_paths', + action='append', default=[]) + options, args = parser.parse_args(argv) + + ignored_paths = {os.path.abspath(p) for p in options.ignored_paths} + + path = os.path.abspath(args[0]) if args else os.getcwd() + convertables = [] + for filename in iglob(os.path.join(path, '*.py')): + if filename in ignored_paths: + continue + basename, ext = os.path.splitext(filename) + if basename.endswith('3'): + continue + filename3 = basename + '3' + ext + copy(filename, filename3) + convertables.append(filename3) + run_2to3(convertables) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/utils/reindent.py b/utils/reindent.py index c499f671e..59828fd86 100755 --- a/utils/reindent.py +++ b/utils/reindent.py @@ -1,16 +1,14 @@ #! /usr/bin/env python # Released to the public domain, by Tim Peters, 03 October 2000. -# -B option added by Georg Brandl, 2006. """reindent [-d][-r][-v] [ path ... ] --d (--dryrun) Dry run. Analyze, but don't make any changes to files. --r (--recurse) Recurse. Search for all .py files in subdirectories too. --B (--no-backup) Don't write .bak backup files. --v (--verbose) Verbose. Print informative msgs; else only names of \ -changed files. --h (--help) Help. Print this usage information and exit. +-d (--dryrun) Dry run. Analyze, but don't make any changes to, files. +-r (--recurse) Recurse. Search for all .py files in subdirectories too. +-n (--nobackup) No backup. Does not make a ".bak" file before reindenting. +-v (--verbose) Verbose. Print informative msgs; else no output. +-h (--help) Help. Print this usage information and exit. Change Python (.py) files to use 4-space indents and no hard tab characters. Also trim excess spaces and tabs from ends of lines, and remove empty lines @@ -34,18 +32,30 @@ resulting .py file won't change it again). The hard part of reindenting is figuring out what to do with comment lines. So long as the input files get a clean bill of health from tabnanny.py, reindent should do a good job. + +The backup file is a copy of the one that is being reindented. The ".bak" +file is generated with shutil.copy(), but some corner cases regarding +user/group and permissions could leave the backup file more readable that +you'd prefer. You can always use the --nobackup option to prevent this. """ __version__ = "1" import tokenize -import os +import os, shutil import sys -verbose = 0 -recurse = 0 -dryrun = 0 -no_backup = 0 +if sys.version_info >= (3, 0): + def tokens(readline, tokeneater): + for token in tokenize.tokenize(readline): + yield tokeneater(*token) +else: + tokens = tokenize.tokenize + +verbose = 0 +recurse = 0 +dryrun = 0 +makebackup = True def usage(msg=None): if msg is not None: @@ -61,12 +71,10 @@ def errprint(*args): def main(): import getopt - global verbose, recurse, dryrun, no_backup - + global verbose, recurse, dryrun, makebackup try: - opts, args = getopt.getopt(sys.argv[1:], "drvhB", - ["dryrun", "recurse", "verbose", "help", - "no-backup"]) + opts, args = getopt.getopt(sys.argv[1:], "drnvh", + ["dryrun", "recurse", "nobackup", "verbose", "help"]) except getopt.error, msg: usage(msg) return @@ -75,10 +83,10 @@ def main(): dryrun += 1 elif o in ('-r', '--recurse'): recurse += 1 + elif o in ('-n', '--nobackup'): + makebackup = False elif o in ('-v', '--verbose'): verbose += 1 - elif o in ('-B', '--no-backup'): - no_backup += 1 elif o in ('-h', '--help'): usage() return @@ -98,7 +106,8 @@ def check(file): for name in names: fullname = os.path.join(file, name) if ((recurse and os.path.isdir(fullname) and - not os.path.islink(fullname)) + not os.path.islink(fullname) and + not os.path.split(fullname)[1].startswith(".")) or name.lower().endswith(".py")): check(fullname) return @@ -118,26 +127,35 @@ def check(file): print "changed." if dryrun: print "But this is a dry run, so leaving it alone." - else: - print "reindented", file, \ - (dryrun and "(dry run => not really)" or "") if not dryrun: - if not no_backup: - bak = file + ".bak" - if os.path.exists(bak): - os.remove(bak) - os.rename(file, bak) + bak = file + ".bak" + if makebackup: + shutil.copyfile(file, bak) if verbose: - print "renamed", file, "to", bak + print "backed up", file, "to", bak f = open(file, "w") r.write(f) f.close() if verbose: print "wrote new", file + return True else: if verbose: print "unchanged." + return False +def _rstrip(line, JUNK='\n \t'): + """Return line stripped of trailing spaces, tabs, newlines. + + Note that line.rstrip() instead also strips sundry control characters, + but at least one known Emacs user expects to keep junk like that, not + mentioning Barry by name or anything <wink>. + """ + + i = len(line) + while i > 0 and line[i-1] in JUNK: + i -= 1 + return line[:i] class Reindenter: @@ -151,7 +169,7 @@ class Reindenter: # File lines, rstripped & tab-expanded. Dummy at start is so # that we can use tokenize's 1-based line numbering easily. # Note that a line is all-blank iff it's "\n". - self.lines = [line.rstrip('\n \t').expandtabs() + "\n" + self.lines = [_rstrip(line).expandtabs() + "\n" for line in self.raw] self.lines.insert(0, None) self.index = 1 # index into self.lines of next line @@ -163,7 +181,7 @@ class Reindenter: self.stats = [] def run(self): - tokenize.tokenize(self.getline, self.tokeneater) + tokens(self.getline, self.tokeneater) # Remove trailing empty lines. lines = self.lines while lines and lines[-1] == "\n":