summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgoodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-12-08 04:43:13 +0000
committergoodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-12-08 04:43:13 +0000
commit118dd3d2aa36cf563590197e28830c1a905f9cd8 (patch)
treed60b440574557f4f0dfdb4494e5d37e6d52f2fdf
parente571eb6f3616063e8cc1096b3451aa6f3e659858 (diff)
downloaddocutils-118dd3d2aa36cf563590197e28830c1a905f9cd8.tar.gz
merged branches/s5 changes r4011:4155 into trunk/docutils
git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@4156 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--COPYING.txt6
-rw-r--r--HISTORY.txt39
-rw-r--r--MANIFEST.in2
-rw-r--r--THANKS.txt1
-rw-r--r--docs/dev/testing.txt19
-rw-r--r--docs/index.txt5
-rw-r--r--docs/ref/rst/definitions.txt (renamed from docs/ref/rst/substitutions.txt)54
-rw-r--r--docs/ref/rst/directives.txt8
-rw-r--r--docs/user/config.txt68
-rw-r--r--docs/user/images/big-black.pngbin0 -> 19823 bytes
-rw-r--r--docs/user/images/big-white.pngbin0 -> 25697 bytes
-rw-r--r--docs/user/images/default.pngbin0 -> 59358 bytes
-rw-r--r--docs/user/images/happy_monkey.pngbin0 -> 5202 bytes
-rw-r--r--docs/user/images/medium-black.pngbin0 -> 24021 bytes
-rw-r--r--docs/user/images/medium-white.pngbin0 -> 33756 bytes
-rw-r--r--docs/user/images/rsp-all.pngbin0 -> 32565 bytes
-rw-r--r--docs/user/images/rsp-breaks.pngbin0 -> 17754 bytes
-rw-r--r--docs/user/images/rsp-covers.pngbin0 -> 19080 bytes
-rw-r--r--docs/user/images/rsp-cuts.pngbin0 -> 20751 bytes
-rw-r--r--docs/user/images/rsp-empty.pngbin0 -> 4900 bytes
-rw-r--r--docs/user/images/rsp-objects.pngbin0 -> 21291 bytes
-rw-r--r--docs/user/images/rsp.svg636
-rw-r--r--docs/user/images/s5-files.pngbin0 -> 25404 bytes
-rw-r--r--docs/user/images/s5-files.svg639
-rw-r--r--docs/user/images/small-black.pngbin0 -> 41144 bytes
-rw-r--r--docs/user/images/small-white.pngbin0 -> 41120 bytes
-rw-r--r--docs/user/slide-shows.txt984
-rw-r--r--docs/user/tools.txt142
-rw-r--r--docutils/frontend.py8
-rw-r--r--docutils/parsers/rst/directives/references.py4
-rw-r--r--docutils/parsers/rst/include/s5defs.txt49
-rw-r--r--docutils/transforms/references.py15
-rw-r--r--docutils/writers/__init__.py3
-rw-r--r--docutils/writers/html4css1.py53
-rw-r--r--docutils/writers/s5_html.py314
-rw-r--r--docutils/writers/support/s5_html/README.txt6
-rw-r--r--docutils/writers/support/s5_html/big-black/__base__2
-rw-r--r--docutils/writers/support/s5_html/big-black/big_inverse/framing.css25
-rw-r--r--docutils/writers/support/s5_html/big-black/framing.css25
-rw-r--r--docutils/writers/support/s5_html/big-black/pretty.css111
-rw-r--r--docutils/writers/support/s5_html/big-white/framing.css24
-rw-r--r--docutils/writers/support/s5_html/big-white/pretty.css109
-rw-r--r--docutils/writers/support/s5_html/default/blank.gifbin0 -> 49 bytes
-rw-r--r--docutils/writers/support/s5_html/default/framing.css25
-rw-r--r--docutils/writers/support/s5_html/default/iepngfix.htc42
-rw-r--r--docutils/writers/support/s5_html/default/opera.css8
-rw-r--r--docutils/writers/support/s5_html/default/outline.css21
-rw-r--r--docutils/writers/support/s5_html/default/pretty.css122
-rw-r--r--docutils/writers/support/s5_html/default/print.css33
-rw-r--r--docutils/writers/support/s5_html/default/s5-core.css11
-rw-r--r--docutils/writers/support/s5_html/default/slides.css10
-rw-r--r--docutils/writers/support/s5_html/default/slides.js559
-rw-r--r--docutils/writers/support/s5_html/medium-black/__base__2
-rw-r--r--docutils/writers/support/s5_html/medium-black/pretty.css117
-rw-r--r--docutils/writers/support/s5_html/medium-white/framing.css24
-rw-r--r--docutils/writers/support/s5_html/medium-white/pretty.css115
-rw-r--r--docutils/writers/support/s5_html/small-black/__base__2
-rw-r--r--docutils/writers/support/s5_html/small-black/pretty.css118
-rw-r--r--docutils/writers/support/s5_html/small-white/framing.css24
-rw-r--r--docutils/writers/support/s5_html/small-white/pretty.css116
-rwxr-xr-xsetup.py6
-rw-r--r--test/functional/expected/standalone_rst_html4css1.html2
-rw-r--r--test/functional/expected/standalone_rst_s5_html_1.html148
-rw-r--r--test/functional/expected/standalone_rst_s5_html_2.html144
-rw-r--r--test/functional/expected/ui/default/blank.gifbin0 -> 49 bytes
-rw-r--r--test/functional/expected/ui/default/framing.css25
-rw-r--r--test/functional/expected/ui/default/iepngfix.htc42
-rw-r--r--test/functional/expected/ui/default/opera.css8
-rw-r--r--test/functional/expected/ui/default/outline.css21
-rw-r--r--test/functional/expected/ui/default/pretty.css122
-rw-r--r--test/functional/expected/ui/default/print.css33
-rw-r--r--test/functional/expected/ui/default/s5-core.css11
-rw-r--r--test/functional/expected/ui/default/slides.css10
-rw-r--r--test/functional/expected/ui/default/slides.js559
-rw-r--r--test/functional/expected/ui/small-black/blank.gifbin0 -> 49 bytes
-rw-r--r--test/functional/expected/ui/small-black/framing.css24
-rw-r--r--test/functional/expected/ui/small-black/iepngfix.htc42
-rw-r--r--test/functional/expected/ui/small-black/opera.css8
-rw-r--r--test/functional/expected/ui/small-black/outline.css21
-rw-r--r--test/functional/expected/ui/small-black/pretty.css118
-rw-r--r--test/functional/expected/ui/small-black/print.css33
-rw-r--r--test/functional/expected/ui/small-black/s5-core.css11
-rw-r--r--test/functional/expected/ui/small-black/slides.css10
-rw-r--r--test/functional/expected/ui/small-black/slides.js559
-rw-r--r--test/functional/input/standalone_rst_s5_html.txt126
-rwxr-xr-xtest/functional/tests/standalone_rst_s5_html_1.py44
-rwxr-xr-xtest/functional/tests/standalone_rst_s5_html_2.py7
-rwxr-xr-xtest/test_functional.py50
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_target_notes.py64
-rwxr-xr-xtest/test_transforms/test_target_notes.py84
-rwxr-xr-xtools/rst2s5.py26
91 files changed, 6960 insertions, 98 deletions
diff --git a/COPYING.txt b/COPYING.txt
index c90da5189..6411688bc 100644
--- a/COPYING.txt
+++ b/COPYING.txt
@@ -65,6 +65,12 @@ Exceptions
The exceptions to the `Public Domain Dedication`_ above are:
+* docutils/writers/support/s5_html/default/iepngfix.htc:
+
+ IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull
+ <http://www.twinhelix.com>. Free usage permitted as long as
+ this notice remains intact.
+
* extras/optparse.py, copyright by Gregory P. Ward, released under a
BSD-style license (which can be found in the module's source code).
diff --git a/HISTORY.txt b/HISTORY.txt
index 822a098aa..ba3d38eec 100644
--- a/HISTORY.txt
+++ b/HISTORY.txt
@@ -102,9 +102,15 @@ Changes Since 0.3.9
- Added support for image width and height units.
- Fixed bug with image "target" options.
+* docutils/parsers/rst/directives/references.py:
+
+ - Added "class" attribute to "target-notes" directive, for
+ footnote_reference classes.
+
* docutils/parsers/rst/include/: Directory added to project; contains
standard data files for the "include" directive. Initial contents:
- character entity substitution definition sets.
+ character entity substitution definition sets, and a set of
+ definitions for S5/HTML presentations.
* docutils/parsers/rst/languages/ja.py: Added to project: Japanese
mappings by Hisashi Morita.
@@ -137,6 +143,7 @@ Changes Since 0.3.9
- Added references.DanglingReferences transform, extracted from
universal.FinalChecks.
- Fixed bug with doubly-indirect substitutions.
+ - Added footnote_reference classes attribute to "TargetNotes".
* docutils/transforms/universal.py:
@@ -180,20 +187,23 @@ Changes Since 0.3.9
- Made cloaking of email addresses with ``--cloak-email-addresses``
less obtrusive.
- Fixed support for centered images.
+ - Added support for class="compact" & class="open" lists.
* docutils/writers/latex2e.py:
- Underscores in citekeys are no longer escaped.
+* docutils/writers/s5_html.py: Added to project; writer for S5-format
+ slide shows.
+
* docutils/writers/support/: Directory added to project. Modules and
data files that support writers have been moved here.
- * The stylesheets are now installed along with the code, the code
- now knows where to find them, and the default is now to use
- (actually, to embed) the built-in stylesheets. Some adjustments
- to configuration files may be necessary. The easiest way to
- obtain the new default behavior is to remove all settings whose
- name includes "stylesheet".
+ The stylesheets are now installed along with the code, the code
+ knows where to find them, and the default is to use (actually, to
+ embed) the built-in stylesheets. Some adjustments to configuration
+ files may be necessary. The easiest way to obtain the new default
+ behavior is to remove all settings whose name includes "stylesheet".
* docutils/writers/support/newlatex2e/unicode_map.py: Added to
project; mapping of Unicode characters to LaTeX equivalents.
@@ -223,8 +233,11 @@ Changes Since 0.3.9
* docs/user/mailing-lists.txt: Added to project; information about
Docutils-related mailing lists and how to access them.
-* docs/ref/rst/substitutions.txt: "reStructuredText Standard
- Substitution Definition Sets", added to project.
+* docs/user/slide-shows.txt: Added to project; example of and docs for
+ the S5/HTML writer (``rst2s5.py`` front end).
+
+* docs/ref/rst/definitions.txt: "reStructuredText Standard Definition
+ Files", added to project.
* test/coverage.sh: Added to project; test coverage script.
@@ -232,6 +245,14 @@ Changes Since 0.3.9
- Added support for specifying runtime settings at the suite level.
+* test/test_functional.py:
+
+ - Added the ``clear_output_directory`` function.
+ - Added support for ``_test_more`` functions in functional test
+ config files.
+
+* tools/rst2s5.py: Added to project; front end for the S5/HTML writer.
+
* tools/rstpep2html.py: Renamed from pep.py.
* tools/dev/create_unimap.py: Added to project; script to create the
diff --git a/MANIFEST.in b/MANIFEST.in
index 5b627650c..9b9c4968d 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,4 +6,4 @@ recursive-include extras *
recursive-include licenses *
recursive-include test *
recursive-include tools *
-recursive-exclude * .cvsignore *.pyc *~
+recursive-exclude * .cvsignore *.pyc *~ .DS_Store
diff --git a/THANKS.txt b/THANKS.txt
index 2c0218922..d5ead0f83 100644
--- a/THANKS.txt
+++ b/THANKS.txt
@@ -86,6 +86,7 @@ donations, tasty treats, and related projects:
* Daniel Larsson
* Marc-Andre Lemburg
* Julien Letessier
+* Chris Liechti
* Wolfgang Lipp
* Edward Loper
* Dallas Mahrt
diff --git a/docs/dev/testing.txt b/docs/dev/testing.txt
index 6963f6541..82e9ed31c 100644
--- a/docs/dev/testing.txt
+++ b/docs/dev/testing.txt
@@ -193,12 +193,21 @@ file name (relative to ``functional/output/`` and
arbitrarily. However, the file names in ``functional/output/`` *must*
match the file names in ``functional/expected/``.
-All other variables are passed as keyword arguments to
-``docutils.core.publish_file``, so you can set reader, parser,
-writer and anything else you want to configure.
+If defined, ``_test_more`` must be a function with the following
+signature::
-Note that ``settings_overrides`` is already initialized as a
-dictionary *before* the execution of the config file.
+ def _test_more(expected_dir, output_dir, test_case, parameters):
+
+This function is called from the test case to perform tests beyond the
+simple comparison of expected and actual output files.
+
+``test_source`` and ``test_destination`` are removed from the
+namespace, as are all variables whose names begin with an underscore
+("_"). The remaining names are passed as keyword arguments to
+``docutils.core.publish_file``, so you can set reader, parser, writer
+and anything else you want to configure. Note that
+``settings_overrides`` is already initialized as a dictionary *before*
+the execution of the config file.
Creating New Tests
diff --git a/docs/index.txt b/docs/index.txt
index 69cceb717..e25d66e07 100644
--- a/docs/index.txt
+++ b/docs/index.txt
@@ -79,6 +79,7 @@ top level of the Docutils project directory.
Docutils-general:
* `Docutils Front-End Tools <user/tools.html>`__
+* `Easy Slide Shows With reStructuredText & S5 <user/slide-shows.html>`__
* `Docutils Configuration Files <user/config.html>`__
* `Docutils LaTeX Writer <user/latex.html>`__
* `Docutils Mailing Lists <user/mailing-lists.html>`__
@@ -128,8 +129,8 @@ reStructuredText_:
* `reStructuredText Markup Specification <ref/rst/restructuredtext.html>`__
* `reStructuredText Directives <ref/rst/directives.html>`__
* `reStructuredText Interpreted Text Roles <ref/rst/roles.html>`__
-* `reStructuredText Standard Substitution Definition Sets
- <ref/rst/substitutions.html>`_
+* `reStructuredText Standard Definition Files
+ <ref/rst/definitions.html>`_
Prehistoric:
diff --git a/docs/ref/rst/substitutions.txt b/docs/ref/rst/definitions.txt
index 5ea9562f2..78a2bf8da 100644
--- a/docs/ref/rst/substitutions.txt
+++ b/docs/ref/rst/definitions.txt
@@ -1,6 +1,6 @@
-========================================================
- reStructuredText Standard Substitution Definition Sets
-========================================================
+============================================
+ reStructuredText Standard Definition Files
+============================================
:Author: David Goodger
:Contact: goodger@python.org
:Revision: $Revision$
@@ -10,17 +10,26 @@
.. contents::
-The data files described below contain sets of reStructuredText
-`substitution definitions`__. They can be included in documents using
-the `"include" directive's`__ special syntax for standard data files,
-angle brackets around the file name::
+This document describes standard definition files, such as sets of
+substitution definitions and interpreted text roles, that can be
+included in reStructuredText documents. The `"include" directive`__
+has a special syntax for these standard definition files, angle
+brackets around the file name::
.. include:: <filename.txt>
-__ restructuredtext.html#substitution-definitions
__ directives.html#include
-The definitions can then be used in documents using `substitution
+The individual data files are stored with the Docutils source code in
+the "docutils" package, in the ``docutils/parsers/rst/include``
+directory.
+
+
+Substitution Definitions
+========================
+
+Many of the standard definition files contain sets of `substitution
+definitions`__, which can be used in documents via `substitution
references`__. For example, the copyright symbol is defined in
``isonum.txt`` as "copy"::
@@ -28,10 +37,11 @@ references`__. For example, the copyright symbol is defined in
Copyright |copy| 2003 by John Q. Public, all rights reserved.
+__ restructuredtext.html#substitution-definitions
__ restructuredtext.html#substitution-references
-Individual definitions can also be copied from these data files and
-pasted into documents. This has two advantages: it removes
+Individual substitution definitions can also be copied from definition
+files and pasted into documents. This has two advantages: it removes
dependencies, and it saves processing of unused definitions. However,
multiple substitution definitions add clutter to the document.
@@ -44,8 +54,9 @@ sequence, backslash-space::
Copyright |copy| 2003, BogusMegaCorp\ |trade|.
-Custom definitions may use the `"unicode" directive`__. Whitespace is
-ignored and removed, effectively sqeezing together the text::
+Custom substitution definitions may use the `"unicode" directive`__.
+Whitespace is ignored and removed, effectively sqeezing together the
+text::
.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN
.. |BogusMegaCorp (TM)| unicode:: BogusMegaCorp U+2122
@@ -62,13 +73,9 @@ right, or both sides (respectively) of substitution references::
.. |---| unicode:: U+02014 .. em dash
:trim:
-The individual data files are stored with the Docutils source code in
-the "docutils" package, in the ``docutils/parsers/rst/include``
-directory.
-
Character Entity Sets
-=====================
+---------------------
The following files contain substitution definitions corresponding to
XML character entity sets, from the following standards: ISO 8879 &
@@ -152,6 +159,17 @@ reference (defined in both ``isonum.txt`` and ``xhtml1-lat1.txt``) is
.. _xhtml1-special.txt: ../../../docutils/parsers/rst/include/xhtml1-special.txt
.. _xhtml1-symbol.txt: ../../../docutils/parsers/rst/include/xhtml1-symbol.txt
+
+S5/HTML Definitions
+===================
+
+The "s5defs.txt_" standard definition file contains interpreted text
+roles (classes) and other definitions for documents destined to become
+`S5/HTML slide shows`_.
+
+.. _s5defs.txt: ../../../docutils/parsers/rst/include/s5defs.txt
+.. _S5/HTML slide shows: ../../user/slide-shows.html
+
..
Local Variables:
diff --git a/docs/ref/rst/directives.txt b/docs/ref/rst/directives.txt
index 58fa324cf..12959e86d 100644
--- a/docs/ref/rst/directives.txt
+++ b/docs/ref/rst/directives.txt
@@ -1065,7 +1065,7 @@ Target Footnotes
:Directive Type: "target-notes"
:Doctree Elements: pending, footnote, footnote_reference
:Directive Arguments: None.
-:Directive Options: None.
+:Directive Options: Possible.
:Directive Content: None.
The "target-notes" directive creates a footnote for each external
@@ -1074,6 +1074,12 @@ reference. For every explicit target (of the form, ``.. _target name:
URL``) in the text, a footnote will be generated containing the
visible URL as content.
+The following option is recognized:
+
+``class`` : text
+ Set a "class" attribute value on all footnote_reference elements.
+ See the class_ directive below.
+
Footnotes
=========
diff --git a/docs/user/config.txt b/docs/user/config.txt
index 2f6fa40c8..cbd874972 100644
--- a/docs/user/config.txt
+++ b/docs/user/config.txt
@@ -345,7 +345,8 @@ _`sectnum_xform`
Enable or disable the section numbering transform
(docutils.transforms.parts.SectNum).
- Default: enabled (1). Options: ``--no-section-numbering``.
+ Default: enabled (1). Options: ``--section-numbering``,
+ ``--no-section-numbering``.
_`source_link`
Include a "View document source" link in the document footer. URL
@@ -584,16 +585,18 @@ _`cloak_email_addresses`
_`compact_lists`
Remove extra vertical whitespace between items of bullet lists and
enumerated lists, when list items are "simple" (i.e., all items
- each contain one paragraph and/or one "simple" sublist only).
+ each contain one paragraph and/or one "simple" sublist only). The
+ behaviour can be specified directly via "class" attributes (values
+ "compact" and "open") in the document.
Default: enabled (1). Options: ``--compact-lists,
--no-compact-lists``.
_`compact_field_lists`
-
Remove extra vertical whitespace between items of field lists that
are "simple" (i.e., all field bodies each contain at most one
- paragraph).
+ paragraph). The behaviour can be specified directly via "class"
+ attributes (values "compact" and "open") in the document.
Default: enabled (1). Options: ``--compact-field-lists,
--no-compact-field-lists``.
@@ -643,9 +646,9 @@ _`option_limit`
.. _stylesheet [html4css1 writer]:
stylesheet
- CSS stylesheet URL, used verbatim. Overrides stylesheet_path
- [#override]_. Pass an empty string to deactivate stylesheet
- inclusion.
+ CSS stylesheet URL, used verbatim. Overrides the
+ "stylesheet_path" setting [#override]_. Pass an empty string to
+ deactivate stylesheet inclusion.
Default: None. Options: ``--stylesheet``.
@@ -656,10 +659,9 @@ stylesheet
.. _stylesheet_path [html4css1 writer]:
stylesheet_path
- Path to CSS stylesheet [#pwd]_. Overrides "stylesheet" URL
- setting (``--stylesheet``) [#override]_. Path is adjusted
- relative to the output HTML file. Also defined for the `LaTeX
- Writer`__.
+ Path to CSS stylesheet [#pwd]_. Overrides the "stylesheet" URL
+ setting [#override]_. Path is adjusted relative to the output
+ HTML file. Also defined for the `LaTeX Writer`__.
Default: "html4css1.css" in the docutils/writers/support directory
(installed automatically; for the exact machine-specific path, use
@@ -720,6 +722,50 @@ _`python_home`
Default: parent directory (".."). Options: ``--python-home``.
+[s5_html writer]
+.................
+
+The S5/HTML Writer derives from the standard HTML Writer, and shares
+all settings defined in the `[html4css1 writer]`_ section. The
+"[html4css1 writer]" section of configuration files is processed
+before the "[s5_html writer]" section.
+
+The S5/HTML Writer's default for the ``compact_lists`` setting differs
+from that of the standard HTML Writer: the default here is to disable
+compact lists.
+
+_`current_slide`
+
+ Enable or disable the current slide indicator ("1/15").
+
+ Default: disabled (None). Options: ``--current-slide``,
+ ``--no-current-slide``.
+
+_`overwrite_theme_files`
+ Allow or prevent the overwriting of existing theme files in the
+ ``ui/<theme>`` directory. This has no effect if "theme_url_" is
+ used.
+
+ Default: keep existing theme files (None). Options:
+ ``--keep-theme-files``, ``--overwrite-theme-files``.
+
+_`theme`
+ Name of an installed S5 theme, to be copied into a ``ui/<theme>``
+ subdirectory, beside the destination file (output HTML). Note
+ that existing theme files will not be overwritten; the existing
+ theme directory you must be deleted manually. Overrides the
+ "theme_url_" setting [#override]_.
+
+ Default: "default". Option: ``--theme``.
+
+_`theme-url`
+ The URL of an S5 theme directory. The destination file (output
+ HTML) will link to this theme; nothing will be copied. Overrides
+ the "theme_" setting [#override]_.
+
+ Default: None. Option: ``--theme-url``.
+
+
[latex2e writer]
````````````````
diff --git a/docs/user/images/big-black.png b/docs/user/images/big-black.png
new file mode 100644
index 000000000..869a0cf9f
--- /dev/null
+++ b/docs/user/images/big-black.png
Binary files differ
diff --git a/docs/user/images/big-white.png b/docs/user/images/big-white.png
new file mode 100644
index 000000000..1ce6d7d7d
--- /dev/null
+++ b/docs/user/images/big-white.png
Binary files differ
diff --git a/docs/user/images/default.png b/docs/user/images/default.png
new file mode 100644
index 000000000..509eeddad
--- /dev/null
+++ b/docs/user/images/default.png
Binary files differ
diff --git a/docs/user/images/happy_monkey.png b/docs/user/images/happy_monkey.png
new file mode 100644
index 000000000..2164c06dd
--- /dev/null
+++ b/docs/user/images/happy_monkey.png
Binary files differ
diff --git a/docs/user/images/medium-black.png b/docs/user/images/medium-black.png
new file mode 100644
index 000000000..f851e679e
--- /dev/null
+++ b/docs/user/images/medium-black.png
Binary files differ
diff --git a/docs/user/images/medium-white.png b/docs/user/images/medium-white.png
new file mode 100644
index 000000000..e5a465a56
--- /dev/null
+++ b/docs/user/images/medium-white.png
Binary files differ
diff --git a/docs/user/images/rsp-all.png b/docs/user/images/rsp-all.png
new file mode 100644
index 000000000..3e5f5ede3
--- /dev/null
+++ b/docs/user/images/rsp-all.png
Binary files differ
diff --git a/docs/user/images/rsp-breaks.png b/docs/user/images/rsp-breaks.png
new file mode 100644
index 000000000..f2a31b098
--- /dev/null
+++ b/docs/user/images/rsp-breaks.png
Binary files differ
diff --git a/docs/user/images/rsp-covers.png b/docs/user/images/rsp-covers.png
new file mode 100644
index 000000000..597c2c2a8
--- /dev/null
+++ b/docs/user/images/rsp-covers.png
Binary files differ
diff --git a/docs/user/images/rsp-cuts.png b/docs/user/images/rsp-cuts.png
new file mode 100644
index 000000000..aa46b3876
--- /dev/null
+++ b/docs/user/images/rsp-cuts.png
Binary files differ
diff --git a/docs/user/images/rsp-empty.png b/docs/user/images/rsp-empty.png
new file mode 100644
index 000000000..f6b93c38b
--- /dev/null
+++ b/docs/user/images/rsp-empty.png
Binary files differ
diff --git a/docs/user/images/rsp-objects.png b/docs/user/images/rsp-objects.png
new file mode 100644
index 000000000..43ce276f1
--- /dev/null
+++ b/docs/user/images/rsp-objects.png
Binary files differ
diff --git a/docs/user/images/rsp.svg b/docs/user/images/rsp.svg
new file mode 100644
index 000000000..03445d3bc
--- /dev/null
+++ b/docs/user/images/rsp.svg
@@ -0,0 +1,636 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1224.0000pt"
+ height="792.00000pt"
+ id="svg16130"
+ sodipodi:version="0.32"
+ inkscape:version="0.42"
+ sodipodi:docbase="/Users/david/projects/docutils/s5-branch/docs/user/images"
+ sodipodi:docname="rsp.svg"
+ inkscape:export-filename="/Users/david/projects/docutils/s5-branch/docs/user/images/rsp-empty.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000">
+ <defs
+ id="defs16132">
+ <radialGradient
+ cx="64.960804"
+ cy="86.732626"
+ fx="64.394720"
+ fy="89.843742"
+ id="radialGradient1157"
+ r="4.6795605"
+ xlink:href="#linearGradient1125"
+ gradientTransform="scale(1.232968,0.811051)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1147"
+ x1="30.807715"
+ x2="9.1659926"
+ xlink:href="#linearGradient1129"
+ y1="134.41771"
+ y2="128.61883"
+ gradientTransform="scale(2.035443,0.491293)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1146"
+ x1="23.109005"
+ x2="23.655650"
+ xlink:href="#linearGradient1129"
+ y1="86.372661"
+ y2="75.530011"
+ gradientTransform="scale(1.564854,0.639037)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1150"
+ x1="7.1055503"
+ x2="37.417715"
+ xlink:href="#linearGradient1152"
+ y1="148.97907"
+ y2="149.31015"
+ gradientTransform="scale(1.328405,0.752782)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1152">
+ <stop
+ id="stop1153"
+ offset="0.00000000"
+ style="stop-color:#ffffff;stop-opacity:0.00000000;" />
+ <stop
+ id="stop1155"
+ offset="0.44302326"
+ style="stop-color:#ffffff;stop-opacity:0.46274510;" />
+ <stop
+ id="stop1154"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.00000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1151"
+ x1="29.180973"
+ x2="12.077421"
+ xlink:href="#linearGradient1152"
+ y1="176.88234"
+ y2="176.49016"
+ gradientTransform="scale(1.503932,0.664924)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1135"
+ x1="5.6004575"
+ x2="57.337623"
+ xlink:href="#linearGradient1136"
+ y1="125.70108"
+ y2="125.70108"
+ gradientTransform="scale(1.240748,0.805966)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1129">
+ <stop
+ id="stop1130"
+ offset="0.00000000"
+ style="stop-color:#ffffff;stop-opacity:0.00000000;" />
+ <stop
+ id="stop1131"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.64583331;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1128"
+ x1="76.620649"
+ x2="89.927438"
+ xlink:href="#linearGradient1129"
+ y1="79.202017"
+ y2="132.51965"
+ gradientTransform="scale(1.342210,0.745040)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1133"
+ x1="95.959445"
+ x2="95.959445"
+ xlink:href="#linearGradient1125"
+ y1="96.280971"
+ y2="6.0312801"
+ gradientTransform="scale(1.356086,0.737416)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1136">
+ <stop
+ id="stop1137"
+ offset="0.00000000"
+ style="stop-color:#000000;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1138"
+ offset="1.0000000"
+ style="stop-color:#454545;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1145"
+ x1="26.716417"
+ x2="57.535761"
+ xlink:href="#linearGradient1136"
+ y1="72.512797"
+ y2="104.12337"
+ gradientTransform="scale(1.435519,0.696612)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1125">
+ <stop
+ id="stop1126"
+ offset="0.00000000"
+ style="stop-color:#979797;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1163"
+ offset="0.35050300"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1164"
+ offset="0.36050299"
+ style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1127"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1134"
+ x1="66.560545"
+ x2="26.091148"
+ xlink:href="#linearGradient1125"
+ y1="135.98955"
+ y2="85.436682"
+ gradientTransform="scale(1.892867,0.528299)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1243">
+ <stop
+ id="stop1244"
+ offset="0.00000000"
+ style="stop-color:#000000;stop-opacity:0.19791667;" />
+ <stop
+ id="stop1245"
+ offset="1.0000000"
+ style="stop-color:#000000;stop-opacity:0.00000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1149"
+ x1="508.22840"
+ x2="505.28565"
+ xlink:href="#linearGradient1243"
+ y1="556.37391"
+ y2="107.87502"
+ gradientTransform="scale(1.347706,0.742001)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1243"
+ id="linearGradient16217"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.347706,0.742001)"
+ x1="508.22840"
+ y1="556.37391"
+ x2="505.28565"
+ y2="107.87502" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1243"
+ id="linearGradient16219"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.347706,0.742001)"
+ x1="508.22840"
+ y1="556.37391"
+ x2="505.28565"
+ y2="107.87502" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1243"
+ id="linearGradient16221"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.347706,0.742001)"
+ x1="508.22840"
+ y1="556.37391"
+ x2="505.28565"
+ y2="107.87502" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1243"
+ id="linearGradient16223"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.347706,0.742001)"
+ x1="508.22840"
+ y1="556.37391"
+ x2="505.28565"
+ y2="107.87502" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.52132701"
+ inkscape:cx="650.00000"
+ inkscape:cy="497.00000"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer7"
+ showgrid="true"
+ inkscape:grid-bbox="false"
+ inkscape:grid-points="false"
+ gridspacingx="5.0000000px"
+ gridspacingy="5.0000000px"
+ gridtolerance="2.5000000px"
+ inkscape:window-width="920"
+ inkscape:window-height="603"
+ inkscape:window-x="20"
+ inkscape:window-y="73" />
+ <metadata
+ id="metadata16135">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="base"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline">
+ <g
+ id="g17404"
+ transform="translate(100.0000,-75.00000)"
+ style="stroke:none;stroke-opacity:1.0000000">
+ <rect
+ ry="38.000000"
+ rx="38.000000"
+ style="fill:#ffffff;fill-opacity:0.14999999;stroke:none;stroke-opacity:1.0000000"
+ id="rrect19"
+ width="1100.0000"
+ height="844.00000"
+ x="0.0000000"
+ y="146.00000" />
+ <rect
+ ry="36.000000"
+ rx="36.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect18"
+ width="1096.0000"
+ height="840.00000"
+ x="2.0000000"
+ y="148.00000" />
+ <rect
+ ry="34.000000"
+ rx="34.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect17"
+ width="1092.0000"
+ height="836.00000"
+ x="4.0000000"
+ y="150.00000" />
+ <rect
+ ry="32.000000"
+ rx="32.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect16"
+ width="1088.0000"
+ height="832.00000"
+ x="6.0000000"
+ y="152.00000" />
+ <rect
+ ry="30.000000"
+ rx="30.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect15"
+ width="1084.0000"
+ height="828.00000"
+ x="8.0000000"
+ y="154.00000" />
+ <rect
+ ry="28.000000"
+ rx="28.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect14"
+ width="1080.0000"
+ height="824.00000"
+ x="10.000000"
+ y="156.00000" />
+ <rect
+ ry="26.000000"
+ rx="26.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect13"
+ width="1076.0000"
+ height="820.00000"
+ x="12.000000"
+ y="158.00000" />
+ <rect
+ ry="24.000000"
+ rx="24.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect12"
+ width="1072.0000"
+ height="816.00000"
+ x="14.000000"
+ y="160.00000" />
+ <rect
+ ry="22.000000"
+ rx="22.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect11"
+ width="1068.0000"
+ height="812.00000"
+ x="16.000000"
+ y="162.00000" />
+ <rect
+ ry="20.000000"
+ rx="20.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect10"
+ width="1064.0000"
+ height="808.00000"
+ x="18.000000"
+ y="164.00000" />
+ <rect
+ ry="18.000000"
+ rx="18.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect9"
+ width="1060.0000"
+ height="804.00000"
+ x="20.000000"
+ y="166.00000" />
+ <rect
+ ry="16.000000"
+ rx="16.000000"
+ style="fill:#ffffff;fill-opacity:0.099999972;stroke:none;stroke-opacity:1.0000000"
+ id="rrect8"
+ width="1056.0000"
+ height="800.00000"
+ x="22.000000"
+ y="168.00000" />
+ <rect
+ ry="14.000000"
+ rx="14.000000"
+ style="fill:#ffffff;fill-opacity:0.11999995;stroke:none;stroke-opacity:1.0000000"
+ id="rrect7"
+ width="1052.0000"
+ height="796.00000"
+ x="24.000000"
+ y="170.00000" />
+ <rect
+ ry="12.000000"
+ rx="12.000000"
+ style="fill:#ffffff;fill-opacity:0.14000000;stroke:none;stroke-opacity:1.0000000"
+ id="rrect6"
+ width="1048.0000"
+ height="792.00000"
+ x="26.000000"
+ y="172.00000" />
+ <rect
+ ry="10.000000"
+ rx="10.000000"
+ style="fill:#ffffff;fill-opacity:0.15999998;stroke:none;stroke-opacity:1.0000000"
+ id="rrect5"
+ width="1044.0000"
+ height="788.00000"
+ x="28.000000"
+ y="174.00000" />
+ <rect
+ ry="8.0000000"
+ rx="8.0000000"
+ style="fill:#ffffff;fill-opacity:0.17999996;stroke:none;stroke-opacity:1.0000000"
+ id="rrect4"
+ width="1040.0000"
+ height="784.00000"
+ x="30.000000"
+ y="176.00000" />
+ <rect
+ ry="6.0000000"
+ rx="6.0000000"
+ style="fill:#ffffff;fill-opacity:0.20000000;stroke:none;stroke-opacity:1.0000000"
+ id="rrect3"
+ width="1036.0000"
+ height="780.00000"
+ x="32.000000"
+ y="178.00000" />
+ <rect
+ ry="4.0000000"
+ rx="4.0000000"
+ style="fill:#ffffff;fill-opacity:0.21999998;stroke:none;stroke-opacity:1.0000000"
+ id="rrect2"
+ width="1032.0000"
+ height="776.00000"
+ x="34.000000"
+ y="180.00000" />
+ <rect
+ ry="2.0000000"
+ rx="2.0000000"
+ style="fill:#ffffff;fill-opacity:0.49999997;stroke:none;stroke-opacity:1.0000000"
+ id="rrect1"
+ width="1028.0000"
+ height="772.00000"
+ x="36.000000"
+ y="182.00000" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect7529"
+ width="1024.0000"
+ height="768.00000"
+ x="38.000000"
+ y="184.00000" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="cuts"
+ style="display:inline">
+ <g
+ style="display:inline"
+ id="g17268"
+ transform="matrix(3.955288,0.000000,0.000000,3.955288,-1133.851,-788.5280)">
+ <g
+ transform="matrix(-1.028194e-2,1.033891e-2,-1.033891e-2,-1.028194e-2,587.3686,366.0048)"
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ id="g17126">
+ <path
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ sodipodi:nodetypes="ccccc"
+ id="path17128"
+ d="M 7602.2995,10592.638 L 6351.2995,11841.638 L 7603.2995,9842.6385 L 8851.2995,11843.638 L 7602.2995,10592.638 z " />
+ </g>
+ <path
+ id="text17130"
+ d="M 346.56856,325.28003 C 346.01656,325.52003 345.34456,325.66403 344.48056,325.66403 C 342.70456,325.66403 341.26456,324.51203 341.26456,322.35203 C 341.24056,320.43204 342.48856,319.06403 344.40856,319.06403 C 345.36856,319.06403 346.01656,319.23203 346.44856,319.42403 L 347.02456,316.71203 C 346.25656,316.42403 345.20056,316.25603 344.24056,316.25603 C 339.87256,316.25603 337.52056,319.06404 337.52056,322.49603 C 337.52056,326.19203 339.94456,328.52003 343.73656,328.52003 C 345.12856,328.52003 346.35256,328.28003 347.00056,327.96803 L 346.56856,325.28003 M 360.08468,316.52003 L 356.43668,316.52003 L 356.43668,323.50403 C 356.43668,323.81603 356.38868,324.08003 356.29268,324.29603 C 356.07668,324.87203 355.47668,325.56803 354.46868,325.56803 C 353.17269,325.56803 352.62068,324.53603 352.62068,322.83203 L 352.62068,316.52003 L 348.97268,316.52003 L 348.97268,323.40803 C 348.97268,327.03203 350.70069,328.52003 353.10068,328.52003 C 355.21268,328.52003 356.31669,327.32003 356.77268,326.60003 L 356.84468,326.60003 L 357.01268,328.25603 L 360.18068,328.25603 C 360.13268,327.27204 360.08468,326.02403 360.08468,324.48803 L 360.08468,316.52003 M 363.54031,314.31203 L 363.54031,316.52003 L 361.98031,316.52003 L 361.98031,319.20803 L 363.54031,319.20803 L 363.54031,324.03203 C 363.54031,325.68803 363.87631,326.81603 364.54831,327.51203 C 365.14831,328.11203 366.13231,328.52003 367.30831,328.52003 C 368.31631,328.52003 369.20431,328.37603 369.66031,328.20803 L 369.63631,325.44803 C 369.30031,325.52003 369.06031,325.54403 368.55631,325.54403 C 367.47631,325.54403 367.11631,324.89603 367.11631,323.48003 L 367.11631,319.20803 L 369.73231,319.20803 L 369.73231,316.52003 L 367.11631,316.52003 L 367.11631,313.32803 L 363.54031,314.31203 M 371.17681,327.68003 C 372.06481,328.16003 373.43281,328.52003 374.96881,328.52003 C 378.32881,328.52003 380.03281,326.91203 380.03281,324.70403 C 380.00881,323.00004 379.09681,321.84803 376.86481,321.10403 C 375.42481,320.60003 374.96881,320.31203 374.96881,319.73603 C 374.96881,319.16003 375.47281,318.80003 376.36081,318.80003 C 377.34481,318.80003 378.37681,319.18403 378.90481,319.44803 L 379.52881,316.95203 C 378.80881,316.59203 377.60881,316.25603 376.24081,316.25603 C 373.33681,316.25603 371.46481,317.91204 371.46481,320.12003 C 371.44081,321.48803 372.37681,322.83203 374.82481,323.62403 C 376.16881,324.08003 376.52881,324.36803 376.52881,324.99203 C 376.52881,325.59203 376.07281,325.95203 374.96881,325.95203 C 373.88881,325.95203 372.49681,325.49603 371.82481,325.08803 L 371.17681,327.68003"
+ style="font-size:24.000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#007f00;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Myriad" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="scissors"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(-0.261242,0.531875,-0.531875,-0.261243,609.4123,269.4384)"
+ id="g834">
+ <path
+ transform="matrix(-0.974540,0.224211,0.224211,0.974540,434.7533,-39.90828)"
+ style="font-size:12.000000px;fill:#dadadb;fill-rule:evenodd;stroke:#000000;stroke-width:10.000006;stroke-linejoin:round;stroke-dasharray:none"
+ id="path693"
+ d="M 130.58000,19.228100 C 131.42800,19.228100 283.20600,268.51700 283.20600,268.51700 C 283.20600,268.51700 237.41800,294.80300 238.26600,294.80300 C 239.11400,294.80300 112.77400,100.62900 130.58000,19.228100 z " />
+ <path
+ style="font-size:12.000000px;fill:#1f1f61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:10.000000;stroke-linejoin:bevel;stroke-dasharray:none"
+ id="path596"
+ d="M 267.36640,300.28500 C 267.36640,300.28500 221.96450,419.33820 230.36720,437.01870 C 230.00410,447.80450 196.57070,496.47240 174.95750,496.94460 C 156.32120,498.11630 95.023300,483.45520 104.85110,423.19450 C 116.53670,361.19710 166.80670,382.68650 186.68190,380.35660 C 206.55780,378.02600 240.34010,301.17560 216.89540,284.78780 C 243.06010,291.66780 266.70660,302.06270 267.36640,300.28500 z M 178.01080,388.46270 C 110.22310,370.58330 97.043850,476.92290 157.42350,483.15570 C 225.11850,486.03500 224.54920,396.02940 178.01080,388.46270 z " />
+ <path
+ transform="matrix(0.984591,0.174877,-0.174877,0.984591,41.27270,-35.37063)"
+ style="font-size:12.000000px;fill:#dadadb;fill-rule:evenodd;stroke:#000000;stroke-width:9.9999933;stroke-linejoin:bevel;stroke-dasharray:none"
+ id="path674"
+ d="M 130.58000,19.228100 C 131.42800,19.228100 283.20600,268.51700 283.20600,268.51700 C 283.20600,268.51700 237.41800,294.80300 238.26600,294.80300 C 239.11400,294.80300 112.77400,100.62900 130.58000,19.228100 z " />
+ <path
+ transform="translate(161.5948,57.16911)"
+ style="font-size:12.000000px;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6.2500000;stroke-dasharray:none"
+ sodipodi:nodetypes="ccc"
+ id="path710"
+ d="M 81.400500,200.68300 C 66.137900,201.53100 63.594200,225.27300 81.400500,226.12100 C 98.359000,225.27300 98.359200,200.68300 81.400500,200.68300 z " />
+ <path
+ transform="translate(161.5948,57.16911)"
+ style="font-size:12.000000px;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6.2500000;stroke-dasharray:none"
+ id="path711"
+ d="M 69.529600,209.16300 C 71.225500,209.16300 86.488100,224.42500 86.488100,224.42500" />
+ <path
+ transform="translate(161.5948,57.16911)"
+ style="font-size:12.000000px;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:6.2500000;stroke-dasharray:none"
+ sodipodi:nodetypes="cc"
+ id="path712"
+ d="M 76.313000,203.22700 C 77.160900,203.22700 92.423500,218.49000 92.423500,218.49000" />
+ <path
+ style="font-size:12.000000px;fill:#e6ffff;fill-opacity:0.75000000;fill-rule:evenodd;stroke-width:1.0000000pt"
+ sodipodi:nodetypes="cccc"
+ id="path717"
+ d="M 311.59912,21.282200 C 312.44712,21.282200 250.54912,207.82500 250.54912,207.82500 C 250.54912,207.82500 257.17737,220.62188 259.72037,219.77388 C 262.26437,218.92588 318.38312,30.609400 311.59912,21.282200 z " />
+ <path
+ transform="translate(-3.750000,3.750000)"
+ style="font-size:12.000000px;fill-opacity:0.31851897;fill-rule:evenodd;stroke-width:1.0000000pt"
+ sodipodi:nodetypes="ccccc"
+ id="path718"
+ d="M 236.85900,262.03100 L 240.39000,257.08300 L 256.63200,272.60800 L 252.68100,276.70800 L 236.85900,262.03100 z " />
+ <path
+ style="font-size:12.000000px;fill:#1f1f61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:10.000000;stroke-linejoin:bevel;stroke-dasharray:none"
+ id="path590"
+ d="M 319.25070,379.53570 C 386.05280,358.26700 404.56760,463.80860 344.57810,473.07250 C 277.11370,479.35530 273.15220,389.43500 319.25070,379.53570 z M 225.57020,295.96700 C 225.57020,295.96700 276.90680,412.58430 269.40450,430.66530 C 270.31010,441.41910 306.15060,488.34270 327.76030,487.72650 C 346.43190,487.95870 406.91430,470.23100 394.06590,410.54120 C 379.27480,349.21050 330.15000,373.20280 310.18270,371.87620 C 290.21460,370.54890 252.60710,295.49620 275.19730,277.94910 C 249.41200,286.13730 226.31860,297.70920 225.57020,295.96700 z " />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="breaks"
+ style="display:inline">
+ <g
+ style="display:inline"
+ id="g17263"
+ transform="matrix(3.955288,0.000000,0.000000,3.955288,-654.3060,-855.6644)">
+ <g
+ transform="matrix(0.000000,1.458120e-2,1.458120e-2,0.000000,167.9907,189.6206)"
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ id="g2604">
+ <path
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ sodipodi:nodetypes="ccccc"
+ id="path2606"
+ d="M 7601.0000,11063.000 L 6350.0000,12312.000 L 7602.0000,10313.000 L 8850.0000,12314.000 L 7601.0000,11063.000 z " />
+ </g>
+ <path
+ id="text17114"
+ d="M 299.55643,273.07213 C 299.55643,274.39213 299.50843,275.80813 299.46043,276.57613 L 302.55643,276.57613 L 302.70043,274.94413 L 302.74843,274.94413 C 303.56443,276.33613 304.90843,276.84013 306.27643,276.84013 C 308.96443,276.84013 311.62843,274.72813 311.62843,270.50413 C 311.65243,266.90413 309.61243,264.57613 306.80443,264.57613 C 305.17243,264.57613 303.94843,265.22413 303.25243,266.23213 L 303.20443,266.23213 L 303.20443,259.53613 L 299.55643,259.53613 L 299.55643,273.07213 M 303.20443,269.85613 C 303.20443,269.61613 303.22843,269.40013 303.27643,269.18413 C 303.51643,268.12813 304.42843,267.38413 305.41243,267.38413 C 307.11643,267.38413 307.93243,268.82413 307.93243,270.64813 C 307.93243,272.76013 306.97243,273.96013 305.41243,273.96013 C 304.35643,273.96013 303.51643,273.19213 303.27643,272.23213 C 303.22843,272.04013 303.20443,271.82413 303.20443,271.58413 L 303.20443,269.85613 M 313.90018,276.57613 L 317.54818,276.57613 L 317.54818,270.64813 C 317.54818,270.33613 317.57218,270.07213 317.62018,269.83213 C 317.86018,268.68013 318.77218,267.98413 320.11618,267.98413 C 320.52418,267.98413 320.81218,268.03213 321.12418,268.08013 L 321.12418,264.64813 C 320.86018,264.60013 320.69218,264.57613 320.35618,264.57613 C 319.20418,264.57613 317.78818,265.29613 317.18818,267.02413 L 317.09218,267.02413 L 316.94818,264.84013 L 313.82818,264.84013 C 313.90018,265.84813 313.92418,266.97613 313.92418,268.70413 L 313.90018,276.57613 M 333.40881,271.87213 C 333.45681,271.58413 333.52881,271.03213 333.52881,270.40813 C 333.52881,267.50413 332.08880,264.55213 328.29681,264.55213 C 324.24081,264.55213 322.36881,267.84013 322.36881,270.81613 C 322.36881,274.51213 324.64881,276.81613 328.63281,276.81613 C 330.21681,276.81613 331.68081,276.57613 332.88081,276.07213 L 332.40081,273.60013 C 331.41681,273.93613 330.40881,274.10413 329.16081,274.10413 C 327.45681,274.10413 325.96881,273.38413 325.84881,271.84813 L 333.40881,271.87213 M 325.82481,269.35213 C 325.92081,268.39213 326.54481,266.97613 328.10481,266.97613 C 329.76081,266.97613 330.14481,268.48813 330.14481,269.35213 L 325.82481,269.35213 M 345.46506,269.64013 C 345.46506,266.88013 344.24105,264.57613 340.32906,264.57613 C 338.19306,264.57613 336.58506,265.17613 335.76906,265.63213 L 336.44106,267.96013 C 337.20906,267.50413 338.48106,267.09613 339.68106,267.09613 C 341.48106,267.09613 341.81706,267.98413 341.81706,268.60813 L 341.81706,268.75213 C 337.66506,268.75213 334.92906,270.19213 334.92906,273.24013 C 334.92906,275.11213 336.34506,276.84013 338.72106,276.84013 C 340.11306,276.84013 341.31306,276.33613 342.08106,275.40013 L 342.15306,275.40013 L 342.36906,276.57613 L 345.65706,276.57613 C 345.51306,275.92813 345.46506,274.84813 345.46506,273.74413 L 345.46506,269.64013 M 341.93706,272.30413 C 341.93706,272.52013 341.91306,272.73613 341.86506,272.92813 C 341.62506,273.67213 340.85706,274.27213 339.96906,274.27213 C 339.15306,274.27213 338.52906,273.81613 338.52906,272.88013 C 338.52906,271.48813 340.01706,271.03213 341.93706,271.03213 L 341.93706,272.30413 M 352.00131,259.53613 L 348.35331,259.53613 L 348.35331,276.57613 L 352.00131,276.57613 L 352.00131,272.92813 L 352.91331,271.75213 L 355.76931,276.57613 L 360.25731,276.57613 L 355.45731,269.59213 L 359.65731,264.84013 L 355.26531,264.84013 L 352.88931,268.39213 C 352.60131,268.82413 352.31331,269.30413 352.04931,269.80813 L 352.00131,269.80813 L 352.00131,259.53613 M 360.71256,276.00013 C 361.60056,276.48013 362.96856,276.84013 364.50456,276.84013 C 367.86455,276.84013 369.56856,275.23213 369.56856,273.02413 C 369.54456,271.32013 368.63256,270.16813 366.40056,269.42413 C 364.96056,268.92013 364.50456,268.63213 364.50456,268.05613 C 364.50456,267.48013 365.00856,267.12013 365.89656,267.12013 C 366.88056,267.12013 367.91256,267.50413 368.44056,267.76813 L 369.06456,265.27213 C 368.34456,264.91213 367.14456,264.57613 365.77656,264.57613 C 362.87256,264.57613 361.00056,266.23213 361.00056,268.44013 C 360.97656,269.80813 361.91256,271.15213 364.36056,271.94413 C 365.70456,272.40013 366.06456,272.68813 366.06456,273.31213 C 366.06456,273.91213 365.60856,274.27213 364.50456,274.27213 C 363.42456,274.27213 362.03256,273.81613 361.36056,273.40813 L 360.71256,276.00013"
+ style="font-size:24.000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#007f00;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Myriad" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="rock"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(0.708388,0.000000,0.000000,0.708388,768.4189,171.0555)"
+ id="g2067">
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ id="path10"
+ d="M 149.15160,130.25073 L 138.01458,125.99417 L 132.85423,131.15452 L 127.69388,137.17493 L 120.81341,144.91545 L 113.07289,154.37609 L 105.33236,163.83673 L 97.591837,173.29738 L 89.851312,183.61808 L 82.970845,194.79883 L 76.090379,205.11953 L 70.069971,215.44023 L 64.909621,224.04082 L 61.469388,232.64140 L 58.889213,240.38192 L 58.889213,246.40233 L 60.609329,250.70262 L 66.629738,257.58309 L 73.510204,263.60350 L 82.110787,269.62391 L 90.711370,275.64431 L 100.17201,280.80466 L 108.77259,285.96501 L 117.37318,291.98542 L 124.25364,296.28571 L 129.41399,300.58601 L 132.85423,304.02624 L 135.43440,306.60641 L 138.01458,308.32653 L 140.59475,310.04665 L 144.03499,311.76676 L 150.05539,314.34694 L 156.93586,316.92711 L 165.53644,319.50729 L 195.63848,318.64723 L 201.65889,318.64723 L 208.53936,318.64723 L 216.27988,319.50729 L 224.02041,320.36735 L 230.90087,321.22741 L 236.06122,323.80758 L 241.22157,325.52770 L 248.10204,325.52770 L 254.98251,325.52770 L 261.86297,324.66764 L 268.74344,322.94752 L 275.62391,321.22741 L 281.64431,318.64723 L 286.80466,316.92711 L 291.10496,314.34694 L 295.40525,310.90671 L 298.84548,306.60641 L 303.14577,302.30612 L 306.58601,298.00583 L 310.02624,293.70554 L 312.60641,291.12536 L 315.18659,290.26531 L 318.62682,290.26531 L 322.92711,289.40525 L 328.94752,287.68513 L 334.96793,285.10496 L 340.98834,283.38484 L 346.14869,280.80466 L 349.58892,279.08455 L 351.30904,277.36443 L 356.78718,268.76385 L 364.48397,254.32361 L 363.12536,245.36152 L 359.04956,237.80175 L 362.48980,236.94169 L 365.93003,234.36152 L 368.51020,230.92128 L 371.09038,225.76093 L 373.67055,221.46064 L 375.39067,218.02041 L 376.25073,215.44023 L 377.11079,214.58017 L 365.93003,182.75802 L 364.20991,181.03790 L 361.62974,176.73761 L 357.32945,171.57726 L 352.16910,164.69679 L 347.00875,158.67638 L 342.70845,153.51603 L 333.79008,153.06414 L 329.62682,149.89505 L 322.92711,148.35569 L 320.03207,145.27697 L 315.64140,143.64723 L 312.97085,142.01749 L 308.94169,139.52769 L 304.14285,137.62682 L 299.34403,135.63557 L 295.22449,130.56560 L 290.24490,127.71429 L 286.80466,123.41399 L 284.22449,119.97376 L 282.50437,117.39359 L 281.64431,116.53353 L 239.50146,101.91254 L 238.64140,101.91254 L 236.06122,101.05248 L 231.76093,100.19242 L 227.46064,99.332362 L 222.30029,98.472303 L 218.00000,98.472303 L 213.69971,98.472303 L 211.11953,98.472303 L 181.51020,124.82216 L 149.15160,130.25073 z "
+ style="fill:#b5abab;fill-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ id="path1333"
+ d="M 272.27930,110.03646 L 278.00000,110.00000 L 281.00000,109.00000 L 285.00000,109.00000 L 288.00000,109.00000 L 290.00000,113.00000 L 293.00000,116.00000 L 295.00000,119.00000 L 298.00000,123.00000 L 300.00000,126.00000 L 302.00000,130.00000 L 303.00000,134.00000 L 303.00000,138.00000 L 302.00000,139.00000 L 302.00000,139.00000 L 301.00000,140.00000 L 301.00000,140.00000 L 297.00000,137.00000 L 293.00000,135.00000 L 290.00000,132.00000 L 287.00000,129.00000 L 284.00000,128.00000 L 280.00000,127.00000 L 277.00000,126.00000 L 273.00000,126.00000 L 270.00000,125.00000 L 266.00000,125.00000 L 262.00000,125.00000 L 259.00000,125.00000 L 254.00000,122.00000 L 249.00000,119.00000 L 245.00000,116.00000 L 240.00000,112.00000 L 235.00000,110.00000 L 230.00000,108.00000 L 225.00000,109.00000 L 219.00000,111.00000 L 214.00000,113.00000 L 209.00000,116.00000 L 204.00000,119.00000 L 199.00000,122.00000 L 194.00000,125.00000 L 190.00000,129.00000 L 186.00000,134.00000 L 183.00000,139.00000 L 177.00000,141.00000 L 171.00000,143.00000 L 164.00000,143.00000 L 157.00000,143.00000 L 150.00000,144.00000 L 143.00000,145.00000 L 137.00000,147.00000 L 131.00000,151.00000 L 129.00000,153.00000 L 127.00000,155.00000 L 125.00000,158.00000 L 124.00000,161.00000 L 117.00000,167.00000 L 111.00000,174.00000 L 106.00000,181.00000 L 101.00000,188.00000 L 96.000000,195.00000 L 92.000000,203.00000 L 87.000000,211.00000 L 81.000000,218.00000 L 78.000000,225.00000 L 74.000000,231.00000 L 70.000000,238.00000 L 69.000000,246.00000 L 74.000000,250.00000 L 79.000000,254.00000 L 83.000000,259.00000 L 88.000000,263.00000 L 93.000000,267.00000 L 97.000000,272.00000 L 102.00000,276.00000 L 107.00000,280.00000 L 111.00000,284.00000 L 116.00000,287.00000 L 121.00000,291.00000 L 126.00000,294.00000 L 132.00000,296.00000 L 138.00000,299.00000 L 144.00000,301.00000 L 150.00000,302.00000 L 155.00000,302.00000 L 159.00000,302.00000 L 164.00000,302.00000 L 168.00000,302.00000 L 172.00000,302.00000 L 176.00000,301.00000 L 180.00000,300.00000 L 184.00000,297.00000 L 188.00000,296.00000 L 191.00000,296.00000 L 193.00000,297.00000 L 196.00000,300.00000 L 198.00000,302.00000 L 201.00000,304.00000 L 204.00000,306.00000 L 207.00000,306.00000 L 211.00000,308.00000 L 214.00000,309.00000 L 218.00000,310.00000 L 222.00000,311.00000 L 226.00000,312.00000 L 230.00000,312.00000 L 233.00000,313.00000 L 237.00000,314.00000 L 240.00000,314.00000 L 244.00000,314.00000 L 246.00000,314.00000 L 249.00000,313.00000 L 252.00000,312.00000 L 255.00000,311.00000 L 258.00000,311.00000 L 261.00000,311.00000 L 267.00000,308.00000 L 273.00000,305.00000 L 279.00000,301.00000 L 285.00000,296.00000 L 290.00000,291.00000 L 296.00000,287.00000 L 302.00000,282.00000 L 308.00000,278.00000 L 312.00000,277.00000 L 316.00000,276.00000 L 321.00000,276.00000 L 325.00000,275.00000 L 329.00000,275.00000 L 334.00000,275.00000 L 338.00000,274.00000 L 343.00000,274.00000 L 344.00000,272.00000 L 346.00000,270.00000 L 349.00000,268.00000 L 351.00000,265.00000 L 354.00000,263.00000 L 356.00000,259.00000 L 357.00000,256.00000 L 359.00000,253.00000 L 357.00000,248.00000 L 355.00000,244.00000 L 353.00000,239.00000 L 352.00000,234.00000 L 355.00000,231.00000 L 359.00000,228.00000 L 363.00000,226.00000 L 366.00000,222.00000 L 363.00000,217.00000 L 359.00000,212.00000 L 355.00000,206.00000 L 354.00000,200.00000 L 356.00000,192.00000 L 358.00000,183.00000 L 358.00000,175.00000 L 354.00000,167.00000 L 352.00000,165.00000 L 349.00000,163.00000 L 347.00000,161.00000 L 344.00000,160.00000 L 341.00000,159.00000 L 338.00000,158.00000 L 335.00000,158.00000 L 332.00000,158.00000 L 330.00000,156.00000 L 328.00000,154.00000 L 327.00000,153.00000 L 327.00000,150.00000 L 329.00000,149.00000 L 335.00000,150.00000 L 342.00000,151.00000 L 349.00000,152.00000 L 355.00000,154.00000 L 361.00000,156.00000 L 367.00000,160.00000 L 371.00000,164.00000 L 374.00000,171.00000 L 374.00000,178.00000 L 373.00000,186.00000 L 372.00000,193.00000 L 375.00000,200.00000 L 379.00000,204.00000 L 382.00000,208.00000 L 386.00000,212.00000 L 388.00000,216.00000 L 389.00000,216.00000 L 389.00000,217.00000 L 389.00000,218.00000 L 389.00000,219.00000 L 389.00000,219.00000 L 391.00000,219.00000 L 391.00000,224.00000 L 390.00000,227.00000 L 388.00000,230.00000 L 385.00000,233.00000 L 382.00000,235.00000 L 378.00000,238.00000 L 375.00000,240.00000 L 373.00000,243.00000 L 372.00000,249.00000 L 372.00000,254.00000 L 370.00000,259.00000 L 367.00000,264.00000 L 365.00000,269.00000 L 362.00000,274.00000 L 358.00000,279.00000 L 353.00000,283.00000 L 348.00000,286.00000 L 343.00000,289.00000 L 338.00000,292.00000 L 332.00000,293.00000 L 328.00000,293.00000 L 325.00000,294.00000 L 321.00000,296.00000 L 319.00000,298.00000 L 317.00000,302.00000 L 315.00000,305.00000 L 313.00000,308.00000 L 311.00000,312.00000 L 308.00000,315.00000 L 306.00000,318.00000 L 302.00000,321.00000 L 299.00000,322.00000 L 295.00000,324.00000 L 291.00000,325.00000 L 288.00000,327.00000 L 284.00000,329.00000 L 276.00000,330.00000 L 267.00000,332.00000 L 259.00000,333.00000 L 250.00000,333.00000 L 242.00000,333.00000 L 233.00000,333.00000 L 225.00000,332.00000 L 217.00000,329.00000 L 212.00000,328.00000 L 207.00000,327.00000 L 202.00000,325.00000 L 197.00000,324.00000 L 192.00000,323.00000 L 187.00000,323.00000 L 182.00000,324.00000 L 178.00000,326.00000 L 168.00000,325.00000 L 158.00000,322.00000 L 149.00000,317.00000 L 140.00000,312.00000 L 131.00000,306.00000 L 123.00000,301.00000 L 115.00000,295.00000 L 108.00000,291.00000 L 105.00000,289.00000 L 102.00000,286.00000 L 98.000000,284.00000 L 94.000000,283.00000 L 90.000000,281.00000 L 86.000000,279.00000 L 83.000000,277.00000 L 79.000000,275.00000 L 75.000000,272.00000 L 71.000000,269.00000 L 66.000000,266.00000 L 62.000000,263.00000 L 58.000000,260.00000 L 54.000000,256.00000 L 51.000000,251.00000 L 49.000000,247.00000 L 51.000000,238.00000 L 54.000000,229.00000 L 58.000000,221.00000 L 63.000000,213.00000 L 85.000000,179.00000 L 89.000000,173.00000 L 94.000000,167.00000 L 99.000000,162.00000 L 104.00000,156.00000 L 108.00000,151.00000 L 113.00000,146.00000 L 117.00000,141.00000 L 121.00000,135.00000 L 125.00000,132.00000 L 128.00000,129.00000 L 132.00000,126.00000 L 135.00000,123.00000 L 139.00000,121.00000 L 143.00000,119.00000 L 148.00000,118.00000 L 152.00000,117.00000 L 157.00000,117.00000 L 162.00000,117.00000 L 167.00000,117.00000 L 172.00000,117.00000 L 176.00000,117.00000 L 181.00000,115.00000 L 185.00000,113.00000 L 189.00000,110.00000 L 192.00000,107.00000 L 196.00000,105.00000 L 200.00000,102.00000 L 203.00000,99.000000 L 207.00000,96.000000 L 210.00000,94.000000 L 214.00000,92.000000 L 219.00000,91.000000 L 221.00000,89.000000 L 223.00000,88.000000 L 227.00000,89.000000 L 230.00000,89.000000 L 234.00000,89.000000 L 237.00000,91.000000 L 241.00000,92.000000 L 244.00000,95.000000 L 247.00000,97.000000 L 250.00000,100.00000 L 253.00000,103.00000 L 257.03646,105.51823 L 262.08918,108.23892"
+ style="fill:#000000" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ style="fill:#645858;fill-opacity:1.0000000"
+ d="M 289.76968,176.61808 L 294.76968,177.61808 L 298.76968,178.61808 L 303.76968,179.61808 L 308.76968,180.61808 L 312.76968,182.61808 L 316.76968,184.61808 L 320.76968,186.61808 L 322.88387,187.07485 L 323.76968,189.55120 L 325.24603,192.02754 L 322.76968,193.61808 L 320.88387,193.01571 L 319.76968,193.61808 L 316.76968,193.61808 L 313.58860,194.38970 L 311.00000,195.69680 L 307.54519,197.77551 L 303.00583,200.85423 L 298.46647,201.08455 L 293.92711,197.23616 L 287.84840,196.69680 L 283.30904,197.46648 L 279.53936,196.46648 L 275.76968,193.69680 L 269.32070,193.78135 L 264.55102,194.01167 L 259.78134,194.70263 L 256.55102,193.85423 L 252.62974,193.46648 L 245.24198,195.69680 L 240.70262,196.38776 L 235.62391,196.84840 L 230.31487,199.61808 L 225.77551,203.69680 L 218.92711,207.23616 L 213.16327,211.85423 L 206.31487,213.16327 L 201.23615,211.93295 L 193.84840,210.70263 L 187.99806,205.86607 L 181.57290,203.02154 L 174.66149,202.84239 L 166.45481,204.08455 L 159.37609,206.62391 L 151.06495,208.38970 L 147.76968,206.79916 L 144.29333,204.91335 L 142.58860,202.02754 L 141.58860,199.14173 L 142.47441,196.07485 L 146.76968,196.61808 L 151.76968,194.61808 L 156.76968,191.61808 L 161.76968,189.61808 L 165.76968,187.61808 L 170.76968,185.61808 L 175.76968,182.61808 L 180.76968,180.61808 L 183.76968,180.61808 L 187.76968,179.61808 L 190.76968,180.61808 L 193.76968,181.61808 L 196.76968,182.61808 L 198.76968,183.61808 L 201.76968,185.61808 L 204.76968,188.61808 L 208.76968,187.61808 L 212.76968,184.61808 L 215.76968,180.61808 L 217.76968,176.61808 L 221.76968,174.61808 L 225.76968,172.61808 L 229.76968,169.61808 L 233.76968,167.61808 L 237.76968,165.61808 L 242.76968,163.61808 L 246.76968,161.61808 L 250.76968,159.61808 L 256.76968,160.61808 L 261.76968,162.61808 L 265.76968,165.61808 L 269.76968,169.61808 L 274.76968,173.61808 L 278.76968,175.61808 L 283.76968,177.61808 L 289.76968,176.61808 z "
+ id="path2065" />
+ <path
+ id="path16"
+ d="M 289.00000,172.00000 L 294.00000,173.00000 L 298.00000,174.00000 L 303.00000,175.00000 L 308.00000,176.00000 L 312.00000,178.00000 L 316.00000,180.00000 L 320.00000,182.00000 L 323.00000,186.00000 L 323.00000,187.00000 L 323.00000,188.00000 L 322.00000,189.00000 L 321.00000,190.00000 L 319.00000,189.00000 L 316.00000,189.00000 L 314.00000,188.00000 L 311.00000,188.00000 L 308.00000,188.00000 L 305.00000,188.00000 L 303.00000,188.00000 L 300.00000,188.00000 L 296.00000,187.00000 L 293.00000,187.00000 L 290.00000,188.00000 L 287.00000,188.00000 L 284.00000,189.00000 L 281.00000,189.00000 L 278.00000,188.00000 L 275.00000,186.00000 L 272.00000,184.00000 L 268.00000,181.00000 L 264.00000,178.00000 L 260.00000,176.00000 L 256.00000,174.00000 L 252.00000,173.00000 L 247.00000,173.00000 L 243.00000,174.00000 L 239.00000,177.00000 L 235.00000,180.00000 L 232.00000,183.00000 L 229.00000,186.00000 L 228.00000,185.00000 L 226.00000,188.00000 L 223.00000,191.00000 L 221.00000,193.00000 L 218.00000,195.00000 L 215.00000,196.00000 L 212.00000,198.00000 L 210.00000,200.00000 L 207.00000,202.00000 L 204.00000,201.00000 L 202.00000,200.00000 L 199.00000,200.00000 L 197.00000,198.00000 L 194.00000,197.00000 L 192.00000,195.00000 L 190.00000,193.00000 L 189.00000,191.00000 L 185.00000,190.00000 L 182.00000,190.00000 L 178.00000,191.00000 L 174.00000,192.00000 L 150.00000,202.00000 L 147.00000,201.00000 L 145.00000,200.00000 L 143.00000,198.00000 L 142.00000,196.00000 L 142.00000,195.00000 L 146.00000,192.00000 L 151.00000,190.00000 L 156.00000,187.00000 L 161.00000,185.00000 L 165.00000,183.00000 L 170.00000,181.00000 L 175.00000,178.00000 L 180.00000,176.00000 L 183.00000,176.00000 L 187.00000,175.00000 L 190.00000,176.00000 L 193.00000,177.00000 L 196.00000,178.00000 L 198.00000,179.00000 L 201.00000,181.00000 L 204.00000,184.00000 L 208.00000,183.00000 L 212.00000,180.00000 L 215.00000,176.00000 L 217.00000,172.00000 L 221.00000,170.00000 L 225.00000,168.00000 L 229.00000,165.00000 L 233.00000,163.00000 L 237.00000,161.00000 L 242.00000,159.00000 L 246.00000,157.00000 L 250.00000,155.00000 L 256.00000,156.00000 L 261.00000,158.00000 L 265.00000,161.00000 L 269.00000,165.00000 L 274.00000,169.00000 L 278.00000,171.00000 L 283.00000,173.00000 L 289.00000,172.00000 z "
+ style="fill:#000000" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer8"
+ inkscape:label="covers"
+ style="display:inline">
+ <g
+ id="g17273"
+ transform="matrix(3.955288,0.000000,0.000000,3.955288,155.1671,-915.1278)">
+ <g
+ id="g17118"
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ transform="matrix(1.274278e-2,7.087528e-3,-7.087528e-3,1.274278e-2,147.7444,148.5166)">
+ <path
+ d="M 7601.0000,11063.000 L 6350.0000,12312.000 L 7602.0000,10313.000 L 8850.0000,12314.000 L 7601.0000,11063.000 z "
+ id="path17120"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#00ff00;fill-opacity:1.0000000;stroke:#000000;stroke-width:47.034168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ id="text17122"
+ d="M 187.95573,356.23294 C 187.40374,356.47294 186.73173,356.61694 185.86773,356.61694 C 184.09174,356.61694 182.65173,355.46494 182.65173,353.30494 C 182.62773,351.38494 183.87574,350.01694 185.79573,350.01694 C 186.75573,350.01694 187.40374,350.18494 187.83573,350.37694 L 188.41173,347.66494 C 187.64374,347.37694 186.58773,347.20894 185.62773,347.20894 C 181.25974,347.20894 178.90773,350.01694 178.90773,353.44894 C 178.90773,357.14493 181.33174,359.47294 185.12373,359.47294 C 186.51573,359.47294 187.73974,359.23294 188.38773,358.92094 L 187.95573,356.23294 M 195.83186,359.47294 C 198.95186,359.47294 201.99986,357.50493 201.99986,353.23294 C 201.99986,349.68094 199.59986,347.20894 196.02386,347.20894 C 192.23186,347.20894 189.73586,349.63294 189.73586,353.42494 C 189.73586,357.21693 192.37586,359.47294 195.80786,359.47294 L 195.83186,359.47294 M 195.85586,356.85694 C 194.31986,356.85694 193.47986,355.34494 193.47986,353.35294 C 193.47986,351.60094 194.15186,349.82494 195.87986,349.82494 C 197.53586,349.82494 198.20786,351.60094 198.20786,353.32894 C 198.20786,355.44094 197.31986,356.85694 195.87986,356.85694 L 195.85586,356.85694 M 202.98798,347.47294 L 207.25998,359.20894 L 210.90798,359.20894 L 215.27598,347.47294 L 211.43598,347.47294 L 209.92398,352.92094 C 209.65999,353.92894 209.46798,354.81694 209.27598,355.77694 L 209.20398,355.77694 C 209.01199,354.84094 208.81998,353.90494 208.53198,352.92094 L 206.94798,347.47294 L 202.98798,347.47294 M 227.30711,354.50494 C 227.35511,354.21694 227.42711,353.66494 227.42711,353.04094 C 227.42711,350.13694 225.98711,347.18494 222.19511,347.18494 C 218.13911,347.18494 216.26711,350.47294 216.26711,353.44894 C 216.26711,357.14493 218.54711,359.44894 222.53111,359.44894 C 224.11511,359.44894 225.57911,359.20894 226.77911,358.70494 L 226.29911,356.23294 C 225.31511,356.56894 224.30711,356.73694 223.05911,356.73694 C 221.35511,356.73694 219.86711,356.01694 219.74711,354.48094 L 227.30711,354.50494 M 219.72311,351.98494 C 219.81911,351.02494 220.44311,349.60894 222.00311,349.60894 C 223.65911,349.60894 224.04311,351.12094 224.04311,351.98494 L 219.72311,351.98494 M 229.59536,359.20894 L 233.24336,359.20894 L 233.24336,353.28094 C 233.24336,352.96894 233.26736,352.70494 233.31536,352.46494 C 233.55536,351.31294 234.46736,350.61694 235.81136,350.61694 C 236.21936,350.61694 236.50736,350.66494 236.81936,350.71294 L 236.81936,347.28094 C 236.55536,347.23294 236.38736,347.20894 236.05136,347.20894 C 234.89936,347.20894 233.48336,347.92894 232.88336,349.65694 L 232.78736,349.65694 L 232.64336,347.47294 L 229.52336,347.47294 C 229.59536,348.48094 229.61936,349.60894 229.61936,351.33694 L 229.59536,359.20894 M 238.06398,358.63294 C 238.95198,359.11294 240.31999,359.47294 241.85598,359.47294 C 245.21598,359.47294 246.91998,357.86494 246.91998,355.65694 C 246.89598,353.95294 245.98398,352.80094 243.75198,352.05694 C 242.31199,351.55294 241.85598,351.26494 241.85598,350.68894 C 241.85598,350.11294 242.35999,349.75294 243.24798,349.75294 C 244.23198,349.75294 245.26399,350.13694 245.79198,350.40094 L 246.41598,347.90494 C 245.69599,347.54494 244.49598,347.20894 243.12798,347.20894 C 240.22399,347.20894 238.35198,348.86494 238.35198,351.07294 C 238.32798,352.44094 239.26399,353.78494 241.71198,354.57694 C 243.05598,355.03294 243.41598,355.32094 243.41598,355.94494 C 243.41598,356.54494 242.95998,356.90494 241.85598,356.90494 C 240.77599,356.90494 239.38398,356.44894 238.71198,356.04094 L 238.06398,358.63294"
+ style="font-size:24.000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#007f00;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Myriad" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer7"
+ inkscape:label="paper"
+ style="display:inline">
+ <g
+ style="display:inline"
+ id="g17136"
+ transform="matrix(3.955288,0.000000,0.000000,3.955288,-708.3488,-857.6103)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ d="M 390.34708,372.49332 L 332.34539,427.86139 L 272.20460,392.33038 L 341.37790,339.74173 L 378.06120,351.10999 C 379.20468,351.78631 380.06344,352.64698 380.62363,353.61296 L 390.84522,371.30530 C 391.02046,371.60027 390.83244,372.00903 390.34708,372.49332 z "
+ style="fill:#ffff19;fill-opacity:1.0000000;stroke:#000000;stroke-width:1.6000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12105" />
+ <path
+ id="path12107"
+ style="fill:#bebe12;fill-opacity:1.0000000;stroke:#000000;stroke-width:1.6000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 390.84798,371.31968 C 390.67230,371.01421 390.16897,370.87309 389.44281,370.86931 L 380.40026,370.92353 L 380.40026,370.92353 L 381.40039,356.76032 C 381.45531,355.66353 381.19370,354.58394 380.62363,353.61296 L 390.84798,371.31968 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/docs/user/images/s5-files.png b/docs/user/images/s5-files.png
new file mode 100644
index 000000000..53cbbf250
--- /dev/null
+++ b/docs/user/images/s5-files.png
Binary files differ
diff --git a/docs/user/images/s5-files.svg b/docs/user/images/s5-files.svg
new file mode 100644
index 000000000..a3e644a22
--- /dev/null
+++ b/docs/user/images/s5-files.svg
@@ -0,0 +1,639 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="595.27559pt"
+ height="841.88976pt"
+ id="svg5904"
+ sodipodi:version="0.32"
+ inkscape:version="0.42"
+ sodipodi:docbase="/Users/david/projects/docutils/s5-branch/docs/user/images"
+ sodipodi:docname="s5-files.svg"
+ inkscape:export-filename="/Users/david/projects/docutils/s5-branch/docs/user/images/s5-files.png"
+ inkscape:export-xdpi="100.00000"
+ inkscape:export-ydpi="100.00000">
+ <defs
+ id="defs5906">
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path10526"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path10529"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path10518"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(-5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mstart"
+ style="overflow:visible">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path10509"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) translate(-5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path10521"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(-5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path10512"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(-5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0050485"
+ inkscape:cx="359.99999"
+ inkscape:cy="345.00000"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1161"
+ inkscape:window-height="810"
+ inkscape:window-x="51"
+ inkscape:window-y="22"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:grid-points="true"
+ gridspacingx="5.0000000px"
+ gridspacingy="5.0000000px"
+ gridtolerance="2.0000000px" />
+ <metadata
+ id="metadata5909">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline">
+ <g
+ id="g15792">
+ <g
+ transform="translate(-5.000000,-55.00000)"
+ id="g13828"
+ style="stroke:#000000;stroke-opacity:1.0000000;stroke-linejoin:round;stroke-linecap:round">
+ <g
+ id="g13761"
+ style="stroke:#000000;stroke-opacity:1.0000000;stroke-linejoin:round;stroke-linecap:round">
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 451.84175,542.36220 L 490.47866,542.36220"
+ id="path13719" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 515.00000,597.36220 L 491.83836,597.36220"
+ id="path13721" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 515.00000,487.36218 L 491.83836,487.36218"
+ id="path13723" />
+ <path
+ id="path13725"
+ d="M 491.83836,487.36218 L 491.83836,597.36220 L 491.83836,707.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13757"
+ d="M 515.00000,707.36218 L 491.83836,707.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <g
+ id="g13695"
+ style="stroke:#000000;stroke-opacity:1.0000000;stroke-linejoin:round;stroke-linecap:round">
+ <path
+ id="path10755"
+ d="M 451.84175,982.36220 L 490.47866,982.36220"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13691"
+ d="M 515.00000,1037.3622 L 491.83836,1037.3622"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13689"
+ d="M 515.00000,927.36218 L 491.83836,927.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13687"
+ d="M 491.83836,1037.3622 L 491.83836,927.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <g
+ id="g13174"
+ style="stroke:#000000;stroke-opacity:1.0000000;stroke-linejoin:round;stroke-linecap:round">
+ <path
+ id="path9672"
+ d="M 205.00000,762.36217 L 275.47323,762.36217"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13150"
+ d="M 325.12023,762.36218 L 276.91055,762.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13148"
+ d="M 325.12023,872.36218 L 276.91055,872.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13146"
+ d="M 325.12023,982.36218 L 276.91055,982.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13156"
+ d="M 325.12023,542.36218 L 276.91055,542.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13154"
+ d="M 276.91055,982.36218 L 276.91055,542.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:none;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13144"
+ d="M 325.12023,652.36218 L 276.91055,652.36218"
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.1250000;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ </g>
+ </g>
+ <g
+ transform="translate(-5.000000,-55.00000)"
+ id="g13805"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13533"
+ transform="translate(-160.0000,215.0000)">
+ <g
+ id="g13262"
+ transform="translate(522.7639,-102.4046)"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13264" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ id="path13266" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9098"
+ y="266.27817"
+ x="748.73212"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="266.27817"
+ x="748.73212"
+ id="tspan9100"
+ sodipodi:role="line">s5-core</tspan><tspan
+ id="tspan9102"
+ y="290.27818"
+ x="748.73212"
+ sodipodi:role="line">.css</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13541"
+ transform="translate(-160.0000,215.0000)">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ transform="translate(522.7639,7.595400)"
+ id="g13276">
+ <path
+ id="path13278"
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ id="path13280"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9104"
+ y="377.05817"
+ x="749.49524"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="377.05817"
+ x="749.49524"
+ id="tspan9106"
+ sodipodi:role="line">framing</tspan><tspan
+ id="tspan9108"
+ y="401.05818"
+ x="749.49524"
+ sodipodi:role="line">.css</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13549"
+ transform="translate(-160.0000,215.0000)">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ transform="translate(522.7639,117.5954)"
+ id="g13290">
+ <path
+ id="path13292"
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ id="path13294"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ transform="scale(1.075185,0.930073)"
+ sodipodi:linespacing="100.00000%"
+ id="text9110"
+ y="522.89044"
+ x="696.86365"
+ style="font-size:25.804459px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="522.89044"
+ x="696.86365"
+ id="tspan9112"
+ sodipodi:role="line">pretty</tspan><tspan
+ id="tspan9114"
+ y="548.69490"
+ x="696.86365"
+ sodipodi:role="line">.css</tspan></text>
+ </g>
+ </g>
+ <g
+ transform="translate(-5.000000,-55.00000)"
+ id="g13701"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13617"
+ transform="translate(-150.0000,240.0000)">
+ <g
+ id="g13322"
+ transform="translate(512.7639,312.5954)"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13324" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ id="path13326" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9122"
+ y="682.05817"
+ x="740.27032"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="682.05817"
+ x="740.27033"
+ id="tspan9124"
+ sodipodi:role="line">iepngfix</tspan><tspan
+ id="tspan9126"
+ y="706.05818"
+ x="740.27032"
+ sodipodi:role="line">.htc</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13609"
+ transform="translate(-150.0000,240.0000)">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ transform="translate(512.7639,422.5954)"
+ id="g13336">
+ <path
+ id="path13338"
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ id="path13340"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9116"
+ y="790.57019"
+ x="739.14758"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="790.57019"
+ x="739.14758"
+ id="tspan9118"
+ sodipodi:role="line">blank</tspan><tspan
+ id="tspan9120"
+ y="814.57020"
+ x="739.14758"
+ sodipodi:role="line">.gif</tspan></text>
+ </g>
+ </g>
+ <g
+ transform="translate(-5.000000,-55.00000)"
+ id="g13768"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g12998"
+ transform="translate(140.0000,160.0000)">
+ <g
+ id="g12960"
+ transform="translate(32.76392,117.5954)"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12962" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ id="path12964" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9080"
+ y="486.96219"
+ x="259.42813"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="486.96219"
+ x="259.42813"
+ id="tspan9082"
+ sodipodi:role="line">outline</tspan><tspan
+ id="tspan9084"
+ y="510.96220"
+ x="259.42813"
+ sodipodi:role="line">.css</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13006"
+ transform="translate(140.0000,160.0000)">
+ <g
+ id="g12972"
+ transform="translate(32.76392,227.5954)"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12974" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ id="path12976" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ x="259.34225"
+ y="596.96216"
+ id="text9284"
+ sodipodi:linespacing="100.00000%"><tspan
+ sodipodi:role="line"
+ id="tspan9290"
+ x="259.34226"
+ y="596.96216">print</tspan><tspan
+ sodipodi:role="line"
+ id="tspan9292"
+ x="259.34225"
+ y="620.96217">.css</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13014"
+ transform="translate(140.0000,160.0000)">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ transform="translate(32.76392,337.5954)"
+ id="g12978">
+ <path
+ id="path12980"
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ id="path12982"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ x="259.56012"
+ y="706.32617"
+ id="text12043"
+ sodipodi:linespacing="100.00000%"><tspan
+ sodipodi:role="line"
+ id="tspan12045"
+ x="259.56012"
+ y="706.32617">opera</tspan><tspan
+ sodipodi:role="line"
+ x="259.56012"
+ y="730.32618"
+ id="tspan12047">.css</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13022"
+ transform="translate(140.0000,160.0000)">
+ <g
+ id="g12984"
+ transform="translate(32.76392,447.5954)"
+ style="stroke:#000000;stroke-opacity:1.0000000">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12986" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ id="path12988" />
+ </g>
+ <text
+ sodipodi:linespacing="100.00000%"
+ id="text9092"
+ y="816.30219"
+ x="259.32312"
+ style="font-size:24.000011px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="816.30219"
+ x="259.32312"
+ id="tspan9094"
+ sodipodi:role="line">slides</tspan><tspan
+ id="tspan9096"
+ y="840.30220"
+ x="259.32312"
+ sodipodi:role="line">.js</tspan></text>
+ </g>
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g12990"
+ transform="translate(140.0000,160.0000)">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ transform="translate(32.76392,7.595403)"
+ id="g12886">
+ <path
+ id="path2125"
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 286.53987,344.38881 L 259.95853,330.91154 C 258.50529,330.17714 256.87802,329.76853 255.16608,329.76765 L 167.23608,329.76678 L 167.23608,329.76678 L 167.23608,419.76678 L 287.23608,419.76678 L 287.22985,346.10313 C 287.20953,345.21142 286.98750,344.61022 286.53987,344.38881 z "
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ id="path2168"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 286.55635,344.40356 C 286.09815,344.17032 285.49622,344.35102 284.82132,344.84280 L 276.51509,351.08392 L 276.51509,351.08392 L 263.72436,334.02075 C 262.71303,332.71478 261.42576,331.64498 259.95853,330.91154 L 286.55635,344.40356 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ transform="scale(1.003177,0.996833)"
+ sodipodi:linespacing="100.00000%"
+ id="text9074"
+ y="378.15045"
+ x="258.4964"
+ style="font-size:24.117754px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ xml:space="preserve"><tspan
+ y="378.15045"
+ x="258.49640"
+ id="tspan9076"
+ sodipodi:role="line">slides</tspan><tspan
+ id="tspan9078"
+ y="402.26821"
+ x="258.49640"
+ sodipodi:role="line">.css</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g14176">
+ <g
+ style="stroke:#000000;stroke-opacity:1.0000000"
+ id="g13130"
+ transform="translate(0.000000,-54.99999)">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ d="M 209.99815,696.86669 L 210.00000,852.36217 L 75.000000,852.36217 L 75.000000,672.36217 L 75.000000,672.36217 L 161.90250,672.36347 C 164.47041,672.36479 166.91132,672.97771 169.09117,674.07931 L 208.96319,694.29521 C 209.63463,694.62733 209.96767,695.52913 209.99815,696.86669 z "
+ style="fill:#ffffff;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12105" />
+ <path
+ id="path12107"
+ style="fill:#a6a6a6;fill-opacity:1.0000000;stroke:#000000;stroke-width:3.7500000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;display:inline"
+ d="M 208.98791,694.31734 C 208.30060,693.96748 207.39771,694.23853 206.38536,694.97620 L 193.92602,704.33788 L 193.92602,704.33788 L 174.73992,678.74312 C 173.22293,676.78417 171.29202,675.17947 169.09117,674.07931 L 208.98791,694.31734 z "
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:36.814487px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100.00000%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1.0000000;stroke:#000000;stroke-width:0.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Myriad"
+ x="146.13911"
+ y="695.62231"
+ id="text9058"
+ sodipodi:linespacing="100.00000%"
+ transform="scale(0.997872,1.002133)"><tspan
+ sodipodi:role="line"
+ x="146.13911"
+ y="695.62231"
+ id="tspan9128"><tspan
+ id="tspan14172"
+ style="font-size:36.814487px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:99.999976%;writing-mode:lr-tb;text-anchor:middle;stroke:#000000;stroke-width:0.0000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;font-family:Myriad" />*.html</tspan><tspan
+ sodipodi:role="line"
+ x="146.13912"
+ y="732.43680"
+ id="tspan14174">output</tspan></text>
+ </g>
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="2"
+ style="display:inline" />
+</svg>
diff --git a/docs/user/images/small-black.png b/docs/user/images/small-black.png
new file mode 100644
index 000000000..f8d80d387
--- /dev/null
+++ b/docs/user/images/small-black.png
Binary files differ
diff --git a/docs/user/images/small-white.png b/docs/user/images/small-white.png
new file mode 100644
index 000000000..65f96895d
--- /dev/null
+++ b/docs/user/images/small-white.png
Binary files differ
diff --git a/docs/user/slide-shows.txt b/docs/user/slide-shows.txt
new file mode 100644
index 000000000..1fdd8398b
--- /dev/null
+++ b/docs/user/slide-shows.txt
@@ -0,0 +1,984 @@
+.. include:: <s5defs.txt>
+
+=============================================
+ Easy Slide Shows With reStructuredText & S5
+=============================================
+
+:Authors: David Goodger & Chris Liechti
+:Date: $Date$
+
+.. This document has been placed in the public domain.
+
+.. class:: handout
+
+ This document serves both as a user manual and as a usage example
+ of the s5_html.py writer and the rst2s5.py front end.
+
+.. contents::
+ :class: handout
+
+How to create quick, good-looking presentation slide shows with
+Docutils_/reStructuredText_ and S5_.
+
+.. class:: small
+
+* Use the arrow keys to navigate.
+
+* Click the "|mode|" button to switch between presentation &
+ handout/outline modes.
+
+.. container:: handout
+
+ In presentation mode, mouse over to the lower right-hand corner to
+ display the controls.
+
+ The first slide of a presentation consists of all visible text up
+ to the first section title. The document title is also added to
+ the footer of all slides.
+
+ The "footer" directive is used to specify part of the slide footer
+ text. It is currently limited to one short line (one paragraph).
+
+ There is no support for the "header" directive in the themes
+ included with Docutils.
+
+.. _Docutils: http://docutils.sourceforge.net/
+.. _reStructuredText: http://docutils.sourceforge.net/rst.html
+.. _S5: http://meyerweb.com/eric/tools/s5/
+.. |bullet| unicode:: U+02022
+.. |mode| unicode:: U+00D8 .. capital o with stroke
+.. footer:: Location |bullet| Date
+
+
+Introduction
+============
+
+.. class:: handout
+
+ ``rst2s5.py`` is a Docutils_ front end that outputs HTML for use
+ with S5_, a "Simple Standards-based Slide Show System" by Eric
+ Meyer.
+
+.. topic:: Installation
+ :class: handout
+
+ Prerequisites: Python and the Docutils_ package have to be
+ installed. See the `Docutils README`__ file for installation
+ instructions.
+
+ __ http://docutils.sourceforge.net/README.html
+
+* reStructuredText
+
+ .. class:: handout
+
+ Uses normal reStructuredText as input.
+
+* One section per slide
+
+ .. class:: handout
+
+ Each first-level section is converted into a single slide.
+
+* (X)HTML output
+
+ .. class:: handout
+
+ Presentations can be viewed using any modern graphical web browser.
+ The browser must support CSS, JavaScript, and XHTML. S5 even works
+ with IE!
+
+* Themes
+
+ .. class:: handout
+
+ A variety of themes are available. See `Example Themes`_, below.
+
+* ``rst2s5.py``
+
+ .. class:: handout
+
+ The front-end tool to generate S5 slide shows.
+
+.. topic:: Keyboard Controls
+ :class: handout
+
+ The following apply in any supporting browser besides Opera, which
+ uses the default Opera Show controls instead.
+
+ .. list-table::
+ :header-rows: 1
+
+ * - Action
+ - Key(s)
+ * - Go to the next slide
+ - * [Space bar]
+ * [Return]
+ * [Enter]
+ * [Right arrow]
+ * [Down arrow]
+ * [Page down]
+ * Click the left mouse button outside of the control area,
+ Flash object, or movie
+ * - Go to the previous slide
+ - * [Left arrow]
+ * [Up arrow]
+ * [Page up]
+ * - Go to the title (first) slide
+ - [Home]
+ * - Go to the last slide
+ - [End]
+ * - Jump directly to a slide
+ - Type the slide number, then hit [Return] or [Enter]
+ * - Skip forward *n* slides
+ - Type the number of slides to skip, then hit any "go to next"
+ key (except [Return] or [Enter])
+ * - Skip backward *n* slides
+ - Type the number of slides to skip, then hit any "go to
+ previous" key
+ * - Switch between slideshow and outline view
+ - * [T]
+ * Click the |mode| button
+ * - Show/hide slide controls
+ - * [C]
+ * Move the mouse pointer over the control area
+
+ Further details of the S5 user interface can be found at `Eric
+ Meyer's S5 page`__.
+
+ __ S5_
+
+
+Features (1)
+============
+
+.. container:: handout
+
+ The S5/HTML Writer supports all the standard Docutils HTML
+ features.
+
+S5-specific features:
+
+.. class:: incremental
+
+* The document title is duplicated on each slide in the S5 footer.
+
+* The ``footer`` directive may be used to define additional text in
+ the S5 footer.
+
+ .. container:: handout
+
+ But it is limited to one line of text.
+
+ This is useful for information such as the date of the
+ presentation and/or the location. The field in the footer is
+ left blank if no ``footer`` directive is used.
+
+ Example::
+
+ .. footer:: Location - Date
+
+* Incremental display.
+
+ .. class:: handout
+
+ An "incremental" class can be assigned to lists and other elements
+ to get one-item-at-a-time behavior (like this list).
+
+
+Features (2): Handouts
+======================
+
+``<element class="handout">``
+
+.. container:: handout
+
+ The contents of any element with a "class" attribute value of
+ "handout" are hidden in the slide presentation, and are only
+ visible when the presentation is printed, or viewed in outline
+ mode. "Handout"-class elements can appear anywhere in the text, as
+ often as needed.
+
+ This means that the slides and extra handout material can be
+ combined in one document. The handout can be printed directly from
+ the browser, and it will contain more than just silly framed
+ slides. This can be used to provide more detailed information, or
+ for speaker's notes.
+
+.. class:: incremental
+
+* Use the "class" directive::
+
+ .. class:: handout
+
+ .. container:: handout
+
+ The ``.. class:: handout`` directive can be used to tag
+ individual paragraphs and other elements. The "class" directive
+ applies to the first element immediately following::
+
+ .. class:: handout
+
+ This paragraph will get a ``class="handout"`` attribute.
+
+ This paragraph will not be affected.
+
+ It also applies to multiple elements in the directive content::
+
+ .. class:: handout
+
+ These paragraphs are the content of the "class" directive.
+ And as such...
+
+ Both paragraphs will *individually* receive
+ ``class="handout"`` attributes.
+
+* Use the "container" directive::
+
+ .. container:: handout
+
+ .. container:: handout
+
+ Arbitrary handout blocks can be created using the ``container``
+ directive. The content is treated as one.
+
+* Add a "class" option to certain directives::
+
+ .. topic:: Extra Material For Handouts
+ :class: handout
+
+.. container:: handout
+
+ The following directives support "class" options:
+
+ * all admonition directives ("admonition", "note", "hint", etc.)
+ * "image" & "figure"
+ * "topic"
+ * "sidebar"
+ * "line-block"
+ * "parsed-literal"
+ * "rubric"
+ * "compound"
+ * "table", "csv-table", & "list-table"
+ * "target-notes" (more about that below)
+ * "role" (pre-defined; more below)
+
+ Handout contents are also visible on the screen if the S5 view mode
+ is toggled from "slide show" to "outline" mode.
+
+
+Caveats
+=======
+
+.. class:: incremental
+
+1. Some Docutils features are not supported by some themes.
+
+ .. container:: handout
+
+ For example, header rendering is not supported by the themes
+ supplied with Docutils.
+
+ The "header" directive is used to set header text. S5
+ automatically inserts section/slide titles into the "header"
+ area of a slide. If both Docutils headers and S5 headers (slide
+ titles) exist simultaneously, they interfere with each other.
+
+2. Care must be taken with the "contents" directive.
+
+ .. container:: handout
+
+ The ``--no-toc-backlinks`` option is the default for the S5/HTML
+ writer (``toc_backlinks=0`` setting). Other values for this
+ setting will change the CSS class of headings such that they
+ won't show up correctly in the slide show.
+
+ Use the ``:class: handout`` option on the "contents" directive
+ to limit the table of contents to the handout/outline mode
+ only::
+
+ .. contents::
+ :class: handout
+
+
+.. class:: incremental
+
+3. Subsections ...
+------------------
+
+... may be used, sparingly.
+
+.. container:: handout
+
+ Only first-level sections become slides. Not many levels of
+ subsections can fit on a slide.
+
+ Subsections (of any level) work normally in handouts though. Add
+ "``.. class:: handout``" before a subsection (or sub-subsection, or
+ ...), and the entire subsection will only appear in the handout.
+
+
+Generating a Slide Show (1)
+===========================
+
+.. class:: incremental
+
+1. Open a console (terminal, command shell) and go to the folder
+ containing your file, ``presentation.txt``.
+
+2. Run the command::
+
+ rst2s5.py presentation.txt \
+ presentation.html
+
+3. Specify an S5 theme with the ``--theme`` option.
+
+ .. class:: handout
+
+ Docutils will copy the S5 theme files into a ``ui/<theme>`` folder
+ beside the output HTML file. A slide show can also link to an
+ existing theme using the ``--theme-url`` option.
+
+
+Generating a Slide Show (2)
+===========================
+
+.. class:: incremental
+
+4. Include a copy of any linked stylesheet.
+
+ .. class:: handout
+
+ The default Docutils stylesheet, ``html4css1.css``, will normally
+ be embedded in the output HTML. If you choose to link to a
+ stylesheet instead of embedding, you must include a copy (suggested
+ location: in the ``ui/`` directory).
+
+5. Open ``presentation.html`` in a web browser.
+
+6. Expand the browser window to full-screen mode, and speak.
+
+ .. class:: handout
+
+ The `Web Developer`__ extension for Firefox is very useful. With
+ it, you can resize your browser window to the exact dimensions of
+ the projector you'll be using, so you can test beforehand. There
+ are many other useful features as well.
+
+ __ http://chrispederick.com/work/webdeveloper/
+
+7. Profit!
+
+
+Examples (1)
+============
+
+.. sidebar:: Hint
+
+ Admonitions, tables, sidebars, and other elements can be used in
+ on-screen presentations in handouts. Images too!
+
+ .. image:: images/happy_monkey.png
+ :alt: sample image
+
+===== ===== ======
+ A B A or B
+===== ===== ======
+False False False
+True False True
+False True True
+True True True
+===== ===== ======
+
+
+Examples (2): Incremental Text
+==============================
+
+.. class:: incremental
+
+ Paragraphs can be displayed one at a time...
+
+ .. container::
+
+ ... or a bunch at a time.
+
+ This second paragraph is displayed together with the previous
+ one by grouping them with the "container" directive.
+
+| `We can also display` `one` `word` `at` `a` `time,`
+| `or a phrase` `at a time,`
+| `or even` `o`\ `n`\ `e` `l`\ `e`\ `t`\ `t`\ `e`\ `r` `at a time!`
+|
+| `(But the markup ain't pretty.)`
+
+
+Examples (3): Incr. Graphics
+============================
+
+Let's play... Rock, Scissors, Paper
+
+.. container:: animation
+
+ .. image:: images/rsp-empty.png
+
+ .. class:: incremental
+
+ .. image:: images/rsp-objects.png
+ .. image:: images/rsp-cuts.png
+ .. image:: images/rsp-covers.png
+ .. image:: images/rsp-breaks.png
+ .. image:: images/rsp-all.png
+
+
+Themes
+======
+
+.. class:: incremental
+
+* Several themes are available, and they're easy to adapt.
+
+ .. container:: handout
+
+ Themes from the `S5 tutorial`__ can be used. These themes are in
+ the public domain and may be redistributed freely.
+
+ __ http://meyerweb.com/eric/tools/s5/s5blank.zip
+
+ Sites with other S5 themes:
+
+ * http://meyerweb.com/eric/tools/s5/themes/
+ * http://mozilla.wikicities.com/wiki/Firefox_S5:Designs
+ * http://lachy.id.au/dev/mozilla/firefox/s5/
+
+ S5 is becoming more popular every day. Do a web search for "S5
+ theme" and you're bound to find plenty of choices.
+
+* "``--theme``" option.
+
+ .. container:: handout
+
+ The theme can be specified with the "``--theme``" command-line
+ option.
+
+ Example::
+
+ rst2s5 --theme big-black presentation.txt presentation.html
+
+ The default theme is "default".
+
+* "``theme``" setting.
+
+ .. class:: handout
+
+ You can set the theme with the "``theme``" configuration file
+ setting.
+
+* Copied to ``./ui/<theme>/``.
+
+ .. class:: handout
+
+ Themes are copied into a ``ui/<theme>`` folder inside the folder
+ containing the presentation.
+
+* Link with "``--theme-url``" option.
+
+ .. class:: handout
+
+ Link to a theme on the same or another web site, using the
+ "``--theme-url``" option or "``theme_url``" configuration file
+ setting.
+
+
+Example Themes
+==============
+
+.. class:: handout
+
+ The default theme, "default", is a simplified version of S5's
+ default theme. It accommodates up to 13 lines of text.
+
+.. class:: center
+
+ "default"
+
+ .. image:: images/default.png
+ :align: center
+
+
+Example Themes: Small Text
+==========================
+
+.. class:: handout
+
+ The "small-white" and "small-black" themes are simplifications of
+ the default theme (**small** black text on a **white** background,
+ and **small** black text on a **white** background, respectively).
+ They each accommodate up to 15 lines of text.
+
+.. list-table::
+ :class: borderless
+
+ * - "small-white"
+
+ .. image:: images/small-white.png
+
+ - "small-black"
+
+ .. image:: images/small-black.png
+
+
+Example Themes: Large Text
+==========================
+
+.. class:: handout
+
+ The "big-white" and "big-black" themes feature very large, bold
+ text, with no footers. Only five short lines of large text fits
+ per slide.
+
+.. list-table::
+ :class: borderless
+
+ * - "big-white"
+
+ .. image:: images/big-white.png
+
+ - "big-black"
+
+ .. image:: images/big-black.png
+
+
+Example Themes: Medium Text
+===========================
+
+.. class:: handout
+
+ The "medium-white" and "medium-black" themes feature medium-sized
+ text. Up to 8 lines of text are accommodated.
+
+.. list-table::
+ :class: borderless
+
+ * - "medium-white"
+
+ .. image:: images/medium-white.png
+
+ - "medium-black"
+
+ .. image:: images/medium-black.png
+
+
+S5 Theme Files
+==============
+
+An S5 theme consists of a directory containing several files --
+stylesheets, JavaScript, and graphics:
+
+.. image:: images/s5-files.png
+ :align: center
+
+.. container:: handout
+
+ The generated HTML contains the entire slide show text. It also
+ contains links to the following files:
+
+ * slides.css simply contains import links to:
+
+ - s5-core.css: Default styles critical to the proper functioning
+ of the slide show; don't touch this!
+
+ - framing.css: Sets the basic layout of slide components (header,
+ footer, controls, etc. This file is the often edited.
+
+ - pretty.css: Presentation styles that give the slide show a
+ unique look and feel. This is the file that you're most likely
+ to edit for a custom theme. You can make a whole new theme
+ just by editing this file, and not touching the others.
+
+ * outline.css: Styles for outline mode.
+
+ * print.css: Styles for printing; hides most layout elements, and
+ may display others.
+
+ * opera.css: Styles necessary for the proper functioning of S5 in
+ Opera Show.
+
+ * slides.js: the JavaScript that drives the dynamic side of the
+ slide show (actions and navigation controls). It automatically
+ IDs the slides when the document loads, builds the navigation
+ menu, handles the hiding and showing of slides, and so on. The
+ code also manages the fallback to Opera Show if you're using
+ the Opera web browser.
+
+ Two files are included to support PNG transparency (alpha
+ channels) in Internet Explorer:
+
+ - iepngfix.htc
+ - blank.gif
+
+
+Making a Custom Theme
+=====================
+
+.. class:: incremental
+
+1. Run "``rst2s5.py --theme <base-theme> <doc>.txt <doc>.html``".
+
+ .. class:: handout
+
+ This initializes the ``ui`` directory with the base theme files.
+
+2. Copy ``ui/<base-theme>`` to ``ui/<new-theme>``.
+
+3. Edit the styles.
+
+ .. class:: handout
+
+ Start with ``pretty.css``; edit ``framing.css`` if you need to make
+ layout changes.
+
+4. Run "``rst2s5.py --theme <new-theme> <doc>.txt <doc>.html``".
+
+ .. class:: handout
+
+ Open your ``<doc>.html`` in a browser to test the new theme.
+
+5. Rinse & repeat.
+
+ .. class:: handout
+
+ Repeat from step 3 until you're satisfied.
+
+.. TODO: What to do next:
+
+ * add a ``__base__`` file
+ * create a personal reusable theme (plugin)
+ * submit the new theme to Docutils
+
+ ``docutils/writers/support/s5_html/<theme>``
+
+.. container:: handout
+
+ Resources:
+
+ * W3C's `Learning CSS <http://www.w3.org/Style/CSS/learning>`__
+
+ * `Creating An S5 Theme <http://home.cogeco.ca/~ve3ll/s5themes.htm>`__
+
+ * A short tutorial on how to create themes (in German):
+ `Eigenes Theme erstellen <http://yatil.de/s5/dokumentation/9/>`__
+
+
+Classes: Incremental (1)
+========================
+
+.. class:: handout
+
+ Several "class" attribute values have built-in support in the
+ themes supplied with Docutils.
+
+.. class:: incremental
+
+ As described earlier,
+
+ * ``.. class:: incremental``
+
+ * ``.. container:: incremental``
+
+ * ::
+
+ .. sidebar:: title
+ :class: incremental
+
+
+Classes: Incremental (2)
+========================
+
+The "incremental" interpreted text role is also supported:
+
+.. class:: incremental
+
+ ::
+
+ :incremental:`This will appear first,` `and
+ this will appear second.`:incremental:
+
+ Requires "``.. include:: <s5defs.txt>``".
+
+.. container:: handout
+
+ As you can see, this markup is not very convenient.
+
+.. class:: incremental
+
+ | But ``s5defs.txt`` includes this useful definition:
+ | "``.. default-role:: incremental``". So:
+
+ ::
+
+ `This` `is` `all` `we` `need`
+
+`This` `is` `all` `we` `need` `to mark up incremental text.`
+
+
+Classes: Incremental (3)
+========================
+
+.. class:: handout
+
+ The "animation" class is provided to support incremental graphics.
+ This is how the example earlier was done:
+
+::
+
+ .. container:: animation
+
+ .. image:: images/rsp-empty.png
+
+ .. class:: incremental
+
+ .. image:: images/rsp-objects.png
+ .. image:: images/rsp-cuts.png
+ .. image:: images/rsp-covers.png
+ .. image:: images/rsp-breaks.png
+ .. image:: images/rsp-all.png
+
+.. admonition:: Caveat
+ :class: handout
+
+ The animation effects are caused by placing successive images at
+ the same location, laying each image over the last. For best
+ results, all images should be the same size, and the positions of
+ image elements should be consistent. Use image transparency (alpha
+ channels) to get overlay effects.
+
+ Absolute positioning is used, which means that the images take up
+ no space in the flow. If you want text to follow the images, you
+ have to specify the image sizes. Otherwise, the images and any
+ following text will overlap.
+
+
+Classes: Text Size
+==================
+
+.. class:: incremental
+
+ * :tiny:`tiny` (class & role name: "tiny", e.g. "``:tiny:`text```")
+ * :small:`small` ("small")
+ * normal (unstyled)
+ * :big:`big` ("big")
+ * :huge:`huge` ("huge")
+
+ Requires "``.. include:: <s5defs.txt>``".
+
+
+Classes: Alignment
+==================
+
+.. class:: incremental
+
+ .. class:: left
+
+ Left (class name: "left")
+
+ .. class:: center
+
+ Center ("center" & "centre")
+
+ .. class:: right
+
+ Right ("right")
+
+.. class:: handout
+
+ These classes apply to block-level elements only. They cannot be
+ used for inline text (i.e., they're not interpreted text roles).
+
+.. class:: incremental
+
+ Example::
+
+ .. class:: center
+
+ Text to be centered.
+
+
+Classes: Text Colours
+=====================
+
+:black:`black` [black], :gray:`gray`, :silver:`silver`, :white:`white`
+[white], :maroon:`maroon`, :red:`red`, :magenta:`magenta`,
+:fuchsia:`fuchsia`, :pink:`pink`, :orange:`orange`, :yellow:`yellow`,
+:lime:`lime`, :green:`green`, :olive:`olive`, :teal:`teal`,
+:cyan:`cyan`, :aqua:`aqua`, :blue:`blue`, :navy:`navy`,
+:purple:`purple`
+
+The class names and role names are the same as the colour names. For
+example, "``:orange:`text```" produces ":orange:`text`".
+
+.. class:: incremental
+
+Requires "``.. include:: <s5defs.txt>``".
+
+
+Classes: Borderless Tables
+==========================
+
+.. class:: handout
+
+ Here's an ordinary, unstyled table:
+
+.. class:: incremental
+
+ ========= =======
+ Sometimes borders
+ --------- -------
+ are useful.
+ ========= =======
+
+ And after applying "``.. class:: borderless``":
+
+ .. class:: borderless
+
+ ======= ========== =======
+ But sometimes, borders
+ ------- ---------- -------
+ are **not** wanted.
+ ======= ========== =======
+
+
+Classes: Print-Only
+===================
+
+.. class:: handout
+
+ Two classes are provided that only display their contents in
+ hardcopy. The "print-block" class applies to block-level elements
+ (like paragraphs, lists, and topics). The "print-inline" class
+ applies to text within paragraphs.
+
+.. class:: incremental
+
+ | "print-block" for block elements
+ | "print-inline" for inline text
+
+ Example: the "target-notes" directive::
+
+ .. topic:: Links
+ :class: print-block
+
+ .. target-notes::
+ :class: print-inline
+
+.. container:: handout
+
+ One good example, used in this document, is the "target-notes"
+ directive. For each external target (hyperlink) in the text, this
+ directive generates a footnote containing the visible URL as
+ content. Footnote references are placed after each hyperlink
+ reference.
+
+ The "topic" directive is given a "class" attribute with value
+ "print-block"; the entire topic will only be displayed when
+ printed. The "target-notes" assigns a "class" attribute with value
+ "print-inline" to each of the footnote references it inserts
+ throughout the text; they will only show up when printed.
+
+.. class:: incremental
+
+ Other uses may require "``.. include:: <s5defs.txt>``".
+
+
+Chained Presentations
+=====================
+
+.. class:: handout
+
+ Presentation slide shows can be chained together. This is useful
+ for including all or part of one presentation in another, and for
+ changing themes. Slide numbers are not carried over, unless you
+ fake a continuous multi-themed presentation:
+
+ 1. Generate slide show HTML files with two different names from
+ different themes but from the same source text.
+
+ 2. Include a link to the **next** slide, in the **second** theme's
+ file.
+
+ 3. To return to the first theme, include a link to the **next**
+ slide, in the **first** theme.
+
+From one theme, `to another...`__
+
+__ slide-shows-alt.html#chained-presentations-2
+
+
+Chained Presentations (2)
+=========================
+
+... and `back again...`__
+
+__ slide-shows.html#chained-presentations-3
+
+
+Chained Presentations (3)
+=========================
+
+... back to the first theme.
+
+.. container:: handout
+
+ Now we're back where we started from, back in the first theme, but
+ two slides further on.
+
+ In this way, any number of themes can be chained together.
+
+`Or you could cheat.`
+
+.. container:: handout
+
+ Just prepare the browser in advance, with all the slide show files
+ set up at the right slide in separate tabs in your browser, in the
+ right order. Closing one tab will reveal the next.
+
+
+To Do
+=====
+
+.. class:: incremental
+
+ * Multi-display support:
+
+ - speaker's notes on the laptop screen
+ - slides on the projector
+ - two views stay in sync
+ - presentation controlled from either display
+
+ * Add timeout to incremental style.
+
+ .. class:: handout
+
+ I.e., incremental-specific style should go away (revert to
+ normal) after a certain interval.
+
+ These will require some serious JavaScript-fu!
+
+
+That's All, Folks!
+==================
+
+.. class:: huge
+
+ Further information:
+ http://docutils.sf.net
+
+ Docutils users' mailing list:
+ docutils-users@lists.sf.net
+
+ `Any questions?`
+
+
+.. topic:: Links
+ :class: print-block
+
+ .. target-notes:: :class: print-inline
diff --git a/docs/user/tools.txt b/docs/user/tools.txt
index 48105e1ba..6f39b5021 100644
--- a/docs/user/tools.txt
+++ b/docs/user/tools.txt
@@ -3,7 +3,7 @@
==========================
:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
+:Contact: goodger@python.org
:Revision: $Revision$
:Date: $Date$
:Copyright: This document has been placed in the public domain.
@@ -11,8 +11,9 @@
.. contents::
-Introduction
-============
+--------------
+ Introduction
+--------------
Once the Docutils package is unpacked, you will discover a "``tools``"
directory containing several front ends for common Docutils
@@ -40,7 +41,7 @@ input (stdin) is used for the source as well.
Getting Help
-------------
+============
First, try the "``--help``" option each front-end tool has.
@@ -51,8 +52,12 @@ list.
.. _Docutils-users: mailing-lists.html#docutils-users
-The Tools
-=========
+-----------
+ The Tools
+-----------
+
+HTML-Generating Tools
+=====================
buildhtml.py
------------
@@ -154,6 +159,116 @@ For example, to process a PEP into HTML::
rstpep2html.py pep-0287.txt pep-0287.html
+rst2s5.py
+---------
+
+:Reader: Standalone
+:Parser: reStructuredText
+:Writer: S5/HTML
+
+The ``rst2s5.py`` front end reads standalone reStructuredText source
+files and produces (X)HTML output compatible with S5_, the "Simple
+Standards-based Slide Show System" by Eric Meyer. A theme is required
+for proper rendering; several are distributed with Docutils and others
+are available; see Themes_ below.
+
+For example, to process a reStructuredText file "``slides.txt``" into
+S5/HTML::
+
+ rst2s5.py slides.txt slides.html
+
+Now open the "``slides.html``" file in your favorite browser, switch
+to full-screen mode, and enjoy the results.
+
+.. _S5: http://meyerweb.com/eric/tools/s5/
+
+
+Themes
+``````
+
+Each S5 theme consists of a directory containing several files:
+stylesheets, JavaScript, and graphics. These are copied into a
+``ui/<theme>`` directory beside the generated HTML. A theme is chosen
+using the "``--theme``" option (for themes that come with Docutils) or
+the "``--theme-url``" option (for themes anywhere). For example, the
+"medium-black" theme can be specified as follows::
+
+ rst2s5.py --theme medium-black slides.txt slides.html
+
+The theme will be copied to the ``ui/medium-black`` directory.
+
+Several themes are included with Docutils:
+
+``default``
+ This is a simplified version of S5's default theme.
+
+ :Main content: black serif text on a white background
+ :Text capacity: about 13 lines
+ :Headers: light blue, bold sans-serif text on a dark blue
+ background; titles are limited to one line
+ :Footers: small, gray, bold sans-serif text on a dark blue
+ background
+
+``small-white``
+ (Small text on a white background.)
+
+ :Main content: black serif text on a white background
+ :Text capacity: about 15 lines
+ :Headers: black, bold sans-serif text on a white background;
+ titles wrap
+ :Footers: small, dark gray, bold sans-serif text on a white
+ background
+
+``small-black``
+ :Main content: white serif text on a black background
+ :Text capacity: about 15 lines
+ :Headers: white, bold sans-serif text on a black background;
+ titles wrap
+ :Footers: small, light gray, bold sans-serif text on a black
+ background
+
+``medium-white``
+ :Main content: black serif text on a white background
+ :Text capacity: about 9 lines
+ :Headers: black, bold sans-serif text on a white background;
+ titles wrap
+ :Footers: small, dark gray, bold sans-serif text on a white
+ background
+
+``medium-black``
+ :Main content: white serif text on a black background
+ :Text capacity: about 9 lines
+ :Headers: white, bold sans-serif text on a black background;
+ titles wrap
+ :Footers: small, light gray, bold sans-serif text on a black
+ background
+
+``big-white``
+ :Main content: black, bold sans-serif text on a white background
+ :Text capacity: about 5 lines
+ :Headers: black, bold sans-serif text on a white background;
+ titles wrap
+ :Footers: not displayed
+
+``big-black``
+ :Main content: white, bold sans-serif text on a black background
+ :Text capacity: about 5 lines
+ :Headers: white, bold sans-serif text on a black background;
+ titles wrap
+ :Footers: not displayed
+
+If a theme directory contains a file named ``__base__``, the name of
+the theme's base theme will be read from it. Files are accumulated
+from the named theme, any base themes, and the "default" theme (which
+is the implicit base of all themes).
+
+For details, please see `Easy Slide Shows With reStructuredText &
+S5 <slide-shows.html>`_.
+
+
+LaTeX-Generating Tools
+======================
+
rst2latex.py
------------
@@ -181,6 +296,9 @@ Some limitations and difference apply:
- Not all constructs are possible, see `Generating LaTeX with Docutils`_.
+XML-Generating Tools
+====================
+
rst2xml.py
----------
@@ -193,6 +311,9 @@ This can be transformed with standard XML tools such as XSLT
processors into arbitrary final forms.
+Testing/Debugging Tools
+=======================
+
rst2pseudoxml.py
----------------
@@ -228,11 +349,12 @@ document. Various forms output are possible:
-Customization
-=============
+---------------
+ Customization
+---------------
Command-Line Options
---------------------
+====================
Each front-end tool supports command-line options for one-off
customization. For persistent customization, use `configuration
@@ -248,7 +370,7 @@ corresponding configuration file entry names are listed in the
.. _configuration file:
Configuration Files
--------------------
+===================
Configuration files are used for persistent customization; they can be
set once and take effect every time you use a front-end tool.
diff --git a/docutils/frontend.py b/docutils/frontend.py
index 93506bce5..43750c30c 100644
--- a/docutils/frontend.py
+++ b/docutils/frontend.py
@@ -338,10 +338,14 @@ class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
('Disable backlinks from footnotes and citations.',
['--no-footnote-backlinks'],
{'dest': 'footnote_backlinks', 'action': 'store_false'}),
- ('Disable Docutils section numbering',
+ ('Enable Docutils section numbering (default: enabled).',
+ ['--section-numbering'],
+ {'action': 'store_true', 'dest': 'sectnum_xform',
+ 'default': 1, 'validator': validate_boolean}),
+ ('Disable Docutils section numbering (default: enabled).',
['--no-section-numbering'],
{'action': 'store_false', 'dest': 'sectnum_xform',
- 'default': 1, 'validator': validate_boolean}),
+ 'validator': validate_boolean}),
('Set verbosity threshold; report system messages at or higher than '
'<level> (by name or number: "info" or "1", warning/2, error/3, '
'severe/4; also, "none" or "5"). Default is 2 (warning).',
diff --git a/docutils/parsers/rst/directives/references.py b/docutils/parsers/rst/directives/references.py
index 92966140f..0406182b6 100644
--- a/docutils/parsers/rst/directives/references.py
+++ b/docutils/parsers/rst/directives/references.py
@@ -12,12 +12,16 @@ __docformat__ = 'reStructuredText'
from docutils import nodes
from docutils.transforms import references
+from docutils.parsers.rst import directives
def target_notes(name, arguments, options, content, lineno,
content_offset, block_text, state, state_machine):
"""Target footnote generation."""
pending = nodes.pending(references.TargetNotes)
+ pending.details.update(options)
state_machine.document.note_pending(pending)
nodelist = [pending]
return nodelist
+
+target_notes.options = {'class': directives.class_option}
diff --git a/docutils/parsers/rst/include/s5defs.txt b/docutils/parsers/rst/include/s5defs.txt
new file mode 100644
index 000000000..d5d3047ce
--- /dev/null
+++ b/docutils/parsers/rst/include/s5defs.txt
@@ -0,0 +1,49 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+ =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+ ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Print-Only
+ ==========
+
+.. role:: print-inline
+
+
+.. Incremental Display
+ ===================
+
+.. role:: incremental
+.. default-role:: incremental
diff --git a/docutils/transforms/references.py b/docutils/transforms/references.py
index bcf33dfe5..c3de8e3f1 100644
--- a/docutils/transforms/references.py
+++ b/docutils/transforms/references.py
@@ -713,6 +713,12 @@ class TargetNotes(Transform):
"""The TargetNotes transform has to be applied after `IndirectHyperlinks`
but before `Footnotes`."""
+
+ def __init__(self, document, startnode):
+ Transform.__init__(self, document, startnode=startnode)
+
+ self.classes = startnode.details.get('class', [])
+
def apply(self):
notes = {}
nodelist = []
@@ -736,7 +742,8 @@ class TargetNotes(Transform):
if not ref.get('anonymous'):
continue
if ref.hasattr('refuri'):
- footnote = self.make_target_footnote(ref['refuri'], [ref], notes)
+ footnote = self.make_target_footnote(ref['refuri'], [ref],
+ notes)
if not notes.has_key(ref['refuri']):
notes[ref['refuri']] = footnote
nodelist.append(footnote)
@@ -765,12 +772,16 @@ class TargetNotes(Transform):
continue
refnode = nodes.footnote_reference(
refname=footnote_name, auto=1)
+ refnode['classes'] += self.classes
self.document.note_autofootnote_ref(refnode)
self.document.note_footnote_ref(refnode)
index = ref.parent.index(ref) + 1
reflist = [refnode]
if not utils.get_trim_footnote_ref_space(self.document.settings):
- reflist.insert(0, nodes.Text(' '))
+ if self.classes:
+ reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+ else:
+ reflist.insert(0, nodes.Text(' '))
ref.parent.insert(index, reflist)
return footnote
diff --git a/docutils/writers/__init__.py b/docutils/writers/__init__.py
index c020fbf62..fb4cbee0b 100644
--- a/docutils/writers/__init__.py
+++ b/docutils/writers/__init__.py
@@ -125,7 +125,8 @@ _writer_aliases = {
'pprint': 'pseudoxml',
'pformat': 'pseudoxml',
'pdf': 'rlpdf',
- 'xml': 'docutils_xml',}
+ 'xml': 'docutils_xml',
+ 's5': 's5_html'}
def get_writer_class(writer_name):
"""Return the Writer class from the `writer_name` module."""
diff --git a/docutils/writers/html4css1.py b/docutils/writers/html4css1.py
index a53bda2ca..065d90584 100644
--- a/docutils/writers/html4css1.py
+++ b/docutils/writers/html4css1.py
@@ -99,19 +99,23 @@ class Writer(writers.Writer):
('Remove extra vertical whitespace between items of bullet lists '
'and enumerated lists, when list items are "simple" (i.e., all '
'items each contain one paragraph and/or one "simple" sublist '
- 'only). Default: enabled.',
+ 'only). Default: enabled. Can be specified directly via "class" '
+ 'attributes (values "compact" and "open") in the document.',
['--compact-lists'],
{'default': 1, 'action': 'store_true',
'validator': frontend.validate_boolean}),
- ('Disable compact simple bullet and enumerated lists.',
+ ('Disable compact simple bullet and enumerated lists (except where '
+ 'specified directly via "class" attributes; see --compact-lists).',
['--no-compact-lists'],
{'dest': 'compact_lists', 'action': 'store_false'}),
('Remove extra vertical whitespace between items of simple field '
- 'lists. Default: enabled.',
+ 'lists. Default: enabled. Can be specified directly via "class" '
+ 'attributes (values "compact" and "open") in the document.',
['--compact-field-lists'],
{'default': 1, 'action': 'store_true',
'validator': frontend.validate_boolean}),
- ('Disable compact simple field lists.',
+ ('Disable compact simple field lists (except where specified '
+ 'directly via "class" attributes; see --compact-field-lists).',
['--no-compact-field-lists'],
{'dest': 'compact_field_lists', 'action': 'store_false'}),
('Omit the XML declaration. Use with caution.',
@@ -508,10 +512,12 @@ class HTMLTranslator(nodes.NodeVisitor):
old_compact_simple = self.compact_simple
self.context.append((self.compact_simple, self.compact_p))
self.compact_p = None
- self.compact_simple = (self.settings.compact_lists and
- (self.compact_simple
- or self.topic_classes == ['contents']
- or self.check_simple_list(node)))
+ self.compact_simple = ('compact' in node['classes']
+ or (self.settings.compact_lists
+ and 'open' not in node['classes']
+ and (self.compact_simple
+ or self.topic_classes == ['contents']
+ or self.check_simple_list(node))))
if self.compact_simple and not old_compact_simple:
atts['class'] = 'simple'
self.body.append(self.starttag(node, 'ul', **atts))
@@ -763,10 +769,12 @@ class HTMLTranslator(nodes.NodeVisitor):
old_compact_simple = self.compact_simple
self.context.append((self.compact_simple, self.compact_p))
self.compact_p = None
- self.compact_simple = (self.settings.compact_lists and
- (self.compact_simple
- or self.topic_classes == ['contents']
- or self.check_simple_list(node)))
+ self.compact_simple = ('compact' in node['classes']
+ or (self.settings.compact_lists
+ and 'open' not in node['classes']
+ and (self.compact_simple
+ or self.topic_classes == ['contents']
+ or self.check_simple_list(node))))
if self.compact_simple and not old_compact_simple:
atts['class'] = (atts.get('class', '') + ' simple').strip()
self.body.append(self.starttag(node, 'ol', **atts))
@@ -805,7 +813,10 @@ class HTMLTranslator(nodes.NodeVisitor):
def visit_field_list(self, node):
self.context.append((self.compact_field_list, self.compact_p))
self.compact_p = None
- if self.settings.compact_field_lists:
+ if 'compact' in node['classes']:
+ self.compact_field_list = 1
+ elif (self.settings.compact_field_lists
+ and 'open' not in node['classes']):
self.compact_field_list = 1
for field in node:
field_body = field[-1]
@@ -1440,7 +1451,7 @@ class HTMLTranslator(nodes.NodeVisitor):
def depart_tip(self, node):
self.depart_admonition()
- def visit_title(self, node):
+ def visit_title(self, node, move_ids=1):
"""Only 6 section levels are supported by HTML."""
check_id = 0
close_tag = '</p>\n'
@@ -1475,14 +1486,18 @@ class HTMLTranslator(nodes.NodeVisitor):
self.body.append(
self.starttag(node, 'h%s' % h_level, '', **atts))
atts = {}
- # !!! next 2 lines to be removed in Docutils 0.5:
- if node.parent['ids']:
- atts['ids'] = node.parent['ids']
+ # !!! conditional to be removed in Docutils 0.5:
+ if move_ids:
+ if node.parent['ids']:
+ atts['ids'] = node.parent['ids']
if node.hasattr('refid'):
atts['class'] = 'toc-backref'
atts['href'] = '#' + node['refid']
- self.body.append(self.starttag({}, 'a', '', **atts))
- self.context.append('</a></h%s>\n' % (h_level))
+ if atts:
+ self.body.append(self.starttag({}, 'a', '', **atts))
+ self.context.append('</a></h%s>\n' % (h_level))
+ else:
+ self.context.append('</h%s>\n' % (h_level))
# !!! conditional to be removed in Docutils 0.5:
if check_id:
if node.parent['ids']:
diff --git a/docutils/writers/s5_html.py b/docutils/writers/s5_html.py
new file mode 100644
index 000000000..853787544
--- /dev/null
+++ b/docutils/writers/s5_html.py
@@ -0,0 +1,314 @@
+# Author: Chris Liechti
+# Contact: cliechti@gmx.net
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+
+support_path = utils.relative_path(
+ os.path.join(os.getcwd(), 'dummy'),
+ os.path.join(writers.support_path, 's5_html'))
+
+def find_theme(name):
+ # Where else to look for a theme?
+ # Check working dir? Destination dir? Config dir? Plugins dir?
+ path = os.path.join(support_path, name)
+ if not os.path.isdir(path):
+ raise docutils.ApplicationError('Theme directory not found: %r' % name)
+ return path
+
+
+class Writer(html4css1.Writer):
+
+ settings_spec = html4css1.Writer.settings_spec + (
+ 'S5 Slideshow Specific Options',
+ 'For the S5/HTML writer, the --no-toc-backlinks option '
+ '(defined in General Docutils Options above) is the default, '
+ 'and should not be changed.',
+ (('Specify an installed S5 theme by name. Overrides --theme-url. '
+ 'The default theme name is "default". The theme files will be '
+ 'copied into a "ui/<theme>" directory, in the same directory as the '
+ 'destination file (output HTML). Note that existing theme files '
+ 'will not be overwritten (unless --overwrite-theme-files is used).',
+ ['--theme'],
+ {'default': 'default', 'metavar': '<name>',
+ 'overrides': 'theme_url'}),
+ ('Specify an S5 theme URL. The destination file (output HTML) will '
+ 'link to this theme; nothing will be copied. Overrides --theme.',
+ ['--theme-url'],
+ {'metavar': '<URL>', 'overrides': 'theme'}),
+ ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+ 'overwritten. The default is not to overwrite theme files.',
+ ['--overwrite-theme-files'],
+ {'action': 'store_true'}),
+ ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+ 'overwrite any. This is the default.',
+ ['--keep-theme-files'],
+ {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+ ('Enable the current slide indicator ("1 / 15"). '
+ 'The default is to disable it.',
+ ['--current-slide'],
+ {'action': 'store_true'}),
+ ('Disable the current slide indicator. This is the default.',
+ ['--no-current-slide'],
+ {'dest': 'current_slide', 'action': 'store_false'}),))
+
+ settings_default_overrides = {'toc_backlinks': 0}
+
+ config_section = 's5_html writer'
+ config_section_dependencies = ('writers', 'html4css1 writer')
+
+ def __init__(self):
+ html4css1.Writer.__init__(self)
+ self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+ doctype = (
+ '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
+ ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n')
+
+ s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="%(path)s/slides.css"
+ type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+ type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+ type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+ type="text/css" media="projection" id="operaFix" />
+<script src="%(path)s/slides.js" type="text/javascript"></script>\n"""
+
+ disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+ layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+ default_theme = 'default'
+ """Name of the default theme."""
+
+ base_theme_file = '__base__'
+ """Name of the file containing the name of the base theme."""
+
+ direct_theme_files = (
+ 'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+ """Names of theme files directly linked to in the output HTML"""
+
+ indirect_theme_files = (
+ 's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+ """Names of files used indirectly; imported or used by files in
+ `direct_theme_files`."""
+
+ required_theme_files = indirect_theme_files + direct_theme_files
+ """Names of mandatory theme files."""
+
+ def __init__(self, *args):
+ html4css1.HTMLTranslator.__init__(self, *args)
+ #insert S5-specific stylesheet and script stuff:
+ self.theme_file_path = None
+ self.setup_theme()
+ self.stylesheet.append(self.s5_stylesheet_template
+ % {'path': self.theme_file_path})
+ if not self.document.settings.current_slide:
+ self.stylesheet.append(self.disable_current_slide)
+ self.add_meta('<meta name="version" content="S5 1.1" />\n')
+ self.s5_footer = []
+ self.s5_header = []
+ self.section_count = 0
+ self.theme_files_copied = None
+
+ def setup_theme(self):
+ if self.document.settings.theme:
+ self.copy_theme()
+ elif self.document.settings.theme_url:
+ self.theme_file_path = self.document.settings.theme_url
+ else:
+ raise docutils.ApplicationError(
+ 'No theme specified for S5/HTML writer.')
+
+ def copy_theme(self):
+ """
+ Locate & copy theme files.
+
+ A theme may be explicitly based on another theme via a '__base__'
+ file. The default base theme is 'default'. Files are accumulated
+ from the specified theme, any base themes, and 'default'.
+ """
+ settings = self.document.settings
+ path = find_theme(settings.theme)
+ theme_paths = [path]
+ self.theme_files_copied = {}
+ copied = {}
+ # This is a link (URL) in HTML, so we use "/", not os.sep:
+ self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+ if settings._destination:
+ dest = os.path.join(
+ os.path.dirname(settings._destination), 'ui', settings.theme)
+ if not os.path.isdir(dest):
+ os.makedirs(dest)
+ else:
+ # no destination, so we can't copy the theme
+ return
+ default = 0
+ while path:
+ for f in os.listdir(path): # copy all files from each theme
+ if f == self.base_theme_file:
+ continue # ... except the "__base__" file
+ if ( self.copy_file(f, path, dest)
+ and f in self.required_theme_files):
+ copied[f] = 1
+ if default:
+ break # "default" theme has no base theme
+ # Find the "__base__" file in theme directory:
+ base_theme_file = os.path.join(path, self.base_theme_file)
+ # If it exists, read it and record the theme path:
+ if os.path.isfile(base_theme_file):
+ lines = open(base_theme_file).readlines()
+ for line in lines:
+ line = line.strip()
+ if line and not line.startswith('#'):
+ path = find_theme(line)
+ if path in theme_paths: # check for duplicates (cycles)
+ path = None # if found, use default base
+ else:
+ theme_paths.append(path)
+ break
+ else: # no theme name found
+ path = None # use default base
+ else: # no base theme file found
+ path = None # use default base
+ if not path:
+ path = find_theme(self.default_theme)
+ theme_paths.append(path)
+ default = 1
+ if len(copied) != len(self.required_theme_files):
+ # Some all required files weren't found & couldn't be copied.
+ required = list(self.required_theme_files)
+ for f in copied.keys():
+ required.remove(f)
+ raise docutils.ApplicationError(
+ 'Theme files not found: %s'
+ % ', '.join(['%r' % f for f in required]))
+
+ def copy_file(self, name, source_dir, dest_dir):
+ """
+ Copy file `name` from `source_dir` to `dest_dir`.
+ Return 1 if the file exists in either `source_dir` or `dest_dir`.
+ """
+ source = os.path.join(source_dir, name)
+ dest = os.path.join(dest_dir, name)
+ if self.theme_files_copied.has_key(dest):
+ return 1
+ else:
+ self.theme_files_copied[dest] = 1
+ if os.path.isfile(source):
+ settings = self.document.settings
+ if os.path.exists(dest) and not settings.overwrite_theme_files:
+ settings.record_dependencies.add(dest)
+ else:
+ src_file = open(source, 'rb')
+ src_data = src_file.read()
+ src_file.close()
+ dest_file = open(dest, 'wb')
+ dest_file.write(src_data.replace(
+ 'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
+ dest_file.close()
+ settings.record_dependencies.add(source)
+ return 1
+ if os.path.isfile(dest):
+ return 1
+
+ def depart_document(self, node):
+ header = ''.join(self.s5_header)
+ footer = ''.join(self.s5_footer)
+ title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+ layout = self.layout_template % {'header': header,
+ 'title': title,
+ 'footer': footer}
+ self.fragment.extend(self.body)
+ self.body_prefix.extend(layout)
+ self.body_prefix.append('<div class="presentation">\n')
+ self.body_prefix.append(
+ self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+ self.body_suffix.insert(0, '</div>\n')
+ # skip content-type meta tag with interpolated charset value:
+ self.html_head.extend(self.head[1:])
+ self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+ + self.docinfo + self.body
+ + self.body_suffix[:-1])
+
+ def depart_footer(self, node):
+ start = self.context.pop()
+ self.s5_footer.append('<h2>')
+ self.s5_footer.extend(self.body[start:])
+ self.s5_footer.append('</h2>')
+ del self.body[start:]
+
+ def depart_header(self, node):
+ start = self.context.pop()
+ header = ['<div id="header">\n']
+ header.extend(self.body[start:])
+ header.append('\n</div>\n')
+ del self.body[start:]
+ self.s5_header.extend(header)
+
+ def visit_section(self, node):
+ if not self.section_count:
+ self.body.append('\n</div>\n')
+ self.section_count += 1
+ self.section_level += 1
+ if self.section_level > 1:
+ # dummy for matching div's
+ self.body.append(self.starttag(node, 'div', CLASS='section'))
+ else:
+ self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+ def visit_subtitle(self, node):
+ if isinstance(node.parent, nodes.section):
+ level = self.section_level + self.initial_header_level - 1
+ if level == 1:
+ level = 2
+ tag = 'h%s' % level
+ self.body.append(self.starttag(node, tag, ''))
+ self.context.append('</%s>\n' % tag)
+ else:
+ html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+ def visit_title(self, node, move_ids=0):
+ html4css1.HTMLTranslator.visit_title(self, node, move_ids=move_ids)
diff --git a/docutils/writers/support/s5_html/README.txt b/docutils/writers/support/s5_html/README.txt
new file mode 100644
index 000000000..2e01b51ee
--- /dev/null
+++ b/docutils/writers/support/s5_html/README.txt
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer. For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
diff --git a/docutils/writers/support/s5_html/big-black/__base__ b/docutils/writers/support/s5_html/big-black/__base__
new file mode 100644
index 000000000..f08be9ad5
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-black/__base__
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
diff --git a/docutils/writers/support/s5_html/big-black/big_inverse/framing.css b/docutils/writers/support/s5_html/big-black/big_inverse/framing.css
new file mode 100644
index 000000000..5a31113fb
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-black/big_inverse/framing.css
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/* list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/big-black/framing.css b/docutils/writers/support/s5_html/big-black/framing.css
new file mode 100644
index 000000000..5a31113fb
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-black/framing.css
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/* list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/big-black/pretty.css b/docutils/writers/support/s5_html/big-black/pretty.css
new file mode 100644
index 000000000..91a85dec2
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-black/pretty.css
@@ -0,0 +1,111 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+ font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/big-white/framing.css b/docutils/writers/support/s5_html/big-white/framing.css
new file mode 100644
index 000000000..cd343432b
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-white/framing.css
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/big-white/pretty.css b/docutils/writers/support/s5_html/big-white/pretty.css
new file mode 100644
index 000000000..8ecb1dd65
--- /dev/null
+++ b/docutils/writers/support/s5_html/big-white/pretty.css
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+ font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/default/blank.gif b/docutils/writers/support/s5_html/default/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/blank.gif
Binary files differ
diff --git a/docutils/writers/support/s5_html/default/framing.css b/docutils/writers/support/s5_html/default/framing.css
new file mode 100644
index 000000000..c4727f303
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/framing.css
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/default/iepngfix.htc b/docutils/writers/support/s5_html/default/iepngfix.htc
new file mode 100644
index 000000000..9f3d628b5
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/iepngfix.htc
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+ filters[f].enabled = s ? true : false;
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+ (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+ if ((/\.png$/i).test(src)) {
+ filt(src, 'image'); // was 'scale'
+ src = blankImg;
+ } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+ var s = RegExp.$1;
+ style.backgroundImage = '';
+ filt(s, 'crop');
+ } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component> \ No newline at end of file
diff --git a/docutils/writers/support/s5_html/default/opera.css b/docutils/writers/support/s5_html/default/opera.css
new file mode 100644
index 000000000..c9d1148be
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/opera.css
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+ visibility: visible !important;
+ position: static !important;
+ page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
diff --git a/docutils/writers/support/s5_html/default/outline.css b/docutils/writers/support/s5_html/default/outline.css
new file mode 100644
index 000000000..cb3588d5a
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/outline.css
@@ -0,0 +1,21 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+ outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+ display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0.75em; padding-top: 0.25em;
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block, .print-inline {display: none;}
diff --git a/docutils/writers/support/s5_html/default/pretty.css b/docutils/writers/support/s5_html/default/pretty.css
new file mode 100644
index 000000000..f83ca2bf5
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/pretty.css
@@ -0,0 +1,122 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+ div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+ margin: 0; padding-left: 0.7em; white-space: nowrap;
+ font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+ font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+ color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/default/print.css b/docutils/writers/support/s5_html/default/print.css
new file mode 100644
index 000000000..76e6352ee
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/print.css
@@ -0,0 +1,33 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+ DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;}
+.extra {background: transparent !important;}
+div.extra, pre.extra, .example {font-size: 10pt; color: #333;}
+ul.extra a {font-weight: bold;}
+p.example {display: none;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+ font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block {display: block !important;}
+.print-inline {display: inline !important;}
+
+/* The following rule keeps the layout stuff out of print.
+ Remove at your own risk! */
+.layout, .layout * {display: none !important;}
diff --git a/docutils/writers/support/s5_html/default/s5-core.css b/docutils/writers/support/s5_html/default/s5-core.css
new file mode 100644
index 000000000..6965f5e8f
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/s5-core.css
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+ The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer,
+ html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
diff --git a/docutils/writers/support/s5_html/default/slides.css b/docutils/writers/support/s5_html/default/slides.css
new file mode 100644
index 000000000..82bdc0ee0
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/slides.css
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
diff --git a/docutils/writers/support/s5_html/default/slides.js b/docutils/writers/support/s5_html/default/slides.js
new file mode 100644
index 000000000..f0f81bbf8
--- /dev/null
+++ b/docutils/writers/support/s5_html/default/slides.js
@@ -0,0 +1,559 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+// $Revision$
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+ if (!object.className) return false;
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+ if (!object) return false;
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+ if (!object) return;
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+ if (!object || hasClass(object, className)) return;
+ if (object.className) {
+ object.className += ' '+className;
+ } else {
+ object.className = className;
+ }
+}
+
+function GetElementsWithClassName(elementName,className) {
+ var allElements = document.getElementsByTagName(elementName);
+ var elemColl = new Array();
+ for (var i = 0; i< allElements.length; i++) {
+ if (hasClass(allElements[i], className)) {
+ elemColl[elemColl.length] = allElements[i];
+ }
+ }
+ return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+ if (element == null || element.nodeName=='BODY') return false;
+ else if (element.id == id) return true;
+ else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+ var result = "";
+ if (node.nodeType == 1) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; ++i) {
+ result += nodeValue(children[i]);
+ }
+ }
+ else if (node.nodeType == 3) {
+ result = node.nodeValue;
+ }
+ return(result);
+}
+
+function slideLabel() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var list = document.getElementById('jumplist');
+ smax = slideColl.length;
+ for (var n = 0; n < smax; n++) {
+ var obj = slideColl[n];
+
+ var did = 'slide' + n.toString();
+ if (obj.getAttribute('id')) {
+ slideIDs[n] = obj.getAttribute('id');
+ }
+ else {
+ obj.setAttribute('id',did);
+ slideIDs[n] = did;
+ }
+ if (isOp) continue;
+
+ var otext = '';
+ var menu = obj.firstChild;
+ if (!menu) continue; // to cope with empty slides
+ while (menu && menu.nodeType == 3) {
+ menu = menu.nextSibling;
+ }
+ if (!menu) continue; // to cope with slides with only text nodes
+
+ var menunodes = menu.childNodes;
+ for (var o = 0; o < menunodes.length; o++) {
+ otext += nodeValue(menunodes[o]);
+ }
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
+ }
+}
+
+function currentSlide() {
+ var cs;
+ var footer_nodes;
+ var vis = 'visible';
+ if (document.getElementById) {
+ cs = document.getElementById('currentSlide');
+ footer_nodes = document.getElementById('footer').childNodes;
+ } else {
+ cs = document.currentSlide;
+ footer = document.footer.childNodes;
+ }
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
+ '<span id="csSep">\/<\/span> ' +
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
+ if (snum == 0) {
+ vis = 'hidden';
+ }
+ cs.style.visibility = vis;
+ for (var i = 0; i < footer_nodes.length; i++) {
+ if (footer_nodes[i].nodeType == 1) {
+ footer_nodes[i].style.visibility = vis;
+ }
+ }
+}
+
+function go(step) {
+ if (document.getElementById('slideProj').disabled || step == 0) return;
+ var jl = document.getElementById('jumplist');
+ var cid = slideIDs[snum];
+ var ce = document.getElementById(cid);
+ if (incrementals[snum].length > 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ removeClass(incrementals[snum][i], 'current');
+ removeClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (step != 'j') {
+ snum += step;
+ lmax = smax - 1;
+ if (snum > lmax) snum = lmax;
+ if (snum < 0) snum = 0;
+ } else
+ snum = parseInt(jl.value);
+ var nid = slideIDs[snum];
+ var ne = document.getElementById(nid);
+ if (!ne) {
+ ne = document.getElementById(slideIDs[0]);
+ snum = 0;
+ }
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+ if (incrementals[snum].length > 0 && incpos == 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ if (hasClass(incrementals[snum][i], 'current'))
+ incpos = i + 1;
+ else
+ addClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (incrementals[snum].length > 0 && incpos > 0)
+ addClass(incrementals[snum][incpos - 1], 'current');
+ ce.style.visibility = 'hidden';
+ ne.style.visibility = 'visible';
+ jl.selectedIndex = snum;
+ currentSlide();
+ number = 0;
+}
+
+function goTo(target) {
+ if (target >= smax || target == snum) return;
+ go(target - snum);
+}
+
+function subgo(step) {
+ if (step > 0) {
+ removeClass(incrementals[snum][incpos - 1],'current');
+ removeClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos],'current');
+ incpos++;
+ } else {
+ incpos--;
+ removeClass(incrementals[snum][incpos],'current');
+ addClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos - 1],'current');
+ }
+}
+
+function toggle() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ if (!slides.disabled) {
+ slides.disabled = true;
+ outline.disabled = false;
+ s5mode = false;
+ fontSize('1em');
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'visible';
+ }
+ } else {
+ slides.disabled = false;
+ outline.disabled = true;
+ s5mode = true;
+ fontScale();
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'hidden';
+ }
+ slideColl[snum].style.visibility = 'visible';
+ }
+}
+
+function showHide(action) {
+ var obj = GetElementsWithClassName('*','hideme')[0];
+ switch (action) {
+ case 's': obj.style.visibility = 'visible'; break;
+ case 'h': obj.style.visibility = 'hidden'; break;
+ case 'k':
+ if (obj.style.visibility != 'visible') {
+ obj.style.visibility = 'visible';
+ } else {
+ obj.style.visibility = 'hidden';
+ }
+ break;
+ }
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+ if (!key) {
+ key = event;
+ key.which = key.keyCode;
+ }
+ if (key.which == 84) {
+ toggle();
+ return;
+ }
+ if (s5mode) {
+ switch (key.which) {
+ case 10: // return
+ case 13: // enter
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ if(number != undef) {
+ goTo(number);
+ break;
+ }
+ case 32: // spacebar
+ case 34: // page down
+ case 39: // rightkey
+ case 40: // downkey
+ if(number != undef) {
+ go(number);
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ break;
+ case 33: // page up
+ case 37: // leftkey
+ case 38: // upkey
+ if(number != undef) {
+ go(-1 * number);
+ } else if (!incrementals[snum] || incpos <= 0) {
+ go(-1);
+ } else {
+ subgo(-1);
+ }
+ break;
+ case 36: // home
+ goTo(0);
+ break;
+ case 35: // end
+ goTo(smax-1);
+ break;
+ case 67: // c
+ showHide('k');
+ break;
+ }
+ if (key.which < 48 || key.which > 57) {
+ number = undef;
+ } else {
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+ }
+ }
+ return false;
+}
+
+function clicker(e) {
+ number = undef;
+ var target;
+ if (window.event) {
+ target = window.event.srcElement;
+ e = window.event;
+ } else target = e.target;
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+ if (!e.which || e.which == 1) {
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ }
+}
+
+function findSlide(hash) {
+ var target = document.getElementById(hash);
+ if (target) {
+ for (var i = 0; i < slideIDs.length; i++) {
+ if (target.id == slideIDs[i]) return i;
+ }
+ }
+ return null;
+}
+
+function slideJump() {
+ if (window.location.hash == null || window.location.hash == '') {
+ currentSlide();
+ return;
+ }
+ if (window.location.hash == null) return;
+ var dest = null;
+ dest = findSlide(window.location.hash.slice(1));
+ if (dest == null) {
+ dest = 0;
+ }
+ go(dest - snum);
+}
+
+function fixLinks() {
+ var thisUri = window.location.href;
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+ var aelements = document.getElementsByTagName('A');
+ for (var i = 0; i < aelements.length; i++) {
+ var a = aelements[i].href;
+ var slideID = a.match('\#.+');
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+ var dest = findSlide(slideID[0].slice(1));
+ if (dest != null) {
+ if (aelements[i].addEventListener) {
+ aelements[i].addEventListener("click", new Function("e",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "if (e.preventDefault) e.preventDefault();"), true);
+ } else if (aelements[i].attachEvent) {
+ aelements[i].attachEvent("onclick", new Function("",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "event.returnValue = false;"));
+ }
+ }
+ }
+ }
+}
+
+function externalLinks() {
+ if (!document.getElementsByTagName) return;
+ var anchors = document.getElementsByTagName('a');
+ for (var i=0; i<anchors.length; i++) {
+ var anchor = anchors[i];
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+ anchor.target = '_blank';
+ addClass(anchor,'external');
+ }
+ }
+}
+
+function createControls() {
+ var controlsDiv = document.getElementById("controls");
+ if (!controlsDiv) return;
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+ var hideDiv, hideList = '';
+ if (controlVis == 'hidden') {
+ hideDiv = hider;
+ } else {
+ hideList = hider;
+ }
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+ '<div id="navLinks">' +
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+ '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+ '<\/div><\/form>';
+ if (controlVis == 'hidden') {
+ var hidden = document.getElementById('navLinks');
+ } else {
+ var hidden = document.getElementById('jumplist');
+ }
+ addClass(hidden,'hideme');
+}
+
+function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+ if (!s5mode) return false;
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
+ if (window.innerHeight) {
+ var vSize = window.innerHeight;
+ var hSize = window.innerWidth;
+ } else if (document.documentElement.clientHeight) {
+ var vSize = document.documentElement.clientHeight;
+ var hSize = document.documentElement.clientWidth;
+ } else if (document.body.clientHeight) {
+ var vSize = document.body.clientHeight;
+ var hSize = document.body.clientWidth;
+ } else {
+ var vSize = 700; // assuming 1024x768, minus chrome and such
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
+ }
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+ fontSize(newSize + 'px');
+ if (isGe) { // hack to counter incremental reflow bugs
+ var obj = document.getElementsByTagName('body')[0];
+ obj.style.display = 'none';
+ obj.style.display = 'block';
+ }
+}
+
+function fontSize(value) {
+ if (!(s5ss = document.getElementById('s5ss'))) {
+ if (!isIE) {
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+ s5ss.setAttribute('media','screen, projection');
+ s5ss.setAttribute('id','s5ss');
+ } else {
+ document.createStyleSheet();
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+ }
+ }
+ if (!isIE) {
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+ } else {
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+ }
+}
+
+function notOperaFix() {
+ slideCSS = document.getElementById('slideProj').href;
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ slides.setAttribute('media','screen');
+ outline.disabled = true;
+ if (isGe) {
+ slides.setAttribute('href','null'); // Gecko fix
+ slides.setAttribute('href',slideCSS); // Gecko fix
+ }
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+ }
+}
+
+function getIncrementals(obj) {
+ var incrementals = new Array();
+ if (!obj)
+ return incrementals;
+ var children = obj.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (hasClass(child, 'incremental')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'incremental');
+ for (var j = 0; j < child.childNodes.length; j++) {
+ if (child.childNodes[j].nodeType == 1) {
+ addClass(child.childNodes[j], 'incremental');
+ }
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ removeClass(child,'incremental');
+ }
+ }
+ if (hasClass(child, 'show-first')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'show-first');
+ if (child.childNodes[isGe].nodeType == 1) {
+ removeClass(child.childNodes[isGe], 'incremental');
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ }
+ }
+ incrementals = incrementals.concat(getIncrementals(child));
+ }
+ return incrementals;
+}
+
+function createIncrementals() {
+ var incrementals = new Array();
+ for (var i = 0; i < smax; i++) {
+ incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+ }
+ return incrementals;
+}
+
+function defaultCheck() {
+ var allMetas = document.getElementsByTagName('meta');
+ for (var i = 0; i< allMetas.length; i++) {
+ if (allMetas[i].name == 'defaultView') {
+ defaultView = allMetas[i].content;
+ }
+ if (allMetas[i].name == 'controlVis') {
+ controlVis = allMetas[i].content;
+ }
+ }
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+ if (!e) {
+ e = event;
+ e.which = e.keyCode;
+ }
+ try {
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+ }
+ catch(e) {
+ modifierKey = false;
+ }
+ return modifierKey || e.which == 0;
+}
+
+function startup() {
+ defaultCheck();
+ if (!isOp) createControls();
+ slideLabel();
+ fixLinks();
+ externalLinks();
+ fontScale();
+ if (!isOp) {
+ notOperaFix();
+ incrementals = createIncrementals();
+ slideJump();
+ if (defaultView == 'outline') {
+ toggle();
+ }
+ document.onkeyup = keys;
+ document.onkeypress = trap;
+ document.onclick = clicker;
+ }
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
diff --git a/docutils/writers/support/s5_html/medium-black/__base__ b/docutils/writers/support/s5_html/medium-black/__base__
new file mode 100644
index 000000000..401b621bd
--- /dev/null
+++ b/docutils/writers/support/s5_html/medium-black/__base__
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
diff --git a/docutils/writers/support/s5_html/medium-black/pretty.css b/docutils/writers/support/s5_html/medium-black/pretty.css
new file mode 100644
index 000000000..6bc13353a
--- /dev/null
+++ b/docutils/writers/support/s5_html/medium-black/pretty.css
@@ -0,0 +1,117 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA;
+ font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+ font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/medium-white/framing.css b/docutils/writers/support/s5_html/medium-white/framing.css
new file mode 100644
index 000000000..6c4e3abf2
--- /dev/null
+++ b/docutils/writers/support/s5_html/medium-white/framing.css
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/medium-white/pretty.css b/docutils/writers/support/s5_html/medium-white/pretty.css
new file mode 100644
index 000000000..fe70a39f7
--- /dev/null
+++ b/docutils/writers/support/s5_html/medium-white/pretty.css
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444;
+ font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+ font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/small-black/__base__ b/docutils/writers/support/s5_html/small-black/__base__
new file mode 100644
index 000000000..67f4db2bf
--- /dev/null
+++ b/docutils/writers/support/s5_html/small-black/__base__
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
diff --git a/docutils/writers/support/s5_html/small-black/pretty.css b/docutils/writers/support/s5_html/small-black/pretty.css
new file mode 100644
index 000000000..991bb9fdb
--- /dev/null
+++ b/docutils/writers/support/s5_html/small-black/pretty.css
@@ -0,0 +1,118 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA;
+ font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+ font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/docutils/writers/support/s5_html/small-white/framing.css b/docutils/writers/support/s5_html/small-white/framing.css
new file mode 100644
index 000000000..70287dd06
--- /dev/null
+++ b/docutils/writers/support/s5_html/small-white/framing.css
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/docutils/writers/support/s5_html/small-white/pretty.css b/docutils/writers/support/s5_html/small-white/pretty.css
new file mode 100644
index 000000000..243763ffc
--- /dev/null
+++ b/docutils/writers/support/s5_html/small-white/pretty.css
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444;
+ font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+ font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/setup.py b/setup.py
index 24caa593c..157158c4f 100755
--- a/setup.py
+++ b/setup.py
@@ -71,8 +71,12 @@ what-you-see-is-what-you-get plaintext markup syntax.""", # wrap at col 60
['docutils/writers/support/newlatex2e/base.tex']),
('docutils/writers/support/pep_html',
['docutils/writers/support/pep_html/pep.css',
- 'docutils/writers/support/pep_html/template.txt']),],
+ 'docutils/writers/support/pep_html/template.txt']),
+ ('docutils/writers/support/s5_html',
+ (['docutils/writers/support/s5_html/README.txt']
+ + glob.glob('docutils/writers/support/s5_html/*/*')))],
'scripts' : ['tools/rst2html.py',
+ 'tools/rst2s5.py',
'tools/rst2latex.py',
'tools/rst2newlatex.py',
'tools/rst2xml.py',
diff --git a/test/functional/expected/standalone_rst_html4css1.html b/test/functional/expected/standalone_rst_html4css1.html
index dd19f2710..6f2fbb49c 100644
--- a/test/functional/expected/standalone_rst_html4css1.html
+++ b/test/functional/expected/standalone_rst_html4css1.html
@@ -970,7 +970,7 @@ section, &quot;Docutils System Messages&quot;:</p>
<!-- section should be added by Docutils automatically -->
</div>
<div class="system-messages section">
-<h1><a>Docutils System Messages</a></h1>
+<h1>Docutils System Messages</h1>
<div class="system-message" id="id23">
<p class="system-message-title">System Message: <a name="id23">ERROR/3</a> (<tt class="docutils">functional/input/data/standard.txt</tt>, line 100); <em><a href="#id24">backlink</a></em></p>
Undefined substitution referenced: &quot;problematic&quot;.</div>
diff --git a/test/functional/expected/standalone_rst_s5_html_1.html b/test/functional/expected/standalone_rst_s5_html_1.html
new file mode 100644
index 000000000..bbface42e
--- /dev/null
+++ b/test/functional/expected/standalone_rst_s5_html_1.html
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.3.10: http://docutils.sourceforge.net/" />
+<meta name="version" content="S5 1.1" />
+<title>Slide Shows</title>
+<meta name="author" content="David Goodger" />
+<meta name="date" content="2005-11-28" />
+<link rel="stylesheet" href="../../../docutils/writers/support/html4css1.css" type="text/css" />
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="ui/small-black/slides.css"
+ type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/small-black/outline.css"
+ type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/small-black/print.css"
+ type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/small-black/opera.css"
+ type="text/css" media="projection" id="operaFix" />
+<script src="ui/small-black/slides.js" type="text/javascript"></script>
+
+<style type="text/css">
+#currentSlide {display: none;}
+</style>
+</head>
+<body>
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+
+</div>
+<div id="footer">
+<h1>Slide Shows</h1>
+<h2>Location • Date</h2>
+</div>
+</div>
+<div class="presentation">
+<div class="slide" id="slide0">
+<h1 class="title">Slide Shows</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>David Goodger</td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>2005-11-28</td></tr>
+</tbody>
+</table>
+<!-- Definitions of interpreted text roles (classes) for S5/HTML data. -->
+<!-- This data file has been placed in the public domain. -->
+<!-- Colours
+======= -->
+<!-- Text Sizes
+========== -->
+<!-- Print-Only
+========== -->
+<!-- Incremental Display
+=================== -->
+<div class="contents handout topic">
+<p class="topic-title first"><a id="contents" name="contents">Contents</a></p>
+<ul class="simple">
+<li><a class="reference" href="#introduction" id="id1" name="id1">Introduction</a></li>
+<li><a class="reference" href="#features-1" id="id2" name="id2">Features (1)</a></li>
+<li><a class="reference" href="#features-2" id="id3" name="id3">Features (2)</a></li>
+<li><a class="reference" href="#checklist" id="id4" name="id4">Checklist</a></li>
+</ul>
+</div>
+<p class="handout">This is a test. This is only a test. If this were a real slide
+show, there would be a projector handy.</p>
+<p>Let's test the S5/HTML writer!</p>
+<ul class="small simple">
+<li>Use the arrow keys to navigate.</li>
+<li>Click the &quot;Ø&quot; button to switch between presentation &amp;
+handout/outline modes.</li>
+</ul>
+<div class="handout container">
+In presentation mode, mouse over to the lower right-hand corner to
+display the controls.</div>
+
+</div>
+<div class="slide" id="introduction">
+<h1>Introduction</h1>
+<ul class="compact simple">
+<li>reStructuredText<p class="handout">Uses normal reStructuredText as input.</p>
+</li>
+<li>One section per slide<p class="handout">Each first-level section is converted into a single slide.</p>
+</li>
+<li>(X)HTML output<p class="handout">Presentations can be viewed using any modern graphical web browser.
+The browser must support CSS, JavaScript, and XHTML. S5 even works
+with IE!</p>
+</li>
+<li>Themes<p class="handout">A variety of themes are available.</p>
+</li>
+<li><tt class="docutils literal"><span class="pre">rst2s5.py</span></tt><p class="handout">The front-end tool to generate S5 slide shows.</p>
+</li>
+</ul>
+</div>
+<div class="slide" id="features-1">
+<h1>Features (1)</h1>
+<p class="left">A flush-left paragraph</p>
+<p class="center">A centered paragraph</p>
+<p class="right">A flush-right paragraph</p>
+<p>Some colours: <span class="black">black</span> [black], <span class="gray">gray</span>, <span class="silver">silver</span>,
+<span class="white">white</span> [white], <span class="maroon">maroon</span>, <span class="red">red</span>,
+<span class="magenta">magenta</span>, <span class="fuchsia">fuchsia</span>, <span class="pink">pink</span>,
+<span class="orange">orange</span>, <span class="yellow">yellow</span>, <span class="lime">lime</span>, <span class="green">green</span>,
+<span class="olive">olive</span>, <span class="teal">teal</span>, <span class="cyan">cyan</span>, <span class="aqua">aqua</span>,
+<span class="blue">blue</span>, <span class="navy">navy</span>, <span class="purple">purple</span></p>
+</div>
+<div class="slide" id="features-2">
+<h1>Features (2)</h1>
+<p><span class="incremental">Some</span> <span class="incremental">incremental</span> <span class="incremental">text.</span></p>
+<ul class="incremental open">
+<li><p class="first"><span class="tiny">tiny</span> (class &amp; role name: &quot;tiny&quot;, e.g. &quot;<tt class="docutils literal"><span class="pre">:tiny:`text`</span></tt>&quot;)</p>
+</li>
+<li><p class="first"><span class="small">small</span> (&quot;small&quot;)</p>
+</li>
+<li><p class="first">normal (unstyled)</p>
+</li>
+<li><p class="first"><span class="big">big</span> (&quot;big&quot;)</p>
+</li>
+<li><p class="first"><span class="huge">huge</span> (&quot;huge&quot;)</p>
+</li>
+</ul>
+</div>
+<div class="slide" id="checklist">
+<h1>Checklist</h1>
+<ul class="simple">
+<li>The document title should be duplicated on each slide in the footer
+(except for the first slide, <tt class="docutils literal"><span class="pre">slide0</span></tt>, where the entire footer is
+disabled).</li>
+<li>The footer also contains a second line, &quot;Location • Date&quot;</li>
+<li>There's no table of contents on the first slide (the directive is
+disabled).</li>
+<li>Handout material is not displayed in presentation mode.</li>
+<li>The theme directories should be created, and the theme files copied
+over.</li>
+</ul>
+</div>
+</div>
+</body>
+</html>
diff --git a/test/functional/expected/standalone_rst_s5_html_2.html b/test/functional/expected/standalone_rst_s5_html_2.html
new file mode 100644
index 000000000..31d5e8750
--- /dev/null
+++ b/test/functional/expected/standalone_rst_s5_html_2.html
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.3.10: http://docutils.sourceforge.net/" />
+<meta name="version" content="S5 1.1" />
+<title>Slide Shows</title>
+<meta name="author" content="David Goodger" />
+<meta name="date" content="2005-11-28" />
+<link rel="stylesheet" href="../../../docutils/writers/support/html4css1.css" type="text/css" />
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="ui/default/slides.css"
+ type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/default/outline.css"
+ type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/default/print.css"
+ type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/default/opera.css"
+ type="text/css" media="projection" id="operaFix" />
+<script src="ui/default/slides.js" type="text/javascript"></script>
+</head>
+<body>
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+
+</div>
+<div id="footer">
+<h1>Slide Shows</h1>
+<h2>Location • Date</h2>
+</div>
+</div>
+<div class="presentation">
+<div class="slide" id="slide0">
+<h1 class="title">Slide Shows</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>David Goodger</td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>2005-11-28</td></tr>
+</tbody>
+</table>
+<!-- Definitions of interpreted text roles (classes) for S5/HTML data. -->
+<!-- This data file has been placed in the public domain. -->
+<!-- Colours
+======= -->
+<!-- Text Sizes
+========== -->
+<!-- Print-Only
+========== -->
+<!-- Incremental Display
+=================== -->
+<div class="contents handout topic">
+<p class="topic-title first"><a id="contents" name="contents">Contents</a></p>
+<ul class="simple">
+<li><a class="reference" href="#introduction" id="id1" name="id1">Introduction</a></li>
+<li><a class="reference" href="#features-1" id="id2" name="id2">Features (1)</a></li>
+<li><a class="reference" href="#features-2" id="id3" name="id3">Features (2)</a></li>
+<li><a class="reference" href="#checklist" id="id4" name="id4">Checklist</a></li>
+</ul>
+</div>
+<p class="handout">This is a test. This is only a test. If this were a real slide
+show, there would be a projector handy.</p>
+<p>Let's test the S5/HTML writer!</p>
+<ul class="small simple">
+<li>Use the arrow keys to navigate.</li>
+<li>Click the &quot;Ø&quot; button to switch between presentation &amp;
+handout/outline modes.</li>
+</ul>
+<div class="handout container">
+In presentation mode, mouse over to the lower right-hand corner to
+display the controls.</div>
+
+</div>
+<div class="slide" id="introduction">
+<h1>Introduction</h1>
+<ul class="compact simple">
+<li>reStructuredText<p class="handout">Uses normal reStructuredText as input.</p>
+</li>
+<li>One section per slide<p class="handout">Each first-level section is converted into a single slide.</p>
+</li>
+<li>(X)HTML output<p class="handout">Presentations can be viewed using any modern graphical web browser.
+The browser must support CSS, JavaScript, and XHTML. S5 even works
+with IE!</p>
+</li>
+<li>Themes<p class="handout">A variety of themes are available.</p>
+</li>
+<li><tt class="docutils literal"><span class="pre">rst2s5.py</span></tt><p class="handout">The front-end tool to generate S5 slide shows.</p>
+</li>
+</ul>
+</div>
+<div class="slide" id="features-1">
+<h1>Features (1)</h1>
+<p class="left">A flush-left paragraph</p>
+<p class="center">A centered paragraph</p>
+<p class="right">A flush-right paragraph</p>
+<p>Some colours: <span class="black">black</span> [black], <span class="gray">gray</span>, <span class="silver">silver</span>,
+<span class="white">white</span> [white], <span class="maroon">maroon</span>, <span class="red">red</span>,
+<span class="magenta">magenta</span>, <span class="fuchsia">fuchsia</span>, <span class="pink">pink</span>,
+<span class="orange">orange</span>, <span class="yellow">yellow</span>, <span class="lime">lime</span>, <span class="green">green</span>,
+<span class="olive">olive</span>, <span class="teal">teal</span>, <span class="cyan">cyan</span>, <span class="aqua">aqua</span>,
+<span class="blue">blue</span>, <span class="navy">navy</span>, <span class="purple">purple</span></p>
+</div>
+<div class="slide" id="features-2">
+<h1>Features (2)</h1>
+<p><span class="incremental">Some</span> <span class="incremental">incremental</span> <span class="incremental">text.</span></p>
+<ul class="incremental open">
+<li><p class="first"><span class="tiny">tiny</span> (class &amp; role name: &quot;tiny&quot;, e.g. &quot;<tt class="docutils literal"><span class="pre">:tiny:`text`</span></tt>&quot;)</p>
+</li>
+<li><p class="first"><span class="small">small</span> (&quot;small&quot;)</p>
+</li>
+<li><p class="first">normal (unstyled)</p>
+</li>
+<li><p class="first"><span class="big">big</span> (&quot;big&quot;)</p>
+</li>
+<li><p class="first"><span class="huge">huge</span> (&quot;huge&quot;)</p>
+</li>
+</ul>
+</div>
+<div class="slide" id="checklist">
+<h1>Checklist</h1>
+<ul class="simple">
+<li>The document title should be duplicated on each slide in the footer
+(except for the first slide, <tt class="docutils literal"><span class="pre">slide0</span></tt>, where the entire footer is
+disabled).</li>
+<li>The footer also contains a second line, &quot;Location • Date&quot;</li>
+<li>There's no table of contents on the first slide (the directive is
+disabled).</li>
+<li>Handout material is not displayed in presentation mode.</li>
+<li>The theme directories should be created, and the theme files copied
+over.</li>
+</ul>
+</div>
+</div>
+</body>
+</html>
diff --git a/test/functional/expected/ui/default/blank.gif b/test/functional/expected/ui/default/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/test/functional/expected/ui/default/blank.gif
Binary files differ
diff --git a/test/functional/expected/ui/default/framing.css b/test/functional/expected/ui/default/framing.css
new file mode 100644
index 000000000..c4727f303
--- /dev/null
+++ b/test/functional/expected/ui/default/framing.css
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/test/functional/expected/ui/default/iepngfix.htc b/test/functional/expected/ui/default/iepngfix.htc
new file mode 100644
index 000000000..9f3d628b5
--- /dev/null
+++ b/test/functional/expected/ui/default/iepngfix.htc
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+ filters[f].enabled = s ? true : false;
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+ (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+ if ((/\.png$/i).test(src)) {
+ filt(src, 'image'); // was 'scale'
+ src = blankImg;
+ } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+ var s = RegExp.$1;
+ style.backgroundImage = '';
+ filt(s, 'crop');
+ } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component> \ No newline at end of file
diff --git a/test/functional/expected/ui/default/opera.css b/test/functional/expected/ui/default/opera.css
new file mode 100644
index 000000000..c9d1148be
--- /dev/null
+++ b/test/functional/expected/ui/default/opera.css
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+ visibility: visible !important;
+ position: static !important;
+ page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
diff --git a/test/functional/expected/ui/default/outline.css b/test/functional/expected/ui/default/outline.css
new file mode 100644
index 000000000..cb3588d5a
--- /dev/null
+++ b/test/functional/expected/ui/default/outline.css
@@ -0,0 +1,21 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+ outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+ display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0.75em; padding-top: 0.25em;
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block, .print-inline {display: none;}
diff --git a/test/functional/expected/ui/default/pretty.css b/test/functional/expected/ui/default/pretty.css
new file mode 100644
index 000000000..f83ca2bf5
--- /dev/null
+++ b/test/functional/expected/ui/default/pretty.css
@@ -0,0 +1,122 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+ div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+ margin: 0; padding-left: 0.7em; white-space: nowrap;
+ font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+ font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+ color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/test/functional/expected/ui/default/print.css b/test/functional/expected/ui/default/print.css
new file mode 100644
index 000000000..76e6352ee
--- /dev/null
+++ b/test/functional/expected/ui/default/print.css
@@ -0,0 +1,33 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+ DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;}
+.extra {background: transparent !important;}
+div.extra, pre.extra, .example {font-size: 10pt; color: #333;}
+ul.extra a {font-weight: bold;}
+p.example {display: none;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+ font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block {display: block !important;}
+.print-inline {display: inline !important;}
+
+/* The following rule keeps the layout stuff out of print.
+ Remove at your own risk! */
+.layout, .layout * {display: none !important;}
diff --git a/test/functional/expected/ui/default/s5-core.css b/test/functional/expected/ui/default/s5-core.css
new file mode 100644
index 000000000..6965f5e8f
--- /dev/null
+++ b/test/functional/expected/ui/default/s5-core.css
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+ The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer,
+ html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
diff --git a/test/functional/expected/ui/default/slides.css b/test/functional/expected/ui/default/slides.css
new file mode 100644
index 000000000..82bdc0ee0
--- /dev/null
+++ b/test/functional/expected/ui/default/slides.css
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
diff --git a/test/functional/expected/ui/default/slides.js b/test/functional/expected/ui/default/slides.js
new file mode 100644
index 000000000..cc4ddfa1e
--- /dev/null
+++ b/test/functional/expected/ui/default/slides.js
@@ -0,0 +1,559 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+// $Revision: 4117 $
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+ if (!object.className) return false;
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+ if (!object) return false;
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+ if (!object) return;
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+ if (!object || hasClass(object, className)) return;
+ if (object.className) {
+ object.className += ' '+className;
+ } else {
+ object.className = className;
+ }
+}
+
+function GetElementsWithClassName(elementName,className) {
+ var allElements = document.getElementsByTagName(elementName);
+ var elemColl = new Array();
+ for (var i = 0; i< allElements.length; i++) {
+ if (hasClass(allElements[i], className)) {
+ elemColl[elemColl.length] = allElements[i];
+ }
+ }
+ return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+ if (element == null || element.nodeName=='BODY') return false;
+ else if (element.id == id) return true;
+ else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+ var result = "";
+ if (node.nodeType == 1) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; ++i) {
+ result += nodeValue(children[i]);
+ }
+ }
+ else if (node.nodeType == 3) {
+ result = node.nodeValue;
+ }
+ return(result);
+}
+
+function slideLabel() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var list = document.getElementById('jumplist');
+ smax = slideColl.length;
+ for (var n = 0; n < smax; n++) {
+ var obj = slideColl[n];
+
+ var did = 'slide' + n.toString();
+ if (obj.getAttribute('id')) {
+ slideIDs[n] = obj.getAttribute('id');
+ }
+ else {
+ obj.setAttribute('id',did);
+ slideIDs[n] = did;
+ }
+ if (isOp) continue;
+
+ var otext = '';
+ var menu = obj.firstChild;
+ if (!menu) continue; // to cope with empty slides
+ while (menu && menu.nodeType == 3) {
+ menu = menu.nextSibling;
+ }
+ if (!menu) continue; // to cope with slides with only text nodes
+
+ var menunodes = menu.childNodes;
+ for (var o = 0; o < menunodes.length; o++) {
+ otext += nodeValue(menunodes[o]);
+ }
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
+ }
+}
+
+function currentSlide() {
+ var cs;
+ var footer_nodes;
+ var vis = 'visible';
+ if (document.getElementById) {
+ cs = document.getElementById('currentSlide');
+ footer_nodes = document.getElementById('footer').childNodes;
+ } else {
+ cs = document.currentSlide;
+ footer = document.footer.childNodes;
+ }
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
+ '<span id="csSep">\/<\/span> ' +
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
+ if (snum == 0) {
+ vis = 'hidden';
+ }
+ cs.style.visibility = vis;
+ for (var i = 0; i < footer_nodes.length; i++) {
+ if (footer_nodes[i].nodeType == 1) {
+ footer_nodes[i].style.visibility = vis;
+ }
+ }
+}
+
+function go(step) {
+ if (document.getElementById('slideProj').disabled || step == 0) return;
+ var jl = document.getElementById('jumplist');
+ var cid = slideIDs[snum];
+ var ce = document.getElementById(cid);
+ if (incrementals[snum].length > 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ removeClass(incrementals[snum][i], 'current');
+ removeClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (step != 'j') {
+ snum += step;
+ lmax = smax - 1;
+ if (snum > lmax) snum = lmax;
+ if (snum < 0) snum = 0;
+ } else
+ snum = parseInt(jl.value);
+ var nid = slideIDs[snum];
+ var ne = document.getElementById(nid);
+ if (!ne) {
+ ne = document.getElementById(slideIDs[0]);
+ snum = 0;
+ }
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+ if (incrementals[snum].length > 0 && incpos == 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ if (hasClass(incrementals[snum][i], 'current'))
+ incpos = i + 1;
+ else
+ addClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (incrementals[snum].length > 0 && incpos > 0)
+ addClass(incrementals[snum][incpos - 1], 'current');
+ ce.style.visibility = 'hidden';
+ ne.style.visibility = 'visible';
+ jl.selectedIndex = snum;
+ currentSlide();
+ number = 0;
+}
+
+function goTo(target) {
+ if (target >= smax || target == snum) return;
+ go(target - snum);
+}
+
+function subgo(step) {
+ if (step > 0) {
+ removeClass(incrementals[snum][incpos - 1],'current');
+ removeClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos],'current');
+ incpos++;
+ } else {
+ incpos--;
+ removeClass(incrementals[snum][incpos],'current');
+ addClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos - 1],'current');
+ }
+}
+
+function toggle() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ if (!slides.disabled) {
+ slides.disabled = true;
+ outline.disabled = false;
+ s5mode = false;
+ fontSize('1em');
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'visible';
+ }
+ } else {
+ slides.disabled = false;
+ outline.disabled = true;
+ s5mode = true;
+ fontScale();
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'hidden';
+ }
+ slideColl[snum].style.visibility = 'visible';
+ }
+}
+
+function showHide(action) {
+ var obj = GetElementsWithClassName('*','hideme')[0];
+ switch (action) {
+ case 's': obj.style.visibility = 'visible'; break;
+ case 'h': obj.style.visibility = 'hidden'; break;
+ case 'k':
+ if (obj.style.visibility != 'visible') {
+ obj.style.visibility = 'visible';
+ } else {
+ obj.style.visibility = 'hidden';
+ }
+ break;
+ }
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+ if (!key) {
+ key = event;
+ key.which = key.keyCode;
+ }
+ if (key.which == 84) {
+ toggle();
+ return;
+ }
+ if (s5mode) {
+ switch (key.which) {
+ case 10: // return
+ case 13: // enter
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ if(number != undef) {
+ goTo(number);
+ break;
+ }
+ case 32: // spacebar
+ case 34: // page down
+ case 39: // rightkey
+ case 40: // downkey
+ if(number != undef) {
+ go(number);
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ break;
+ case 33: // page up
+ case 37: // leftkey
+ case 38: // upkey
+ if(number != undef) {
+ go(-1 * number);
+ } else if (!incrementals[snum] || incpos <= 0) {
+ go(-1);
+ } else {
+ subgo(-1);
+ }
+ break;
+ case 36: // home
+ goTo(0);
+ break;
+ case 35: // end
+ goTo(smax-1);
+ break;
+ case 67: // c
+ showHide('k');
+ break;
+ }
+ if (key.which < 48 || key.which > 57) {
+ number = undef;
+ } else {
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+ }
+ }
+ return false;
+}
+
+function clicker(e) {
+ number = undef;
+ var target;
+ if (window.event) {
+ target = window.event.srcElement;
+ e = window.event;
+ } else target = e.target;
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+ if (!e.which || e.which == 1) {
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ }
+}
+
+function findSlide(hash) {
+ var target = document.getElementById(hash);
+ if (target) {
+ for (var i = 0; i < slideIDs.length; i++) {
+ if (target.id == slideIDs[i]) return i;
+ }
+ }
+ return null;
+}
+
+function slideJump() {
+ if (window.location.hash == null || window.location.hash == '') {
+ currentSlide();
+ return;
+ }
+ if (window.location.hash == null) return;
+ var dest = null;
+ dest = findSlide(window.location.hash.slice(1));
+ if (dest == null) {
+ dest = 0;
+ }
+ go(dest - snum);
+}
+
+function fixLinks() {
+ var thisUri = window.location.href;
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+ var aelements = document.getElementsByTagName('A');
+ for (var i = 0; i < aelements.length; i++) {
+ var a = aelements[i].href;
+ var slideID = a.match('\#.+');
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+ var dest = findSlide(slideID[0].slice(1));
+ if (dest != null) {
+ if (aelements[i].addEventListener) {
+ aelements[i].addEventListener("click", new Function("e",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "if (e.preventDefault) e.preventDefault();"), true);
+ } else if (aelements[i].attachEvent) {
+ aelements[i].attachEvent("onclick", new Function("",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "event.returnValue = false;"));
+ }
+ }
+ }
+ }
+}
+
+function externalLinks() {
+ if (!document.getElementsByTagName) return;
+ var anchors = document.getElementsByTagName('a');
+ for (var i=0; i<anchors.length; i++) {
+ var anchor = anchors[i];
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+ anchor.target = '_blank';
+ addClass(anchor,'external');
+ }
+ }
+}
+
+function createControls() {
+ var controlsDiv = document.getElementById("controls");
+ if (!controlsDiv) return;
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+ var hideDiv, hideList = '';
+ if (controlVis == 'hidden') {
+ hideDiv = hider;
+ } else {
+ hideList = hider;
+ }
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+ '<div id="navLinks">' +
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+ '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+ '<\/div><\/form>';
+ if (controlVis == 'hidden') {
+ var hidden = document.getElementById('navLinks');
+ } else {
+ var hidden = document.getElementById('jumplist');
+ }
+ addClass(hidden,'hideme');
+}
+
+function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+ if (!s5mode) return false;
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
+ if (window.innerHeight) {
+ var vSize = window.innerHeight;
+ var hSize = window.innerWidth;
+ } else if (document.documentElement.clientHeight) {
+ var vSize = document.documentElement.clientHeight;
+ var hSize = document.documentElement.clientWidth;
+ } else if (document.body.clientHeight) {
+ var vSize = document.body.clientHeight;
+ var hSize = document.body.clientWidth;
+ } else {
+ var vSize = 700; // assuming 1024x768, minus chrome and such
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
+ }
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+ fontSize(newSize + 'px');
+ if (isGe) { // hack to counter incremental reflow bugs
+ var obj = document.getElementsByTagName('body')[0];
+ obj.style.display = 'none';
+ obj.style.display = 'block';
+ }
+}
+
+function fontSize(value) {
+ if (!(s5ss = document.getElementById('s5ss'))) {
+ if (!isIE) {
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+ s5ss.setAttribute('media','screen, projection');
+ s5ss.setAttribute('id','s5ss');
+ } else {
+ document.createStyleSheet();
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+ }
+ }
+ if (!isIE) {
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+ } else {
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+ }
+}
+
+function notOperaFix() {
+ slideCSS = document.getElementById('slideProj').href;
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ slides.setAttribute('media','screen');
+ outline.disabled = true;
+ if (isGe) {
+ slides.setAttribute('href','null'); // Gecko fix
+ slides.setAttribute('href',slideCSS); // Gecko fix
+ }
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+ }
+}
+
+function getIncrementals(obj) {
+ var incrementals = new Array();
+ if (!obj)
+ return incrementals;
+ var children = obj.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (hasClass(child, 'incremental')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'incremental');
+ for (var j = 0; j < child.childNodes.length; j++) {
+ if (child.childNodes[j].nodeType == 1) {
+ addClass(child.childNodes[j], 'incremental');
+ }
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ removeClass(child,'incremental');
+ }
+ }
+ if (hasClass(child, 'show-first')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'show-first');
+ if (child.childNodes[isGe].nodeType == 1) {
+ removeClass(child.childNodes[isGe], 'incremental');
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ }
+ }
+ incrementals = incrementals.concat(getIncrementals(child));
+ }
+ return incrementals;
+}
+
+function createIncrementals() {
+ var incrementals = new Array();
+ for (var i = 0; i < smax; i++) {
+ incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+ }
+ return incrementals;
+}
+
+function defaultCheck() {
+ var allMetas = document.getElementsByTagName('meta');
+ for (var i = 0; i< allMetas.length; i++) {
+ if (allMetas[i].name == 'defaultView') {
+ defaultView = allMetas[i].content;
+ }
+ if (allMetas[i].name == 'controlVis') {
+ controlVis = allMetas[i].content;
+ }
+ }
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+ if (!e) {
+ e = event;
+ e.which = e.keyCode;
+ }
+ try {
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+ }
+ catch(e) {
+ modifierKey = false;
+ }
+ return modifierKey || e.which == 0;
+}
+
+function startup() {
+ defaultCheck();
+ if (!isOp) createControls();
+ slideLabel();
+ fixLinks();
+ externalLinks();
+ fontScale();
+ if (!isOp) {
+ notOperaFix();
+ incrementals = createIncrementals();
+ slideJump();
+ if (defaultView == 'outline') {
+ toggle();
+ }
+ document.onkeyup = keys;
+ document.onkeypress = trap;
+ document.onclick = clicker;
+ }
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
diff --git a/test/functional/expected/ui/small-black/blank.gif b/test/functional/expected/ui/small-black/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/test/functional/expected/ui/small-black/blank.gif
Binary files differ
diff --git a/test/functional/expected/ui/small-black/framing.css b/test/functional/expected/ui/small-black/framing.css
new file mode 100644
index 000000000..70287dd06
--- /dev/null
+++ b/test/functional/expected/ui/small-black/framing.css
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+ z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/test/functional/expected/ui/small-black/iepngfix.htc b/test/functional/expected/ui/small-black/iepngfix.htc
new file mode 100644
index 000000000..fa9f99659
--- /dev/null
+++ b/test/functional/expected/ui/small-black/iepngfix.htc
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/small-black/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+ filters[f].enabled = s ? true : false;
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+ (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+ if ((/\.png$/i).test(src)) {
+ filt(src, 'image'); // was 'scale'
+ src = blankImg;
+ } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+ var s = RegExp.$1;
+ style.backgroundImage = '';
+ filt(s, 'crop');
+ } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component> \ No newline at end of file
diff --git a/test/functional/expected/ui/small-black/opera.css b/test/functional/expected/ui/small-black/opera.css
new file mode 100644
index 000000000..c9d1148be
--- /dev/null
+++ b/test/functional/expected/ui/small-black/opera.css
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+ visibility: visible !important;
+ position: static !important;
+ page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
diff --git a/test/functional/expected/ui/small-black/outline.css b/test/functional/expected/ui/small-black/outline.css
new file mode 100644
index 000000000..cb3588d5a
--- /dev/null
+++ b/test/functional/expected/ui/small-black/outline.css
@@ -0,0 +1,21 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+ outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+ display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0.75em; padding-top: 0.25em;
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block, .print-inline {display: none;}
diff --git a/test/functional/expected/ui/small-black/pretty.css b/test/functional/expected/ui/small-black/pretty.css
new file mode 100644
index 000000000..991bb9fdb
--- /dev/null
+++ b/test/functional/expected/ui/small-black/pretty.css
@@ -0,0 +1,118 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin: 0 0 0.5em 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA;
+ font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+ background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+ font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+ font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+ color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.print-block, .print-inline {display: none;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.borderless, .borderless td {border: 0;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
diff --git a/test/functional/expected/ui/small-black/print.css b/test/functional/expected/ui/small-black/print.css
new file mode 100644
index 000000000..76e6352ee
--- /dev/null
+++ b/test/functional/expected/ui/small-black/print.css
@@ -0,0 +1,33 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+ DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;}
+.extra {background: transparent !important;}
+div.extra, pre.extra, .example {font-size: 10pt; color: #333;}
+ul.extra a {font-weight: bold;}
+p.example {display: none;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+ font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.handout {border-left: solid #BBB; padding-left: 0.5em;}
+
+.print-block {display: block !important;}
+.print-inline {display: inline !important;}
+
+/* The following rule keeps the layout stuff out of print.
+ Remove at your own risk! */
+.layout, .layout * {display: none !important;}
diff --git a/test/functional/expected/ui/small-black/s5-core.css b/test/functional/expected/ui/small-black/s5-core.css
new file mode 100644
index 000000000..6965f5e8f
--- /dev/null
+++ b/test/functional/expected/ui/small-black/s5-core.css
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+ The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer,
+ html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
diff --git a/test/functional/expected/ui/small-black/slides.css b/test/functional/expected/ui/small-black/slides.css
new file mode 100644
index 000000000..82bdc0ee0
--- /dev/null
+++ b/test/functional/expected/ui/small-black/slides.css
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
diff --git a/test/functional/expected/ui/small-black/slides.js b/test/functional/expected/ui/small-black/slides.js
new file mode 100644
index 000000000..7c1e6ff5c
--- /dev/null
+++ b/test/functional/expected/ui/small-black/slides.js
@@ -0,0 +1,559 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+// $Revision: 4117 $
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+ if (!object.className) return false;
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+ if (!object) return false;
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+ if (!object) return;
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+ if (!object || hasClass(object, className)) return;
+ if (object.className) {
+ object.className += ' '+className;
+ } else {
+ object.className = className;
+ }
+}
+
+function GetElementsWithClassName(elementName,className) {
+ var allElements = document.getElementsByTagName(elementName);
+ var elemColl = new Array();
+ for (var i = 0; i< allElements.length; i++) {
+ if (hasClass(allElements[i], className)) {
+ elemColl[elemColl.length] = allElements[i];
+ }
+ }
+ return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+ if (element == null || element.nodeName=='BODY') return false;
+ else if (element.id == id) return true;
+ else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+ var result = "";
+ if (node.nodeType == 1) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; ++i) {
+ result += nodeValue(children[i]);
+ }
+ }
+ else if (node.nodeType == 3) {
+ result = node.nodeValue;
+ }
+ return(result);
+}
+
+function slideLabel() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var list = document.getElementById('jumplist');
+ smax = slideColl.length;
+ for (var n = 0; n < smax; n++) {
+ var obj = slideColl[n];
+
+ var did = 'slide' + n.toString();
+ if (obj.getAttribute('id')) {
+ slideIDs[n] = obj.getAttribute('id');
+ }
+ else {
+ obj.setAttribute('id',did);
+ slideIDs[n] = did;
+ }
+ if (isOp) continue;
+
+ var otext = '';
+ var menu = obj.firstChild;
+ if (!menu) continue; // to cope with empty slides
+ while (menu && menu.nodeType == 3) {
+ menu = menu.nextSibling;
+ }
+ if (!menu) continue; // to cope with slides with only text nodes
+
+ var menunodes = menu.childNodes;
+ for (var o = 0; o < menunodes.length; o++) {
+ otext += nodeValue(menunodes[o]);
+ }
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
+ }
+}
+
+function currentSlide() {
+ var cs;
+ var footer_nodes;
+ var vis = 'visible';
+ if (document.getElementById) {
+ cs = document.getElementById('currentSlide');
+ footer_nodes = document.getElementById('footer').childNodes;
+ } else {
+ cs = document.currentSlide;
+ footer = document.footer.childNodes;
+ }
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
+ '<span id="csSep">\/<\/span> ' +
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
+ if (snum == 0) {
+ vis = 'hidden';
+ }
+ cs.style.visibility = vis;
+ for (var i = 0; i < footer_nodes.length; i++) {
+ if (footer_nodes[i].nodeType == 1) {
+ footer_nodes[i].style.visibility = vis;
+ }
+ }
+}
+
+function go(step) {
+ if (document.getElementById('slideProj').disabled || step == 0) return;
+ var jl = document.getElementById('jumplist');
+ var cid = slideIDs[snum];
+ var ce = document.getElementById(cid);
+ if (incrementals[snum].length > 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ removeClass(incrementals[snum][i], 'current');
+ removeClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (step != 'j') {
+ snum += step;
+ lmax = smax - 1;
+ if (snum > lmax) snum = lmax;
+ if (snum < 0) snum = 0;
+ } else
+ snum = parseInt(jl.value);
+ var nid = slideIDs[snum];
+ var ne = document.getElementById(nid);
+ if (!ne) {
+ ne = document.getElementById(slideIDs[0]);
+ snum = 0;
+ }
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+ if (incrementals[snum].length > 0 && incpos == 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ if (hasClass(incrementals[snum][i], 'current'))
+ incpos = i + 1;
+ else
+ addClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (incrementals[snum].length > 0 && incpos > 0)
+ addClass(incrementals[snum][incpos - 1], 'current');
+ ce.style.visibility = 'hidden';
+ ne.style.visibility = 'visible';
+ jl.selectedIndex = snum;
+ currentSlide();
+ number = 0;
+}
+
+function goTo(target) {
+ if (target >= smax || target == snum) return;
+ go(target - snum);
+}
+
+function subgo(step) {
+ if (step > 0) {
+ removeClass(incrementals[snum][incpos - 1],'current');
+ removeClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos],'current');
+ incpos++;
+ } else {
+ incpos--;
+ removeClass(incrementals[snum][incpos],'current');
+ addClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos - 1],'current');
+ }
+}
+
+function toggle() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ if (!slides.disabled) {
+ slides.disabled = true;
+ outline.disabled = false;
+ s5mode = false;
+ fontSize('1em');
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'visible';
+ }
+ } else {
+ slides.disabled = false;
+ outline.disabled = true;
+ s5mode = true;
+ fontScale();
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'hidden';
+ }
+ slideColl[snum].style.visibility = 'visible';
+ }
+}
+
+function showHide(action) {
+ var obj = GetElementsWithClassName('*','hideme')[0];
+ switch (action) {
+ case 's': obj.style.visibility = 'visible'; break;
+ case 'h': obj.style.visibility = 'hidden'; break;
+ case 'k':
+ if (obj.style.visibility != 'visible') {
+ obj.style.visibility = 'visible';
+ } else {
+ obj.style.visibility = 'hidden';
+ }
+ break;
+ }
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+ if (!key) {
+ key = event;
+ key.which = key.keyCode;
+ }
+ if (key.which == 84) {
+ toggle();
+ return;
+ }
+ if (s5mode) {
+ switch (key.which) {
+ case 10: // return
+ case 13: // enter
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ if(number != undef) {
+ goTo(number);
+ break;
+ }
+ case 32: // spacebar
+ case 34: // page down
+ case 39: // rightkey
+ case 40: // downkey
+ if(number != undef) {
+ go(number);
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ break;
+ case 33: // page up
+ case 37: // leftkey
+ case 38: // upkey
+ if(number != undef) {
+ go(-1 * number);
+ } else if (!incrementals[snum] || incpos <= 0) {
+ go(-1);
+ } else {
+ subgo(-1);
+ }
+ break;
+ case 36: // home
+ goTo(0);
+ break;
+ case 35: // end
+ goTo(smax-1);
+ break;
+ case 67: // c
+ showHide('k');
+ break;
+ }
+ if (key.which < 48 || key.which > 57) {
+ number = undef;
+ } else {
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+ }
+ }
+ return false;
+}
+
+function clicker(e) {
+ number = undef;
+ var target;
+ if (window.event) {
+ target = window.event.srcElement;
+ e = window.event;
+ } else target = e.target;
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+ if (!e.which || e.which == 1) {
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ }
+}
+
+function findSlide(hash) {
+ var target = document.getElementById(hash);
+ if (target) {
+ for (var i = 0; i < slideIDs.length; i++) {
+ if (target.id == slideIDs[i]) return i;
+ }
+ }
+ return null;
+}
+
+function slideJump() {
+ if (window.location.hash == null || window.location.hash == '') {
+ currentSlide();
+ return;
+ }
+ if (window.location.hash == null) return;
+ var dest = null;
+ dest = findSlide(window.location.hash.slice(1));
+ if (dest == null) {
+ dest = 0;
+ }
+ go(dest - snum);
+}
+
+function fixLinks() {
+ var thisUri = window.location.href;
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+ var aelements = document.getElementsByTagName('A');
+ for (var i = 0; i < aelements.length; i++) {
+ var a = aelements[i].href;
+ var slideID = a.match('\#.+');
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+ var dest = findSlide(slideID[0].slice(1));
+ if (dest != null) {
+ if (aelements[i].addEventListener) {
+ aelements[i].addEventListener("click", new Function("e",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "if (e.preventDefault) e.preventDefault();"), true);
+ } else if (aelements[i].attachEvent) {
+ aelements[i].attachEvent("onclick", new Function("",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "event.returnValue = false;"));
+ }
+ }
+ }
+ }
+}
+
+function externalLinks() {
+ if (!document.getElementsByTagName) return;
+ var anchors = document.getElementsByTagName('a');
+ for (var i=0; i<anchors.length; i++) {
+ var anchor = anchors[i];
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+ anchor.target = '_blank';
+ addClass(anchor,'external');
+ }
+ }
+}
+
+function createControls() {
+ var controlsDiv = document.getElementById("controls");
+ if (!controlsDiv) return;
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+ var hideDiv, hideList = '';
+ if (controlVis == 'hidden') {
+ hideDiv = hider;
+ } else {
+ hideList = hider;
+ }
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+ '<div id="navLinks">' +
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+ '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+ '<\/div><\/form>';
+ if (controlVis == 'hidden') {
+ var hidden = document.getElementById('navLinks');
+ } else {
+ var hidden = document.getElementById('jumplist');
+ }
+ addClass(hidden,'hideme');
+}
+
+function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+ if (!s5mode) return false;
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
+ if (window.innerHeight) {
+ var vSize = window.innerHeight;
+ var hSize = window.innerWidth;
+ } else if (document.documentElement.clientHeight) {
+ var vSize = document.documentElement.clientHeight;
+ var hSize = document.documentElement.clientWidth;
+ } else if (document.body.clientHeight) {
+ var vSize = document.body.clientHeight;
+ var hSize = document.body.clientWidth;
+ } else {
+ var vSize = 700; // assuming 1024x768, minus chrome and such
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
+ }
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+ fontSize(newSize + 'px');
+ if (isGe) { // hack to counter incremental reflow bugs
+ var obj = document.getElementsByTagName('body')[0];
+ obj.style.display = 'none';
+ obj.style.display = 'block';
+ }
+}
+
+function fontSize(value) {
+ if (!(s5ss = document.getElementById('s5ss'))) {
+ if (!isIE) {
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+ s5ss.setAttribute('media','screen, projection');
+ s5ss.setAttribute('id','s5ss');
+ } else {
+ document.createStyleSheet();
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+ }
+ }
+ if (!isIE) {
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+ } else {
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+ }
+}
+
+function notOperaFix() {
+ slideCSS = document.getElementById('slideProj').href;
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ slides.setAttribute('media','screen');
+ outline.disabled = true;
+ if (isGe) {
+ slides.setAttribute('href','null'); // Gecko fix
+ slides.setAttribute('href',slideCSS); // Gecko fix
+ }
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/small-black/iepngfix.htc)');
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/small-black/iepngfix.htc)');
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/small-black/iepngfix.htc)');
+ }
+}
+
+function getIncrementals(obj) {
+ var incrementals = new Array();
+ if (!obj)
+ return incrementals;
+ var children = obj.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (hasClass(child, 'incremental')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'incremental');
+ for (var j = 0; j < child.childNodes.length; j++) {
+ if (child.childNodes[j].nodeType == 1) {
+ addClass(child.childNodes[j], 'incremental');
+ }
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ removeClass(child,'incremental');
+ }
+ }
+ if (hasClass(child, 'show-first')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'show-first');
+ if (child.childNodes[isGe].nodeType == 1) {
+ removeClass(child.childNodes[isGe], 'incremental');
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ }
+ }
+ incrementals = incrementals.concat(getIncrementals(child));
+ }
+ return incrementals;
+}
+
+function createIncrementals() {
+ var incrementals = new Array();
+ for (var i = 0; i < smax; i++) {
+ incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+ }
+ return incrementals;
+}
+
+function defaultCheck() {
+ var allMetas = document.getElementsByTagName('meta');
+ for (var i = 0; i< allMetas.length; i++) {
+ if (allMetas[i].name == 'defaultView') {
+ defaultView = allMetas[i].content;
+ }
+ if (allMetas[i].name == 'controlVis') {
+ controlVis = allMetas[i].content;
+ }
+ }
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+ if (!e) {
+ e = event;
+ e.which = e.keyCode;
+ }
+ try {
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+ }
+ catch(e) {
+ modifierKey = false;
+ }
+ return modifierKey || e.which == 0;
+}
+
+function startup() {
+ defaultCheck();
+ if (!isOp) createControls();
+ slideLabel();
+ fixLinks();
+ externalLinks();
+ fontScale();
+ if (!isOp) {
+ notOperaFix();
+ incrementals = createIncrementals();
+ slideJump();
+ if (defaultView == 'outline') {
+ toggle();
+ }
+ document.onkeyup = keys;
+ document.onkeypress = trap;
+ document.onclick = clicker;
+ }
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
diff --git a/test/functional/input/standalone_rst_s5_html.txt b/test/functional/input/standalone_rst_s5_html.txt
new file mode 100644
index 000000000..a1461f1f0
--- /dev/null
+++ b/test/functional/input/standalone_rst_s5_html.txt
@@ -0,0 +1,126 @@
+.. include:: <s5defs.txt>
+
+=============
+ Slide Shows
+=============
+
+:Author: David Goodger
+:Date: 2005-11-28
+
+.. contents::
+ :class: handout
+
+.. class:: handout
+
+ This is a test. This is only a test. If this were a real slide
+ show, there would be a projector handy.
+
+Let's test the S5/HTML writer!
+
+.. class:: small
+
+* Use the arrow keys to navigate.
+
+* Click the "|mode|" button to switch between presentation &
+ handout/outline modes.
+
+.. container:: handout
+
+ In presentation mode, mouse over to the lower right-hand corner to
+ display the controls.
+
+.. |bullet| unicode:: U+02022
+.. |mode| unicode:: U+00D8 .. capital o with stroke
+.. footer:: Location |bullet| Date
+
+
+Introduction
+============
+
+.. class:: compact
+
+* reStructuredText
+
+ .. class:: handout
+
+ Uses normal reStructuredText as input.
+
+* One section per slide
+
+ .. class:: handout
+
+ Each first-level section is converted into a single slide.
+
+* (X)HTML output
+
+ .. class:: handout
+
+ Presentations can be viewed using any modern graphical web browser.
+ The browser must support CSS, JavaScript, and XHTML. S5 even works
+ with IE!
+
+* Themes
+
+ .. class:: handout
+
+ A variety of themes are available.
+
+* ``rst2s5.py``
+
+ .. class:: handout
+
+ The front-end tool to generate S5 slide shows.
+
+
+Features (1)
+============
+
+.. class:: left
+
+A flush-left paragraph
+
+.. class:: center
+
+A centered paragraph
+
+.. class:: right
+
+A flush-right paragraph
+
+Some colours: :black:`black` [black], :gray:`gray`, :silver:`silver`,
+:white:`white` [white], :maroon:`maroon`, :red:`red`,
+:magenta:`magenta`, :fuchsia:`fuchsia`, :pink:`pink`,
+:orange:`orange`, :yellow:`yellow`, :lime:`lime`, :green:`green`,
+:olive:`olive`, :teal:`teal`, :cyan:`cyan`, :aqua:`aqua`,
+:blue:`blue`, :navy:`navy`, :purple:`purple`
+
+Features (2)
+============
+
+`Some` `incremental` `text.`
+
+.. class:: incremental open
+
+ * :tiny:`tiny` (class & role name: "tiny", e.g. "``:tiny:`text```")
+ * :small:`small` ("small")
+ * normal (unstyled)
+ * :big:`big` ("big")
+ * :huge:`huge` ("huge")
+
+
+Checklist
+=========
+
+* The document title should be duplicated on each slide in the footer
+ (except for the first slide, ``slide0``, where the entire footer is
+ disabled).
+
+* The footer also contains a second line, "Location |bullet| Date"
+
+* There's no table of contents on the first slide (the directive is
+ disabled).
+
+* Handout material is not displayed in presentation mode.
+
+* The theme directories should be created, and the theme files copied
+ over.
diff --git a/test/functional/tests/standalone_rst_s5_html_1.py b/test/functional/tests/standalone_rst_s5_html_1.py
new file mode 100755
index 000000000..cb0d6f552
--- /dev/null
+++ b/test/functional/tests/standalone_rst_s5_html_1.py
@@ -0,0 +1,44 @@
+execfile('functional/tests/_standalone_rst_defaults.py')
+
+# Source and destination file names:
+test_source = 'standalone_rst_s5_html.txt'
+test_destination = 'standalone_rst_s5_html_1.html'
+
+# Keyword parameters passed to publish_file:
+writer_name = 's5_html'
+
+# Settings:
+settings_overrides['theme'] = 'small-black'
+
+
+# Extra functional tests.
+# Prefix all names with '_' to avoid confusing `docutils.core.publish_file`.
+
+import filecmp as _filecmp
+
+def _test_more(expected_dir, output_dir, test_case, parameters):
+ """Compare ``ui/<theme>`` directories."""
+ theme = settings_overrides.get('theme', 'default')
+ expected = '%s/%s/%s' % (expected_dir, 'ui', theme)
+ output = '%s/%s/%s' % (output_dir, 'ui', theme)
+ differences, uniques = _compare_directories(expected, output)
+ parts = []
+ if differences:
+ parts.append('The following files differ from the expected output:')
+ parts.extend(differences)
+ if uniques:
+ parts.append('The following paths are unique:')
+ parts.extend(uniques)
+ test_case.assert_(not parts, '\n'.join(parts))
+
+def _compare_directories(expected, output):
+ dircmp = _filecmp.dircmp(expected, output, ['.svn', 'CVS'])
+ differences = ['%s/%s' % (output, name) for name in dircmp.diff_files]
+ uniques = (['%s/%s' % (expected, name) for name in dircmp.left_only]
+ + ['%s/%s' % (output, name) for name in dircmp.right_only])
+ for subdir in dircmp.common_dirs:
+ diffs, uniqs = _compare_directories('%s/%s' % (expected, subdir),
+ '%s/%s' % (output, subdir))
+ differences.extend(diffs)
+ uniques.extend(uniqs)
+ return differences, uniques
diff --git a/test/functional/tests/standalone_rst_s5_html_2.py b/test/functional/tests/standalone_rst_s5_html_2.py
new file mode 100755
index 000000000..aea7a9207
--- /dev/null
+++ b/test/functional/tests/standalone_rst_s5_html_2.py
@@ -0,0 +1,7 @@
+# initialize with the settings & definitions from test 1:
+execfile('functional/tests/standalone_rst_s5_html_1.py')
+
+# overrides specific to this test:
+test_destination = 'standalone_rst_s5_html_2.html'
+del settings_overrides['theme'] # use the default
+settings_overrides['current_slide'] = 1
diff --git a/test/test_functional.py b/test/test_functional.py
index 1cebc2462..dcec9cf45 100755
--- a/test/test_functional.py
+++ b/test/test_functional.py
@@ -15,6 +15,7 @@ Read README.txt for details on how this is done.
import sys
import os
import os.path
+import shutil
import unittest
import difflib
import DocutilsTestSupport # must be imported before docutils
@@ -38,10 +39,22 @@ class FunctionalTestSuite(DocutilsTestSupport.CustomTestSuite):
"""Process all config files in functional/tests/."""
DocutilsTestSupport.CustomTestSuite.__init__(self)
os.chdir(DocutilsTestSupport.testroot)
+ self.clear_output_directory()
self.added = 0
os.path.walk(join_path(datadir, 'tests'), self.walker, None)
assert self.added, 'No functional tests found.'
+ def clear_output_directory(self):
+ files = os.listdir(os.path.join('functional', 'output'))
+ for f in files:
+ if f in ('README.txt', '.svn', 'CVS'):
+ continue # don't touch the infrastructure
+ path = os.path.join('functional', 'output', f)
+ if os.path.isdir(path):
+ shutil.rmtree(path)
+ else:
+ os.remove(path)
+
def walker(self, dummy, dirname, names):
"""
Process all config files among `names` in `dirname`.
@@ -75,31 +88,33 @@ class FunctionalTestCase(DocutilsTestSupport.CustomTestCase):
"""Process self.configfile."""
os.chdir(DocutilsTestSupport.testroot)
# Keyword parameters for publish_file:
- params = {}
+ namespace = {}
# Initialize 'settings_overrides' for test settings scripts,
# and disable configuration files:
- params['settings_overrides'] = {'_disable_config': 1}
+ namespace['settings_overrides'] = {'_disable_config': 1}
# Read the variables set in the default config file and in
- # the current config file into params:
- execfile(join_path(datadir, 'tests', '_default.py'), params)
- execfile(self.configfile, params)
+ # the current config file into namespace:
+ execfile(join_path(datadir, 'tests', '_default.py'), namespace)
+ execfile(self.configfile, namespace)
# Check for required settings:
- assert params.has_key('test_source'),\
+ assert namespace.has_key('test_source'),\
"No 'test_source' supplied in " + self.configfile
- assert params.has_key('test_destination'),\
+ assert namespace.has_key('test_destination'),\
"No 'test_destination' supplied in " + self.configfile
# Set source_path and destination_path if not given:
- params.setdefault('source_path',
- join_path(datadir, 'input',
- params['test_source']))
+ namespace.setdefault('source_path',
+ join_path(datadir, 'input',
+ namespace['test_source']))
# Path for actual output:
- params.setdefault('destination_path',
- join_path(datadir, 'output',
- params['test_destination']))
+ namespace.setdefault('destination_path',
+ join_path(datadir, 'output',
+ namespace['test_destination']))
# Path for expected output:
expected_path = join_path(datadir, 'expected',
- params['test_destination'])
- # test_source and test_destination aren't needed any more:
+ namespace['test_destination'])
+ # shallow copy of namespace to minimize:
+ params = namespace.copy()
+ # remove unneeded parameters:
del params['test_source']
del params['test_destination']
# Delete private stuff like params['__builtins__']:
@@ -137,6 +152,11 @@ class FunctionalTestCase(DocutilsTestSupport.CustomTestCase):
print >>sys.stderr, '\n%s:' % (self,)
print >>sys.stderr, diff
raise
+ # Execute optional function containing extra tests:
+ if namespace.has_key('_test_more'):
+ namespace['_test_more'](join_path(datadir, 'expected'),
+ join_path(datadir, 'output'),
+ self, namespace)
def suite():
diff --git a/test/test_parsers/test_rst/test_directives/test_target_notes.py b/test/test_parsers/test_rst/test_directives/test_target_notes.py
new file mode 100755
index 000000000..18dc1d207
--- /dev/null
+++ b/test/test_parsers/test_rst/test_directives/test_target_notes.py
@@ -0,0 +1,64 @@
+#! /usr/bin/env python
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+Tests for the target-notes directives.
+"""
+
+from __init__ import DocutilsTestSupport
+
+def suite():
+ s = DocutilsTestSupport.ParserTestSuite()
+ s.generateTests(totest)
+ return s
+
+totest = {}
+
+totest['target-notes'] = [
+["""\
+.. target-notes::
+""",
+"""\
+<document source="test data">
+ <pending>
+ .. internal attributes:
+ .transform: docutils.transforms.references.TargetNotes
+ .details:
+"""],
+["""\
+.. target-notes:: :class: custom
+""",
+"""\
+<document source="test data">
+ <pending>
+ .. internal attributes:
+ .transform: docutils.transforms.references.TargetNotes
+ .details:
+ class: ['custom']
+"""],
+["""\
+.. target-notes::
+ :class:
+""",
+"""\
+<document source="test data">
+ <system_message level="3" line="1" source="test data" type="ERROR">
+ <paragraph>
+ Error in "target-notes" directive:
+ invalid option value: (option: "class"; value: None)
+ argument required but none supplied.
+ <literal_block xml:space="preserve">
+ .. target-notes::
+ :class:
+"""],
+]
+
+
+if __name__ == '__main__':
+ import unittest
+ unittest.main(defaultTest='suite')
diff --git a/test/test_transforms/test_target_notes.py b/test/test_transforms/test_target_notes.py
new file mode 100755
index 000000000..cf625572d
--- /dev/null
+++ b/test/test_transforms/test_target_notes.py
@@ -0,0 +1,84 @@
+#! /usr/bin/env python
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+Tests for `docutils.transforms.references.TargetNotes` (via
+`docutils.transforms.universal.LastReaderPending`).
+"""
+
+from __init__ import DocutilsTestSupport
+from docutils.transforms.references import PropagateTargets, \
+ AnonymousHyperlinks, IndirectHyperlinks, ExternalTargets, \
+ InternalTargets, DanglingReferences, Footnotes
+from docutils.parsers.rst import Parser
+
+
+def suite():
+ parser = Parser()
+ s = DocutilsTestSupport.TransformTestSuite(parser)
+ s.generateTests(totest)
+ return s
+
+totest = {}
+
+totest['tables_of_contents'] = ((PropagateTargets, AnonymousHyperlinks,
+ IndirectHyperlinks,
+ ExternalTargets, InternalTargets,
+ DanglingReferences,
+ ), [
+["""\
+.. _target: http://exammple.org
+
+A reference to a target_.
+
+.. target-notes::
+""",
+"""\
+<document source="test data">
+ <target ids="target" names="target" refuri="http://exammple.org">
+ <paragraph>
+ A reference to a \n\
+ <reference name="target" refuri="http://exammple.org">
+ target
+ \n\
+ <footnote_reference auto="1" ids="id2" refid="id1">
+ .
+ <footnote auto="1" ids="id1" names="TARGET_NOTE:\\ id1">
+ <paragraph>
+ <reference refuri="http://exammple.org">
+ http://exammple.org
+"""],
+["""\
+.. _target: http://exammple.org
+
+A reference to a target_.
+
+.. target-notes:: :class: custom
+""",
+"""\
+<document source="test data">
+ <target ids="target" names="target" refuri="http://exammple.org">
+ <paragraph>
+ A reference to a \n\
+ <reference name="target" refuri="http://exammple.org">
+ target
+ <inline classes="custom">
+ \n\
+ <footnote_reference auto="1" classes="custom" ids="id2" refid="id1">
+ .
+ <footnote auto="1" ids="id1" names="TARGET_NOTE:\\ id1">
+ <paragraph>
+ <reference refuri="http://exammple.org">
+ http://exammple.org
+"""],
+])
+
+
+if __name__ == '__main__':
+ import unittest
+ unittest.main(defaultTest='suite')
diff --git a/tools/rst2s5.py b/tools/rst2s5.py
new file mode 100755
index 000000000..b4a9396d1
--- /dev/null
+++ b/tools/rst2s5.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+
+# Author: Chris Liechti
+# Contact: cliechti@gmx.net
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML slides using
+the S5 template system.
+"""
+
+try:
+ import locale
+ locale.setlocale(locale.LC_ALL, '')
+except:
+ pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates S5 (X)HTML slideshow documents from standalone '
+ 'reStructuredText sources. ' + default_description)
+
+publish_cmdline(writer_name='s5', description=description)