--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+=============================
+Working with Message Catalogs
+=============================
+
+.. contents:: Contents
+ :depth: 2
+.. sectnum::
+
+
+Introduction
+============
+
+The ``gettext`` translation system enables you to mark any strings used in your
+application as subject to localization, by wrapping them in functions such as
+``gettext(str)`` and ``ngettext(singular, plural, num)``. For brevity, the
+``gettext`` function is often aliased to ``_(str)``, so you can write::
+
+ print _("Hello")
+
+instead of just::
+
+ print "Hello"
+
+to make the string "Hello" localizable.
+
+Message catalogs are collections of translations for such localizable messages
+used in an application. They are commonly stored in PO (Portable Object) and MO
+(Machine Object) files, the formats of which are defined by the GNU `gettext`_
+tools and the GNU `translation project`_.
+
+ .. _`gettext`: http://www.gnu.org/software/gettext/
+ .. _`translation project`: http://sourceforge.net/projects/translation
+
+The general procedure for building message catalogs looks something like this:
+
+ * use a tool (such as ``xgettext``) to extract localizable strings from the
+ code base and write them to a POT (PO Template) file.
+ * make a copy of the POT file for a specific locale (for example, "en_US")
+ and start translating the messages
+ * use a tool such as ``msgfmt`` to compile the locale PO file into an binary
+ MO file
+ * later, when code changes make it necessary to update the translations, you
+ regenerate the POT file and merge the changes into the various
+ locale-specific PO files, for example using ``msgmerge``
+
+Python provides the `gettext module`_ as part of the standard library, which
+enables applications to work with appropriately generated MO files.
+
+ .. _`gettext module`: http://docs.python.org/lib/module-gettext.html
+
+As ``gettext`` provides a solid and well supported foundation for translating
+application messages, Babel does not reinvent the wheel, but rather reuses this
+infrastructure, and makes it easier to build message catalogs for Python
+applications.
+
+
+Message Extraction
+==================
+
+Babel provides functionality similar to that of the ``xgettext`` program,
+except that only extraction from Python source files is built-in, while support
+for other file formats can be added using a simple extension mechanism.
+
+(TODO: more)
+
+
+--------------------------
+Writing Extraction Methods
+--------------------------
+
+(TODO: write)
+
+---------------------
+``setup.py`` Commands
+---------------------
+
+(TODO: overview)
+
+See `Distutils/Setuptools Integration <setup.html>`_ for more information.
+
+-------------------
+Command-line script
+-------------------
+
+(TODO: overview)
+
+See `Command-Line Interface <cmdline.html>`_ for more information.
+
+
+Extended ``Translations`` Class
+===============================
+
+Many web-based applications are composed of a variety of different components
+(possibly using some kind of plugin system), and some of those components may
+provide their own message catalogs that need to be integrated into the larger
+system.
+
+To support this usage pattern, Babel provides a ``Translations`` class that is
+derived from the ``GNUTranslations`` class in the ``gettext`` module. This
+class adds a ``merge()`` method that takes another ``Translations`` instance,
+and merges its contents into the catalog::
+
+ translations = Translations.load('main')
+ translations.merge(Translations.load('plugin1'))
--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+======================
+Command-Line Interface
+======================
+
+Babel includes a command-line interface for working with message catalogs,
+similar to the GNU ``xgettext`` program commonly available on Linux/Unix
+systems.
+
+
+.. contents:: Contents
+ :depth: 2
+.. sectnum::
+
+
+pygettext
+=========
+
+When properly installed, Babel provides a script called ``pygettext``, which can
+be used to extract localized messages from a variety of files::
+
+ $ pygettext --help
+ usage: pygettext [options] dirname1 <dirname2> ...
+
+ options:
+ --version show program's version number and exit
+ -h, --help show this help message and exit
+ --charset=CHARSET charset to use in the output
+ -k KEYWORDS, --keyword=KEYWORDS
+ keywords to look for in addition to the defaults. You
+ can specify multiple -k flags on the command line.
+ --no-location do not include location comments with filename and
+ line number
+ --omit-header do not include msgid "" entry in header
+ -o OUTPUT, --output=OUTPUT
+ path to the output POT file
--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+====================
+Locale Display Names
+====================
+
+.. contents:: Contents
+ :depth: 2
+.. sectnum::
+
+
+Introduction
+============
+
+While `message catalogs <catalogs.html>`_ allow you to localize any messages
+in your application, there are a number of strings that are used in many
+applications for which translations are readily available.
+
+Imagine for example you have a list of countries that users can choose from,
+and you'd like to display the names of those countries in the language the
+user prefers. Instead of translating all those country names yourself in your
+application, you can make use of the translations provided by the locale data
+included with Babel, which is based on the `Common Locale Data Repository
+(CLDR) <http://unicode.org/cldr/>`_ developed and maintained by the `Unicode
+Consortium <http://unicode.org/>`_.
+
+
+The ``Locale`` Class
+====================
+
+You normally access such locale data through the `Locale`_ class provided
+by Babel::
+
+ >>> from babel import Locale
+ >>> locale = Locale('en', 'US')
+ >>> locale.territories['US']
+ u'United States'
+ >>> locale = Locale('es', 'MX')
+ >>> locale.territories['US']
+ u'Estados Unidos'
+
+.. _`Locale`: api/babel.core.Locale-class.html
+
+In addition to country/territory names, the locale data also provides access to
+names of languages, scripts, variants, time zones, and more. Some of the data
+is closely related to `number and date formatting`_.
+
+Most of the corresponding ``Locale`` properties return dictionaries, where the
+key is a code such as the ISO country and language codes. Consult the API
+documentation for references to the relevant specifications.
+
+.. _`number and date formatting`: formatting.html
--- /dev/null
+[general]
+input_encoding = utf-8
+strip_comments = yes
+toc_backlinks = none
+
+[html4css1 writer]
+embed_stylesheet = no
+stylesheet = style/edgewall.css
+xml_declaration = no
--- /dev/null
+[epydoc]
+
+name: Documentation Index
+url: ../index.html
+modules: babel
+verbosity: 1
+
+# Extraction
+docformat: restructuredtext
+parse: yes
+introspect: yes
+exclude: .*\.tests.*
+inheritance: listed
+private: no
+imports: no
+include-log: no
+
+# HTML output
+output: html
+target: doc/api/
+css: doc/style/epydoc.css
+top: babel
+frames: no
+sourcecode: no
--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+==========================
+Number and Date Formatting
+==========================
+
+
+.. contents:: Contents
+ :depth: 2
+.. sectnum::
+
+
--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+=====
+Babel
+=====
+
+
+---------------------------------------------------
+Simple Internationalization for Python Applications
+---------------------------------------------------
+
+Babel is an integrated collection of utilities that assist in
+internationalizing and localizing Python applications, with an
+emphasis on web-based applications.
+
+* `Working with Message Catalogs <catalogs.html>`_
+* `Locale Display Names <display.html>`_
+* `Number and Date Formatting <formatting.html>`_
+* `Command-Line Interface <cmdline.html>`_
+* `Distutils/Setuptools Integration <setup.html>`_
+* `Generated API Documentation <api/index.html>`_
+
+Introduction
+------------
+
+The functionality Babel provides for internationalization (I18n) and
+localization (L10N) can be separated into two different aspects:
+
+ * tools to build and work with ``gettext`` message catalogs, and
+ * a Python interface to the CLDR (Common Locale Data Repository), providing
+ access to various locale display names, localized number and date
+ formatting, etc.
+
+While the Python standard library includes a
+`gettext <http://docs.python.org/lib/module-gettext.html>`_ module that enables
+applications to use message catalogs, it requires developers to build these
+catalogs using GNU tools such as ``xgettext``, ``msgmerge``, and ``msgfmt``.
+And while ``xgettext`` does have support for extracting messages from Python
+files, it does not know how to deal with other kinds of files commonly found
+in Python web-applications, such as templates, nor does it provide an easy
+extensibility mechanism to add such support.
+
+Babel addresses this by providing a framework where various extraction methods
+can be plugged in to a larger message extraction framework, and also removes
+the dependency on the GNU ``gettext`` tools for common tasks, as these aren't
+necessarily available on all platforms. See `Working with Message Catalogs`_
+for details on this aspect of Babel.
+
+Furthermore, while the Python standard library does include support for basic
+localization with respect to the formatting of numbers and dates (the
+`locale <http://docs.python.org/lib/module-locale.html>`_ module, among others),
+this support is based on the assumption that there will be only one specific
+locale used per process (at least simultaneously.) Also, it doesn't provide
+access to other kinds of locale data, such as the localized names of countries,
+languages, or time zones, with are frequently needed in web-based applications.
+
+For these requirements, Babel includes data extracted from the `Common Locale
+Data Repository (CLDR) <http://unicode.org/cldr/>`_, and provides a number of
+convenient methods for accessing and using this data. See `Locale Display
+Names`_ and `Number and Date Formatting`_ for more information on this aspect
+of Babel.
+
--- /dev/null
+.. -*- mode: rst; encoding: utf-8 -*-
+
+================================
+Distutils/Setuptools Integration
+================================
+
+Babel provides commands for integration into ``setup.py`` scripts, based on
+either the ``distutils`` package that is part of the Python standard library,
+or the third-party ``setuptools`` package.
+
+These commands are available by default when Babel has been properly installed,
+and ``setup.py`` is using ``setuptools``. For projects that use plain old
+``distutils``, the commands need to be registered explicitly, for example::
+
+ from distutils.core import setup
+ from babel.catalog import frontend as babel
+
+ setup(
+ ...
+ cmd_class = {'extract_messages': babel.extract_messages}
+ )
+
+
+.. contents:: Contents
+ :depth: 2
+.. sectnum::
+
+
+extract_messages
+================
+
+The ``extract_messages`` command is comparabe to the GNU ``xgettext`` program:
+it can extract localizable messages from a variety of difference source files,
+and generate a PO (portable object) template file from the collected messages.
+
+If the command has been correctly installed or registered, another project's
+``setup.py`` script should allow you to use the command::
+
+ $ ./setup.py extract_messages --help
+ Global options:
+ --verbose (-v) run verbosely (default)
+ --quiet (-q) run quietly (turns verbosity off)
+ --dry-run (-n) don't actually do anything
+ --help (-h) show detailed help message
+
+ Options for 'extract_messages' command:
+ --charset charset to use in the output
+ --keywords (-k) comma-separated list of keywords to look for in addition
+ to the defaults
+ --no-location do not write filename/lineno location comments
+ --output-file filename of the output PO file
+
+Running the command will produce a PO file::
+
+ $ ./setup.py extract_messages --output-file webapp/locales/messages.pot
+ running extract_messages
+ extracting messages from 'webapp'
+ extracting messages from 'webparts'
+ writing PO file to webapp/locales/messages.pot
+
+
+Options
+-------
+
+As shown in the ``--help`` output above, the ``extract_messages`` command
+accepts the following options:
+
+``--charset``
+ The character set / encoding to use in the generated PO file.
+``--keywords``
+ A comma-separated list of keywords (function names) to look for in addition
+ to the default keywords
+``--no-location``
+ If this flag is set, location comments will not be included in the generated
+ PO file.
+``--output-file`` or ``-o``
+ The path to the PO file that should be generated
+
--- /dev/null
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Date: $Date: 2005-12-18 01:56:14 +0100 (Sun, 18 Dec 2005) $
+:Revision: $Revision: 4224 $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+ border: 0 }
+
+table.borderless td, table.borderless th {
+ /* Override padding for "table.docutils td" with "! important".
+ The right padding separates the table cells. */
+ padding: 0 0.5em 0 0 ! important }
+
+.first {
+ /* Override more specific margin styles with "! important". */
+ margin-top: 0 ! important }
+
+.last, .with-subtitle {
+ margin-bottom: 0 ! important }
+
+.hidden {
+ display: none }
+
+a.toc-backref {
+ text-decoration: none ;
+ color: black }
+
+blockquote.epigraph {
+ margin: 2em 5em ; }
+
+dl.docutils dd {
+ margin-bottom: 0.5em }
+
+dl.docutils dt {
+ font-weight: bold }
+
+div.abstract {
+ margin: 2em 5em }
+
+div.abstract p.topic-title {
+ font-weight: bold ;
+ text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+ margin: 2em ;
+ border: medium outset ;
+ padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+ font-weight: bold ;
+ font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+ color: red ;
+ font-weight: bold ;
+ font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+ compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+ margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+ margin-top: 0.5em }
+*/
+
+div.dedication {
+ margin: 2em 5em ;
+ text-align: center ;
+ font-style: italic }
+
+div.dedication p.topic-title {
+ font-weight: bold ;
+ font-style: normal }
+
+div.figure {
+ margin-left: 2em ;
+ margin-right: 2em }
+
+div.footer, div.header {
+ clear: both;
+ font-size: smaller }
+
+div.line-block {
+ display: block ;
+ margin-top: 1em ;
+ margin-bottom: 1em }
+
+div.line-block div.line-block {
+ margin-top: 0 ;
+ margin-bottom: 0 ;
+ margin-left: 1.5em }
+
+div.sidebar {
+ margin-left: 1em ;
+ border: medium outset ;
+ padding: 1em ;
+ background-color: #ffffee ;
+ width: 40% ;
+ float: right ;
+ clear: right }
+
+div.sidebar p.rubric {
+ font-family: sans-serif ;
+ font-size: medium }
+
+div.system-messages {
+ margin: 5em }
+
+div.system-messages h1 {
+ color: red }
+
+div.system-message {
+ border: medium outset ;
+ padding: 1em }
+
+div.system-message p.system-message-title {
+ color: red ;
+ font-weight: bold }
+
+div.topic {
+ margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+ margin-top: 0.4em }
+
+h1.title {
+ text-align: center }
+
+h2.subtitle {
+ text-align: center }
+
+hr.docutils {
+ width: 75% }
+
+img.align-left {
+ clear: left }
+
+img.align-right {
+ clear: right }
+
+ol.simple, ul.simple {
+ margin-bottom: 1em }
+
+ol.arabic {
+ list-style: decimal }
+
+ol.loweralpha {
+ list-style: lower-alpha }
+
+ol.upperalpha {
+ list-style: upper-alpha }
+
+ol.lowerroman {
+ list-style: lower-roman }
+
+ol.upperroman {
+ list-style: upper-roman }
+
+p.attribution {
+ text-align: right ;
+ margin-left: 50% }
+
+p.caption {
+ font-style: italic }
+
+p.credits {
+ font-style: italic ;
+ font-size: smaller }
+
+p.label {
+ white-space: nowrap }
+
+p.rubric {
+ font-weight: bold ;
+ font-size: larger ;
+ color: maroon ;
+ text-align: center }
+
+p.sidebar-title {
+ font-family: sans-serif ;
+ font-weight: bold ;
+ font-size: larger }
+
+p.sidebar-subtitle {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+p.topic-title {
+ font-weight: bold }
+
+pre.address {
+ margin-bottom: 0 ;
+ margin-top: 0 ;
+ font-family: serif ;
+ font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+ margin-left: 2em ;
+ margin-right: 2em ;
+ background-color: #eeeeee }
+
+span.classifier {
+ font-family: sans-serif ;
+ font-style: oblique }
+
+span.classifier-delimiter {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+span.interpreted {
+ font-family: sans-serif }
+
+span.option {
+ white-space: nowrap }
+
+span.pre {
+ white-space: pre }
+
+span.problematic {
+ color: red }
+
+span.section-subtitle {
+ /* font-size relative to parent (h1..h6 element) */
+ font-size: 80% }
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px }
+
+table.docinfo {
+ margin: 2em 4em }
+
+table.docutils {
+ margin-top: 0.5em ;
+ margin-bottom: 0.5em }
+
+table.footnote {
+ border-left: solid 1px black;
+ margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+ padding-left: 0.5em ;
+ padding-right: 0.5em ;
+ vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+ font-weight: bold ;
+ text-align: left ;
+ white-space: nowrap ;
+ padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+ font-size: 100% }
+
+tt.docutils {
+ background-color: #eeeeee }
+
+ul.auto-toc {
+ list-style-type: none }
--- /dev/null
+@import(docutils.css);
+
+html, body { height: 100%; margin: 0; padding: 0; }
+html, body { background: #4b4d4d url(bkgnd_pattern.png); color: #000; }
+body, th, td {
+ font: normal small Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif;
+}
+pre, code, tt { font-size: medium; }
+h1, h2, h3, h4 {
+ border-bottom: 1px solid #ccc;
+ font-family: Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif;
+ font-weight: bold; letter-spacing: -0.018em;
+}
+h1 { font-size: 19px; margin: 2em 0 .5em; }
+h2 { font-size: 16px; margin: 1.5em 0 .5em; }
+h3 { font-size: 14px; margin: 1.2em 0 .5em; }
+hr { border: none; border-top: 1px solid #ccb; margin: 2em 0; }
+p { margin: 0 0 1em; }
+
+:link, :visited { text-decoration: none; border-bottom: 1px dotted #bbb;
+ color: #b00;
+}
+:link:hover, :visited:hover { background-color: #eee; color: #555; }
+:link img, :visited img { border: none }
+h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited,
+h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited {
+ color: #000;
+}
+
+div.document { background: #fff url(shadow.gif) right top repeat-y;
+ border-left: 1px solid #000; margin: 0 auto 0 40px;
+ min-height: 100%; width: 54em; padding: 0 180px 1px 20px;
+}
+h1.title, div.document#babel h1 { border: none; color: #666;
+ font-size: x-large; margin: 0 -20px 1em; padding: 2em 20px 0;
+}
+h1.title { background: url(vertbars.png) repeat-x; }
+div.document#babel h1.title { text-indent: -4000px; }
+div.document#babel h1 { text-align: center; }
+pre.literal-block { background: #d7d7d7; border: 1px solid #e6e6e6; color: #000;
+ margin: 1em 1em; padding: .25em; overflow: auto;
+}
+
+div.contents { font-size: 90%; position: absolute; position: fixed;
+ margin-left: 80px; left: 60em; top: 30px; right: 0;
+}
+div.contents .topic-title { display: none; }
+div.contents ul { list-style: none; padding-left: 0; }
+div.contents :link, div.contents :visited { color: #c6c6c6; border: none;
+ display: block; padding: 3px 5px 3px 10px;
+}
+div.contents :link:hover, div.contents :visited:hover { background: #000;
+ color: #fff;
+}
+
+p.admonition-title { font-weight: bold; margin-bottom: 0; }
+div.note, div.warning { font-style: italic; margin-left: 2em;
+ margin-right: 2em;
+}
--- /dev/null
+html { background: #4b4d4d url(../style/bkgnd_pattern.png); margin: 0;
+ padding: 1em 1em 3em;
+}
+body { background: #fff url(../style/vertbars.png) repeat-x;
+ border: 1px solid #000; color: #000; margin: 1em 0; padding: 0 1em 1em;
+}
+body, th, td {
+ font: normal small Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif;
+}
+h1, h2, h3, h4 {
+ font-family: Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif;
+ font-weight: bold; letter-spacing: -0.018em;
+}
+h1 { font-size: 19px; margin: 2em 0 .5em; }
+h2 { font-size: 16px; margin: 1.5em 0 .5em; }
+h3 { font-size: 14px; margin: 1.2em 0 .5em; }
+hr { border: none; border-top: 1px solid #ccb; margin: 2em 0; }
+p { margin: 0 0 1em; }
+:link, :visited { text-decoration: none; border-bottom: 1px dotted #bbb;
+ color: #b00;
+}
+:link:hover, :visited:hover { background-color: #eee; color: #555; }
+
+table { border: none; border-collapse: collapse; }
+
+table.navbar { background: #000; color: #fff; margin: 2em 0 .33em; }
+table.navbar th { border: 1px solid #000; font-weight: bold; padding: 1px; }
+table.navbar :link, table.navbar :visited { border: none; color: #fff; }
+table.navbar :link:hover, table.navbar :visited:hover { background: none;
+ text-decoration: underline overline;
+}
+table.navbar th.navbar-select { background: #fff; color: #000; }
+span.breadcrumbs { color: #666; font-size: 95%; }
+h1.epydoc { border: none; color: #666;
+ font-size: x-large; margin: 1em 0 0; padding: 0;
+}
+pre.base-tree { color: #666; margin: 0; padding: 0; }
+pre.base-tree :link, pre.base-tree :visited { border: none; }
+pre.py-doctest, pre.variable, pre.rst-literal-block { background: #eee;
+ border: 1px solid #e6e6e6; color: #000; margin: 1em; padding: .25em;
+ overflow: auto;
+}
+pre.variable { margin: 0; }
+
+/* Summary tables */
+
+table.summary { margin: .5em 0; }
+table.summary tr.table-header { background: #f7f7f0; }
+table.summary td.table-header { color: #666; font-weight: bold; }
+table.summary th, table.summary td { border: 1px solid #d7d7d7; }
+table.summary th th, table.summary td td { border: none; }
+table.summary td.summary table td { color: #666; font-size: 90%; }
+table.summary td.summary table br { display: none; }
+table.summary td.summary span.summary-type { font-size: 90%; }
+table.summary td.summary span.summary-type code { font-size: 110%; }
+p.indent-wrapped-lines { color: #999; font-size: 85%; margin: 0;
+ padding: 0 0 0 7em; text-indent: -7em;
+}
+p.indent-wrapped-lines code { color: #999; font-size: 115%; }
+p.indent-wrapped-lines :link, p.indent-wrapped-lines :visited { border: none; }
+.summary-sig { display: block; font-family: monospace; font-size: 120%;
+ margin-bottom: .5em;
+}
+.summary-sig-name { font-weight: bold; }
+.summary-sig-arg { color: #333; }
+.summary-sig :link, .summary-sig :visited { border: none; }
+.summary-name { font-family: monospace; font-weight: bold; }
+
+/* Details tables */
+
+table.details { margin: 2em 0 0; }
+div table.details { margin-top: 0; }
+table.details tr.table-header { background: transparent; }
+table.details td.table-header { border-bottom: 1px solid #ccc; padding: 2em 0 0; }
+table.details span.table-header {
+ font: bold 140% Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif;
+ letter-spacing: -0.018em;
+}
+table.details th, table.details td { border: none; }
+table.details th th, table.details td td { border: none; }
+table.details td { padding-left: 2em; }
+table.details td td { padding-left: 0; }
+table.details h3.epydoc { margin-left: -2em; }
+table.details h3.epydoc .sig { color: #999; font-family: monospace; }
+table.details h3.epydoc .sig-name { color: #000; }
+table.details h3.epydoc .sig-arg { color: #666; }
+table.details h3.epydoc .sig-default { font-size: 95%; font-weight: normal; }
+table.details h3.epydoc .sig-default code { font-weight: normal; }
+table.details h3.epydoc .fname { color: #999; font-size: 90%;
+ font-style: italic; font-weight: normal; line-height: 1.6em;
+}
+
+dl dt { color: #666; margin-top: 1em; }
+dl dd { margin: 0; padding-left: 2em; }
+dl.fields { margin: 1em 0; padding: 0; }
+dl.fields dt { color: #666; margin-top: 1em; }
+dl.fields dd ul { margin: 0; padding: 0; }
+div.fields { font-size: 90%; margin: 0 0 2em 2em; }
+div.fields p { margin-bottom: 0.5em; }
+
+table td.footer { color: #999; font-size: 85%; margin-top: 3em;
+ padding: 0 3em 1em; position: absolute; width: 80%; }
+table td.footer :link, table td.footer :visited { border: none; color: #999; }
+table td.footer :link:hover, table td.footer :visited:hover {
+ background: transparent; text-decoration: underline;
+}
+
+/* Syntax highlighting */
+
+.py-prompt, .py-more, .variable-ellipsis, .variable-op { color: #999; }
+.variable-group { color: #666; font-weight: bold; }
+.py-string, .variable-string, .variable-quote { color: #093; }
+.py-comment { color: #06f; font-style: italic; }
+.py-keyword { color: #00f; }
+.py-output { background: #f6f6f0; color: #666; font-weight: bold; }
+
+/* Index */
+
+table.link-index { background: #f6f6f0; border: none; margin-top: 1em; }
+table.link-index td.link-index { border: none; font-family: monospace;
+ font-weight: bold; padding: .5em 1em;
+}
+table.link-index td table, table.link-index td td { border: none; }
+table.link-index .index-where { color: #999;
+ font-family: Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif;
+ font-size: 90%; font-weight: normal; line-height: 1.6em;
+}
+table.link-index .index-where :link, table.link-index .index-where :visited {
+ border: none; color: #666;
+}
+h2.epydoc { color: #999; font-size: 200%; line-height: 10px; }