summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2006-01-09 20:44:25 +0000
committerwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2006-01-09 20:44:25 +0000
commitd77fdfef70e08114f57cbef5d91707df8717ea9f (patch)
tree49444e3486c0c333cb7b33dfa721296c08ee4ece
parent53cd16ca6ca5f638cbe5956988e88f9339e355cf (diff)
parent3993c4097756e9885bcfbd07cb1cc1e4e95e50e4 (diff)
downloaddocutils-0.4.tar.gz
Release 0.4: tagging released revisiondocutils-0.4
git-svn-id: http://svn.code.sf.net/p/docutils/code/tags/docutils-0.4@4268 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--BUGS.txt (renamed from docutils/BUGS.txt)0
-rw-r--r--COPYING.txt (renamed from docutils/COPYING.txt)0
-rw-r--r--FAQ.txt (renamed from docutils/FAQ.txt)0
-rw-r--r--HISTORY.txt (renamed from docutils/HISTORY.txt)0
-rw-r--r--MANIFEST.in (renamed from docutils/MANIFEST.in)0
-rw-r--r--README.txt (renamed from docutils/README.txt)0
-rw-r--r--RELEASE-NOTES.txt (renamed from docutils/RELEASE-NOTES.txt)0
-rw-r--r--THANKS.txt (renamed from docutils/THANKS.txt)0
-rw-r--r--docs/api/cmdline-tool.txt (renamed from docutils/docs/api/cmdline-tool.txt)0
-rw-r--r--docs/api/publisher.txt (renamed from docutils/docs/api/publisher.txt)0
-rw-r--r--docs/api/runtime-settings.txt (renamed from docutils/docs/api/runtime-settings.txt)0
-rw-r--r--docs/dev/distributing.txt (renamed from docutils/docs/dev/distributing.txt)0
-rw-r--r--docs/dev/enthought-plan.txt (renamed from docutils/docs/dev/enthought-plan.txt)0
-rw-r--r--docs/dev/enthought-rfp.txt (renamed from docutils/docs/dev/enthought-rfp.txt)0
-rw-r--r--docs/dev/hacking.txt (renamed from docutils/docs/dev/hacking.txt)0
-rw-r--r--docs/dev/policies.txt (renamed from docutils/docs/dev/policies.txt)0
-rw-r--r--docs/dev/pysource.dtd (renamed from docutils/docs/dev/pysource.dtd)0
-rw-r--r--docs/dev/pysource.txt (renamed from docutils/docs/dev/pysource.txt)0
-rw-r--r--docs/dev/release.txt (renamed from docutils/docs/dev/release.txt)0
-rw-r--r--docs/dev/repository.txt (renamed from docutils/docs/dev/repository.txt)0
-rw-r--r--docs/dev/rst/alternatives.txt (renamed from docutils/docs/dev/rst/alternatives.txt)0
-rw-r--r--docs/dev/rst/problems.txt (renamed from docutils/docs/dev/rst/problems.txt)0
-rw-r--r--docs/dev/semantics.txt (renamed from docutils/docs/dev/semantics.txt)0
-rw-r--r--docs/dev/testing.txt (renamed from docutils/docs/dev/testing.txt)0
-rw-r--r--docs/dev/todo.txt (renamed from docutils/docs/dev/todo.txt)0
-rw-r--r--docs/dev/website.txt (renamed from docutils/docs/dev/website.txt)0
-rw-r--r--docs/howto/html-stylesheets.txt (renamed from docutils/docs/howto/html-stylesheets.txt)0
-rw-r--r--docs/howto/i18n.txt (renamed from docutils/docs/howto/i18n.txt)0
-rw-r--r--docs/howto/rst-directives.txt (renamed from docutils/docs/howto/rst-directives.txt)0
-rw-r--r--docs/howto/rst-roles.txt (renamed from docutils/docs/howto/rst-roles.txt)0
-rw-r--r--docs/index.txt (renamed from docutils/docs/index.txt)0
-rw-r--r--docs/peps/pep-0256.txt (renamed from docutils/docs/peps/pep-0256.txt)0
-rw-r--r--docs/peps/pep-0257.txt (renamed from docutils/docs/peps/pep-0257.txt)0
-rw-r--r--docs/peps/pep-0258.txt (renamed from docutils/docs/peps/pep-0258.txt)0
-rw-r--r--docs/peps/pep-0287.txt (renamed from docutils/docs/peps/pep-0287.txt)0
-rw-r--r--docs/ref/doctree.txt (renamed from docutils/docs/ref/doctree.txt)0
-rw-r--r--docs/ref/docutils.dtd (renamed from docutils/docs/ref/docutils.dtd)0
-rw-r--r--docs/ref/rst/definitions.txt (renamed from docutils/docs/ref/rst/definitions.txt)0
-rw-r--r--docs/ref/rst/directives.txt (renamed from docutils/docs/ref/rst/directives.txt)0
-rw-r--r--docs/ref/rst/introduction.txt (renamed from docutils/docs/ref/rst/introduction.txt)0
-rw-r--r--docs/ref/rst/restructuredtext.txt (renamed from docutils/docs/ref/rst/restructuredtext.txt)0
-rw-r--r--docs/ref/rst/roles.txt (renamed from docutils/docs/ref/rst/roles.txt)0
-rw-r--r--docs/ref/soextblx.dtd (renamed from docutils/docs/ref/soextblx.dtd)0
-rw-r--r--docs/ref/transforms.txt (renamed from docutils/docs/ref/transforms.txt)0
-rw-r--r--docs/user/Makefile.docutils-update (renamed from docutils/docs/user/Makefile.docutils-update)0
-rw-r--r--docs/user/config.txt (renamed from docutils/docs/user/config.txt)0
-rw-r--r--docs/user/emacs.txt (renamed from docutils/docs/user/emacs.txt)0
-rw-r--r--docs/user/images/big-black.png (renamed from docutils/docs/user/images/big-black.png)bin19823 -> 19823 bytes
-rw-r--r--docs/user/images/big-white.png (renamed from docutils/docs/user/images/big-white.png)bin25697 -> 25697 bytes
-rw-r--r--docs/user/images/default.png (renamed from docutils/docs/user/images/default.png)bin59358 -> 59358 bytes
-rw-r--r--docs/user/images/happy_monkey.png (renamed from docutils/docs/user/images/happy_monkey.png)bin5202 -> 5202 bytes
-rw-r--r--docs/user/images/medium-black.png (renamed from docutils/docs/user/images/medium-black.png)bin24021 -> 24021 bytes
-rw-r--r--docs/user/images/medium-white.png (renamed from docutils/docs/user/images/medium-white.png)bin33756 -> 33756 bytes
-rw-r--r--docs/user/images/rsp-all.png (renamed from docutils/docs/user/images/rsp-all.png)bin32565 -> 32565 bytes
-rw-r--r--docs/user/images/rsp-breaks.png (renamed from docutils/docs/user/images/rsp-breaks.png)bin17754 -> 17754 bytes
-rw-r--r--docs/user/images/rsp-covers.png (renamed from docutils/docs/user/images/rsp-covers.png)bin19080 -> 19080 bytes
-rw-r--r--docs/user/images/rsp-cuts.png (renamed from docutils/docs/user/images/rsp-cuts.png)bin20751 -> 20751 bytes
-rw-r--r--docs/user/images/rsp-empty.png (renamed from docutils/docs/user/images/rsp-empty.png)bin4900 -> 4900 bytes
-rw-r--r--docs/user/images/rsp-objects.png (renamed from docutils/docs/user/images/rsp-objects.png)bin21291 -> 21291 bytes
-rw-r--r--docs/user/images/rsp.svg (renamed from docutils/docs/user/images/rsp.svg)0
-rw-r--r--docs/user/images/s5-files.png (renamed from docutils/docs/user/images/s5-files.png)bin25404 -> 25404 bytes
-rw-r--r--docs/user/images/s5-files.svg (renamed from docutils/docs/user/images/s5-files.svg)0
-rw-r--r--docs/user/images/small-black.png (renamed from docutils/docs/user/images/small-black.png)bin41144 -> 41144 bytes
-rw-r--r--docs/user/images/small-white.png (renamed from docutils/docs/user/images/small-white.png)bin41120 -> 41120 bytes
-rw-r--r--docs/user/latex.txt (renamed from docutils/docs/user/latex.txt)0
-rw-r--r--docs/user/links.txt (renamed from docutils/docs/user/links.txt)0
-rw-r--r--docs/user/mailing-lists.txt (renamed from docutils/docs/user/mailing-lists.txt)0
-rw-r--r--docs/user/rst/cheatsheet.txt (renamed from docutils/docs/user/rst/cheatsheet.txt)0
-rw-r--r--docs/user/rst/demo.txt (renamed from docutils/docs/user/rst/demo.txt)0
-rw-r--r--docs/user/rst/images/ball1.gif (renamed from docutils/docs/user/rst/images/ball1.gif)bin4361 -> 4361 bytes
-rw-r--r--docs/user/rst/images/biohazard.png (renamed from docutils/docs/user/rst/images/biohazard.png)bin179 -> 179 bytes
-rw-r--r--docs/user/rst/images/title.png (renamed from docutils/docs/user/rst/images/title.png)bin1171 -> 1171 bytes
-rw-r--r--docs/user/rst/quickref.html (renamed from docutils/docs/user/rst/quickref.html)0
-rw-r--r--docs/user/rst/quickstart.txt (renamed from docutils/docs/user/rst/quickstart.txt)0
-rw-r--r--docs/user/slide-shows.txt (renamed from docutils/docs/user/slide-shows.txt)0
-rw-r--r--docs/user/tools.txt (renamed from docutils/docs/user/tools.txt)0
-rw-r--r--docutils/__init__.py (renamed from docutils/docutils/__init__.py)0
-rw-r--r--docutils/core.py (renamed from docutils/docutils/core.py)0
-rw-r--r--docutils/docutils.conf (renamed from docutils/docutils/docutils.conf)0
-rw-r--r--docutils/examples.py (renamed from docutils/docutils/examples.py)0
-rw-r--r--docutils/frontend.py (renamed from docutils/docutils/frontend.py)0
-rw-r--r--docutils/io.py (renamed from docutils/docutils/io.py)0
-rw-r--r--docutils/languages/__init__.py (renamed from docutils/docutils/languages/__init__.py)0
-rw-r--r--docutils/languages/af.py (renamed from docutils/docutils/languages/af.py)0
-rw-r--r--docutils/languages/ca.py (renamed from docutils/docutils/languages/ca.py)0
-rw-r--r--docutils/languages/cs.py (renamed from docutils/docutils/languages/cs.py)0
-rw-r--r--docutils/languages/de.py (renamed from docutils/docutils/languages/de.py)0
-rw-r--r--docutils/languages/en.py (renamed from docutils/docutils/languages/en.py)0
-rw-r--r--docutils/languages/eo.py (renamed from docutils/docutils/languages/eo.py)0
-rw-r--r--docutils/languages/es.py (renamed from docutils/docutils/languages/es.py)0
-rw-r--r--docutils/languages/fi.py (renamed from docutils/docutils/languages/fi.py)0
-rw-r--r--docutils/languages/fr.py (renamed from docutils/docutils/languages/fr.py)0
-rw-r--r--docutils/languages/it.py (renamed from docutils/docutils/languages/it.py)0
-rw-r--r--docutils/languages/ja.py (renamed from docutils/docutils/languages/ja.py)0
-rw-r--r--docutils/languages/nl.py (renamed from docutils/docutils/languages/nl.py)0
-rw-r--r--docutils/languages/pt_br.py (renamed from docutils/docutils/languages/pt_br.py)0
-rw-r--r--docutils/languages/ru.py (renamed from docutils/docutils/languages/ru.py)0
-rw-r--r--docutils/languages/sk.py (renamed from docutils/docutils/languages/sk.py)0
-rw-r--r--docutils/languages/sv.py (renamed from docutils/docutils/languages/sv.py)0
-rw-r--r--docutils/languages/zh_cn.py (renamed from docutils/docutils/languages/zh_cn.py)0
-rw-r--r--docutils/languages/zh_tw.py (renamed from docutils/docutils/languages/zh_tw.py)0
-rw-r--r--docutils/nodes.py (renamed from docutils/docutils/nodes.py)0
-rw-r--r--docutils/parsers/__init__.py (renamed from docutils/docutils/parsers/__init__.py)0
-rw-r--r--docutils/parsers/null.py (renamed from docutils/docutils/parsers/null.py)0
-rw-r--r--docutils/parsers/rst/__init__.py (renamed from docutils/docutils/parsers/rst/__init__.py)0
-rw-r--r--docutils/parsers/rst/directives/__init__.py (renamed from docutils/docutils/parsers/rst/directives/__init__.py)0
-rw-r--r--docutils/parsers/rst/directives/admonitions.py (renamed from docutils/docutils/parsers/rst/directives/admonitions.py)0
-rw-r--r--docutils/parsers/rst/directives/body.py (renamed from docutils/docutils/parsers/rst/directives/body.py)0
-rw-r--r--docutils/parsers/rst/directives/html.py (renamed from docutils/docutils/parsers/rst/directives/html.py)0
-rw-r--r--docutils/parsers/rst/directives/images.py (renamed from docutils/docutils/parsers/rst/directives/images.py)0
-rw-r--r--docutils/parsers/rst/directives/misc.py (renamed from docutils/docutils/parsers/rst/directives/misc.py)0
-rw-r--r--docutils/parsers/rst/directives/parts.py (renamed from docutils/docutils/parsers/rst/directives/parts.py)0
-rw-r--r--docutils/parsers/rst/directives/references.py (renamed from docutils/docutils/parsers/rst/directives/references.py)0
-rw-r--r--docutils/parsers/rst/directives/tables.py (renamed from docutils/docutils/parsers/rst/directives/tables.py)0
-rw-r--r--docutils/parsers/rst/include/README.txt (renamed from docutils/docutils/parsers/rst/include/README.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamsa.txt (renamed from docutils/docutils/parsers/rst/include/isoamsa.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamsb.txt (renamed from docutils/docutils/parsers/rst/include/isoamsb.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamsc.txt (renamed from docutils/docutils/parsers/rst/include/isoamsc.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamsn.txt (renamed from docutils/docutils/parsers/rst/include/isoamsn.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamso.txt (renamed from docutils/docutils/parsers/rst/include/isoamso.txt)0
-rw-r--r--docutils/parsers/rst/include/isoamsr.txt (renamed from docutils/docutils/parsers/rst/include/isoamsr.txt)0
-rw-r--r--docutils/parsers/rst/include/isobox.txt (renamed from docutils/docutils/parsers/rst/include/isobox.txt)0
-rw-r--r--docutils/parsers/rst/include/isocyr1.txt (renamed from docutils/docutils/parsers/rst/include/isocyr1.txt)0
-rw-r--r--docutils/parsers/rst/include/isocyr2.txt (renamed from docutils/docutils/parsers/rst/include/isocyr2.txt)0
-rw-r--r--docutils/parsers/rst/include/isodia.txt (renamed from docutils/docutils/parsers/rst/include/isodia.txt)0
-rw-r--r--docutils/parsers/rst/include/isogrk1.txt (renamed from docutils/docutils/parsers/rst/include/isogrk1.txt)0
-rw-r--r--docutils/parsers/rst/include/isogrk2.txt (renamed from docutils/docutils/parsers/rst/include/isogrk2.txt)0
-rw-r--r--docutils/parsers/rst/include/isogrk3.txt (renamed from docutils/docutils/parsers/rst/include/isogrk3.txt)0
-rw-r--r--docutils/parsers/rst/include/isogrk4-wide.txt (renamed from docutils/docutils/parsers/rst/include/isogrk4-wide.txt)0
-rw-r--r--docutils/parsers/rst/include/isogrk4.txt (renamed from docutils/docutils/parsers/rst/include/isogrk4.txt)0
-rw-r--r--docutils/parsers/rst/include/isolat1.txt (renamed from docutils/docutils/parsers/rst/include/isolat1.txt)0
-rw-r--r--docutils/parsers/rst/include/isolat2.txt (renamed from docutils/docutils/parsers/rst/include/isolat2.txt)0
-rw-r--r--docutils/parsers/rst/include/isomfrk-wide.txt (renamed from docutils/docutils/parsers/rst/include/isomfrk-wide.txt)0
-rw-r--r--docutils/parsers/rst/include/isomfrk.txt (renamed from docutils/docutils/parsers/rst/include/isomfrk.txt)0
-rw-r--r--docutils/parsers/rst/include/isomopf-wide.txt (renamed from docutils/docutils/parsers/rst/include/isomopf-wide.txt)0
-rw-r--r--docutils/parsers/rst/include/isomopf.txt (renamed from docutils/docutils/parsers/rst/include/isomopf.txt)0
-rw-r--r--docutils/parsers/rst/include/isomscr-wide.txt (renamed from docutils/docutils/parsers/rst/include/isomscr-wide.txt)0
-rw-r--r--docutils/parsers/rst/include/isomscr.txt (renamed from docutils/docutils/parsers/rst/include/isomscr.txt)0
-rw-r--r--docutils/parsers/rst/include/isonum.txt (renamed from docutils/docutils/parsers/rst/include/isonum.txt)0
-rw-r--r--docutils/parsers/rst/include/isopub.txt (renamed from docutils/docutils/parsers/rst/include/isopub.txt)0
-rw-r--r--docutils/parsers/rst/include/isotech.txt (renamed from docutils/docutils/parsers/rst/include/isotech.txt)0
-rw-r--r--docutils/parsers/rst/include/mmlalias.txt (renamed from docutils/docutils/parsers/rst/include/mmlalias.txt)0
-rw-r--r--docutils/parsers/rst/include/mmlextra-wide.txt (renamed from docutils/docutils/parsers/rst/include/mmlextra-wide.txt)0
-rw-r--r--docutils/parsers/rst/include/mmlextra.txt (renamed from docutils/docutils/parsers/rst/include/mmlextra.txt)0
-rw-r--r--docutils/parsers/rst/include/s5defs.txt (renamed from docutils/docutils/parsers/rst/include/s5defs.txt)0
-rw-r--r--docutils/parsers/rst/include/xhtml1-lat1.txt (renamed from docutils/docutils/parsers/rst/include/xhtml1-lat1.txt)0
-rw-r--r--docutils/parsers/rst/include/xhtml1-special.txt (renamed from docutils/docutils/parsers/rst/include/xhtml1-special.txt)0
-rw-r--r--docutils/parsers/rst/include/xhtml1-symbol.txt (renamed from docutils/docutils/parsers/rst/include/xhtml1-symbol.txt)0
-rw-r--r--docutils/parsers/rst/languages/__init__.py (renamed from docutils/docutils/parsers/rst/languages/__init__.py)0
-rw-r--r--docutils/parsers/rst/languages/af.py (renamed from docutils/docutils/parsers/rst/languages/af.py)0
-rw-r--r--docutils/parsers/rst/languages/ca.py (renamed from docutils/docutils/parsers/rst/languages/ca.py)0
-rw-r--r--docutils/parsers/rst/languages/cs.py (renamed from docutils/docutils/parsers/rst/languages/cs.py)0
-rw-r--r--docutils/parsers/rst/languages/de.py (renamed from docutils/docutils/parsers/rst/languages/de.py)0
-rw-r--r--docutils/parsers/rst/languages/en.py (renamed from docutils/docutils/parsers/rst/languages/en.py)0
-rw-r--r--docutils/parsers/rst/languages/eo.py (renamed from docutils/docutils/parsers/rst/languages/eo.py)0
-rw-r--r--docutils/parsers/rst/languages/es.py (renamed from docutils/docutils/parsers/rst/languages/es.py)0
-rw-r--r--docutils/parsers/rst/languages/fi.py (renamed from docutils/docutils/parsers/rst/languages/fi.py)0
-rw-r--r--docutils/parsers/rst/languages/fr.py (renamed from docutils/docutils/parsers/rst/languages/fr.py)0
-rw-r--r--docutils/parsers/rst/languages/it.py (renamed from docutils/docutils/parsers/rst/languages/it.py)0
-rw-r--r--docutils/parsers/rst/languages/ja.py (renamed from docutils/docutils/parsers/rst/languages/ja.py)0
-rw-r--r--docutils/parsers/rst/languages/nl.py (renamed from docutils/docutils/parsers/rst/languages/nl.py)0
-rw-r--r--docutils/parsers/rst/languages/pt_br.py (renamed from docutils/docutils/parsers/rst/languages/pt_br.py)0
-rw-r--r--docutils/parsers/rst/languages/ru.py (renamed from docutils/docutils/parsers/rst/languages/ru.py)0
-rw-r--r--docutils/parsers/rst/languages/sk.py (renamed from docutils/docutils/parsers/rst/languages/sk.py)0
-rw-r--r--docutils/parsers/rst/languages/sv.py (renamed from docutils/docutils/parsers/rst/languages/sv.py)0
-rw-r--r--docutils/parsers/rst/languages/zh_cn.py (renamed from docutils/docutils/parsers/rst/languages/zh_cn.py)0
-rw-r--r--docutils/parsers/rst/languages/zh_tw.py (renamed from docutils/docutils/parsers/rst/languages/zh_tw.py)0
-rw-r--r--docutils/parsers/rst/roles.py (renamed from docutils/docutils/parsers/rst/roles.py)0
-rw-r--r--docutils/parsers/rst/states.py (renamed from docutils/docutils/parsers/rst/states.py)0
-rw-r--r--docutils/parsers/rst/tableparser.py (renamed from docutils/docutils/parsers/rst/tableparser.py)0
-rw-r--r--docutils/readers/__init__.py (renamed from docutils/docutils/readers/__init__.py)0
-rw-r--r--docutils/readers/doctree.py (renamed from docutils/docutils/readers/doctree.py)0
-rw-r--r--docutils/readers/pep.py (renamed from docutils/docutils/readers/pep.py)0
-rw-r--r--docutils/readers/python/__init__.py (renamed from docutils/docutils/readers/python/__init__.py)0
-rw-r--r--docutils/readers/python/moduleparser.py (renamed from docutils/docutils/readers/python/moduleparser.py)0
-rw-r--r--docutils/readers/python/pynodes.py (renamed from docutils/docutils/readers/python/pynodes.py)0
-rw-r--r--docutils/readers/standalone.py (renamed from docutils/docutils/readers/standalone.py)0
-rw-r--r--docutils/statemachine.py (renamed from docutils/docutils/statemachine.py)0
-rw-r--r--docutils/transforms/__init__.py (renamed from docutils/docutils/transforms/__init__.py)0
-rw-r--r--docutils/transforms/components.py (renamed from docutils/docutils/transforms/components.py)0
-rw-r--r--docutils/transforms/frontmatter.py (renamed from docutils/docutils/transforms/frontmatter.py)0
-rw-r--r--docutils/transforms/misc.py (renamed from docutils/docutils/transforms/misc.py)0
-rw-r--r--docutils/transforms/parts.py (renamed from docutils/docutils/transforms/parts.py)0
-rw-r--r--docutils/transforms/peps.py (renamed from docutils/docutils/transforms/peps.py)0
-rw-r--r--docutils/transforms/references.py (renamed from docutils/docutils/transforms/references.py)0
-rw-r--r--docutils/transforms/universal.py (renamed from docutils/docutils/transforms/universal.py)0
-rw-r--r--docutils/transforms/writer_aux.py (renamed from docutils/docutils/transforms/writer_aux.py)0
-rw-r--r--docutils/urischemes.py (renamed from docutils/docutils/urischemes.py)0
-rw-r--r--docutils/utils.py (renamed from docutils/docutils/utils.py)0
-rw-r--r--docutils/writers/__init__.py (renamed from docutils/docutils/writers/__init__.py)0
-rw-r--r--docutils/writers/docutils_xml.py (renamed from docutils/docutils/writers/docutils_xml.py)0
-rw-r--r--docutils/writers/html4css1/__init__.py (renamed from docutils/docutils/writers/html4css1/__init__.py)0
-rw-r--r--docutils/writers/html4css1/html4css1.css (renamed from docutils/docutils/writers/html4css1/html4css1.css)0
-rw-r--r--docutils/writers/latex2e/__init__.py (renamed from docutils/docutils/writers/latex2e/__init__.py)0
-rw-r--r--docutils/writers/latex2e/latex2e.tex (renamed from docutils/docutils/writers/latex2e/latex2e.tex)0
-rw-r--r--docutils/writers/newlatex2e/__init__.py (renamed from docutils/docutils/writers/newlatex2e/__init__.py)0
-rw-r--r--docutils/writers/newlatex2e/base.tex (renamed from docutils/docutils/writers/newlatex2e/base.tex)0
-rw-r--r--docutils/writers/newlatex2e/unicode_map.py (renamed from docutils/docutils/writers/newlatex2e/unicode_map.py)0
-rw-r--r--docutils/writers/null.py (renamed from docutils/docutils/writers/null.py)0
-rw-r--r--docutils/writers/pep_html/__init__.py (renamed from docutils/docutils/writers/pep_html/__init__.py)0
-rw-r--r--docutils/writers/pep_html/pep.css (renamed from docutils/docutils/writers/pep_html/pep.css)0
-rw-r--r--docutils/writers/pep_html/template.txt (renamed from docutils/docutils/writers/pep_html/template.txt)0
-rw-r--r--docutils/writers/pseudoxml.py (renamed from docutils/docutils/writers/pseudoxml.py)0
-rw-r--r--docutils/writers/s5_html/__init__.py (renamed from docutils/docutils/writers/s5_html/__init__.py)0
-rw-r--r--docutils/writers/s5_html/themes/README.txt (renamed from docutils/docutils/writers/s5_html/themes/README.txt)0
-rw-r--r--docutils/writers/s5_html/themes/big-black/__base__ (renamed from docutils/docutils/writers/s5_html/themes/big-black/__base__)0
-rw-r--r--docutils/writers/s5_html/themes/big-black/framing.css (renamed from docutils/docutils/writers/s5_html/themes/big-black/framing.css)0
-rw-r--r--docutils/writers/s5_html/themes/big-black/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/big-black/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/big-white/framing.css (renamed from docutils/docutils/writers/s5_html/themes/big-white/framing.css)0
-rw-r--r--docutils/writers/s5_html/themes/big-white/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/big-white/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/blank.gif (renamed from docutils/docutils/writers/s5_html/themes/default/blank.gif)bin49 -> 49 bytes
-rw-r--r--docutils/writers/s5_html/themes/default/framing.css (renamed from docutils/docutils/writers/s5_html/themes/default/framing.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/iepngfix.htc (renamed from docutils/docutils/writers/s5_html/themes/default/iepngfix.htc)0
-rw-r--r--docutils/writers/s5_html/themes/default/opera.css (renamed from docutils/docutils/writers/s5_html/themes/default/opera.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/outline.css (renamed from docutils/docutils/writers/s5_html/themes/default/outline.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/default/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/print.css (renamed from docutils/docutils/writers/s5_html/themes/default/print.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/s5-core.css (renamed from docutils/docutils/writers/s5_html/themes/default/s5-core.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/slides.css (renamed from docutils/docutils/writers/s5_html/themes/default/slides.css)0
-rw-r--r--docutils/writers/s5_html/themes/default/slides.js (renamed from docutils/docutils/writers/s5_html/themes/default/slides.js)0
-rw-r--r--docutils/writers/s5_html/themes/medium-black/__base__ (renamed from docutils/docutils/writers/s5_html/themes/medium-black/__base__)0
-rw-r--r--docutils/writers/s5_html/themes/medium-black/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/medium-black/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/medium-white/framing.css (renamed from docutils/docutils/writers/s5_html/themes/medium-white/framing.css)0
-rw-r--r--docutils/writers/s5_html/themes/medium-white/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/medium-white/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/small-black/__base__ (renamed from docutils/docutils/writers/s5_html/themes/small-black/__base__)0
-rw-r--r--docutils/writers/s5_html/themes/small-black/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/small-black/pretty.css)0
-rw-r--r--docutils/writers/s5_html/themes/small-white/framing.css (renamed from docutils/docutils/writers/s5_html/themes/small-white/framing.css)0
-rw-r--r--docutils/writers/s5_html/themes/small-white/pretty.css (renamed from docutils/docutils/writers/s5_html/themes/small-white/pretty.css)0
-rw-r--r--extras/optparse.py (renamed from docutils/extras/optparse.py)0
-rw-r--r--extras/roman.py (renamed from docutils/extras/roman.py)0
-rw-r--r--extras/textwrap.py (renamed from docutils/extras/textwrap.py)0
-rwxr-xr-xinstall.py (renamed from docutils/install.py)0
-rw-r--r--licenses/docutils.conf (renamed from docutils/licenses/docutils.conf)0
-rw-r--r--licenses/gpl.txt (renamed from docutils/licenses/gpl.txt)0
-rw-r--r--licenses/python-2-1-1.txt (renamed from docutils/licenses/python-2-1-1.txt)0
-rw-r--r--licenses/python-2-2.txt (renamed from docutils/licenses/python-2-2.txt)0
-rw-r--r--licenses/python-2-3.txt (renamed from docutils/licenses/python-2-3.txt)0
-rw-r--r--sandbox/README.txt65
-rw-r--r--sandbox/aahz/Effective/EffDirectives.py146
-rw-r--r--sandbox/aahz/Effective/EffMap.py12
-rw-r--r--sandbox/aahz/Effective/EffParser.py45
-rw-r--r--sandbox/aahz/Effective/EffTransformer.py24
-rw-r--r--sandbox/aahz/Effective/MIFwriter.py777
-rw-r--r--sandbox/aahz/Effective/bug_report.py43
-rw-r--r--sandbox/aahz/Effective/eff_publish.py55
-rw-r--r--sandbox/aahz/OO/Makefile27
-rw-r--r--sandbox/aahz/OO/OOdirectives.py72
-rw-r--r--sandbox/aahz/OO/OOtext.py127
-rw-r--r--sandbox/aahz/OO/OOwriter.py676
-rw-r--r--sandbox/aahz/OO/graphics_output.py28
-rw-r--r--sandbox/aahz/OO/open_office.py33
-rwxr-xr-xsandbox/aahz/OO/publish.py27
-rw-r--r--sandbox/agurtovoy/html_frames/README.txt22
-rw-r--r--sandbox/agurtovoy/html_frames/tools/htmlframes.py22
-rw-r--r--sandbox/agurtovoy/html_frames/tools/stylesheets/frames.css160
-rw-r--r--sandbox/agurtovoy/html_frames/writers/html4frames.py383
-rw-r--r--sandbox/amk/abc/Makefile5
-rw-r--r--sandbox/amk/abc/README17
-rw-r--r--sandbox/amk/abc/TODO4
-rw-r--r--sandbox/amk/abc/abc.py157
-rwxr-xr-xsandbox/amk/abc/rst2html.py27
-rw-r--r--sandbox/amk/abc/sample.rst33
-rw-r--r--sandbox/axk/chm/README.txt23
-rw-r--r--sandbox/axk/chm/docutils.chmbin893065 -> 0 bytes
-rw-r--r--sandbox/axk/chm/docutils.conf2
-rw-r--r--sandbox/axk/default.css244
-rw-r--r--sandbox/axk/viewcvs/README.txt53
-rw-r--r--sandbox/axk/viewcvs/docutils.conf2
-rw-r--r--sandbox/axk/viewcvs/viewcvs.py2833
-rw-r--r--sandbox/bbum/00README.txt14
-rw-r--r--sandbox/bbum/ChangeLog38
-rw-r--r--sandbox/bbum/DocArticle/00README.txt15
-rw-r--r--sandbox/bbum/DocArticle/DocArticle/DocArticleText.py37
-rw-r--r--sandbox/bbum/DocArticle/DocArticle/__init__.py988
-rw-r--r--sandbox/bbum/DocArticle/LICENSE.txt22
-rwxr-xr-xsandbox/bbum/DocArticle/docarticle.py27
-rwxr-xr-xsandbox/bbum/DocArticle/setup.py18
-rw-r--r--sandbox/blais/css_tricks/README.txt10
-rw-r--r--sandbox/blais/css_tricks/boxed_titles/castro.pngbin20739 -> 0 bytes
-rw-r--r--sandbox/blais/css_tricks/boxed_titles/clinton.pngbin16130 -> 0 bytes
-rw-r--r--sandbox/blais/css_tricks/boxed_titles/docutils.conf3
-rw-r--r--sandbox/blais/css_tricks/boxed_titles/index.txt37
-rw-r--r--sandbox/blais/css_tricks/boxed_titles/style.css16
-rw-r--r--sandbox/blais/css_tricks/section_based/docutils.conf3
-rw-r--r--sandbox/blais/css_tricks/section_based/index.txt35
-rw-r--r--sandbox/blais/css_tricks/section_based/style.css11
-rwxr-xr-xsandbox/blais/emacs-movie/demo-adjust.txt740
-rw-r--r--sandbox/blais/movesec/README.txt34
-rwxr-xr-xsandbox/blais/movesec/docutils-movesec175
-rw-r--r--sandbox/blais/pickle_writer/README.txt10
-rw-r--r--sandbox/blais/pickle_writer/pickle.py32
-rw-r--r--sandbox/blais/rstserver/README.txt12
-rw-r--r--sandbox/blais/rstserver/TODO.txt38
-rwxr-xr-xsandbox/blais/rstserver/bin/rst-server.cgi272
-rw-r--r--sandbox/blais/rstserver/etc/rst-server.php21
-rw-r--r--sandbox/cben/make/Makefile11
-rw-r--r--sandbox/cben/make/Makefile.docutils454
-rw-r--r--sandbox/cben/make/Makefile.docutils.txt617
-rw-r--r--sandbox/cben/make/README.txt23
-rwxr-xr-xsandbox/cben/make/make2rst.py57
-rw-r--r--sandbox/cben/rolehack/README.txt66
-rwxr-xr-xsandbox/cben/rolehack/imgmathhack.py98
-rwxr-xr-xsandbox/cben/rolehack/mathhack.py27
-rw-r--r--sandbox/cben/rolehack/rolehack.py192
-rw-r--r--sandbox/cliechti/README.txt8
-rw-r--r--sandbox/cliechti/aafigure/README.txt177
-rw-r--r--sandbox/cliechti/aafigure/aa.py93
-rw-r--r--sandbox/cliechti/aafigure/aafigure.py308
-rw-r--r--sandbox/cliechti/aafigure/aafigure_directive.py49
-rw-r--r--sandbox/cliechti/aafigure/makefile5
-rw-r--r--sandbox/cliechti/aafigure/rst2html.py27
-rw-r--r--sandbox/cliechti/aafigure/svg.py145
-rw-r--r--sandbox/cliechti/html2rst/README.txt48
-rw-r--r--sandbox/cliechti/html2rst/html2rst.py453
-rw-r--r--sandbox/davidg/pysource_reader/en.py31
-rw-r--r--sandbox/davidg/pysource_reader/nodes.py98
-rw-r--r--sandbox/delza/parsers/rst/directives/misc.py246
-rw-r--r--sandbox/dkuhlman/Docs/Makefile61
-rw-r--r--sandbox/dkuhlman/Docs/rstpythonlatex_intro.txt215
-rw-r--r--sandbox/dkuhlman/Extract/Makefile64
-rwxr-xr-xsandbox/dkuhlman/Extract/extract_doc.py436
-rw-r--r--sandbox/dkuhlman/Extract/extract_doc.txt222
-rw-r--r--sandbox/dkuhlman/README_docpy102
-rw-r--r--sandbox/dkuhlman/docutils/docs/rst/pythonlatex_quickref.html1593
-rw-r--r--sandbox/dkuhlman/docutils/docutils/writers/python_latex.py1114
-rw-r--r--sandbox/dkuhlman/docutils/test/DocutilsTestSupport.py698
-rw-r--r--sandbox/dkuhlman/docutils/test/README.test_python_latex36
-rw-r--r--sandbox/dkuhlman/docutils/test/test_writers/test_python_latex.py490
-rwxr-xr-xsandbox/dkuhlman/docutils/tools/python_latex.py25
-rw-r--r--sandbox/dpriest/XSL-FO/FOP Colour Names.txt32
-rw-r--r--sandbox/dpriest/XSL-FO/pdf_debug.xsl2179
-rw-r--r--sandbox/dpriest/XSL-FO/pdf_publication.xsl2181
-rw-r--r--sandbox/dpriest/csvtable/csv-directive_test-external_table.txt5
-rw-r--r--sandbox/dpriest/csvtable/csv-directive_test.txt31
-rwxr-xr-xsandbox/dpriest/csvtable/csvpublish.py26
-rw-r--r--sandbox/dpriest/csvtable/csvtable.py257
-rw-r--r--sandbox/dpriest/csvtable/csvtable.txt93
-rw-r--r--sandbox/dreamcatcher/ChangeLog13
-rw-r--r--sandbox/dreamcatcher/reportlabs.diff1258
-rw-r--r--sandbox/dreamcatcher/rlpdf/README.txt2
-rw-r--r--sandbox/dreamcatcher/rlpdf/__init__.py5
-rw-r--r--sandbox/dreamcatcher/rlpdf/rllicense.txt29
-rw-r--r--sandbox/dreamcatcher/rlpdf/rlpdf.py789
-rw-r--r--sandbox/dreamcatcher/rlpdf/rltemplate.py143
-rw-r--r--sandbox/dreamcatcher/rlpdf/stylesheet.py212
-rwxr-xr-xsandbox/dreamcatcher/tools/pdf.py22
-rw-r--r--sandbox/edloper/docpy/asyncore.rst295
-rwxr-xr-xsandbox/edloper/docpy/docpy.py323
-rw-r--r--sandbox/edloper/epytext/epytext.py95
-rw-r--r--sandbox/edloper/epytext/epytext.test26
-rwxr-xr-xsandbox/edloper/epytext/publish_epytext.py26
-rw-r--r--sandbox/edloper/roles/README.txt83
-rw-r--r--sandbox/edloper/roles/roles.py296
-rw-r--r--sandbox/edloper/roles/states.py2840
-rw-r--r--sandbox/fwiemann/.fsfsbackup4
-rw-r--r--sandbox/fwiemann/commit-email/README.txt21
-rw-r--r--sandbox/fwiemann/commit-email/commit-email.patch135
-rwxr-xr-xsandbox/fwiemann/fsfsbackup.sh90
-rw-r--r--sandbox/fwiemann/plugins/interface.py256
-rwxr-xr-xsandbox/fwiemann/release.sh490
-rw-r--r--sandbox/fwiemann/users.txt70
-rw-r--r--sandbox/fwiemann/xhtml2rest/README.txt15
-rwxr-xr-xsandbox/fwiemann/xhtml2rest/xhtml2rest.py551
-rw-r--r--sandbox/grubert/README.txt72
-rw-r--r--sandbox/grubert/check25
-rw-r--r--sandbox/grubert/directory_structur24
-rw-r--r--sandbox/grubert/docutils.sty54
-rwxr-xr-xsandbox/grubert/latex.py23
-rw-r--r--sandbox/grubert/latex/__init__.py1
-rw-r--r--sandbox/grubert/latex2e-README.txt158
-rw-r--r--sandbox/grubert/ltx-test.txt476
-rw-r--r--sandbox/grubert/making_a_writer.txt133
-rwxr-xr-xsandbox/grubert/man.py26
-rw-r--r--sandbox/grubert/man/ManPageWriter.py952
-rw-r--r--sandbox/grubert/man/__init__.py1
-rwxr-xr-xsandbox/grubert/pdf124
-rw-r--r--sandbox/grubert/pdftest_1.txt127
-rw-r--r--sandbox/grubert/pdftest_2.txt49
-rw-r--r--sandbox/grubert/rllicense.txt29
-rw-r--r--sandbox/grubert/rlpdf/README.txt2
-rw-r--r--sandbox/grubert/rlpdf/__init__.py5
-rw-r--r--sandbox/grubert/rlpdf/rlpdf.py671
-rw-r--r--sandbox/grubert/rlpdf/rltemplate.py143
-rw-r--r--sandbox/grubert/rlpdf/stylesheet.py158
-rwxr-xr-xsandbox/grubert/runtest227
-rw-r--r--sandbox/grubert/split-test-txt.py61
-rw-r--r--sandbox/grubert/style.tex30
-rw-r--r--sandbox/grubert/test/README.txt332
-rw-r--r--sandbox/grubert/test/characters.txt76
-rw-r--r--sandbox/grubert/test/docinfo-2.txt24
-rw-r--r--sandbox/grubert/test/docinfo.txt24
-rw-r--r--sandbox/grubert/test/footnotes.txt69
-rw-r--r--sandbox/grubert/test/from_test_txt-01.txt66
-rw-r--r--sandbox/grubert/test/from_test_txt-02.txt12
-rw-r--r--sandbox/grubert/test/from_test_txt-03.txt40
-rw-r--r--sandbox/grubert/test/from_test_txt-04.txt20
-rw-r--r--sandbox/grubert/test/from_test_txt-05.txt27
-rw-r--r--sandbox/grubert/test/from_test_txt-06.txt12
-rw-r--r--sandbox/grubert/test/from_test_txt-07.txt14
-rw-r--r--sandbox/grubert/test/from_test_txt-08.txt27
-rw-r--r--sandbox/grubert/test/from_test_txt-09.txt17
-rw-r--r--sandbox/grubert/test/from_test_txt-10.txt13
-rw-r--r--sandbox/grubert/test/from_test_txt-11.txt8
-rw-r--r--sandbox/grubert/test/from_test_txt-12.txt32
-rw-r--r--sandbox/grubert/test/from_test_txt-13.txt25
-rw-r--r--sandbox/grubert/test/from_test_txt-14.txt9
-rw-r--r--sandbox/grubert/test/from_test_txt-15.txt39
-rw-r--r--sandbox/grubert/test/from_test_txt-16.txt124
-rw-r--r--sandbox/grubert/test/from_test_txt-17.txt9
-rw-r--r--sandbox/grubert/test/from_test_txt-18.txt21
-rw-r--r--sandbox/grubert/test/from_test_txt-19.txt21
-rw-r--r--sandbox/grubert/test/images.txt25
-rw-r--r--sandbox/grubert/test/internal_href.txt14
-rw-r--r--sandbox/grubert/test/links.txt14
-rw-r--r--sandbox/grubert/test/literal.txt91
-rw-r--r--sandbox/grubert/test/no-citations.txt9
-rw-r--r--sandbox/grubert/test/tables-multirow.txt60
-rw-r--r--sandbox/grubert/test/tables.txt159
-rw-r--r--sandbox/grubert/test/toc.txt24
-rwxr-xr-xsandbox/grubert/tools/pdf.py22
-rw-r--r--sandbox/gschwant/docfactory/LICENSE.txt32
-rw-r--r--sandbox/gschwant/docfactory/NOTES.txt52
-rw-r--r--sandbox/gschwant/docfactory/README.txt420
-rw-r--r--sandbox/gschwant/docfactory/createdoc.py25
-rw-r--r--sandbox/gschwant/docfactory/doc/FAQ.txt52
-rw-r--r--sandbox/gschwant/docfactory/doc/HISTORY.txt85
-rw-r--r--sandbox/gschwant/docfactory/doc/docutils.conf14
-rw-r--r--sandbox/gschwant/docfactory/doc/downloads.txt11
-rw-r--r--sandbox/gschwant/docfactory/doc/head.html8
-rw-r--r--sandbox/gschwant/docfactory/doc/index.html24
-rw-r--r--sandbox/gschwant/docfactory/doc/navigation_l.html68
-rw-r--r--sandbox/gschwant/docfactory/doc/pics/DF.pngbin82144 -> 0 bytes
-rw-r--r--sandbox/gschwant/docfactory/doc/pics/screenshot1.jpgbin163761 -> 0 bytes
-rw-r--r--sandbox/gschwant/docfactory/doc/pics/screenshot2.jpgbin61033 -> 0 bytes
-rw-r--r--sandbox/gschwant/docfactory/doc/screenshots.txt11
-rw-r--r--sandbox/gschwant/docfactory/doc/start.txt26
-rw-r--r--sandbox/gschwant/docfactory/doc/stylesheets/df.css411
-rw-r--r--sandbox/gschwant/docfactory/doc/stylesheets/navigation_l.css38
-rw-r--r--sandbox/gschwant/docfactory/docfactory.icobin3638 -> 0 bytes
-rwxr-xr-xsandbox/gschwant/docfactory/docfactory.py10
-rw-r--r--sandbox/gschwant/docfactory/docfactory2exe.py17
-rw-r--r--sandbox/gschwant/docfactory/docutils.conf14
-rw-r--r--sandbox/gschwant/docfactory/factory/__init__.py0
-rw-r--r--sandbox/gschwant/docfactory/factory/browser.py198
-rw-r--r--sandbox/gschwant/docfactory/factory/controls.py183
-rw-r--r--sandbox/gschwant/docfactory/factory/dialogs.py788
-rw-r--r--sandbox/gschwant/docfactory/factory/docutilsadapter.py112
-rw-r--r--sandbox/gschwant/docfactory/factory/images.py460
-rwxr-xr-xsandbox/gschwant/docfactory/factory/main.py1708
-rw-r--r--sandbox/gschwant/docfactory/factory/stylesheets.py528
-rw-r--r--sandbox/gschwant/docfactory/factory/throbimages.py7340
-rwxr-xr-xsandbox/gschwant/docfactory/setup.py39
-rw-r--r--sandbox/gschwant/htmlnav/README.txt183
-rw-r--r--sandbox/gschwant/htmlnav/rst2htmlnav.py19
-rw-r--r--sandbox/gschwant/htmlnav/setup.py21
-rw-r--r--sandbox/gschwant/htmlnav/writer/htmlnav.py193
-rw-r--r--sandbox/holdenweb/asyncore.rst275
-rw-r--r--sandbox/ianb/extractor/default.css245
-rw-r--r--sandbox/ianb/extractor/extractor.py336
-rw-r--r--sandbox/ianb/wiki/Wiki.py250
-rw-r--r--sandbox/ianb/wiki/docs/Wiki.txt54
-rw-r--r--sandbox/infrastructure/cvs-reorg.sh119
-rwxr-xr-xsandbox/infrastructure/docutils-update307
-rw-r--r--sandbox/jensj/latex_math/README.txt21
-rw-r--r--sandbox/jensj/latex_math/docs/latex_math.txt269
-rw-r--r--sandbox/jensj/latex_math/test/test.txt51
-rw-r--r--sandbox/jensj/latex_math/tools/rst2latex.py67
-rw-r--r--sandbox/jensj/latex_math/tools/rst2mathml.py522
-rw-r--r--sandbox/lalo/lout_writer/README.txt1
-rw-r--r--sandbox/lalo/lout_writer/lout.py1304
-rw-r--r--sandbox/lalo/lout_writer/setup.py3
-rwxr-xr-xsandbox/lalo/lout_writer/tools/rst2lout.py25
-rwxr-xr-xsandbox/mly/restblog/Makefile36
-rwxr-xr-xsandbox/mly/restblog/README.txt5
-rwxr-xr-xsandbox/mly/restblog/date_index.py39
-rwxr-xr-xsandbox/mly/restblog/default.css43
-rwxr-xr-xsandbox/mly/restblog/keyw_index.py3
-rwxr-xr-xsandbox/mly/restblog/main_index.py28
-rwxr-xr-xsandbox/mly/restblog/restblog.py32
-rwxr-xr-xsandbox/mly/restblog/subj_index.py3
-rw-r--r--sandbox/mmgilbe/rst.py497
-rw-r--r--sandbox/mwh/README2
-rw-r--r--sandbox/mwh/advopostwriter.py59
-rw-r--r--sandbox/oliverr/docbook/CHANGES.txt45
-rw-r--r--sandbox/oliverr/docbook/QUESTIONS.txt38
-rw-r--r--sandbox/oliverr/docbook/README.txt18
-rw-r--r--sandbox/oliverr/docbook/TODO.txt7
-rwxr-xr-xsandbox/oliverr/docbook/rst2docbook.py28
-rw-r--r--sandbox/oliverr/docbook/setup.py23
-rw-r--r--sandbox/oliverr/docbook/writer/docbook.py1091
-rw-r--r--sandbox/oliverr/ht/MANIFEST4
-rw-r--r--sandbox/oliverr/ht/README.txt20
-rw-r--r--sandbox/oliverr/ht/TODO.txt10
-rwxr-xr-xsandbox/oliverr/ht/rst2ht.py29
-rw-r--r--sandbox/oliverr/ht/setup.py24
-rw-r--r--sandbox/oliverr/ht/writer/hthtml.py148
-rw-r--r--sandbox/paultremblay/README.txt36
-rw-r--r--sandbox/paultremblay/docutils_nest/README.txt238
-rw-r--r--sandbox/paultremblay/docutils_nest/configure.py146
-rw-r--r--sandbox/paultremblay/docutils_nest/data/configure.xml9
-rw-r--r--sandbox/paultremblay/docutils_nest/doc/README.txt236
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/__init__.py3
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/inline_to_xml.py459
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/nest_docutils.py123
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/nest_utils.py181
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/nested_inline.py352
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/options_trem.py386
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/read_config.py143
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/rst_options.py106
-rw-r--r--sandbox/paultremblay/docutils_nest/docutils_nest/well_formed_xml.py73
-rw-r--r--sandbox/paultremblay/docutils_nest/options_trem.py377
-rw-r--r--sandbox/paultremblay/docutils_nest/read_config.py144
-rwxr-xr-xsandbox/paultremblay/docutils_nest/scripts/docutils-nest-xml.py37
-rw-r--r--sandbox/paultremblay/docutils_nest/setup.py28
-rw-r--r--sandbox/paultremblay/docutils_nest/test_files/test.txt10
-rw-r--r--sandbox/paultremblay/rst_to_docbook/README.txt2
-rw-r--r--sandbox/paultremblay/rst_to_docbook/configure.py138
-rw-r--r--sandbox/paultremblay/rst_to_docbook/data/configure.xml5
-rw-r--r--sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names.xsl117
-rw-r--r--sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names_tokenize.xsl57
-rw-r--r--sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_to_docbook.xsl343
-rw-r--r--sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStructure_to_docbook.xsl387
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/__init__.py3
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/convert_rst_to_docbook.py194
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/location.py6
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/options_trem.py387
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/output.xml93
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/read_config.py131
-rw-r--r--sandbox/paultremblay/rst_to_docbook/rst_to_docbook/xsl_convert.py145
-rw-r--r--sandbox/paultremblay/rst_to_docbook/scripts/rst2docbook.py25
-rw-r--r--sandbox/paultremblay/rst_to_docbook/setup.py44
-rw-r--r--sandbox/paultremblay/rst_to_docbook/test_files/reStructure_docbook_example.rst65
-rw-r--r--sandbox/paultremblay/rst_to_docbook/test_files/simple.xml3
-rw-r--r--sandbox/paultremblay/rst_to_docbook/test_files/simple.xsl18
-rw-r--r--sandbox/paultremblay/rst_to_docbook/test_files/test_simple.rst11
-rw-r--r--sandbox/pobrien/LinuxFormat/LXFwriter.py984
-rw-r--r--sandbox/pobrien/LinuxFormat/__init__.py1
-rwxr-xr-xsandbox/pobrien/LinuxFormat/rest2lxf.py26
-rw-r--r--sandbox/pobrien/OpenOffice/OOdirectives.py77
-rw-r--r--sandbox/pobrien/OpenOffice/OOtext.py708
-rw-r--r--sandbox/pobrien/OpenOffice/OOwriter.py599
-rw-r--r--sandbox/pobrien/OpenOffice/__init__.py1
-rwxr-xr-xsandbox/pobrien/OpenOffice/rest2oo.py63
-rwxr-xr-xsandbox/pobrien/OpenOffice/rest2oopseudo.py24
-rwxr-xr-xsandbox/pobrien/OpenOffice/rest2ooxml.py27
-rw-r--r--sandbox/pobrien/WriterTemplate.py1081
-rw-r--r--sandbox/pobrien/dwArticle/__init__.py1
-rw-r--r--sandbox/richard/ZReST/Makefile15
-rw-r--r--sandbox/richard/ZReST/README.txt48
-rw-r--r--sandbox/richard/ZReST/TODO.txt6
-rw-r--r--sandbox/richard/ZReST/ZReST.py288
-rw-r--r--sandbox/richard/ZReST/__init__.py27
-rw-r--r--sandbox/richard/ZReST/dtml/manage_addZReSTForm.dtml45
-rw-r--r--sandbox/richard/ZReST/dtml/manage_editForm.dtml88
-rw-r--r--sandbox/richard/ZReST/refresh.txt1
-rw-r--r--sandbox/richard/ZReST/version.txt1
-rw-r--r--sandbox/richard/pythonpoint/example_slides.txt38
-rw-r--r--sandbox/richard/pythonpoint/pythonpoint.py328
-rw-r--r--sandbox/richard/pythonpoint/readme.txt5
-rwxr-xr-xsandbox/richard/pythonpoint/rst2pythonpoint.py25
-rw-r--r--sandbox/simonb/inline_target.txt48
-rw-r--r--sandbox/stylesheets/index.txt48
-rw-r--r--sandbox/stylesheets/voidspace.css137
-rwxr-xr-xsandbox/tibs/pysource/__init__.py5
-rwxr-xr-xsandbox/tibs/pysource/buildhtml.py354
-rwxr-xr-xsandbox/tibs/pysource/buildtree.py403
-rw-r--r--sandbox/tibs/pysource/doc/readme.rtxt189
-rw-r--r--sandbox/tibs/pysource/doc/whythis.rtxt122
-rw-r--r--sandbox/tibs/pysource/group-notes.txt220
-rwxr-xr-xsandbox/tibs/pysource/html.py1163
-rwxr-xr-xsandbox/tibs/pysource/notes/notes.py115
-rw-r--r--sandbox/tibs/pysource/notes/notes.txt7
-rw-r--r--sandbox/tibs/pysource/notes/roles.txt61
-rw-r--r--sandbox/tibs/pysource/notes/scope.txt19
-rwxr-xr-xsandbox/tibs/pysource/notes/string.html225
-rw-r--r--sandbox/tibs/pysource/notes/thoughts.txt170
-rwxr-xr-xsandbox/tibs/pysource/pysource.py262
-rwxr-xr-xsandbox/tibs/pysource/rjhack.py58
-rw-r--r--sandbox/tibs/pysource/test/readme.txt27
-rw-r--r--sandbox/tibs/pysource/test/test.doctest12
-rwxr-xr-xsandbox/tibs/pysource/test/test.py124
-rw-r--r--sandbox/tibs/pysource/test/test.rtxt442
-rwxr-xr-xsandbox/tibs/pysource/test/testassign.py12
-rwxr-xr-xsandbox/tibs/pysource/test/testfunc.py34
-rwxr-xr-xsandbox/tibs/pysource/test/testinterpreted.py44
-rwxr-xr-xsandbox/tibs/pysource/test/testinterpreted2.py37
-rwxr-xr-xsandbox/tibs/pysource/test/testsimp.py12
-rwxr-xr-xsandbox/tibs/pysource/test/testyield.py8
-rwxr-xr-xsandbox/tibs/pysource/transform.py358
-rwxr-xr-xsandbox/tibs/pysource/utils.py474
-rwxr-xr-xsandbox/tibs/pysource/visit.py2074
-rw-r--r--sandbox/tibs/pysource2/__init__.py10
-rw-r--r--sandbox/tibs/pysource2/log.txt113
-rw-r--r--sandbox/tibs/pysource2/not_a_directory0
-rw-r--r--sandbox/tibs/pysource2/package.py185
-rwxr-xr-xsandbox/tibs/pysource2/pysrc2html.py46
-rw-r--r--sandbox/tibs/pysource2/reader.py31
-rw-r--r--sandbox/tibs/pysource2/temp.rst81
-rw-r--r--sandbox/tibs/pysource2/temp.txt79
-rw-r--r--sandbox/tibs/pysource2/test_package.py179
-rw-r--r--sandbox/tibs/pysource2/test_reader.py127
-rw-r--r--sandbox/tibs/pysource2/transform.py157
-rw-r--r--sandbox/tibs/pysource2/trivial_package/__init__.py2
-rw-r--r--sandbox/tibs/pysource2/trivial_package/file1.py14
-rw-r--r--sandbox/tibs/pysource2/trivial_package/file2.py2
-rw-r--r--sandbox/tibs/pysource2/trivial_package/not_python3
-rw-r--r--sandbox/tibs/pysource2/trivial_package/sub_package/__init__.py0
-rw-r--r--sandbox/wilk/french/docutils.conf3
-rw-r--r--sandbox/wilk/french/quickstart-fr.txt375
-rwxr-xr-xsetup.py (renamed from docutils/setup.py)0
-rw-r--r--test/DocutilsTestSupport.py (renamed from docutils/test/DocutilsTestSupport.py)0
-rwxr-xr-xtest/alltests.py (renamed from docutils/test/alltests.py)0
-rwxr-xr-xtest/coverage.sh (renamed from docutils/test/coverage.sh)0
-rw-r--r--test/data/config_1.txt (renamed from docutils/test/data/config_1.txt)0
-rw-r--r--test/data/config_2.txt (renamed from docutils/test/data/config_2.txt)0
-rw-r--r--test/data/config_error_handler.txt (renamed from docutils/test/data/config_error_handler.txt)0
-rw-r--r--test/data/config_list.txt (renamed from docutils/test/data/config_list.txt)0
-rw-r--r--test/data/config_list_2.txt (renamed from docutils/test/data/config_list_2.txt)0
-rw-r--r--test/data/config_old.txt (renamed from docutils/test/data/config_old.txt)0
-rw-r--r--test/data/csv_data.txt (renamed from docutils/test/data/csv_data.txt)0
-rw-r--r--test/data/csv_dep.txt (renamed from docutils/test/data/csv_dep.txt)0
-rw-r--r--test/data/dependencies.txt (renamed from docutils/test/data/dependencies.txt)0
-rw-r--r--test/data/include.txt (renamed from docutils/test/data/include.txt)0
-rw-r--r--test/data/raw.txt (renamed from docutils/test/data/raw.txt)0
-rw-r--r--test/data/stylesheet.txt (renamed from docutils/test/data/stylesheet.txt)0
-rw-r--r--test/docutils.conf (renamed from docutils/test/docutils.conf)0
-rw-r--r--test/docutils_difflib.py (renamed from docutils/test/docutils_difflib.py)0
-rw-r--r--test/functional/README.txt (renamed from docutils/test/functional/README.txt)0
-rw-r--r--test/functional/expected/compact_lists.html (renamed from docutils/test/functional/expected/compact_lists.html)0
-rw-r--r--test/functional/expected/dangerous.html (renamed from docutils/test/functional/expected/dangerous.html)0
-rw-r--r--test/functional/expected/field_name_limit.html (renamed from docutils/test/functional/expected/field_name_limit.html)0
-rw-r--r--test/functional/expected/latex_docinfo.tex (renamed from docutils/test/functional/expected/latex_docinfo.tex)0
-rw-r--r--test/functional/expected/misc_rst_html4css1.html (renamed from docutils/test/functional/expected/misc_rst_html4css1.html)0
-rw-r--r--test/functional/expected/pep_html.html (renamed from docutils/test/functional/expected/pep_html.html)0
-rw-r--r--test/functional/expected/standalone_rst_html4css1.html (renamed from docutils/test/functional/expected/standalone_rst_html4css1.html)0
-rw-r--r--test/functional/expected/standalone_rst_latex.tex (renamed from docutils/test/functional/expected/standalone_rst_latex.tex)0
-rw-r--r--test/functional/expected/standalone_rst_pseudoxml.txt (renamed from docutils/test/functional/expected/standalone_rst_pseudoxml.txt)0
-rw-r--r--test/functional/expected/standalone_rst_s5_html_1.html (renamed from docutils/test/functional/expected/standalone_rst_s5_html_1.html)0
-rw-r--r--test/functional/expected/standalone_rst_s5_html_2.html (renamed from docutils/test/functional/expected/standalone_rst_s5_html_2.html)0
-rw-r--r--test/functional/expected/ui/default/blank.gif (renamed from docutils/test/functional/expected/ui/default/blank.gif)bin49 -> 49 bytes
-rw-r--r--test/functional/expected/ui/default/framing.css (renamed from docutils/test/functional/expected/ui/default/framing.css)0
-rw-r--r--test/functional/expected/ui/default/iepngfix.htc (renamed from docutils/test/functional/expected/ui/default/iepngfix.htc)0
-rw-r--r--test/functional/expected/ui/default/opera.css (renamed from docutils/test/functional/expected/ui/default/opera.css)0
-rw-r--r--test/functional/expected/ui/default/outline.css (renamed from docutils/test/functional/expected/ui/default/outline.css)0
-rw-r--r--test/functional/expected/ui/default/pretty.css (renamed from docutils/test/functional/expected/ui/default/pretty.css)0
-rw-r--r--test/functional/expected/ui/default/print.css (renamed from docutils/test/functional/expected/ui/default/print.css)0
-rw-r--r--test/functional/expected/ui/default/s5-core.css (renamed from docutils/test/functional/expected/ui/default/s5-core.css)0
-rw-r--r--test/functional/expected/ui/default/slides.css (renamed from docutils/test/functional/expected/ui/default/slides.css)0
-rw-r--r--test/functional/expected/ui/default/slides.js (renamed from docutils/test/functional/expected/ui/default/slides.js)0
-rw-r--r--test/functional/expected/ui/small-black/blank.gif (renamed from docutils/test/functional/expected/ui/small-black/blank.gif)bin49 -> 49 bytes
-rw-r--r--test/functional/expected/ui/small-black/framing.css (renamed from docutils/test/functional/expected/ui/small-black/framing.css)0
-rw-r--r--test/functional/expected/ui/small-black/iepngfix.htc (renamed from docutils/test/functional/expected/ui/small-black/iepngfix.htc)0
-rw-r--r--test/functional/expected/ui/small-black/opera.css (renamed from docutils/test/functional/expected/ui/small-black/opera.css)0
-rw-r--r--test/functional/expected/ui/small-black/outline.css (renamed from docutils/test/functional/expected/ui/small-black/outline.css)0
-rw-r--r--test/functional/expected/ui/small-black/pretty.css (renamed from docutils/test/functional/expected/ui/small-black/pretty.css)0
-rw-r--r--test/functional/expected/ui/small-black/print.css (renamed from docutils/test/functional/expected/ui/small-black/print.css)0
-rw-r--r--test/functional/expected/ui/small-black/s5-core.css (renamed from docutils/test/functional/expected/ui/small-black/s5-core.css)0
-rw-r--r--test/functional/expected/ui/small-black/slides.css (renamed from docutils/test/functional/expected/ui/small-black/slides.css)0
-rw-r--r--test/functional/expected/ui/small-black/slides.js (renamed from docutils/test/functional/expected/ui/small-black/slides.js)0
-rw-r--r--test/functional/input/compact_lists.txt (renamed from docutils/test/functional/input/compact_lists.txt)0
-rw-r--r--test/functional/input/dangerous.txt (renamed from docutils/test/functional/input/dangerous.txt)0
-rw-r--r--test/functional/input/data/custom_roles.txt (renamed from docutils/test/functional/input/data/custom_roles.txt)0
-rw-r--r--test/functional/input/data/errors.txt (renamed from docutils/test/functional/input/data/errors.txt)0
-rw-r--r--test/functional/input/data/header_footer.txt (renamed from docutils/test/functional/input/data/header_footer.txt)0
-rw-r--r--test/functional/input/data/latex.txt (renamed from docutils/test/functional/input/data/latex.txt)0
-rw-r--r--test/functional/input/data/list_table.txt (renamed from docutils/test/functional/input/data/list_table.txt)0
-rw-r--r--test/functional/input/data/nonalphanumeric.txt (renamed from docutils/test/functional/input/data/nonalphanumeric.txt)0
-rw-r--r--test/functional/input/data/standard.txt (renamed from docutils/test/functional/input/data/standard.txt)0
-rw-r--r--test/functional/input/data/table_colspan.txt (renamed from docutils/test/functional/input/data/table_colspan.txt)0
-rw-r--r--test/functional/input/data/table_complex.txt (renamed from docutils/test/functional/input/data/table_complex.txt)0
-rw-r--r--test/functional/input/data/table_rowspan.txt (renamed from docutils/test/functional/input/data/table_rowspan.txt)0
-rw-r--r--test/functional/input/data/unicode.txt (renamed from docutils/test/functional/input/data/unicode.txt)0
-rw-r--r--test/functional/input/field_list.txt (renamed from docutils/test/functional/input/field_list.txt)0
-rw-r--r--test/functional/input/latex_docinfo.txt (renamed from docutils/test/functional/input/latex_docinfo.txt)0
-rw-r--r--test/functional/input/pep_html.txt (renamed from docutils/test/functional/input/pep_html.txt)0
-rw-r--r--test/functional/input/simple.txt (renamed from docutils/test/functional/input/simple.txt)0
-rw-r--r--test/functional/input/standalone_rst_html4css1.txt (renamed from docutils/test/functional/input/standalone_rst_html4css1.txt)0
-rw-r--r--test/functional/input/standalone_rst_latex.txt (renamed from docutils/test/functional/input/standalone_rst_latex.txt)0
-rw-r--r--test/functional/input/standalone_rst_newlatex.txt (renamed from docutils/test/functional/input/standalone_rst_newlatex.txt)0
-rw-r--r--test/functional/input/standalone_rst_pseudoxml.txt (renamed from docutils/test/functional/input/standalone_rst_pseudoxml.txt)0
-rw-r--r--test/functional/input/standalone_rst_s5_html.txt (renamed from docutils/test/functional/input/standalone_rst_s5_html.txt)0
-rw-r--r--test/functional/output/README.txt (renamed from docutils/test/functional/output/README.txt)0
-rw-r--r--test/functional/tests/_default.py (renamed from docutils/test/functional/tests/_default.py)0
-rw-r--r--test/functional/tests/_standalone_rst_defaults.py (renamed from docutils/test/functional/tests/_standalone_rst_defaults.py)0
-rw-r--r--test/functional/tests/compact_lists.py (renamed from docutils/test/functional/tests/compact_lists.py)0
-rw-r--r--test/functional/tests/dangerous.py (renamed from docutils/test/functional/tests/dangerous.py)0
-rw-r--r--test/functional/tests/field_name_limit.py (renamed from docutils/test/functional/tests/field_name_limit.py)0
-rw-r--r--test/functional/tests/latex_docinfo.py (renamed from docutils/test/functional/tests/latex_docinfo.py)0
-rw-r--r--test/functional/tests/misc_rst_html4css1.py (renamed from docutils/test/functional/tests/misc_rst_html4css1.py)0
-rw-r--r--test/functional/tests/pep_html.py (renamed from docutils/test/functional/tests/pep_html.py)0
-rw-r--r--test/functional/tests/standalone_rst_html4css1.py (renamed from docutils/test/functional/tests/standalone_rst_html4css1.py)0
-rw-r--r--test/functional/tests/standalone_rst_latex.py (renamed from docutils/test/functional/tests/standalone_rst_latex.py)0
-rw-r--r--test/functional/tests/standalone_rst_pseudoxml.py (renamed from docutils/test/functional/tests/standalone_rst_pseudoxml.py)0
-rwxr-xr-xtest/functional/tests/standalone_rst_s5_html_1.py (renamed from docutils/test/functional/tests/standalone_rst_s5_html_1.py)0
-rwxr-xr-xtest/functional/tests/standalone_rst_s5_html_2.py (renamed from docutils/test/functional/tests/standalone_rst_s5_html_2.py)0
-rw-r--r--test/package_unittest.py (renamed from docutils/test/package_unittest.py)0
-rwxr-xr-xtest/test_dependencies.py (renamed from docutils/test/test_dependencies.py)0
-rwxr-xr-xtest/test_functional.py (renamed from docutils/test/test_functional.py)0
-rwxr-xr-xtest/test_io.py (renamed from docutils/test/test_io.py)0
-rwxr-xr-xtest/test_language.py (renamed from docutils/test/test_language.py)0
-rwxr-xr-xtest/test_nodes.py (renamed from docutils/test/test_nodes.py)0
-rw-r--r--test/test_parsers/__init__.py (renamed from docutils/test/test_parsers/__init__.py)0
-rw-r--r--test/test_parsers/test_rst/__init__.py (renamed from docutils/test/test_parsers/test_rst/__init__.py)0
-rw-r--r--test/test_parsers/test_rst/includes/include9.txt (renamed from docutils/test/test_parsers/test_rst/includes/include9.txt)0
-rwxr-xr-xtest/test_parsers/test_rst/test_SimpleTableParser.py (renamed from docutils/test/test_parsers/test_rst/test_SimpleTableParser.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_TableParser.py (renamed from docutils/test/test_parsers/test_rst/test_TableParser.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_block_quotes.py (renamed from docutils/test/test_parsers/test_rst/test_block_quotes.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_bullet_lists.py (renamed from docutils/test/test_parsers/test_rst/test_bullet_lists.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_citations.py (renamed from docutils/test/test_parsers/test_rst/test_citations.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_comments.py (renamed from docutils/test/test_parsers/test_rst/test_comments.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_definition_lists.py (renamed from docutils/test/test_parsers/test_rst/test_definition_lists.py)0
-rw-r--r--test/test_parsers/test_rst/test_directives/__init__.py (renamed from docutils/test/test_parsers/test_rst/test_directives/__init__.py)0
-rw-r--r--test/test_parsers/test_rst/test_directives/empty.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/empty.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include 11.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include 11.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include1.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include1.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include10.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include10.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include2.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include2.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include3.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include3.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/include8.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/include8.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/includes/include4.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/includes/include4.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/includes/include5.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/includes/include5.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/includes/more/include6.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/includes/more/include6.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt)0
-rw-r--r--test/test_parsers/test_rst/test_directives/raw1.txt (renamed from docutils/test/test_parsers/test_rst/test_directives/raw1.txt)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_admonitions.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_admonitions.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_compound.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_compound.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_container.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_container.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_contents.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_contents.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_date.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_date.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_decorations.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_decorations.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_default_role.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_default_role.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_figures.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_figures.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_images.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_images.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_include.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_include.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_line_blocks.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_line_blocks.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_meta.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_meta.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_raw.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_raw.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_replace.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_replace.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_role.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_role.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_rubrics.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_rubrics.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_sidebars.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_sidebars.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_tables.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_tables.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_target_notes.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_target_notes.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_test_directives.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_test_directives.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_topics.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_topics.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_unicode.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_unicode.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_directives/test_unknown.py (renamed from docutils/test/test_parsers/test_rst/test_directives/test_unknown.py)0
-rw-r--r--test/test_parsers/test_rst/test_directives/utf-16.csv (renamed from docutils/test/test_parsers/test_rst/test_directives/utf-16.csv)bin386 -> 386 bytes
-rwxr-xr-xtest/test_parsers/test_rst/test_doctest_blocks.py (renamed from docutils/test/test_parsers/test_rst/test_doctest_blocks.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_east_asian_text.py (renamed from docutils/test/test_parsers/test_rst/test_east_asian_text.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_enumerated_lists.py (renamed from docutils/test/test_parsers/test_rst/test_enumerated_lists.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_field_lists.py (renamed from docutils/test/test_parsers/test_rst/test_field_lists.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_footnotes.py (renamed from docutils/test/test_parsers/test_rst/test_footnotes.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_functions.py (renamed from docutils/test/test_parsers/test_rst/test_functions.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_inline_markup.py (renamed from docutils/test/test_parsers/test_rst/test_inline_markup.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_interpreted.py (renamed from docutils/test/test_parsers/test_rst/test_interpreted.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_line_blocks.py (renamed from docutils/test/test_parsers/test_rst/test_line_blocks.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_literal_blocks.py (renamed from docutils/test/test_parsers/test_rst/test_literal_blocks.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_option_lists.py (renamed from docutils/test/test_parsers/test_rst/test_option_lists.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_outdenting.py (renamed from docutils/test/test_parsers/test_rst/test_outdenting.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_paragraphs.py (renamed from docutils/test/test_parsers/test_rst/test_paragraphs.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_section_headers.py (renamed from docutils/test/test_parsers/test_rst/test_section_headers.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_substitutions.py (renamed from docutils/test/test_parsers/test_rst/test_substitutions.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_tables.py (renamed from docutils/test/test_parsers/test_rst/test_tables.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_targets.py (renamed from docutils/test/test_parsers/test_rst/test_targets.py)0
-rwxr-xr-xtest/test_parsers/test_rst/test_transitions.py (renamed from docutils/test/test_parsers/test_rst/test_transitions.py)0
-rwxr-xr-xtest/test_publisher.py (renamed from docutils/test/test_publisher.py)0
-rw-r--r--test/test_readers/__init__.py (renamed from docutils/test/test_readers/__init__.py)0
-rw-r--r--test/test_readers/test_pep/__init__.py (renamed from docutils/test/test_readers/test_pep/__init__.py)0
-rwxr-xr-xtest/test_readers/test_pep/test_inline_markup.py (renamed from docutils/test/test_readers/test_pep/test_inline_markup.py)0
-rwxr-xr-xtest/test_readers/test_pep/test_rfc2822.py (renamed from docutils/test/test_readers/test_pep/test_rfc2822.py)0
-rw-r--r--test/test_readers/test_python/__init__.py (renamed from docutils/test/test_readers/test_python/__init__.py)0
-rwxr-xr-xtest/test_readers/test_python/showast (renamed from docutils/test/test_readers/test_python/showast)0
-rwxr-xr-xtest/test_readers/test_python/showdoc (renamed from docutils/test/test_readers/test_python/showdoc)0
-rwxr-xr-xtest/test_readers/test_python/showparse (renamed from docutils/test/test_readers/test_python/showparse)0
-rwxr-xr-xtest/test_readers/test_python/showtok (renamed from docutils/test/test_readers/test_python/showtok)0
-rwxr-xr-xtest/test_readers/test_python/test_functions.py (renamed from docutils/test/test_readers/test_python/test_functions.py)0
-rwxr-xr-xtest/test_readers/test_python/test_parser.py (renamed from docutils/test/test_readers/test_python/test_parser.py)0
-rwxr-xr-xtest/test_readers/test_python/test_token_parser.py (renamed from docutils/test/test_readers/test_python/test_token_parser.py)0
-rwxr-xr-xtest/test_settings.py (renamed from docutils/test/test_settings.py)0
-rwxr-xr-xtest/test_statemachine.py (renamed from docutils/test/test_statemachine.py)0
-rw-r--r--test/test_transforms/__init__.py (renamed from docutils/test/test_transforms/__init__.py)0
-rwxr-xr-xtest/test_transforms/test___init__.py (renamed from docutils/test/test_transforms/test___init__.py)0
-rwxr-xr-xtest/test_transforms/test_class.py (renamed from docutils/test/test_transforms/test_class.py)0
-rwxr-xr-xtest/test_transforms/test_contents.py (renamed from docutils/test/test_transforms/test_contents.py)0
-rwxr-xr-xtest/test_transforms/test_docinfo.py (renamed from docutils/test/test_transforms/test_docinfo.py)0
-rwxr-xr-xtest/test_transforms/test_doctitle.py (renamed from docutils/test/test_transforms/test_doctitle.py)0
-rwxr-xr-xtest/test_transforms/test_expose_internals.py (renamed from docutils/test/test_transforms/test_expose_internals.py)0
-rwxr-xr-xtest/test_transforms/test_filter.py (renamed from docutils/test/test_transforms/test_filter.py)0
-rwxr-xr-xtest/test_transforms/test_footnotes.py (renamed from docutils/test/test_transforms/test_footnotes.py)0
-rwxr-xr-xtest/test_transforms/test_hyperlinks.py (renamed from docutils/test/test_transforms/test_hyperlinks.py)0
-rwxr-xr-xtest/test_transforms/test_messages.py (renamed from docutils/test/test_transforms/test_messages.py)0
-rwxr-xr-xtest/test_transforms/test_peps.py (renamed from docutils/test/test_transforms/test_peps.py)0
-rwxr-xr-xtest/test_transforms/test_sectnum.py (renamed from docutils/test/test_transforms/test_sectnum.py)0
-rwxr-xr-xtest/test_transforms/test_strip_comments.py (renamed from docutils/test/test_transforms/test_strip_comments.py)0
-rwxr-xr-xtest/test_transforms/test_substitutions.py (renamed from docutils/test/test_transforms/test_substitutions.py)0
-rwxr-xr-xtest/test_transforms/test_target_notes.py (renamed from docutils/test/test_transforms/test_target_notes.py)0
-rwxr-xr-xtest/test_transforms/test_transitions.py (renamed from docutils/test/test_transforms/test_transitions.py)0
-rwxr-xr-xtest/test_transforms/test_writer_aux.py (renamed from docutils/test/test_transforms/test_writer_aux.py)0
-rwxr-xr-xtest/test_utils.py (renamed from docutils/test/test_utils.py)0
-rwxr-xr-xtest/test_viewlist.py (renamed from docutils/test/test_viewlist.py)0
-rw-r--r--test/test_writers/__init__.py (renamed from docutils/test/test_writers/__init__.py)0
-rwxr-xr-xtest/test_writers/test_docutils_xml.py (renamed from docutils/test/test_writers/test_docutils_xml.py)0
-rwxr-xr-xtest/test_writers/test_html4css1.py (renamed from docutils/test/test_writers/test_html4css1.py)0
-rwxr-xr-xtest/test_writers/test_html4css1_misc.py (renamed from docutils/test/test_writers/test_html4css1_misc.py)0
-rwxr-xr-xtest/test_writers/test_latex2e.py (renamed from docutils/test/test_writers/test_latex2e.py)0
-rwxr-xr-xtest/test_writers/test_null.py (renamed from docutils/test/test_writers/test_null.py)0
-rwxr-xr-xtest/test_writers/test_pseudoxml.py (renamed from docutils/test/test_writers/test_pseudoxml.py)0
-rwxr-xr-xtools/buildhtml.py (renamed from docutils/tools/buildhtml.py)0
-rw-r--r--tools/dev/README.txt (renamed from docutils/tools/dev/README.txt)0
-rwxr-xr-xtools/dev/create_unimap.py (renamed from docutils/tools/dev/create_unimap.py)0
-rwxr-xr-xtools/dev/profile_docutils.py (renamed from docutils/tools/dev/profile_docutils.py)0
-rwxr-xr-xtools/dev/unicode2rstsubs.py (renamed from docutils/tools/dev/unicode2rstsubs.py)0
-rw-r--r--tools/docutils.conf (renamed from docutils/tools/docutils.conf)0
-rw-r--r--tools/editors/README.txt (renamed from docutils/tools/editors/README.txt)0
-rw-r--r--tools/editors/emacs/README.txt (renamed from docutils/tools/editors/emacs/README.txt)0
-rw-r--r--tools/editors/emacs/docutils.conf (renamed from docutils/tools/editors/emacs/docutils.conf)0
-rw-r--r--tools/editors/emacs/rst.el (renamed from docutils/tools/editors/emacs/rst.el)0
-rw-r--r--tools/editors/emacs/tests/Makefile (renamed from docutils/tools/editors/emacs/tests/Makefile)0
-rw-r--r--tools/editors/emacs/tests/README (renamed from docutils/tools/editors/emacs/tests/README)0
-rw-r--r--tools/editors/emacs/tests/tests-adjust-section.el (renamed from docutils/tools/editors/emacs/tests/tests-adjust-section.el)0
-rw-r--r--tools/editors/emacs/tests/tests-basic.el (renamed from docutils/tools/editors/emacs/tests/tests-basic.el)0
-rw-r--r--tools/editors/emacs/tests/tests-runner.el (renamed from docutils/tools/editors/emacs/tests/tests-runner.el)0
-rwxr-xr-xtools/quicktest.py (renamed from docutils/tools/quicktest.py)0
-rwxr-xr-xtools/rst2html.py (renamed from docutils/tools/rst2html.py)0
-rwxr-xr-xtools/rst2latex.py (renamed from docutils/tools/rst2latex.py)0
-rwxr-xr-xtools/rst2newlatex.py (renamed from docutils/tools/rst2newlatex.py)0
-rwxr-xr-xtools/rst2pseudoxml.py (renamed from docutils/tools/rst2pseudoxml.py)0
-rwxr-xr-xtools/rst2s5.py (renamed from docutils/tools/rst2s5.py)0
-rwxr-xr-xtools/rst2xml.py (renamed from docutils/tools/rst2xml.py)0
-rwxr-xr-xtools/rstpep2html.py (renamed from docutils/tools/rstpep2html.py)0
-rw-r--r--web/.htaccess62
-rw-r--r--web/PyBanner016.pngbin720 -> 0 bytes
-rw-r--r--web/index.txt148
-rw-r--r--web/mirror/setext.txt27
-rw-r--r--web/python.pngbin4846 -> 0 bytes
-rw-r--r--web/rst.pngbin1171 -> 0 bytes
-rw-r--r--web/rst.txt234
838 files changed, 0 insertions, 72965 deletions
diff --git a/docutils/BUGS.txt b/BUGS.txt
index 8bb781508..8bb781508 100644
--- a/docutils/BUGS.txt
+++ b/BUGS.txt
diff --git a/docutils/COPYING.txt b/COPYING.txt
index 4994ef1fa..4994ef1fa 100644
--- a/docutils/COPYING.txt
+++ b/COPYING.txt
diff --git a/docutils/FAQ.txt b/FAQ.txt
index e8b7692e4..e8b7692e4 100644
--- a/docutils/FAQ.txt
+++ b/FAQ.txt
diff --git a/docutils/HISTORY.txt b/HISTORY.txt
index bd5caa54f..bd5caa54f 100644
--- a/docutils/HISTORY.txt
+++ b/HISTORY.txt
diff --git a/docutils/MANIFEST.in b/MANIFEST.in
index 9b9c4968d..9b9c4968d 100644
--- a/docutils/MANIFEST.in
+++ b/MANIFEST.in
diff --git a/docutils/README.txt b/README.txt
index c2005ffaf..c2005ffaf 100644
--- a/docutils/README.txt
+++ b/README.txt
diff --git a/docutils/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 31a1e3dee..31a1e3dee 100644
--- a/docutils/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
diff --git a/docutils/THANKS.txt b/THANKS.txt
index 36cbc3019..36cbc3019 100644
--- a/docutils/THANKS.txt
+++ b/THANKS.txt
diff --git a/docutils/docs/api/cmdline-tool.txt b/docs/api/cmdline-tool.txt
index 3d3d4a635..3d3d4a635 100644
--- a/docutils/docs/api/cmdline-tool.txt
+++ b/docs/api/cmdline-tool.txt
diff --git a/docutils/docs/api/publisher.txt b/docs/api/publisher.txt
index 73cfc0ef2..73cfc0ef2 100644
--- a/docutils/docs/api/publisher.txt
+++ b/docs/api/publisher.txt
diff --git a/docutils/docs/api/runtime-settings.txt b/docs/api/runtime-settings.txt
index 2d60aa3e1..2d60aa3e1 100644
--- a/docutils/docs/api/runtime-settings.txt
+++ b/docs/api/runtime-settings.txt
diff --git a/docutils/docs/dev/distributing.txt b/docs/dev/distributing.txt
index c81807279..c81807279 100644
--- a/docutils/docs/dev/distributing.txt
+++ b/docs/dev/distributing.txt
diff --git a/docutils/docs/dev/enthought-plan.txt b/docs/dev/enthought-plan.txt
index 0ab0d3c83..0ab0d3c83 100644
--- a/docutils/docs/dev/enthought-plan.txt
+++ b/docs/dev/enthought-plan.txt
diff --git a/docutils/docs/dev/enthought-rfp.txt b/docs/dev/enthought-rfp.txt
index 986f5604f..986f5604f 100644
--- a/docutils/docs/dev/enthought-rfp.txt
+++ b/docs/dev/enthought-rfp.txt
diff --git a/docutils/docs/dev/hacking.txt b/docs/dev/hacking.txt
index d0ec9a3fb..d0ec9a3fb 100644
--- a/docutils/docs/dev/hacking.txt
+++ b/docs/dev/hacking.txt
diff --git a/docutils/docs/dev/policies.txt b/docs/dev/policies.txt
index 25fb4f2e9..25fb4f2e9 100644
--- a/docutils/docs/dev/policies.txt
+++ b/docs/dev/policies.txt
diff --git a/docutils/docs/dev/pysource.dtd b/docs/dev/pysource.dtd
index fb8af4091..fb8af4091 100644
--- a/docutils/docs/dev/pysource.dtd
+++ b/docs/dev/pysource.dtd
diff --git a/docutils/docs/dev/pysource.txt b/docs/dev/pysource.txt
index 6f173a709..6f173a709 100644
--- a/docutils/docs/dev/pysource.txt
+++ b/docs/dev/pysource.txt
diff --git a/docutils/docs/dev/release.txt b/docs/dev/release.txt
index fa58bc46f..fa58bc46f 100644
--- a/docutils/docs/dev/release.txt
+++ b/docs/dev/release.txt
diff --git a/docutils/docs/dev/repository.txt b/docs/dev/repository.txt
index 2c613b10e..2c613b10e 100644
--- a/docutils/docs/dev/repository.txt
+++ b/docs/dev/repository.txt
diff --git a/docutils/docs/dev/rst/alternatives.txt b/docs/dev/rst/alternatives.txt
index 12874c5fb..12874c5fb 100644
--- a/docutils/docs/dev/rst/alternatives.txt
+++ b/docs/dev/rst/alternatives.txt
diff --git a/docutils/docs/dev/rst/problems.txt b/docs/dev/rst/problems.txt
index bc0101cbf..bc0101cbf 100644
--- a/docutils/docs/dev/rst/problems.txt
+++ b/docs/dev/rst/problems.txt
diff --git a/docutils/docs/dev/semantics.txt b/docs/dev/semantics.txt
index cd20e15f6..cd20e15f6 100644
--- a/docutils/docs/dev/semantics.txt
+++ b/docs/dev/semantics.txt
diff --git a/docutils/docs/dev/testing.txt b/docs/dev/testing.txt
index bde54116f..bde54116f 100644
--- a/docutils/docs/dev/testing.txt
+++ b/docs/dev/testing.txt
diff --git a/docutils/docs/dev/todo.txt b/docs/dev/todo.txt
index 6f1c6291d..6f1c6291d 100644
--- a/docutils/docs/dev/todo.txt
+++ b/docs/dev/todo.txt
diff --git a/docutils/docs/dev/website.txt b/docs/dev/website.txt
index 193e9c0f2..193e9c0f2 100644
--- a/docutils/docs/dev/website.txt
+++ b/docs/dev/website.txt
diff --git a/docutils/docs/howto/html-stylesheets.txt b/docs/howto/html-stylesheets.txt
index 9369f2d3c..9369f2d3c 100644
--- a/docutils/docs/howto/html-stylesheets.txt
+++ b/docs/howto/html-stylesheets.txt
diff --git a/docutils/docs/howto/i18n.txt b/docs/howto/i18n.txt
index 4a5b1de5a..4a5b1de5a 100644
--- a/docutils/docs/howto/i18n.txt
+++ b/docs/howto/i18n.txt
diff --git a/docutils/docs/howto/rst-directives.txt b/docs/howto/rst-directives.txt
index 6210940c8..6210940c8 100644
--- a/docutils/docs/howto/rst-directives.txt
+++ b/docs/howto/rst-directives.txt
diff --git a/docutils/docs/howto/rst-roles.txt b/docs/howto/rst-roles.txt
index f8ce08bca..f8ce08bca 100644
--- a/docutils/docs/howto/rst-roles.txt
+++ b/docs/howto/rst-roles.txt
diff --git a/docutils/docs/index.txt b/docs/index.txt
index 18761f312..18761f312 100644
--- a/docutils/docs/index.txt
+++ b/docs/index.txt
diff --git a/docutils/docs/peps/pep-0256.txt b/docs/peps/pep-0256.txt
index 1e5e87e35..1e5e87e35 100644
--- a/docutils/docs/peps/pep-0256.txt
+++ b/docs/peps/pep-0256.txt
diff --git a/docutils/docs/peps/pep-0257.txt b/docs/peps/pep-0257.txt
index 23094c56a..23094c56a 100644
--- a/docutils/docs/peps/pep-0257.txt
+++ b/docs/peps/pep-0257.txt
diff --git a/docutils/docs/peps/pep-0258.txt b/docs/peps/pep-0258.txt
index 0d646bb82..0d646bb82 100644
--- a/docutils/docs/peps/pep-0258.txt
+++ b/docs/peps/pep-0258.txt
diff --git a/docutils/docs/peps/pep-0287.txt b/docs/peps/pep-0287.txt
index 689d6b919..689d6b919 100644
--- a/docutils/docs/peps/pep-0287.txt
+++ b/docs/peps/pep-0287.txt
diff --git a/docutils/docs/ref/doctree.txt b/docs/ref/doctree.txt
index 25e5f9594..25e5f9594 100644
--- a/docutils/docs/ref/doctree.txt
+++ b/docs/ref/doctree.txt
diff --git a/docutils/docs/ref/docutils.dtd b/docs/ref/docutils.dtd
index 154566033..154566033 100644
--- a/docutils/docs/ref/docutils.dtd
+++ b/docs/ref/docutils.dtd
diff --git a/docutils/docs/ref/rst/definitions.txt b/docs/ref/rst/definitions.txt
index 78a2bf8da..78a2bf8da 100644
--- a/docutils/docs/ref/rst/definitions.txt
+++ b/docs/ref/rst/definitions.txt
diff --git a/docutils/docs/ref/rst/directives.txt b/docs/ref/rst/directives.txt
index af88a3d4e..af88a3d4e 100644
--- a/docutils/docs/ref/rst/directives.txt
+++ b/docs/ref/rst/directives.txt
diff --git a/docutils/docs/ref/rst/introduction.txt b/docs/ref/rst/introduction.txt
index b7829816e..b7829816e 100644
--- a/docutils/docs/ref/rst/introduction.txt
+++ b/docs/ref/rst/introduction.txt
diff --git a/docutils/docs/ref/rst/restructuredtext.txt b/docs/ref/rst/restructuredtext.txt
index 1445619b3..1445619b3 100644
--- a/docutils/docs/ref/rst/restructuredtext.txt
+++ b/docs/ref/rst/restructuredtext.txt
diff --git a/docutils/docs/ref/rst/roles.txt b/docs/ref/rst/roles.txt
index 3b8b114bc..3b8b114bc 100644
--- a/docutils/docs/ref/rst/roles.txt
+++ b/docs/ref/rst/roles.txt
diff --git a/docutils/docs/ref/soextblx.dtd b/docs/ref/soextblx.dtd
index 56ba311ba..56ba311ba 100644
--- a/docutils/docs/ref/soextblx.dtd
+++ b/docs/ref/soextblx.dtd
diff --git a/docutils/docs/ref/transforms.txt b/docs/ref/transforms.txt
index 54446f8dd..54446f8dd 100644
--- a/docutils/docs/ref/transforms.txt
+++ b/docs/ref/transforms.txt
diff --git a/docutils/docs/user/Makefile.docutils-update b/docs/user/Makefile.docutils-update
index 89097b5ff..89097b5ff 100644
--- a/docutils/docs/user/Makefile.docutils-update
+++ b/docs/user/Makefile.docutils-update
diff --git a/docutils/docs/user/config.txt b/docs/user/config.txt
index 0413dd5be..0413dd5be 100644
--- a/docutils/docs/user/config.txt
+++ b/docs/user/config.txt
diff --git a/docutils/docs/user/emacs.txt b/docs/user/emacs.txt
index 49687f599..49687f599 100644
--- a/docutils/docs/user/emacs.txt
+++ b/docs/user/emacs.txt
diff --git a/docutils/docs/user/images/big-black.png b/docs/user/images/big-black.png
index 869a0cf9f..869a0cf9f 100644
--- a/docutils/docs/user/images/big-black.png
+++ b/docs/user/images/big-black.png
Binary files differ
diff --git a/docutils/docs/user/images/big-white.png b/docs/user/images/big-white.png
index 1ce6d7d7d..1ce6d7d7d 100644
--- a/docutils/docs/user/images/big-white.png
+++ b/docs/user/images/big-white.png
Binary files differ
diff --git a/docutils/docs/user/images/default.png b/docs/user/images/default.png
index 509eeddad..509eeddad 100644
--- a/docutils/docs/user/images/default.png
+++ b/docs/user/images/default.png
Binary files differ
diff --git a/docutils/docs/user/images/happy_monkey.png b/docs/user/images/happy_monkey.png
index 2164c06dd..2164c06dd 100644
--- a/docutils/docs/user/images/happy_monkey.png
+++ b/docs/user/images/happy_monkey.png
Binary files differ
diff --git a/docutils/docs/user/images/medium-black.png b/docs/user/images/medium-black.png
index f851e679e..f851e679e 100644
--- a/docutils/docs/user/images/medium-black.png
+++ b/docs/user/images/medium-black.png
Binary files differ
diff --git a/docutils/docs/user/images/medium-white.png b/docs/user/images/medium-white.png
index e5a465a56..e5a465a56 100644
--- a/docutils/docs/user/images/medium-white.png
+++ b/docs/user/images/medium-white.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-all.png b/docs/user/images/rsp-all.png
index 3e5f5ede3..3e5f5ede3 100644
--- a/docutils/docs/user/images/rsp-all.png
+++ b/docs/user/images/rsp-all.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-breaks.png b/docs/user/images/rsp-breaks.png
index f2a31b098..f2a31b098 100644
--- a/docutils/docs/user/images/rsp-breaks.png
+++ b/docs/user/images/rsp-breaks.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-covers.png b/docs/user/images/rsp-covers.png
index 597c2c2a8..597c2c2a8 100644
--- a/docutils/docs/user/images/rsp-covers.png
+++ b/docs/user/images/rsp-covers.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-cuts.png b/docs/user/images/rsp-cuts.png
index aa46b3876..aa46b3876 100644
--- a/docutils/docs/user/images/rsp-cuts.png
+++ b/docs/user/images/rsp-cuts.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-empty.png b/docs/user/images/rsp-empty.png
index f6b93c38b..f6b93c38b 100644
--- a/docutils/docs/user/images/rsp-empty.png
+++ b/docs/user/images/rsp-empty.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp-objects.png b/docs/user/images/rsp-objects.png
index 43ce276f1..43ce276f1 100644
--- a/docutils/docs/user/images/rsp-objects.png
+++ b/docs/user/images/rsp-objects.png
Binary files differ
diff --git a/docutils/docs/user/images/rsp.svg b/docs/user/images/rsp.svg
index 03445d3bc..03445d3bc 100644
--- a/docutils/docs/user/images/rsp.svg
+++ b/docs/user/images/rsp.svg
diff --git a/docutils/docs/user/images/s5-files.png b/docs/user/images/s5-files.png
index 53cbbf250..53cbbf250 100644
--- a/docutils/docs/user/images/s5-files.png
+++ b/docs/user/images/s5-files.png
Binary files differ
diff --git a/docutils/docs/user/images/s5-files.svg b/docs/user/images/s5-files.svg
index a3e644a22..a3e644a22 100644
--- a/docutils/docs/user/images/s5-files.svg
+++ b/docs/user/images/s5-files.svg
diff --git a/docutils/docs/user/images/small-black.png b/docs/user/images/small-black.png
index f8d80d387..f8d80d387 100644
--- a/docutils/docs/user/images/small-black.png
+++ b/docs/user/images/small-black.png
Binary files differ
diff --git a/docutils/docs/user/images/small-white.png b/docs/user/images/small-white.png
index 65f96895d..65f96895d 100644
--- a/docutils/docs/user/images/small-white.png
+++ b/docs/user/images/small-white.png
Binary files differ
diff --git a/docutils/docs/user/latex.txt b/docs/user/latex.txt
index ce8447692..ce8447692 100644
--- a/docutils/docs/user/latex.txt
+++ b/docs/user/latex.txt
diff --git a/docutils/docs/user/links.txt b/docs/user/links.txt
index 3bb2aaa70..3bb2aaa70 100644
--- a/docutils/docs/user/links.txt
+++ b/docs/user/links.txt
diff --git a/docutils/docs/user/mailing-lists.txt b/docs/user/mailing-lists.txt
index 8137e29e7..8137e29e7 100644
--- a/docutils/docs/user/mailing-lists.txt
+++ b/docs/user/mailing-lists.txt
diff --git a/docutils/docs/user/rst/cheatsheet.txt b/docs/user/rst/cheatsheet.txt
index dfea5bcb7..dfea5bcb7 100644
--- a/docutils/docs/user/rst/cheatsheet.txt
+++ b/docs/user/rst/cheatsheet.txt
diff --git a/docutils/docs/user/rst/demo.txt b/docs/user/rst/demo.txt
index 7a0abd033..7a0abd033 100644
--- a/docutils/docs/user/rst/demo.txt
+++ b/docs/user/rst/demo.txt
diff --git a/docutils/docs/user/rst/images/ball1.gif b/docs/user/rst/images/ball1.gif
index 3e14441d9..3e14441d9 100644
--- a/docutils/docs/user/rst/images/ball1.gif
+++ b/docs/user/rst/images/ball1.gif
Binary files differ
diff --git a/docutils/docs/user/rst/images/biohazard.png b/docs/user/rst/images/biohazard.png
index ae4629d8b..ae4629d8b 100644
--- a/docutils/docs/user/rst/images/biohazard.png
+++ b/docs/user/rst/images/biohazard.png
Binary files differ
diff --git a/docutils/docs/user/rst/images/title.png b/docs/user/rst/images/title.png
index cc6218efe..cc6218efe 100644
--- a/docutils/docs/user/rst/images/title.png
+++ b/docs/user/rst/images/title.png
Binary files differ
diff --git a/docutils/docs/user/rst/quickref.html b/docs/user/rst/quickref.html
index 604cfe6bc..604cfe6bc 100644
--- a/docutils/docs/user/rst/quickref.html
+++ b/docs/user/rst/quickref.html
diff --git a/docutils/docs/user/rst/quickstart.txt b/docs/user/rst/quickstart.txt
index 735dcf512..735dcf512 100644
--- a/docutils/docs/user/rst/quickstart.txt
+++ b/docs/user/rst/quickstart.txt
diff --git a/docutils/docs/user/slide-shows.txt b/docs/user/slide-shows.txt
index 6732f4f44..6732f4f44 100644
--- a/docutils/docs/user/slide-shows.txt
+++ b/docs/user/slide-shows.txt
diff --git a/docutils/docs/user/tools.txt b/docs/user/tools.txt
index 20f5a3b2f..20f5a3b2f 100644
--- a/docutils/docs/user/tools.txt
+++ b/docs/user/tools.txt
diff --git a/docutils/docutils/__init__.py b/docutils/__init__.py
index a390a9f2b..a390a9f2b 100644
--- a/docutils/docutils/__init__.py
+++ b/docutils/__init__.py
diff --git a/docutils/docutils/core.py b/docutils/core.py
index 598ec8e68..598ec8e68 100644
--- a/docutils/docutils/core.py
+++ b/docutils/core.py
diff --git a/docutils/docutils/docutils.conf b/docutils/docutils.conf
index cdce8d629..cdce8d629 100644
--- a/docutils/docutils/docutils.conf
+++ b/docutils/docutils.conf
diff --git a/docutils/docutils/examples.py b/docutils/examples.py
index 96f6a0522..96f6a0522 100644
--- a/docutils/docutils/examples.py
+++ b/docutils/examples.py
diff --git a/docutils/docutils/frontend.py b/docutils/frontend.py
index 46fcaab89..46fcaab89 100644
--- a/docutils/docutils/frontend.py
+++ b/docutils/frontend.py
diff --git a/docutils/docutils/io.py b/docutils/io.py
index 5a6672e15..5a6672e15 100644
--- a/docutils/docutils/io.py
+++ b/docutils/io.py
diff --git a/docutils/docutils/languages/__init__.py b/docutils/languages/__init__.py
index 018c880c4..018c880c4 100644
--- a/docutils/docutils/languages/__init__.py
+++ b/docutils/languages/__init__.py
diff --git a/docutils/docutils/languages/af.py b/docutils/languages/af.py
index 1071b4469..1071b4469 100644
--- a/docutils/docutils/languages/af.py
+++ b/docutils/languages/af.py
diff --git a/docutils/docutils/languages/ca.py b/docutils/languages/ca.py
index 069a853b3..069a853b3 100644
--- a/docutils/docutils/languages/ca.py
+++ b/docutils/languages/ca.py
diff --git a/docutils/docutils/languages/cs.py b/docutils/languages/cs.py
index 94d4b70a1..94d4b70a1 100644
--- a/docutils/docutils/languages/cs.py
+++ b/docutils/languages/cs.py
diff --git a/docutils/docutils/languages/de.py b/docutils/languages/de.py
index 3a829dd34..3a829dd34 100644
--- a/docutils/docutils/languages/de.py
+++ b/docutils/languages/de.py
diff --git a/docutils/docutils/languages/en.py b/docutils/languages/en.py
index 3b39c486f..3b39c486f 100644
--- a/docutils/docutils/languages/en.py
+++ b/docutils/languages/en.py
diff --git a/docutils/docutils/languages/eo.py b/docutils/languages/eo.py
index 32a1be4b1..32a1be4b1 100644
--- a/docutils/docutils/languages/eo.py
+++ b/docutils/languages/eo.py
diff --git a/docutils/docutils/languages/es.py b/docutils/languages/es.py
index 7e3eb9b75..7e3eb9b75 100644
--- a/docutils/docutils/languages/es.py
+++ b/docutils/languages/es.py
diff --git a/docutils/docutils/languages/fi.py b/docutils/languages/fi.py
index 340b33acb..340b33acb 100644
--- a/docutils/docutils/languages/fi.py
+++ b/docutils/languages/fi.py
diff --git a/docutils/docutils/languages/fr.py b/docutils/languages/fr.py
index 33723befa..33723befa 100644
--- a/docutils/docutils/languages/fr.py
+++ b/docutils/languages/fr.py
diff --git a/docutils/docutils/languages/it.py b/docutils/languages/it.py
index fa40afa83..fa40afa83 100644
--- a/docutils/docutils/languages/it.py
+++ b/docutils/languages/it.py
diff --git a/docutils/docutils/languages/ja.py b/docutils/languages/ja.py
index dfa5ca076..dfa5ca076 100644
--- a/docutils/docutils/languages/ja.py
+++ b/docutils/languages/ja.py
diff --git a/docutils/docutils/languages/nl.py b/docutils/languages/nl.py
index ca96d78d9..ca96d78d9 100644
--- a/docutils/docutils/languages/nl.py
+++ b/docutils/languages/nl.py
diff --git a/docutils/docutils/languages/pt_br.py b/docutils/languages/pt_br.py
index 5d2df0e82..5d2df0e82 100644
--- a/docutils/docutils/languages/pt_br.py
+++ b/docutils/languages/pt_br.py
diff --git a/docutils/docutils/languages/ru.py b/docutils/languages/ru.py
index 369d2febd..369d2febd 100644
--- a/docutils/docutils/languages/ru.py
+++ b/docutils/languages/ru.py
diff --git a/docutils/docutils/languages/sk.py b/docutils/languages/sk.py
index bb5cf089a..bb5cf089a 100644
--- a/docutils/docutils/languages/sk.py
+++ b/docutils/languages/sk.py
diff --git a/docutils/docutils/languages/sv.py b/docutils/languages/sv.py
index 275b3569a..275b3569a 100644
--- a/docutils/docutils/languages/sv.py
+++ b/docutils/languages/sv.py
diff --git a/docutils/docutils/languages/zh_cn.py b/docutils/languages/zh_cn.py
index 4f8e06ee8..4f8e06ee8 100644
--- a/docutils/docutils/languages/zh_cn.py
+++ b/docutils/languages/zh_cn.py
diff --git a/docutils/docutils/languages/zh_tw.py b/docutils/languages/zh_tw.py
index 12570cfba..12570cfba 100644
--- a/docutils/docutils/languages/zh_tw.py
+++ b/docutils/languages/zh_tw.py
diff --git a/docutils/docutils/nodes.py b/docutils/nodes.py
index 1553013ad..1553013ad 100644
--- a/docutils/docutils/nodes.py
+++ b/docutils/nodes.py
diff --git a/docutils/docutils/parsers/__init__.py b/docutils/parsers/__init__.py
index 027c25a86..027c25a86 100644
--- a/docutils/docutils/parsers/__init__.py
+++ b/docutils/parsers/__init__.py
diff --git a/docutils/docutils/parsers/null.py b/docutils/parsers/null.py
index 61702dfaf..61702dfaf 100644
--- a/docutils/docutils/parsers/null.py
+++ b/docutils/parsers/null.py
diff --git a/docutils/docutils/parsers/rst/__init__.py b/docutils/parsers/rst/__init__.py
index ff1d7b4f8..ff1d7b4f8 100644
--- a/docutils/docutils/parsers/rst/__init__.py
+++ b/docutils/parsers/rst/__init__.py
diff --git a/docutils/docutils/parsers/rst/directives/__init__.py b/docutils/parsers/rst/directives/__init__.py
index 998c391e3..998c391e3 100644
--- a/docutils/docutils/parsers/rst/directives/__init__.py
+++ b/docutils/parsers/rst/directives/__init__.py
diff --git a/docutils/docutils/parsers/rst/directives/admonitions.py b/docutils/parsers/rst/directives/admonitions.py
index 73ca18161..73ca18161 100644
--- a/docutils/docutils/parsers/rst/directives/admonitions.py
+++ b/docutils/parsers/rst/directives/admonitions.py
diff --git a/docutils/docutils/parsers/rst/directives/body.py b/docutils/parsers/rst/directives/body.py
index 2ff89e617..2ff89e617 100644
--- a/docutils/docutils/parsers/rst/directives/body.py
+++ b/docutils/parsers/rst/directives/body.py
diff --git a/docutils/docutils/parsers/rst/directives/html.py b/docutils/parsers/rst/directives/html.py
index 86e19dcfc..86e19dcfc 100644
--- a/docutils/docutils/parsers/rst/directives/html.py
+++ b/docutils/parsers/rst/directives/html.py
diff --git a/docutils/docutils/parsers/rst/directives/images.py b/docutils/parsers/rst/directives/images.py
index 5aed4c01b..5aed4c01b 100644
--- a/docutils/docutils/parsers/rst/directives/images.py
+++ b/docutils/parsers/rst/directives/images.py
diff --git a/docutils/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
index 42f642fee..42f642fee 100644
--- a/docutils/docutils/parsers/rst/directives/misc.py
+++ b/docutils/parsers/rst/directives/misc.py
diff --git a/docutils/docutils/parsers/rst/directives/parts.py b/docutils/parsers/rst/directives/parts.py
index 2a1a092a4..2a1a092a4 100644
--- a/docutils/docutils/parsers/rst/directives/parts.py
+++ b/docutils/parsers/rst/directives/parts.py
diff --git a/docutils/docutils/parsers/rst/directives/references.py b/docutils/parsers/rst/directives/references.py
index 0406182b6..0406182b6 100644
--- a/docutils/docutils/parsers/rst/directives/references.py
+++ b/docutils/parsers/rst/directives/references.py
diff --git a/docutils/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
index 70a0de5ab..70a0de5ab 100644
--- a/docutils/docutils/parsers/rst/directives/tables.py
+++ b/docutils/parsers/rst/directives/tables.py
diff --git a/docutils/docutils/parsers/rst/include/README.txt b/docutils/parsers/rst/include/README.txt
index cd03135f9..cd03135f9 100644
--- a/docutils/docutils/parsers/rst/include/README.txt
+++ b/docutils/parsers/rst/include/README.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamsa.txt b/docutils/parsers/rst/include/isoamsa.txt
index e6f451800..e6f451800 100644
--- a/docutils/docutils/parsers/rst/include/isoamsa.txt
+++ b/docutils/parsers/rst/include/isoamsa.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamsb.txt b/docutils/parsers/rst/include/isoamsb.txt
index 05e68d99d..05e68d99d 100644
--- a/docutils/docutils/parsers/rst/include/isoamsb.txt
+++ b/docutils/parsers/rst/include/isoamsb.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamsc.txt b/docutils/parsers/rst/include/isoamsc.txt
index 343504d83..343504d83 100644
--- a/docutils/docutils/parsers/rst/include/isoamsc.txt
+++ b/docutils/parsers/rst/include/isoamsc.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamsn.txt b/docutils/parsers/rst/include/isoamsn.txt
index 5ff17291e..5ff17291e 100644
--- a/docutils/docutils/parsers/rst/include/isoamsn.txt
+++ b/docutils/parsers/rst/include/isoamsn.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamso.txt b/docutils/parsers/rst/include/isoamso.txt
index 65cc17e99..65cc17e99 100644
--- a/docutils/docutils/parsers/rst/include/isoamso.txt
+++ b/docutils/parsers/rst/include/isoamso.txt
diff --git a/docutils/docutils/parsers/rst/include/isoamsr.txt b/docutils/parsers/rst/include/isoamsr.txt
index a3d03dab7..a3d03dab7 100644
--- a/docutils/docutils/parsers/rst/include/isoamsr.txt
+++ b/docutils/parsers/rst/include/isoamsr.txt
diff --git a/docutils/docutils/parsers/rst/include/isobox.txt b/docutils/parsers/rst/include/isobox.txt
index 2304f8770..2304f8770 100644
--- a/docutils/docutils/parsers/rst/include/isobox.txt
+++ b/docutils/parsers/rst/include/isobox.txt
diff --git a/docutils/docutils/parsers/rst/include/isocyr1.txt b/docutils/parsers/rst/include/isocyr1.txt
index afee744cf..afee744cf 100644
--- a/docutils/docutils/parsers/rst/include/isocyr1.txt
+++ b/docutils/parsers/rst/include/isocyr1.txt
diff --git a/docutils/docutils/parsers/rst/include/isocyr2.txt b/docutils/parsers/rst/include/isocyr2.txt
index fe09c015b..fe09c015b 100644
--- a/docutils/docutils/parsers/rst/include/isocyr2.txt
+++ b/docutils/parsers/rst/include/isocyr2.txt
diff --git a/docutils/docutils/parsers/rst/include/isodia.txt b/docutils/parsers/rst/include/isodia.txt
index ede6d9946..ede6d9946 100644
--- a/docutils/docutils/parsers/rst/include/isodia.txt
+++ b/docutils/parsers/rst/include/isodia.txt
diff --git a/docutils/docutils/parsers/rst/include/isogrk1.txt b/docutils/parsers/rst/include/isogrk1.txt
index 434368a03..434368a03 100644
--- a/docutils/docutils/parsers/rst/include/isogrk1.txt
+++ b/docutils/parsers/rst/include/isogrk1.txt
diff --git a/docutils/docutils/parsers/rst/include/isogrk2.txt b/docutils/parsers/rst/include/isogrk2.txt
index fa59f968d..fa59f968d 100644
--- a/docutils/docutils/parsers/rst/include/isogrk2.txt
+++ b/docutils/parsers/rst/include/isogrk2.txt
diff --git a/docutils/docutils/parsers/rst/include/isogrk3.txt b/docutils/parsers/rst/include/isogrk3.txt
index efacd980b..efacd980b 100644
--- a/docutils/docutils/parsers/rst/include/isogrk3.txt
+++ b/docutils/parsers/rst/include/isogrk3.txt
diff --git a/docutils/docutils/parsers/rst/include/isogrk4-wide.txt b/docutils/parsers/rst/include/isogrk4-wide.txt
index 39a63075d..39a63075d 100644
--- a/docutils/docutils/parsers/rst/include/isogrk4-wide.txt
+++ b/docutils/parsers/rst/include/isogrk4-wide.txt
diff --git a/docutils/docutils/parsers/rst/include/isogrk4.txt b/docutils/parsers/rst/include/isogrk4.txt
index 5b9f4104f..5b9f4104f 100644
--- a/docutils/docutils/parsers/rst/include/isogrk4.txt
+++ b/docutils/parsers/rst/include/isogrk4.txt
diff --git a/docutils/docutils/parsers/rst/include/isolat1.txt b/docutils/parsers/rst/include/isolat1.txt
index 3e9ad9df3..3e9ad9df3 100644
--- a/docutils/docutils/parsers/rst/include/isolat1.txt
+++ b/docutils/parsers/rst/include/isolat1.txt
diff --git a/docutils/docutils/parsers/rst/include/isolat2.txt b/docutils/parsers/rst/include/isolat2.txt
index 20de84576..20de84576 100644
--- a/docutils/docutils/parsers/rst/include/isolat2.txt
+++ b/docutils/parsers/rst/include/isolat2.txt
diff --git a/docutils/docutils/parsers/rst/include/isomfrk-wide.txt b/docutils/parsers/rst/include/isomfrk-wide.txt
index 75bba2575..75bba2575 100644
--- a/docutils/docutils/parsers/rst/include/isomfrk-wide.txt
+++ b/docutils/parsers/rst/include/isomfrk-wide.txt
diff --git a/docutils/docutils/parsers/rst/include/isomfrk.txt b/docutils/parsers/rst/include/isomfrk.txt
index 868b687a5..868b687a5 100644
--- a/docutils/docutils/parsers/rst/include/isomfrk.txt
+++ b/docutils/parsers/rst/include/isomfrk.txt
diff --git a/docutils/docutils/parsers/rst/include/isomopf-wide.txt b/docutils/parsers/rst/include/isomopf-wide.txt
index a91ea43eb..a91ea43eb 100644
--- a/docutils/docutils/parsers/rst/include/isomopf-wide.txt
+++ b/docutils/parsers/rst/include/isomopf-wide.txt
diff --git a/docutils/docutils/parsers/rst/include/isomopf.txt b/docutils/parsers/rst/include/isomopf.txt
index 4350db61b..4350db61b 100644
--- a/docutils/docutils/parsers/rst/include/isomopf.txt
+++ b/docutils/parsers/rst/include/isomopf.txt
diff --git a/docutils/docutils/parsers/rst/include/isomscr-wide.txt b/docutils/parsers/rst/include/isomscr-wide.txt
index 34b278b98..34b278b98 100644
--- a/docutils/docutils/parsers/rst/include/isomscr-wide.txt
+++ b/docutils/parsers/rst/include/isomscr-wide.txt
diff --git a/docutils/docutils/parsers/rst/include/isomscr.txt b/docutils/parsers/rst/include/isomscr.txt
index a77890e97..a77890e97 100644
--- a/docutils/docutils/parsers/rst/include/isomscr.txt
+++ b/docutils/parsers/rst/include/isomscr.txt
diff --git a/docutils/docutils/parsers/rst/include/isonum.txt b/docutils/parsers/rst/include/isonum.txt
index 35793b365..35793b365 100644
--- a/docutils/docutils/parsers/rst/include/isonum.txt
+++ b/docutils/parsers/rst/include/isonum.txt
diff --git a/docutils/docutils/parsers/rst/include/isopub.txt b/docutils/parsers/rst/include/isopub.txt
index bc5b6d491..bc5b6d491 100644
--- a/docutils/docutils/parsers/rst/include/isopub.txt
+++ b/docutils/parsers/rst/include/isopub.txt
diff --git a/docutils/docutils/parsers/rst/include/isotech.txt b/docutils/parsers/rst/include/isotech.txt
index 01f7e346f..01f7e346f 100644
--- a/docutils/docutils/parsers/rst/include/isotech.txt
+++ b/docutils/parsers/rst/include/isotech.txt
diff --git a/docutils/docutils/parsers/rst/include/mmlalias.txt b/docutils/parsers/rst/include/mmlalias.txt
index cabc54ac4..cabc54ac4 100644
--- a/docutils/docutils/parsers/rst/include/mmlalias.txt
+++ b/docutils/parsers/rst/include/mmlalias.txt
diff --git a/docutils/docutils/parsers/rst/include/mmlextra-wide.txt b/docutils/parsers/rst/include/mmlextra-wide.txt
index 0177ccc09..0177ccc09 100644
--- a/docutils/docutils/parsers/rst/include/mmlextra-wide.txt
+++ b/docutils/parsers/rst/include/mmlextra-wide.txt
diff --git a/docutils/docutils/parsers/rst/include/mmlextra.txt b/docutils/parsers/rst/include/mmlextra.txt
index 790a9775a..790a9775a 100644
--- a/docutils/docutils/parsers/rst/include/mmlextra.txt
+++ b/docutils/parsers/rst/include/mmlextra.txt
diff --git a/docutils/docutils/parsers/rst/include/s5defs.txt b/docutils/parsers/rst/include/s5defs.txt
index dca77ca43..dca77ca43 100644
--- a/docutils/docutils/parsers/rst/include/s5defs.txt
+++ b/docutils/parsers/rst/include/s5defs.txt
diff --git a/docutils/docutils/parsers/rst/include/xhtml1-lat1.txt b/docutils/parsers/rst/include/xhtml1-lat1.txt
index 824dc61c0..824dc61c0 100644
--- a/docutils/docutils/parsers/rst/include/xhtml1-lat1.txt
+++ b/docutils/parsers/rst/include/xhtml1-lat1.txt
diff --git a/docutils/docutils/parsers/rst/include/xhtml1-special.txt b/docutils/parsers/rst/include/xhtml1-special.txt
index dc6f5753c..dc6f5753c 100644
--- a/docutils/docutils/parsers/rst/include/xhtml1-special.txt
+++ b/docutils/parsers/rst/include/xhtml1-special.txt
diff --git a/docutils/docutils/parsers/rst/include/xhtml1-symbol.txt b/docutils/parsers/rst/include/xhtml1-symbol.txt
index 8fe97f808..8fe97f808 100644
--- a/docutils/docutils/parsers/rst/include/xhtml1-symbol.txt
+++ b/docutils/parsers/rst/include/xhtml1-symbol.txt
diff --git a/docutils/docutils/parsers/rst/languages/__init__.py b/docutils/parsers/rst/languages/__init__.py
index be6feb644..be6feb644 100644
--- a/docutils/docutils/parsers/rst/languages/__init__.py
+++ b/docutils/parsers/rst/languages/__init__.py
diff --git a/docutils/docutils/parsers/rst/languages/af.py b/docutils/parsers/rst/languages/af.py
index c2d8fd4c7..c2d8fd4c7 100644
--- a/docutils/docutils/parsers/rst/languages/af.py
+++ b/docutils/parsers/rst/languages/af.py
diff --git a/docutils/docutils/parsers/rst/languages/ca.py b/docutils/parsers/rst/languages/ca.py
index ed181668d..ed181668d 100644
--- a/docutils/docutils/parsers/rst/languages/ca.py
+++ b/docutils/parsers/rst/languages/ca.py
diff --git a/docutils/docutils/parsers/rst/languages/cs.py b/docutils/parsers/rst/languages/cs.py
index 169d2c4f7..169d2c4f7 100644
--- a/docutils/docutils/parsers/rst/languages/cs.py
+++ b/docutils/parsers/rst/languages/cs.py
diff --git a/docutils/docutils/parsers/rst/languages/de.py b/docutils/parsers/rst/languages/de.py
index da528a7be..da528a7be 100644
--- a/docutils/docutils/parsers/rst/languages/de.py
+++ b/docutils/parsers/rst/languages/de.py
diff --git a/docutils/docutils/parsers/rst/languages/en.py b/docutils/parsers/rst/languages/en.py
index 1c0d7edba..1c0d7edba 100644
--- a/docutils/docutils/parsers/rst/languages/en.py
+++ b/docutils/parsers/rst/languages/en.py
diff --git a/docutils/docutils/parsers/rst/languages/eo.py b/docutils/parsers/rst/languages/eo.py
index 8565d6c8d..8565d6c8d 100644
--- a/docutils/docutils/parsers/rst/languages/eo.py
+++ b/docutils/parsers/rst/languages/eo.py
diff --git a/docutils/docutils/parsers/rst/languages/es.py b/docutils/parsers/rst/languages/es.py
index 8e86bae37..8e86bae37 100644
--- a/docutils/docutils/parsers/rst/languages/es.py
+++ b/docutils/parsers/rst/languages/es.py
diff --git a/docutils/docutils/parsers/rst/languages/fi.py b/docutils/parsers/rst/languages/fi.py
index 8f92a67ad..8f92a67ad 100644
--- a/docutils/docutils/parsers/rst/languages/fi.py
+++ b/docutils/parsers/rst/languages/fi.py
diff --git a/docutils/docutils/parsers/rst/languages/fr.py b/docutils/parsers/rst/languages/fr.py
index 7520f743b..7520f743b 100644
--- a/docutils/docutils/parsers/rst/languages/fr.py
+++ b/docutils/parsers/rst/languages/fr.py
diff --git a/docutils/docutils/parsers/rst/languages/it.py b/docutils/parsers/rst/languages/it.py
index cc1701941..cc1701941 100644
--- a/docutils/docutils/parsers/rst/languages/it.py
+++ b/docutils/parsers/rst/languages/it.py
diff --git a/docutils/docutils/parsers/rst/languages/ja.py b/docutils/parsers/rst/languages/ja.py
index 0bb701d85..0bb701d85 100644
--- a/docutils/docutils/parsers/rst/languages/ja.py
+++ b/docutils/parsers/rst/languages/ja.py
diff --git a/docutils/docutils/parsers/rst/languages/nl.py b/docutils/parsers/rst/languages/nl.py
index baaf2ae70..baaf2ae70 100644
--- a/docutils/docutils/parsers/rst/languages/nl.py
+++ b/docutils/parsers/rst/languages/nl.py
diff --git a/docutils/docutils/parsers/rst/languages/pt_br.py b/docutils/parsers/rst/languages/pt_br.py
index 43ebfaa3b..43ebfaa3b 100644
--- a/docutils/docutils/parsers/rst/languages/pt_br.py
+++ b/docutils/parsers/rst/languages/pt_br.py
diff --git a/docutils/docutils/parsers/rst/languages/ru.py b/docutils/parsers/rst/languages/ru.py
index 18354f738..18354f738 100644
--- a/docutils/docutils/parsers/rst/languages/ru.py
+++ b/docutils/parsers/rst/languages/ru.py
diff --git a/docutils/docutils/parsers/rst/languages/sk.py b/docutils/parsers/rst/languages/sk.py
index 513c432f4..513c432f4 100644
--- a/docutils/docutils/parsers/rst/languages/sk.py
+++ b/docutils/parsers/rst/languages/sk.py
diff --git a/docutils/docutils/parsers/rst/languages/sv.py b/docutils/parsers/rst/languages/sv.py
index 8ffe76e50..8ffe76e50 100644
--- a/docutils/docutils/parsers/rst/languages/sv.py
+++ b/docutils/parsers/rst/languages/sv.py
diff --git a/docutils/docutils/parsers/rst/languages/zh_cn.py b/docutils/parsers/rst/languages/zh_cn.py
index dee301ca6..dee301ca6 100644
--- a/docutils/docutils/parsers/rst/languages/zh_cn.py
+++ b/docutils/parsers/rst/languages/zh_cn.py
diff --git a/docutils/docutils/parsers/rst/languages/zh_tw.py b/docutils/parsers/rst/languages/zh_tw.py
index 77574b591..77574b591 100644
--- a/docutils/docutils/parsers/rst/languages/zh_tw.py
+++ b/docutils/parsers/rst/languages/zh_tw.py
diff --git a/docutils/docutils/parsers/rst/roles.py b/docutils/parsers/rst/roles.py
index 554e1f441..554e1f441 100644
--- a/docutils/docutils/parsers/rst/roles.py
+++ b/docutils/parsers/rst/roles.py
diff --git a/docutils/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py
index 363ef8fdd..363ef8fdd 100644
--- a/docutils/docutils/parsers/rst/states.py
+++ b/docutils/parsers/rst/states.py
diff --git a/docutils/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
index 1d5dc9dfd..1d5dc9dfd 100644
--- a/docutils/docutils/parsers/rst/tableparser.py
+++ b/docutils/parsers/rst/tableparser.py
diff --git a/docutils/docutils/readers/__init__.py b/docutils/readers/__init__.py
index b3a7e64eb..b3a7e64eb 100644
--- a/docutils/docutils/readers/__init__.py
+++ b/docutils/readers/__init__.py
diff --git a/docutils/docutils/readers/doctree.py b/docutils/readers/doctree.py
index 4138fb51e..4138fb51e 100644
--- a/docutils/docutils/readers/doctree.py
+++ b/docutils/readers/doctree.py
diff --git a/docutils/docutils/readers/pep.py b/docutils/readers/pep.py
index b181e20c8..b181e20c8 100644
--- a/docutils/docutils/readers/pep.py
+++ b/docutils/readers/pep.py
diff --git a/docutils/docutils/readers/python/__init__.py b/docutils/readers/python/__init__.py
index ba147a3d5..ba147a3d5 100644
--- a/docutils/docutils/readers/python/__init__.py
+++ b/docutils/readers/python/__init__.py
diff --git a/docutils/docutils/readers/python/moduleparser.py b/docutils/readers/python/moduleparser.py
index 03d57c948..03d57c948 100644
--- a/docutils/docutils/readers/python/moduleparser.py
+++ b/docutils/readers/python/moduleparser.py
diff --git a/docutils/docutils/readers/python/pynodes.py b/docutils/readers/python/pynodes.py
index 61e21f10e..61e21f10e 100644
--- a/docutils/docutils/readers/python/pynodes.py
+++ b/docutils/readers/python/pynodes.py
diff --git a/docutils/docutils/readers/standalone.py b/docutils/readers/standalone.py
index df291128f..df291128f 100644
--- a/docutils/docutils/readers/standalone.py
+++ b/docutils/readers/standalone.py
diff --git a/docutils/docutils/statemachine.py b/docutils/statemachine.py
index b14b308f7..b14b308f7 100644
--- a/docutils/docutils/statemachine.py
+++ b/docutils/statemachine.py
diff --git a/docutils/docutils/transforms/__init__.py b/docutils/transforms/__init__.py
index 36aa4e735..36aa4e735 100644
--- a/docutils/docutils/transforms/__init__.py
+++ b/docutils/transforms/__init__.py
diff --git a/docutils/docutils/transforms/components.py b/docutils/transforms/components.py
index 1c3ecbef6..1c3ecbef6 100644
--- a/docutils/docutils/transforms/components.py
+++ b/docutils/transforms/components.py
diff --git a/docutils/docutils/transforms/frontmatter.py b/docutils/transforms/frontmatter.py
index 14a3aa8cc..14a3aa8cc 100644
--- a/docutils/docutils/transforms/frontmatter.py
+++ b/docutils/transforms/frontmatter.py
diff --git a/docutils/docutils/transforms/misc.py b/docutils/transforms/misc.py
index 9567055f9..9567055f9 100644
--- a/docutils/docutils/transforms/misc.py
+++ b/docutils/transforms/misc.py
diff --git a/docutils/docutils/transforms/parts.py b/docutils/transforms/parts.py
index 1e275c78a..1e275c78a 100644
--- a/docutils/docutils/transforms/parts.py
+++ b/docutils/transforms/parts.py
diff --git a/docutils/docutils/transforms/peps.py b/docutils/transforms/peps.py
index edaba2557..edaba2557 100644
--- a/docutils/docutils/transforms/peps.py
+++ b/docutils/transforms/peps.py
diff --git a/docutils/docutils/transforms/references.py b/docutils/transforms/references.py
index c7e17b50e..c7e17b50e 100644
--- a/docutils/docutils/transforms/references.py
+++ b/docutils/transforms/references.py
diff --git a/docutils/docutils/transforms/universal.py b/docutils/transforms/universal.py
index b31648632..b31648632 100644
--- a/docutils/docutils/transforms/universal.py
+++ b/docutils/transforms/universal.py
diff --git a/docutils/docutils/transforms/writer_aux.py b/docutils/transforms/writer_aux.py
index 74ac4d4f6..74ac4d4f6 100644
--- a/docutils/docutils/transforms/writer_aux.py
+++ b/docutils/transforms/writer_aux.py
diff --git a/docutils/docutils/urischemes.py b/docutils/urischemes.py
index 584dad622..584dad622 100644
--- a/docutils/docutils/urischemes.py
+++ b/docutils/urischemes.py
diff --git a/docutils/docutils/utils.py b/docutils/utils.py
index 24c4986f0..24c4986f0 100644
--- a/docutils/docutils/utils.py
+++ b/docutils/utils.py
diff --git a/docutils/docutils/writers/__init__.py b/docutils/writers/__init__.py
index 5482cad42..5482cad42 100644
--- a/docutils/docutils/writers/__init__.py
+++ b/docutils/writers/__init__.py
diff --git a/docutils/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
index 2362e6b78..2362e6b78 100644
--- a/docutils/docutils/writers/docutils_xml.py
+++ b/docutils/writers/docutils_xml.py
diff --git a/docutils/docutils/writers/html4css1/__init__.py b/docutils/writers/html4css1/__init__.py
index 02833d66a..02833d66a 100644
--- a/docutils/docutils/writers/html4css1/__init__.py
+++ b/docutils/writers/html4css1/__init__.py
diff --git a/docutils/docutils/writers/html4css1/html4css1.css b/docutils/writers/html4css1/html4css1.css
index e94df1546..e94df1546 100644
--- a/docutils/docutils/writers/html4css1/html4css1.css
+++ b/docutils/writers/html4css1/html4css1.css
diff --git a/docutils/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
index cf7af05fd..cf7af05fd 100644
--- a/docutils/docutils/writers/latex2e/__init__.py
+++ b/docutils/writers/latex2e/__init__.py
diff --git a/docutils/docutils/writers/latex2e/latex2e.tex b/docutils/writers/latex2e/latex2e.tex
index 6e041a14b..6e041a14b 100644
--- a/docutils/docutils/writers/latex2e/latex2e.tex
+++ b/docutils/writers/latex2e/latex2e.tex
diff --git a/docutils/docutils/writers/newlatex2e/__init__.py b/docutils/writers/newlatex2e/__init__.py
index e46866d0d..e46866d0d 100644
--- a/docutils/docutils/writers/newlatex2e/__init__.py
+++ b/docutils/writers/newlatex2e/__init__.py
diff --git a/docutils/docutils/writers/newlatex2e/base.tex b/docutils/writers/newlatex2e/base.tex
index 231f3911f..231f3911f 100644
--- a/docutils/docutils/writers/newlatex2e/base.tex
+++ b/docutils/writers/newlatex2e/base.tex
diff --git a/docutils/docutils/writers/newlatex2e/unicode_map.py b/docutils/writers/newlatex2e/unicode_map.py
index 2998178f4..2998178f4 100644
--- a/docutils/docutils/writers/newlatex2e/unicode_map.py
+++ b/docutils/writers/newlatex2e/unicode_map.py
diff --git a/docutils/docutils/writers/null.py b/docutils/writers/null.py
index 4632c7457..4632c7457 100644
--- a/docutils/docutils/writers/null.py
+++ b/docutils/writers/null.py
diff --git a/docutils/docutils/writers/pep_html/__init__.py b/docutils/writers/pep_html/__init__.py
index a672e1c6d..a672e1c6d 100644
--- a/docutils/docutils/writers/pep_html/__init__.py
+++ b/docutils/writers/pep_html/__init__.py
diff --git a/docutils/docutils/writers/pep_html/pep.css b/docutils/writers/pep_html/pep.css
index 014d3e423..014d3e423 100644
--- a/docutils/docutils/writers/pep_html/pep.css
+++ b/docutils/writers/pep_html/pep.css
diff --git a/docutils/docutils/writers/pep_html/template.txt b/docutils/writers/pep_html/template.txt
index 6f96977e8..6f96977e8 100644
--- a/docutils/docutils/writers/pep_html/template.txt
+++ b/docutils/writers/pep_html/template.txt
diff --git a/docutils/docutils/writers/pseudoxml.py b/docutils/writers/pseudoxml.py
index c0e18bffb..c0e18bffb 100644
--- a/docutils/docutils/writers/pseudoxml.py
+++ b/docutils/writers/pseudoxml.py
diff --git a/docutils/docutils/writers/s5_html/__init__.py b/docutils/writers/s5_html/__init__.py
index e4bde3375..e4bde3375 100644
--- a/docutils/docutils/writers/s5_html/__init__.py
+++ b/docutils/writers/s5_html/__init__.py
diff --git a/docutils/docutils/writers/s5_html/themes/README.txt b/docutils/writers/s5_html/themes/README.txt
index 2e01b51ee..2e01b51ee 100644
--- a/docutils/docutils/writers/s5_html/themes/README.txt
+++ b/docutils/writers/s5_html/themes/README.txt
diff --git a/docutils/docutils/writers/s5_html/themes/big-black/__base__ b/docutils/writers/s5_html/themes/big-black/__base__
index f08be9ad5..f08be9ad5 100644
--- a/docutils/docutils/writers/s5_html/themes/big-black/__base__
+++ b/docutils/writers/s5_html/themes/big-black/__base__
diff --git a/docutils/docutils/writers/s5_html/themes/big-black/framing.css b/docutils/writers/s5_html/themes/big-black/framing.css
index 5a31113fb..5a31113fb 100644
--- a/docutils/docutils/writers/s5_html/themes/big-black/framing.css
+++ b/docutils/writers/s5_html/themes/big-black/framing.css
diff --git a/docutils/docutils/writers/s5_html/themes/big-black/pretty.css b/docutils/writers/s5_html/themes/big-black/pretty.css
index 82bcc9dc4..82bcc9dc4 100644
--- a/docutils/docutils/writers/s5_html/themes/big-black/pretty.css
+++ b/docutils/writers/s5_html/themes/big-black/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/big-white/framing.css b/docutils/writers/s5_html/themes/big-white/framing.css
index cd343432b..cd343432b 100644
--- a/docutils/docutils/writers/s5_html/themes/big-white/framing.css
+++ b/docutils/writers/s5_html/themes/big-white/framing.css
diff --git a/docutils/docutils/writers/s5_html/themes/big-white/pretty.css b/docutils/writers/s5_html/themes/big-white/pretty.css
index c5e2fcf97..c5e2fcf97 100644
--- a/docutils/docutils/writers/s5_html/themes/big-white/pretty.css
+++ b/docutils/writers/s5_html/themes/big-white/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/blank.gif b/docutils/writers/s5_html/themes/default/blank.gif
index 75b945d25..75b945d25 100644
--- a/docutils/docutils/writers/s5_html/themes/default/blank.gif
+++ b/docutils/writers/s5_html/themes/default/blank.gif
Binary files differ
diff --git a/docutils/docutils/writers/s5_html/themes/default/framing.css b/docutils/writers/s5_html/themes/default/framing.css
index c4727f303..c4727f303 100644
--- a/docutils/docutils/writers/s5_html/themes/default/framing.css
+++ b/docutils/writers/s5_html/themes/default/framing.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/iepngfix.htc b/docutils/writers/s5_html/themes/default/iepngfix.htc
index 9f3d628b5..9f3d628b5 100644
--- a/docutils/docutils/writers/s5_html/themes/default/iepngfix.htc
+++ b/docutils/writers/s5_html/themes/default/iepngfix.htc
diff --git a/docutils/docutils/writers/s5_html/themes/default/opera.css b/docutils/writers/s5_html/themes/default/opera.css
index c9d1148be..c9d1148be 100644
--- a/docutils/docutils/writers/s5_html/themes/default/opera.css
+++ b/docutils/writers/s5_html/themes/default/opera.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/outline.css b/docutils/writers/s5_html/themes/default/outline.css
index fa767e227..fa767e227 100644
--- a/docutils/docutils/writers/s5_html/themes/default/outline.css
+++ b/docutils/writers/s5_html/themes/default/outline.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/pretty.css b/docutils/writers/s5_html/themes/default/pretty.css
index 1cede72d4..1cede72d4 100644
--- a/docutils/docutils/writers/s5_html/themes/default/pretty.css
+++ b/docutils/writers/s5_html/themes/default/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/print.css b/docutils/writers/s5_html/themes/default/print.css
index 9d057cc8c..9d057cc8c 100644
--- a/docutils/docutils/writers/s5_html/themes/default/print.css
+++ b/docutils/writers/s5_html/themes/default/print.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/s5-core.css b/docutils/writers/s5_html/themes/default/s5-core.css
index 6965f5e8f..6965f5e8f 100644
--- a/docutils/docutils/writers/s5_html/themes/default/s5-core.css
+++ b/docutils/writers/s5_html/themes/default/s5-core.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/slides.css b/docutils/writers/s5_html/themes/default/slides.css
index 82bdc0ee0..82bdc0ee0 100644
--- a/docutils/docutils/writers/s5_html/themes/default/slides.css
+++ b/docutils/writers/s5_html/themes/default/slides.css
diff --git a/docutils/docutils/writers/s5_html/themes/default/slides.js b/docutils/writers/s5_html/themes/default/slides.js
index 81e04e5d4..81e04e5d4 100644
--- a/docutils/docutils/writers/s5_html/themes/default/slides.js
+++ b/docutils/writers/s5_html/themes/default/slides.js
diff --git a/docutils/docutils/writers/s5_html/themes/medium-black/__base__ b/docutils/writers/s5_html/themes/medium-black/__base__
index 401b621bd..401b621bd 100644
--- a/docutils/docutils/writers/s5_html/themes/medium-black/__base__
+++ b/docutils/writers/s5_html/themes/medium-black/__base__
diff --git a/docutils/docutils/writers/s5_html/themes/medium-black/pretty.css b/docutils/writers/s5_html/themes/medium-black/pretty.css
index 2ec10e2e8..2ec10e2e8 100644
--- a/docutils/docutils/writers/s5_html/themes/medium-black/pretty.css
+++ b/docutils/writers/s5_html/themes/medium-black/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/medium-white/framing.css b/docutils/writers/s5_html/themes/medium-white/framing.css
index 6c4e3abf2..6c4e3abf2 100644
--- a/docutils/docutils/writers/s5_html/themes/medium-white/framing.css
+++ b/docutils/writers/s5_html/themes/medium-white/framing.css
diff --git a/docutils/docutils/writers/s5_html/themes/medium-white/pretty.css b/docutils/writers/s5_html/themes/medium-white/pretty.css
index 07e07b9ab..07e07b9ab 100644
--- a/docutils/docutils/writers/s5_html/themes/medium-white/pretty.css
+++ b/docutils/writers/s5_html/themes/medium-white/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/small-black/__base__ b/docutils/writers/s5_html/themes/small-black/__base__
index 67f4db2bf..67f4db2bf 100644
--- a/docutils/docutils/writers/s5_html/themes/small-black/__base__
+++ b/docutils/writers/s5_html/themes/small-black/__base__
diff --git a/docutils/docutils/writers/s5_html/themes/small-black/pretty.css b/docutils/writers/s5_html/themes/small-black/pretty.css
index 5c1932704..5c1932704 100644
--- a/docutils/docutils/writers/s5_html/themes/small-black/pretty.css
+++ b/docutils/writers/s5_html/themes/small-black/pretty.css
diff --git a/docutils/docutils/writers/s5_html/themes/small-white/framing.css b/docutils/writers/s5_html/themes/small-white/framing.css
index 70287dd06..70287dd06 100644
--- a/docutils/docutils/writers/s5_html/themes/small-white/framing.css
+++ b/docutils/writers/s5_html/themes/small-white/framing.css
diff --git a/docutils/docutils/writers/s5_html/themes/small-white/pretty.css b/docutils/writers/s5_html/themes/small-white/pretty.css
index ba988e13b..ba988e13b 100644
--- a/docutils/docutils/writers/s5_html/themes/small-white/pretty.css
+++ b/docutils/writers/s5_html/themes/small-white/pretty.css
diff --git a/docutils/extras/optparse.py b/extras/optparse.py
index c21663c55..c21663c55 100644
--- a/docutils/extras/optparse.py
+++ b/extras/optparse.py
diff --git a/docutils/extras/roman.py b/extras/roman.py
index ebe088308..ebe088308 100644
--- a/docutils/extras/roman.py
+++ b/extras/roman.py
diff --git a/docutils/extras/textwrap.py b/extras/textwrap.py
index 6bafc8ffc..6bafc8ffc 100644
--- a/docutils/extras/textwrap.py
+++ b/extras/textwrap.py
diff --git a/docutils/install.py b/install.py
index 1a71e433f..1a71e433f 100755
--- a/docutils/install.py
+++ b/install.py
diff --git a/docutils/licenses/docutils.conf b/licenses/docutils.conf
index cdce8d629..cdce8d629 100644
--- a/docutils/licenses/docutils.conf
+++ b/licenses/docutils.conf
diff --git a/docutils/licenses/gpl.txt b/licenses/gpl.txt
index 5b6e7c66c..5b6e7c66c 100644
--- a/docutils/licenses/gpl.txt
+++ b/licenses/gpl.txt
diff --git a/docutils/licenses/python-2-1-1.txt b/licenses/python-2-1-1.txt
index 7664787d1..7664787d1 100644
--- a/docutils/licenses/python-2-1-1.txt
+++ b/licenses/python-2-1-1.txt
diff --git a/docutils/licenses/python-2-2.txt b/licenses/python-2-2.txt
index f7c869124..f7c869124 100644
--- a/docutils/licenses/python-2-2.txt
+++ b/licenses/python-2-2.txt
diff --git a/docutils/licenses/python-2-3.txt b/licenses/python-2-3.txt
index d33d9b08a..d33d9b08a 100644
--- a/docutils/licenses/python-2-3.txt
+++ b/licenses/python-2-3.txt
diff --git a/sandbox/README.txt b/sandbox/README.txt
deleted file mode 100644
index 4bd5b2620..000000000
--- a/sandbox/README.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-=====================
- README: The Sandbox
-=====================
-
-The Sandbox_ is a place to play around, to try out and share ideas.
-It's a part of the Subversion repository but it isn't distributed as
-part of Docutils_ releases. Each developer who wants to play here
-should create their own subdirectory (suggested name: SourceForge ID,
-or given name + family initial).
-
-It's OK to make a mess here! But please, play nice.
-
-For more information, please see the `Docutils Project Policies`_.
-
-.. This link gives readers a way to *get to* the sandbox:
-.. _Sandbox: ./
-
-.. _Docutils: http://docutils.sourceforge.net/
-.. _Docutils Project Policies:
- http://docutils.sourceforge.net/docs/dev/policies.html#the-sandbox
-
-
-Sandbox Projects
-================
-
-.. contents:: :local:
-
-
-Project Infrastructure
-----------------------
-
-`docutils-update <infrastructure/docutils-update>`_ is a script that
-is installed as a cron job on BerliOS.de to automatically update the
-Docutils `web site`_ whenever the SVN files change. Any .html
-document with a corresponding .txt file is regenerated whenever the
-.txt file changes.
-
-.. _web site: http://docutils.sf.net/docs/dev/website.html
-
-
-Documenting Python
-------------------
-
-Some work has been done on enabling Docutils to write the
-`"Documenting Python" variant of LaTeX`__, which we're calling
-"DocPy".
-
-__ http://docs.python.org/doc/doc.html
-
-* `Edward Loper's sandbox
- <http://docutils.sf.net/sandbox/edloper/docpy/>`__. The example
- "asyncore.rst" file was originally adapted by Steve Holden and Bill
- Sconce.
-
-* `Dave Kuhlman's sandbox
- <http://docutils.sf.net/sandbox/dkuhlman/>`__ and `his homepage
- <http://www.rexx.com/~dkuhlman/rstpythonlatex_intro.html>`__.
-
-
-Other Sandbox Projects
-----------------------
-
-For other sandbox projects, please see the `Docutils Link List`_.
-
-.. _Docutils Link List: http://docutils.sf.net/docs/user/links.html
diff --git a/sandbox/aahz/Effective/EffDirectives.py b/sandbox/aahz/Effective/EffDirectives.py
deleted file mode 100644
index bdb46eb6d..000000000
--- a/sandbox/aahz/Effective/EffDirectives.py
+++ /dev/null
@@ -1,146 +0,0 @@
-import sys
-import os
-import re
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.languages import en
-
-import EffTransformer
-
-registry = directives._directive_registry
-registry['chapter-list'] = ('EffDirectives', 'chapter_list')
-registry['item-list'] = ('EffDirectives', 'item_list')
-registry['index'] = ('EffDirectives', 'index_directive')
-registry['include-code'] = ('EffDirectives', 'include_code')
-registry['include-output'] = ('EffDirectives', 'include_output')
-registry['comment'] = ('EffDirectives', 'comment')
-
-en.directives['chapter-list'] = 'chapter-list'
-en.directives['item-list'] = 'item-list'
-en.directives['index'] = 'index'
-en.directives['include-code'] = 'include-code'
-en.directives['include-output'] = 'include-output'
-en.directives['comment'] = 'comment'
-
-
-
-def chapter_list(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- document = state_machine.document
- chapters = {}
- chapter_num = 1
- for chapter in content:
- chapter = chapter.strip()
- chapters[chapter] = chapter_num
- chapter_num += 1
- document.chapters = chapters
- return []
-
-chapter_list.content = 1
-
-
-
-def item_list(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- document = state_machine.document
- items = {}
- document.items = items
- return []
-
-item_list.content = 1
-
-
-
-class index_entry(nodes.Inline, nodes.Invisible, nodes.Element): pass
-class index_entry_level(nodes.Inline, nodes.TextElement): pass
-
-re_index_levels = re.compile(r';\w*')
-
-def index_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #pending = nodes.pending(EffTransformer.Index, {'entries': content})
- #state_machine.document.note_pending(pending)
- #return [pending]
- # XXX
- entries = []
- message_set = []
- for entry in content:
- levels = re_index_levels.split(entry)
- tmp = []
- for level in levels:
- textnodes, messages = state.inline_text(level, lineno)
- entry_level = index_entry_level(level, '', *textnodes)
- tmp.append(entry_level)
- message_set.extend(messages)
- index = index_entry(entry, *tmp)
- entries.append(index)
- pending = nodes.pending(EffTransformer.Index, {'entries': entries})
- state_machine.document.note_pending(pending)
- return [pending] + message_set
-
-index_directive.content = 1
-
-
-
-MAX_WIDTH = 65
-
-def _checkwidth(fname, code):
- code = code.split('\n')
- i = 1
- for line in code:
- if len(line) > MAX_WIDTH:
- print "Line %s in %s exceeds %s chars" % (i, fname, MAX_WIDTH)
- print " ", line
- i += 1
-
-def include_code(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #obj = state_machine.document.attributes
- #print >> sys.stderr, obj
- #print >> sys.stderr, dir(obj)
- document = state_machine.document
- dirname = _getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- code = open(fname).read()
- _checkwidth(fname, code)
- node = nodes.literal_block(code, code)
- return [node]
-
-include_code.arguments = (0, 1, 0)
-
-
-
-def include_output(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- document = state_machine.document
- dirname = _getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- cmd = os.environ['PYTHON'] + ' ' + fname
- f_input, f_output = os.popen4(cmd)
- output = f_output.read()
- f_output.close()
- return [nodes.literal_block(output, output)]
-
-include_output.arguments = (0, 1, 0)
-
-
-
-def comment(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- return []
-
-comment.content = 1
-
-
-
-def _getDocDir(document):
- source = document.current_source
- if source is None:
- return os.getcwd()
- else:
- dirname = os.path.dirname(os.path.abspath(source))
- if dirname is None:
- return os.getcwd()
- else:
- return dirname
diff --git a/sandbox/aahz/Effective/EffMap.py b/sandbox/aahz/Effective/EffMap.py
deleted file mode 100644
index 15e396cf7..000000000
--- a/sandbox/aahz/Effective/EffMap.py
+++ /dev/null
@@ -1,12 +0,0 @@
-StyleMap = {
- 'sections': ['HB', 'HC', 'HD'],
- 'paragraph': 'Body',
-
- 'admonition': 'CALLOUT',
- 'footnote': 'FTN',
- 'literal_block': 'CP',
-
- 'emphasis': 'E2',
- 'literal': 'C1',
- 'strong': 'E1',
- }
diff --git a/sandbox/aahz/Effective/EffParser.py b/sandbox/aahz/Effective/EffParser.py
deleted file mode 100644
index ee281d571..000000000
--- a/sandbox/aahz/Effective/EffParser.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import sys
-import os
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.languages import en
-
-import sys
-from warnings import warn
-import re
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-from docutils.parsers import rst
-
-en.roles['chapter'] = 'chapter'
-en.roles['figure'] = 'figure'
-en.roles['item'] = 'item'
-en.roles['list'] = 'list'
-
-class Inliner(rst.states.Inliner):
- _interpreted_roles = rst.states.Inliner._interpreted_roles.copy()
- _interpreted_roles.update({
- 'chapter': 'chapter_role',
- 'figure': 'figure_role',
- 'item': 'item_role',
- 'list': 'list_role',
- })
-
- def chapter_role(self, role, rawtext, text, lineno):
- return [nodes.emphasis(rawtext, text)], []
-
- def figure_role(self, role, rawtext, text, lineno):
- return [nodes.emphasis(rawtext, text)], []
-
- def item_role(self, role, rawtext, text, lineno):
- return [nodes.emphasis(rawtext, text)], []
-
- def list_role(self, role, rawtext, text, lineno):
- return [nodes.emphasis(rawtext, text)], []
-
-class Parser(rst.Parser):
- def __init__(self, *args, **kwargs):
- rst.Parser.__init__(self, *args, **kwargs)
diff --git a/sandbox/aahz/Effective/EffTransformer.py b/sandbox/aahz/Effective/EffTransformer.py
deleted file mode 100644
index a88e41cd7..000000000
--- a/sandbox/aahz/Effective/EffTransformer.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from docutils import nodes
-from docutils import transforms
-
-#class index_entry(nodes.Inline, nodes.TextElement): pass
-
-class Index(transforms.Transform):
- default_priority = 250
-
- def apply(self):
- pending = self.startnode
- curr_index = pending.parent.index(pending)
- if curr_index == 0:
- error = self.document.reporter.error(
- 'Index directive must follow a text node',
- nodes.literal_block(pending.rawsource, pending.rawsource),
- line=pending.line)
- pending.parent.replace(pending, error)
- return
- entries = []
- for entry in pending.details['entries']:
- entries.append(entry)
- sibling = pending.parent[curr_index-1]
- sibling.children[0:0] = entries
- pending.parent.remove(pending)
diff --git a/sandbox/aahz/Effective/MIFwriter.py b/sandbox/aahz/Effective/MIFwriter.py
deleted file mode 100644
index c83f1e898..000000000
--- a/sandbox/aahz/Effective/MIFwriter.py
+++ /dev/null
@@ -1,777 +0,0 @@
-# Author: Aahz
-# Contact: aahz@pythoncraft.com
-# Revision:
-# Copyright: This module has been placed in the public domain.
-
-"""
-MIF writer
-
-The output is a FrameMaker MIF file.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-from warnings import warn
-import re
-
-import docutils
-from docutils import nodes, utils, writers, languages
-from docutils import transforms
-
-
-LineBreak = '<Char HardReturn>'
-LineBreak = r'\x09 '
-NoBreakSpace = r'\x11 '
-NoBreakHyphen = r'\x15 '
-emDash = r'\xd1 '
-
-
-class FrameBool(int):
- def __str__(self):
- if self:
- return 'Yes'
- else:
- return 'No'
-
-# register_directive()
-
-
-class makeFrameIDs(transforms.Transform):
- default_priority = 950
-
- def apply(self):
- frameID = 1000
- doc = self.document
- nodes = (doc.autofootnotes + doc.symbol_footnotes +
- doc.footnotes)
- for node in nodes:
- node['frameID'] = frameID
- frameID += 1
-
-
-class Writer(writers.Writer):
-
- supported = ('MIF')
- """Formats this writer supports."""
-
- def get_transforms(self):
- return writers.Writer.get_transforms(self) + [makeFrameIDs]
-
- def __init__(self, style_map):
- writers.Writer.__init__(self)
- self.output = None
- self.style_map = style_map
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document, self.style_map)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
- header = ['<MIFFile 7.0>\n\n']
- footer = []
-
- re_spaces = re.compile(' +')
-
- re_annotation = re.compile(r'#\d+(?:, #\d+)*$')
-
- def __init__(self, document, style_map):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = document.settings
- self.style_map = style_map
- self.body = []
- self.footnotes = []
- self.section_level = 0
- self.skip_para_tag = False
- self.in_index = False
-
- self.curr_contents = self.body
-
- self._indent_level = 0
- self._frameIDcounter = 1000
-
- def astext(self):
- return ''.join(self.header + self.footnotes + self.body +
- self.footer)
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- text = text.replace('\\', '\\\\')
- text = text.replace("'", r'\q')
- text = text.replace('`', r'\Q')
- text = text.replace('\t', r'\t')
- text = text.replace('>', r'\>')
- return text
-
- def literal(self, text):
- if not self.in_index:
- return (" " * self._indent_level) + (" <String `%s'>\n" % text)
- else:
- return text
-
-
- def charstyle_start(self, font):
- if not self.in_index:
- return " <Font\n <FTag `%s'>\n >\n" % font
- else:
- return "<%s\>" % font
-
- def charstyle_end(self):
- if not self.in_index:
- return " <Font\n <FTag `'>\n >\n"
- else:
- return "<Default Para Font\>"
-
- def para_start(self, font):
- indent = ' ' * self._indent_level
- tmp = []
- tmp.append(indent + "<Para\n")
- tmp.append(indent + " <PgfTag `%s'>\n" % font)
- tmp.append(indent + " <ParaLine\n")
- return ''.join(tmp)
-
- def para_end(self):
- indent = ' ' * self._indent_level
- tmp = []
- tmp.append(indent + " >\n")
- tmp.append(indent + ">\n")
- if self._indent_level == 0:
- tmp.append(indent + "\n")
- return ''.join(tmp)
-
- def visit_Text(self, node):
- text = node.astext()
- text = text.replace('.\n', '. \n')
- text = text.replace('\n', ' \n')
- lines = text.split('\n')
- for line in lines:
- line = self.literal(self.encode(line))
- self.curr_contents.append(line)
-
- def depart_Text(self, node):
- pass
-
- def visit_admonition(self, node, name):
- self.skip_para_tag = True
- self.body.append(self.para_start(self.style_map['admonition']))
-
- def depart_admonition(self):
- self.body.append(self.para_end())
- self.skip_para_tag = False
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_block_quote(self, node):
- raise nodes.SkipNode
- self.skip_para_tag = True
- self.body.append(self.para_start('.quotes'))
-
- def depart_block_quote(self, node):
- self.body.append(self.para_end())
- self.skip_para_tag = False
-
- def visit_bullet_list(self, node):
- raise nodes.SkipNode
- self.body.append('\n<text:unordered-list text:style-name=".bullet">\n')
-
- def depart_bullet_list(self, node):
- self.body.append('</text:unordered-list>\n')
-
- def visit_caption(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- self.body.append('</p>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- raise NotImplementedError
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- self.body.append(']</a>')
-
- def visit_classifier(self, node):
- raise NotImplementedError
- self.body.append(' <span class="classifier-delimiter">:</span> ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- self.body.append('</span>')
-
- def visit_colspec(self, node):
- raise NotImplementedError
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- raise NotImplementedError
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.body.append(self.emptytag(node, 'col',
- colwidth='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node):
- print node.astext()
- raise nodes.SkipNode
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- raise NotImplementedError
- self.body.append('</dt>\n')
- self.body.append(self.starttag(node, 'dd', ''))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_definition(self, node):
- self.body.append('</dd>\n')
-
- def visit_definition_list(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- self.body.append('</dl>\n')
-
- def visit_definition_list_item(self, node):
- raise NotImplementedError
- raise nodes.SkipNode
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- raise NotImplementedError
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'td', ''))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_description(self, node):
- self.body.append('</td>')
-
- def visit_doctest_block(self, node):
- self.visit_literal_block(node)
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.body.append(self.charstyle_start(self.style_map['emphasis']))
-
- def depart_emphasis(self, node):
- self.body.append(self.charstyle_end())
-
- def visit_entry(self, node):
- raise NotImplementedError
- raise nodes.SkipNode
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
- elif isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_entry(self, node):
- self.body.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- raise NotImplementedError
- raise nodes.SkipNode
- """
- The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
- CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
- usable.
- """
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['class'] = node['enumtype']
- # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
- # single "format" attribute? Use CSS2?
- old_compact_simple = self.compact_simple
- self.context.append((self.compact_simple, self.compact_p))
- self.compact_p = None
- self.compact_simple = (self.options.compact_lists and
- (self.compact_simple
- or self.topic_class == '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))
-
- def depart_enumerated_list(self, node):
- self.compact_simple, self.compact_p = self.context.pop()
- self.body.append('</ol>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- raise NotImplementedError
- raise NotImplementedError
- self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
-
- def depart_field(self, node):
- self.body.append('</tr>\n')
-
- def visit_field_body(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_field_body(self, node):
- self.body.append('</td>\n')
-
- def visit_field_list(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'table', frame='void',
- rules='none', CLASS='field-list'))
- self.body.append('<col class="field-name" />\n'
- '<col class="field-body" />\n'
- '<tbody valign="top">\n')
-
- def depart_field_list(self, node):
- self.body.append('</tbody>\n</table>\n')
-
- def visit_field_name(self, node):
- raise NotImplementedError
- atts = {}
- if self.in_docinfo:
- atts['class'] = 'docinfo-name'
- else:
- atts['class'] = 'field-name'
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'th', '', **atts))
-
- def depart_field_name(self, node):
- self.body.append(':</th>')
- self.body.append(self.context.pop())
-
- def visit_figure(self, node):
- raise nodes.SkipNode
- self.body.append(self.para_start('.figure'))
-
- def depart_figure(self, node):
- self.body.append(self.para_end())
-
- def visit_footnote(self, node):
- self.footnotes.append("<Notes\n <FNote\n")
- self.footnotes.append(" <ID %s>\n" % node['frameID'])
- self._indent_level += 2
- self.footnotes.append(self.para_start(self.style_map['footnote']))
- self.curr_contents = self.footnotes
- self.skip_para_tag = True
-
- def depart_footnote(self, node):
- self.footnotes.append(self.para_end())
- self._indent_level -= 2
- self.footnotes.append(' >\n>\n\n')
- self.skip_para_tag = False
- self.curr_contents = self.body
-
- def footnote_backrefs(self, node):
- warn("footnote backrefs not available")
-
- def visit_footnote_reference(self, node):
- name = node['refid']
- footnoteID = self.document.nameids[name]
- footnote = self.document.ids[footnoteID]
- self.body.append(' <FNote %s>\n' % footnote['frameID'])
- raise nodes.SkipNode
-
- def depart_footnote_reference(self, node):
- pass
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- raise NotImplementedError
- self.context.append(len(self.body))
-
- def depart_header(self, node):
- start = self.context.pop()
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('<hr />\n</div>\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- raise nodes.SkipNode
- name = "Figure: %s\n" % node.attributes['uri']
- self.body.append(name)
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_index_entry(self, node):
- self.body.append(" <Marker\n")
- self.body.append(" <MTypeName `Index'>\n")
- self.body.append(" <MText `")
- self.in_index = True
- return
-
- def depart_index_entry(self, node):
- self.body.append("'>\n")
- self.body.append(" >\n")
- self.in_index = False
-
- def visit_index_entry_level(self, node):
- pass
-
- def depart_index_entry_level(self, node):
- # index_entry can only contain index_entry_level
- if node.parent[-1] != node:
- self.body.append(':')
-
- def visit_interpreted(self, node):
- # @@@ Incomplete, pending a proper implementation on the
- # Parser/Reader end.
- #self.body.append(node['role'] + ':')
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def depart_interpreted(self, node):
- pass
-
- # Don't need footnote labels/numbers
- def visit_label(self, node):
- raise nodes.SkipNode
-
- def depart_label(self, node):
- pass
-
- def visit_legend(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- self.body.append('</div>\n')
-
- def visit_line_block(self, node):
- raise nodes.SkipNode
- self.body.append(self.para_start('.quotes'))
- lines = node.astext()
- lines = lines.split('\n')
- lines = self.line_break.join(lines)
- self.body.append(lines)
- self.body.append(self.para_end())
- raise nodes.SkipNode
-
- def visit_list_item(self, node):
- raise nodes.SkipNode
- self.body.append('<text:list-item>')
-
- def depart_list_item(self, node):
- self.body.append('</text:list-item>\n')
-
- def visit_literal(self, node):
- self.body.append(self.charstyle_start(self.style_map['literal']))
-
- def depart_literal(self, node):
- self.body.append(self.charstyle_end())
-
- def visit_literal_block(self, node):
- lines = self.encode(node.astext())
- lines = lines.split('\n')
- while lines[-1] == '':
- lines.pop()
- for line in lines:
- self.body.append(self.para_start(self.style_map['literal_block']))
- self.body.append(self.literal(line))
- self.body.append(self.para_end())
- raise nodes.SkipNode
-
- def visit_note(self, node):
- self.visit_admonition(node, '.note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- raise NotImplementedError
- if self.context[-1]:
- self.body.append(', ')
-
- def depart_option(self, node):
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- raise NotImplementedError
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- self.body.append('</var>')
-
- def visit_option_group(self, node):
- raise NotImplementedError
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'td', **atts))
- self.body.append('<kbd>')
- self.context.append(0) # count number of options
-
- def depart_option_group(self, node):
- self.context.pop()
- self.body.append('</kbd></td>\n')
- self.body.append(self.context.pop())
-
- def visit_option_list(self, node):
- raise NotImplementedError
- self.body.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none"))
- self.body.append('<col class="option" />\n'
- '<col class="description" />\n'
- '<tbody valign="top">\n')
-
- def depart_option_list(self, node):
- self.body.append('</tbody>\n</table>\n')
-
- def visit_option_list_item(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- self.body.append('</tr>\n')
-
- def visit_option_string(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- self.body.append('</span>')
-
- def visit_paragraph(self, node):
- if not self.skip_para_tag:
- self.body.append(self.para_start(self.style_map['paragraph']))
-
- def depart_paragraph(self, node):
- if not self.skip_para_tag:
- self.body.append(self.para_end())
-
- def visit_problematic(self, node):
- raise NotImplementedError
- if node.hasattr('refid'):
- self.body.append('<a href="#%s" name="%s">' % (node['refid'],
- node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- self.body.append('</span>')
- self.body.append(self.context.pop())
-
- def visit_raw(self, node):
- raise NotImplementedError
- if node.has_key('format') and node['format'] == 'html':
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- # XXX
- # Keep from processing URLs
- pass
-
- def depart_reference(self, node):
- pass
-
- def visit_row(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- self.body.append('</tr>\n')
-
- def visit_section(self, node):
- self.section_level += 1
-
- def depart_section(self, node):
- self.section_level -= 1
-
- def visit_strong(self, node):
- self.body.append(self.charstyle_start(self.style_map['strong']))
-
- def depart_strong(self, node):
- self.body.append(self.charstyle_end())
-
- def visit_table(self, node):
- raise NotImplementedError
- self.body.append(
- self.starttag(node, 'table', CLASS="table",
- frame='border', rules='all'))
-
- def depart_table(self, node):
- self.body.append('</table>\n')
-
- def visit_target(self, node):
- raise NotImplementedError
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- self.body.append(self.starttag(node, 'a', '', CLASS='target'))
- self.context.append('</a>')
- else:
- self.context.append('')
-
- def depart_target(self, node):
- self.body.append(self.context.pop())
-
- def visit_tbody(self, node):
- raise NotImplementedError
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n' or ''
- self.body.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- self.body.append('</tbody>\n')
-
- def visit_term(self, node):
- raise NotImplementedError
- self.body.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- """
- Leave the end tag to `self.visit_definition()`, in case there's a
- classifier.
- """
- pass
-
- def visit_tgroup(self, node):
- raise NotImplementedError
- # Mozilla needs <colgroup>:
- self.body.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- raise NotImplementedError
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.body.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- self.body.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- """Only 3 section levels are supported by this writer."""
- style = self.style_map['sections'][self.section_level]
- title_tag = self.para_start(style)
- self.body.append(title_tag)
-
- def depart_title(self, node):
- self.body.append(self.para_end())
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def visit_system_message(self, node):
- print node.astext()
- raise nodes.SkipNode
-
- def depart_system_message(self, node):
- pass
-
- def unknown_visit(self, node):
- print "Failure processing at line", node.line
- print "Failure is", node.astext()
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
diff --git a/sandbox/aahz/Effective/bug_report.py b/sandbox/aahz/Effective/bug_report.py
deleted file mode 100644
index e6f9349f1..000000000
--- a/sandbox/aahz/Effective/bug_report.py
+++ /dev/null
@@ -1,43 +0,0 @@
-reST_text = """
-``spam``
-
-blah blah
-
-.. index::
- ``xyzzy``
- plugh
- spam ``eggs``
-"""
-
-import sys
-import zipfile
-from cStringIO import StringIO
-
-from docutils import core, io
-
-import EffDirectives
-import EffParser
-import EffMap
-
-class MIF: pass
-writer = MIF
-writer = None
-
-if writer is MIF:
- import MIFwriter as EffWriter
- pub = core.Publisher(writer=EffWriter.Writer(EffMap.StyleMap))
-else:
- pub = core.Publisher()
- pub.set_writer('pseudoxml')
-
-inliner = EffParser.Inliner()
-pub.set_reader('standalone', EffParser.Parser(inliner=inliner),
- 'restructuredtext')
-settings = pub.get_settings()
-#settings.doctitle_xform = 0
-settings.traceback = 1
-pub.source = io.StringInput(reST_text)
-pub.destination = io.StringOutput(encoding='utf-8')
-content = pub.publish()
-
-print content
diff --git a/sandbox/aahz/Effective/eff_publish.py b/sandbox/aahz/Effective/eff_publish.py
deleted file mode 100644
index bbf23b9f9..000000000
--- a/sandbox/aahz/Effective/eff_publish.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import sys
-import zipfile
-from cStringIO import StringIO
-
-from docutils import core, io
-
-outfile = sys.argv[2]
-
-import EffDirectives
-import EffParser
-import EffMap
-
-class OO: pass
-class MIF: pass
-writer = MIF
-writer = OO
-
-if writer is OO:
- import OOtext
- import OOwriter as EffWriter
-elif writer is MIF:
- import MIFwriter as EffWriter
-else:
- raise "Bad writer"
-
-pub = core.Publisher(writer=EffWriter.Writer(EffMap.StyleMap))
-inliner = EffParser.Inliner()
-pub.set_reader('standalone', EffParser.Parser(inliner=inliner),
- 'restructuredtext')
-settings = pub.get_settings()
-#settings.doctitle_xform = 0
-settings.traceback = 1
-pub.source = io.FileInput(source_path=sys.argv[1])
-pub.destination = io.StringOutput(encoding='utf-8')
-content = pub.publish()
-
-if writer is OO:
- manifest_list = [
- ('content.xml', content),
- ('styles.xml', OOtext.styles)
- ]
-
- manifest_entries = []
- for docname, _ in manifest_list:
- manifest_entries.append(OOtext.manifest_format % docname)
- manifest = OOtext.manifest % '\n '.join(manifest_entries)
- manifest_list.append( ('META-INF/manifest.xml', manifest) )
-
- zip = zipfile.ZipFile(outfile, "w")
- for docname, contents in manifest_list:
- zinfo = zipfile.ZipInfo(docname)
- zip.writestr(zinfo, contents)
- zip.close()
-elif writer is MIF:
- file(outfile, 'wb').write(content)
diff --git a/sandbox/aahz/OO/Makefile b/sandbox/aahz/OO/Makefile
deleted file mode 100644
index 57b826b59..000000000
--- a/sandbox/aahz/OO/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-export PYTHON=python
-export PYTHONPATH=$(HOME)/src/Lib-Python
-MAIN=$(HOME)/write/effective/book
-
-CHAPTER=Way
-CHAPTER=Control
-CHAPTER=Objects
-CHAPTER=Data
-
-SRCDIR=$(MAIN)/tmp/$(CHAPTER)
-SRCDIR=$(MAIN)/Chapters/$(CHAPTER)
-SRC=$(SRCDIR)/$(CHAPTER)
-
-DESTDIR=$(MAIN)/Output/$(CHAPTER)
-DESTDIR=$(MAIN)/Output/upload
-DEST=$(DESTDIR)/$(CHAPTER).sxw
-
-#DEST=$(MAIN)/Output/foo.xml
-
-GRAPH_TYPE=pdf
-GRAPH_TYPE=eps
-
-test:
- #$(PYTHON) force_mkdir.py $(DESTDIR)
- $(PYTHON) graphics_output.py $(GRAPH_TYPE) $(SRCDIR) $(DESTDIR)
- $(PYTHON) open_office.py $(SRC) $(DEST)
- #$(PYTHON) publish.py $(SRC) > $(DEST)
diff --git a/sandbox/aahz/OO/OOdirectives.py b/sandbox/aahz/OO/OOdirectives.py
deleted file mode 100644
index e437f6fbf..000000000
--- a/sandbox/aahz/OO/OOdirectives.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import sys
-import os
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.languages import en
-
-registry = directives._directive_registry
-registry['index'] = ('OOdirectives', 'index_directive')
-registry['include-code'] = ('OOdirectives', 'include_code')
-registry['include-output'] = ('OOdirectives', 'include_output')
-
-en.directives['index'] = 'index'
-en.directives['include-code'] = 'include-code'
-en.directives['include-output'] = 'include-output'
-
-
-class index_entry(nodes.General, nodes.Element): pass
-class index_entry(nodes.Inline, nodes.TextElement): pass
-
-def index_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #nodes = []
- #for entry in content:
- # nodes.append(index_entry(entry, entry))
- #return nodes
- entries = '\n'.join(content)
- return [index_entry(entries,entries)]
-
-index_directive.content = 1
-
-
-
-def include_code(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #obj = state_machine.document.attributes
- #print >> sys.stderr, obj
- #print >> sys.stderr, dir(obj)
- document = state_machine.document
- dirname = getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- code = open(fname).read()
- return [nodes.literal_block(code, code)]
-
-include_code.arguments = (0, 1, 0)
-
-
-
-def include_output(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- document = state_machine.document
- dirname = getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- cmd = os.environ['PYTHON'] + ' ' + fname
- f_input, f_output = os.popen4(cmd)
- output = f_output.read()
- f_output.close()
- return [nodes.literal_block(output, output)]
-
-include_output.arguments = (0, 1, 0)
-
-
-def getDocDir(document):
- source = document.current_source
- if source is None:
- return os.getcwd()
- else:
- dirname = os.path.dirname(os.path.abspath(source))
- if dirname is None:
- return os.getcwd()
- else:
- return dirname
diff --git a/sandbox/aahz/OO/OOtext.py b/sandbox/aahz/OO/OOtext.py
deleted file mode 100644
index 9651a10c6..000000000
--- a/sandbox/aahz/OO/OOtext.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# Can't have blank line at beginning of XML
-
-styles = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE office:document-styles PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "office.dtd">
-<office:document-styles xmlns:office="http://openoffice.org/2000/office" xmlns:style="http://openoffice.org/2000/style" xmlns:text="http://openoffice.org/2000/text" xmlns:table="http://openoffice.org/2000/table" xmlns:draw="http://openoffice.org/2000/drawing" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:number="http://openoffice.org/2000/datastyle" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="http://openoffice.org/2000/chart" xmlns:dr3d="http://openoffice.org/2000/dr3d" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="http://openoffice.org/2000/form" xmlns:script="http://openoffice.org/2000/script" office:version="1.0">
- <office:font-decls>
- <style:font-decl style:name="StarSymbol" fo:font-family="StarSymbol" style:font-charset="x-symbol"/>
- <style:font-decl style:name="Courier" fo:font-family="Courier" style:font-family-generic="modern" style:font-pitch="fixed"/>
- <style:font-decl style:name="Arial Unicode MS" fo:font-family="&apos;Arial Unicode MS&apos;" style:font-pitch="variable"/>
- <style:font-decl style:name="Thorndale" fo:font-family="Thorndale" style:font-family-generic="roman" style:font-pitch="variable"/>
- </office:font-decls>
- <office:styles>
- <style:default-style style:family="graphics">
- <style:properties draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" fo:color="#000000" style:font-name="Thorndale" fo:font-size="12pt" fo:language="en" fo:country="US" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="none" style:country-complex="none" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict">
- <style:tab-stops/>
- </style:properties>
- </style:default-style>
- <style:default-style style:family="paragraph">
- <style:properties fo:color="#000000" style:font-name="Thorndale" fo:font-size="12pt" fo:language="en" fo:country="US" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="none" style:country-complex="none" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="2.205cm"/>
- </style:default-style>
- <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
- <style:style style:name=".body" style:family="paragraph" style:parent-style-name="Standard"/>
- <style:style style:name=".CALLOUT" style:family="paragraph" style:parent-style-name=".body"/>
- <style:style style:name=".figure" style:family="paragraph" style:parent-style-name=".body"/>
- <style:style style:name=".quotes" style:family="paragraph" style:parent-style-name=".body">
- <style:properties fo:margin-left="2cm" fo:margin-right="2cm" fo:text-indent="0cm" style:auto-text-indent="false"/>
- </style:style>
- <style:list-style style:name=".bullet"/>
- <style:style style:name=".ch title" style:family="paragraph" style:parent-style-name=".body">
- <style:properties style:font-size="24pt" fo:font-size="24pt"/>
- </style:style>
- <style:style style:name=".head 1" style:family="paragraph" style:parent-style-name=".body">
- <style:properties style:font-size="20pt" fo:font-size="20pt"/>
- </style:style>
- <style:style style:name=".head 2" style:family="paragraph" style:parent-style-name=".body">
- <style:properties style:font-size="16pt" fo:font-size="16pt"/>
- </style:style>
- <style:style style:name=".code" style:family="paragraph" style:parent-style-name=".body">
- <style:properties style:font-name="Courier"/>
- </style:style>
- <style:style style:name=".code first" style:family="paragraph" style:parent-style-name=".body"/>
- <style:style style:name=".code last" style:family="paragraph" style:parent-style-name=".body"/>
- <style:style style:name="Footnote Symbol" style:family="text"/>
- <style:style style:name="Bullet Symbols" style:family="text">
- <style:properties style:font-name="StarSymbol" fo:font-size="9pt" style:font-name-complex="StarSymbol" style:font-size-complex="9pt"/>
- </style:style>
- <style:style style:name="Footnote anchor" style:family="text">
- <style:properties style:text-position="super 58%"/>
- </style:style>
- <style:style style:name="code" style:family="text">
- <style:properties style:font-name="Courier"/>
- </style:style>
- <style:style style:name="italic" style:family="text">
- <style:properties fo:font-style="italic"/>
- </style:style>
- <text:outline-style>
- <text:outline-level-style text:level="1" style:num-format=""/>
- <text:outline-level-style text:level="2" style:num-format=""/>
- <text:outline-level-style text:level="3" style:num-format=""/>
- <text:outline-level-style text:level="4" style:num-format=""/>
- <text:outline-level-style text:level="5" style:num-format=""/>
- <text:outline-level-style text:level="6" style:num-format=""/>
- <text:outline-level-style text:level="7" style:num-format=""/>
- <text:outline-level-style text:level="8" style:num-format=""/>
- <text:outline-level-style text:level="9" style:num-format=""/>
- <text:outline-level-style text:level="10" style:num-format=""/>
- </text:outline-style>
- <text:footnotes-configuration style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
- <text:endnotes-configuration style:num-format="i" text:start-value="0"/>
- <text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
- </office:styles>
- <office:automatic-styles>
- <style:page-master style:name="pm1">
- <style:properties fo:page-width="20.999cm" fo:page-height="29.699cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2.54cm" fo:margin-bottom="2.54cm" fo:margin-left="0cm" fo:margin-right="5cm" style:footnote-max-height="0cm">
- <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
- </style:properties>
- <style:header-style/>
- <style:footer-style/>
- </style:page-master>
- <style:page-master style:name="pm2">
- <style:properties fo:page-width="20.999cm" fo:page-height="29.699cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:footnote-max-height="0cm">
- <style:footnote-sep style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
- </style:properties>
- <style:header-style/>
- <style:footer-style/>
- </style:page-master>
- </office:automatic-styles>
- <office:master-styles>
- <style:master-page style:name="Standard" style:page-master-name="pm1"/>
- <style:master-page style:name="Footnote" style:page-master-name="pm2"/>
- </office:master-styles>
-</office:document-styles>
-'''
-
-manifest = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
-<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
- <manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer" manifest:full-path="/"/>
- <manifest:file-entry manifest:media-type="" manifest:full-path="Pictures/"/>
- %s
-</manifest:manifest>
-'''
-
-manifest_format = '<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="%s"/>'
-
-content_header = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE office:document-content PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "office.dtd">
-<office:document-content xmlns:office="http://openoffice.org/2000/office" xmlns:style="http://openoffice.org/2000/style" xmlns:text="http://openoffice.org/2000/text" xmlns:table="http://openoffice.org/2000/table" xmlns:draw="http://openoffice.org/2000/drawing" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:number="http://openoffice.org/2000/datastyle" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="http://openoffice.org/2000/chart" xmlns:dr3d="http://openoffice.org/2000/dr3d" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="http://openoffice.org/2000/form" xmlns:script="http://openoffice.org/2000/script" office:class="text" office:version="1.0">
- <office:script/>
- <office:font-decls>
- <style:font-decl style:name="Courier" fo:font-family="Courier" style:font-family-generic="modern" style:font-pitch="fixed"/>
- <style:font-decl style:name="Arial Unicode MS" fo:font-family="&apos;Arial Unicode MS&apos;" style:font-pitch="variable"/>
- <style:font-decl style:name="Thorndale" fo:font-family="Thorndale" style:font-family-generic="roman" style:font-pitch="variable"/>
- </office:font-decls>
- <office:automatic-styles/>
- <office:body>
- <text:sequence-decls>
- <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
- <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
- <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
- <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
- </text:sequence-decls>
-'''
-
-content_footer = '''</office:body>
-</office:document-content>
-'''
diff --git a/sandbox/aahz/OO/OOwriter.py b/sandbox/aahz/OO/OOwriter.py
deleted file mode 100644
index 6a0841040..000000000
--- a/sandbox/aahz/OO/OOwriter.py
+++ /dev/null
@@ -1,676 +0,0 @@
-# Author: Aahz
-# Contact: aahz@pythoncraft.com
-# Revision:
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-OpenOffice writer
-
-The output is an OpenOffice.org 1.0-compatible document.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-from warnings import warn
-import re
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-import OOtext
-
-
-section_styles = [
- '.ch title',
- '.head 1',
- '.head 2'
- ]
-
-class Writer(writers.Writer):
-
- supported = ('OpenOffice')
- """Formats this writer supports."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.output = None
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
-
- header = [OOtext.content_header]
- footer = [OOtext.content_footer]
-
- start_para = '\n<text:p text:style-name="%s">\n'
- end_para = '\n</text:p>\n'
-
- start_charstyle = '<text:span text:style-name="%s">'
- end_charstyle = '</text:span>'
-
- line_break = '\n<text:line-break/>'
- re_spaces = re.compile(' +')
- spaces = '<text:s text:c="%d"/>'
-
- re_annotation = re.compile(r'#\d+(?:, #\d+)*$')
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = document.settings
- self.body = []
- self.section_level = 0
- self.skip_para_tag = False
-
- def astext(self):
- return ''.join(self.header + self.body + self.footer)
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- # @@@ A codec to do these and all other HTML entities would be nice.
- text = text.replace("&", "&amp;")
- text = text.replace("<", "&lt;")
- text = text.replace('"', "&quot;")
- text = text.replace(">", "&gt;")
- return text
-
- def compress_spaces(self, line):
- while 1:
- match = self.re_spaces.search(line)
- if match:
- start, end = match.span()
- numspaces = end - start
- line = line[:start] + (self.spaces % numspaces) + line[end:]
- else:
- break
- return line
-
- def fix_annotation(self, line):
- match = self.re_annotation.search(line)
- if match:
- pos = match.start()
- line = line[:pos] + '|' + line[pos:]
- return line
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_admonition(self, node, name):
- self.skip_para_tag = True
- self.body.append(self.start_para % '.CALLOUT')
-
- def depart_admonition(self):
- self.body.append(self.end_para)
- self.skip_para_tag = False
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_block_quote(self, node):
- self.skip_para_tag = True
- self.body.append(self.start_para % '.quotes')
-
- def depart_block_quote(self, node):
- self.body.append(self.end_para)
- self.skip_para_tag = False
-
- def visit_bullet_list(self, node):
- self.body.append('\n<text:unordered-list text:style-name=".bullet">\n')
-
- def depart_bullet_list(self, node):
- self.body.append('</text:unordered-list>\n')
-
- def visit_caption(self, node):
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- self.body.append('</p>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- self.body.append(']</a>')
-
- def visit_classifier(self, node):
- self.body.append(' <span class="classifier-delimiter">:</span> ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- self.body.append('</span>')
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.body.append(self.emptytag(node, 'col',
- colwidth='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node):
- raise nodes.SkipNode
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- self.body.append('</dt>\n')
- self.body.append(self.starttag(node, 'dd', ''))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_definition(self, node):
- self.body.append('</dd>\n')
-
- def visit_definition_list(self, node):
- print node.astext()
- self.body.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- self.body.append('</dl>\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- self.body.append(self.starttag(node, 'td', ''))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_description(self, node):
- self.body.append('</td>')
-
- def visit_doctest_block(self, node):
- self.visit_literal_block(node)
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.body.append(self.start_charstyle % 'italic')
-
- def depart_emphasis(self, node):
- self.body.append(self.end_charstyle)
-
- def visit_entry(self, node):
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
- elif isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_entry(self, node):
- self.body.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- """
- The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
- CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
- usable.
- """
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['class'] = node['enumtype']
- # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
- # single "format" attribute? Use CSS2?
- old_compact_simple = self.compact_simple
- self.context.append((self.compact_simple, self.compact_p))
- self.compact_p = None
- self.compact_simple = (self.options.compact_lists and
- (self.compact_simple
- or self.topic_class == '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))
-
- def depart_enumerated_list(self, node):
- self.compact_simple, self.compact_p = self.context.pop()
- self.body.append('</ol>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
-
- def depart_field(self, node):
- self.body.append('</tr>\n')
-
- def visit_field_body(self, node):
- self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
- if len(node) and isinstance(node[0], nodes.paragraph):
- node[0].set_class('first')
-
- def depart_field_body(self, node):
- self.body.append('</td>\n')
-
- def visit_field_list(self, node):
- self.body.append(self.starttag(node, 'table', frame='void',
- rules='none', CLASS='field-list'))
- self.body.append('<col class="field-name" />\n'
- '<col class="field-body" />\n'
- '<tbody valign="top">\n')
-
- def depart_field_list(self, node):
- self.body.append('</tbody>\n</table>\n')
-
- def visit_field_name(self, node):
- atts = {}
- if self.in_docinfo:
- atts['class'] = 'docinfo-name'
- else:
- atts['class'] = 'field-name'
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'th', '', **atts))
-
- def depart_field_name(self, node):
- self.body.append(':</th>')
- self.body.append(self.context.pop())
-
- def visit_figure(self, node):
- self.body.append(self.start_para % '.figure')
-
- def depart_figure(self, node):
- self.body.append(self.end_para)
-
- def visit_footnote(self, node):
- raise nodes.SkipNode
-
- def footnote_backrefs(self, node):
- warn("footnote backrefs not available")
-
- def depart_footnote(self, node):
- pass
-
- def visit_footnote_reference(self, node):
- name = node['refid']
- id = node['id']
- number = node['auto']
- for footnote in self.document.autofootnotes:
- if name == footnote['name']:
- break
- self.body.append('<text:footnote text:id="%s">\n' % id)
- self.body.append('<text:footnote-citation text:string-value="%s"/>\n' % number)
- self.body.append('<text:footnote-body>\n')
- self.body.append(self.start_para % '.body')
- for child in footnote.children:
- if isinstance(child, nodes.paragraph):
- self.body.append(child.astext())
- self.body.append(self.end_para)
- self.body.append('</text:footnote-body>\n')
- self.body.append('</text:footnote>')
- raise nodes.SkipNode
-
- def depart_footnote_reference(self, node):
- pass
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- self.context.append(len(self.body))
-
- def depart_header(self, node):
- start = self.context.pop()
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('<hr />\n</div>\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- name = "Figure: %s\n" % node.attributes['uri']
- self.body.append(name)
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_index_entry(self, node):
- index_format = '<text:alphabetical-index-mark text:string-value="%s"/>\n'
- self.body.append(self.start_para % '.body')
- entries = node.astext().split('\n')
- for entry in entries:
- self.body.append(index_format % self.encode(entry))
- self.body.append(self.end_para)
- raise nodes.SkipNode
-
- def visit_interpreted(self, node):
- # @@@ Incomplete, pending a proper implementation on the
- # Parser/Reader end.
- #self.body.append(node['role'] + ':')
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def depart_interpreted(self, node):
- pass
-
- # Don't need footnote labels/numbers
- def visit_label(self, node):
- print "!"
- raise nodes.SkipNode
-
- def visit_legend(self, node):
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- self.body.append('</div>\n')
-
- def visit_line_block(self, node):
- self.body.append(self.start_para % '.quotes')
- lines = node.astext()
- lines = lines.split('\n')
- lines = self.line_break.join(lines)
- self.body.append(lines)
- self.body.append(self.end_para)
- raise nodes.SkipNode
-
- def visit_list_item(self, node):
- self.body.append('<text:list-item>')
-
- def depart_list_item(self, node):
- self.body.append('</text:list-item>\n')
-
- def visit_literal(self, node):
- self.body.append(self.start_charstyle % 'code')
-
- def depart_literal(self, node):
- self.body.append(self.end_charstyle)
-
- def visit_literal_block(self, node):
- self.body.append(self.start_para % '.code first')
- self.body.append(self.end_para)
- lines = self.encode(node.astext())
- lines = lines.split('\n')
- while lines[-1] == '':
- lines.pop()
- for line in lines:
- self.body.append(self.start_para % '.code')
- line = self.fix_annotation(line)
- line = self.compress_spaces(line)
- self.body.append(line)
- self.body.append(self.end_para)
- self.body.append(self.start_para % '.code last')
- self.body.append(self.end_para)
- raise nodes.SkipNode
-
- def visit_note(self, node):
- self.visit_admonition(node, '.note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- if self.context[-1]:
- self.body.append(', ')
-
- def depart_option(self, node):
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- self.body.append('</var>')
-
- def visit_option_group(self, node):
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'td', **atts))
- self.body.append('<kbd>')
- self.context.append(0) # count number of options
-
- def depart_option_group(self, node):
- self.context.pop()
- self.body.append('</kbd></td>\n')
- self.body.append(self.context.pop())
-
- def visit_option_list(self, node):
- self.body.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none"))
- self.body.append('<col class="option" />\n'
- '<col class="description" />\n'
- '<tbody valign="top">\n')
-
- def depart_option_list(self, node):
- self.body.append('</tbody>\n</table>\n')
-
- def visit_option_list_item(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- self.body.append('</tr>\n')
-
- def visit_option_string(self, node):
- self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- self.body.append('</span>')
-
- def visit_paragraph(self, node):
- if not self.skip_para_tag:
- self.body.append(self.start_para % '.body')
-
- def depart_paragraph(self, node):
- if not self.skip_para_tag:
- self.body.append(self.end_para)
-
- def visit_problematic(self, node):
- if node.hasattr('refid'):
- self.body.append('<a href="#%s" name="%s">' % (node['refid'],
- node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- self.body.append('</span>')
- self.body.append(self.context.pop())
-
- def visit_raw(self, node):
- if node.has_key('format') and node['format'] == 'html':
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- pass
-
- def depart_reference(self, node):
- pass
-
- def visit_row(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- self.body.append('</tr>\n')
-
- def visit_section(self, node):
- self.section_level += 1
-
- def depart_section(self, node):
- self.section_level -= 1
-
- def visit_strong(self, node):
- self.body.append('<strong>')
-
- def depart_strong(self, node):
- self.body.append('</strong>')
-
- def visit_table(self, node):
- self.body.append(
- self.starttag(node, 'table', CLASS="table",
- frame='border', rules='all'))
-
- def depart_table(self, node):
- self.body.append('</table>\n')
-
- def visit_target(self, node):
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- self.body.append(self.starttag(node, 'a', '', CLASS='target'))
- self.context.append('</a>')
- else:
- self.context.append('')
-
- def depart_target(self, node):
- self.body.append(self.context.pop())
-
- def visit_tbody(self, node):
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n' or ''
- self.body.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- self.body.append('</tbody>\n')
-
- def visit_term(self, node):
- self.body.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- """
- Leave the end tag to `self.visit_definition()`, in case there's a
- classifier.
- """
- pass
-
- def visit_tgroup(self, node):
- # Mozilla needs <colgroup>:
- self.body.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.body.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- self.body.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- """Only 3 section levels are supported by this writer."""
- title_tag = self.start_para % section_styles[self.section_level]
- self.body.append(title_tag)
-
- def depart_title(self, node):
- self.body.append(self.end_para)
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def visit_system_message(self, node):
- print node.astext()
-
- def depart_system_message(self, node):
- pass
-
- def unknown_visit(self, node):
- print "Failure processing at line", node.line
- print "Failure is", node.astext()
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
diff --git a/sandbox/aahz/OO/graphics_output.py b/sandbox/aahz/OO/graphics_output.py
deleted file mode 100644
index 35d2f9516..000000000
--- a/sandbox/aahz/OO/graphics_output.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import sys
-import os
-
-SOURCE_EXT = '.fig'
-
-TypeList = {
- 'eps': {
- 'ext': '.eps',
- 'cmd': 'fig2dev -L eps %s %s'
- },
- 'pdf': {
- 'ext': '.pdf',
- 'cmd': 'fig2dev -L pdf %s %s'
- }
- }
-
-type = TypeList[sys.argv[1]]
-SourceDir = sys.argv[2]
-DestDir = sys.argv[3]
-
-for name in os.listdir(SourceDir):
- base, ext = os.path.splitext(name)
- if ext == SOURCE_EXT:
- src = SourceDir + '/' + name
- dest = DestDir + '/' + base + type['ext']
- cmd = type['cmd'] % (src, dest)
- print cmd
- os.system(cmd)
diff --git a/sandbox/aahz/OO/open_office.py b/sandbox/aahz/OO/open_office.py
deleted file mode 100644
index 90e4c4393..000000000
--- a/sandbox/aahz/OO/open_office.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import sys
-import zipfile
-from cStringIO import StringIO
-
-from docutils import core, io
-
-import OOdirectives
-import OOtext
-import OOwriter
-
-pub = core.Publisher(writer=OOwriter.Writer())
-pub.set_reader('standalone', None, 'restructuredtext')
-settings = pub.get_settings()
-pub.source = io.FileInput(settings, source_path=sys.argv[1])
-pub.destination = io.StringOutput(settings)
-content = pub.publish()
-
-manifest_list = [
- ('content.xml', content),
- ('styles.xml', OOtext.styles)
- ]
-
-manifest_entries = []
-for docname, _ in manifest_list:
- manifest_entries.append(OOtext.manifest_format % docname)
-manifest = OOtext.manifest % '\n '.join(manifest_entries)
-manifest_list.append( ('META-INF/manifest.xml', manifest) )
-
-zip = zipfile.ZipFile(sys.argv[2], "w")
-for docname, contents in manifest_list:
- zinfo = zipfile.ZipInfo(docname)
- zip.writestr(zinfo, contents)
-zip.close()
diff --git a/sandbox/aahz/OO/publish.py b/sandbox/aahz/OO/publish.py
deleted file mode 100755
index 006d3fd97..000000000
--- a/sandbox/aahz/OO/publish.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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.
-
-"""
-A minimal front end to the Docutils Publisher, producing pseudo-XML.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish, default_description
-
-import OOdirectives
-
-
-description = ('Generates pseudo-XML from standalone reStructuredText '
- 'sources (for testing purposes). ' + default_description)
-
-publish(description=description)
diff --git a/sandbox/agurtovoy/html_frames/README.txt b/sandbox/agurtovoy/html_frames/README.txt
deleted file mode 100644
index 82e137ed1..000000000
--- a/sandbox/agurtovoy/html_frames/README.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-
-Docutils HTML/frames writer
-***************************
-
-This is a writer for Docutils__ that produces "framed" HTML documents.
-
-Note that the writer requires your reStructuredText__ documents to contain
-the `contents directive`__ that instructs the docutils front-end to
-generate a table of contents used by the writer to determine how to split
-the document.
-
-Known issues:
-
- - ``--no-doc-title`` option is not supported
-
-Author: `Aleksey Gurtovoy`__
-
-
-__ http://docutils.sourceforge.net/
-__ http://docutils.sourceforge.net/rst.html
-__ http://docutils.sourceforge.net/spec/rst/directives.html#table-of-contents
-__ mailto:agurtovoy@meta-comm.com
diff --git a/sandbox/agurtovoy/html_frames/tools/htmlframes.py b/sandbox/agurtovoy/html_frames/tools/htmlframes.py
deleted file mode 100644
index 811b35a63..000000000
--- a/sandbox/agurtovoy/html_frames/tools/htmlframes.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Aleksey Gurtovoy
-# Contact: agurtovoy@meta-comm.com
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates "framed" (X)HTML documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='html4frames', description=description)
diff --git a/sandbox/agurtovoy/html_frames/tools/stylesheets/frames.css b/sandbox/agurtovoy/html_frames/tools/stylesheets/frames.css
deleted file mode 100644
index 1e2e89473..000000000
--- a/sandbox/agurtovoy/html_frames/tools/stylesheets/frames.css
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-:Author: Aleksey Gurtovoy
-:Contact: agurtovoy@meta-comm.com
-:Date: $Date$
-:Version: $Revision$
-:Copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML frames output of Docutils.
-*/
-
-@import url(default.css);
-
-div.section h1
-{
- margin-top: 0pt;
- margin-bottom: 0pt;
-}
-
-
-div.section h3
-{
- margin-bottom: 0pt;
- padding-bottom: 0pt;
-
-/*
- padding-left: 1pt;
- border-style: none none solid none ;
- border-width: 2px;
- border-color: #f0a0a0;
-*/
-}
-
-p
-{
- margin-top: 7pt;
- padding-top: 0pt;
-}
-
-pre.literal-block
-{
- border-style: none none none solid;
- border-width: 1px;
- border-color: #c0c0ff;
- padding-top: 1pt;
- padding-bottom: 1pt;
- padding-left: 1em;
- margin-top: 10pt;
- margin-left: 0pt;
- background-color: #f0f5ff;
-}
-
-tt.literal {
- background-color: #f0f5ff;
-}
-
-body.docframe {
- background-color: #ffffff;
-}
-
-span.navigation-group {
- background-color: #f0f5ff;
-}
-
-table
-{
- border: solid 1px;
- border-collapse: collapse;
-}
-
-table td
-{
- margin-top: 0px;
- margin-bottom: 0px;
- padding-top: 0px;
- padding-bottom: 5pt;
-}
-
-a.ref-subsection-title
-{
- text-decoration: none;
- color: black;
-}
-
-table.wrapper
-{
- border: 0px;
- width: 100%;
- margin-top: 0px;
- margin-left: 0px;
- margin-bottom: 0px;
-}
-
-table.wrapper td
-{
- padding-left: 0px;
- padding-right: 0px;
- padding-bottom: 0px;
- vertical-align: middle;
-}
-
-table.wrapper td.right
-{
- padding-left: 0px;
- text-align: right;
-}
-
-table.wrapper td.right img
-{
- float: right;
- border-width: 0px;
-}
-
-/*
-a:link,
-a:visited
-{
- color: #505050;
-}
-
-sup a:link,
-sup a:visited,
-a.interlink:link,
-a.interlink:visited
-{
- color: #505050;
- text-decoration: none;
-}
-*/
-
-hr.navigation-bar-separator {
- width: 100%;
- clear: both;
-}
-
-span.navigation-bar {
- clear: both;
-}
-
-body.tocframe ul.auto-toc,
-ul.auto-toc {
- list-style-type: none;
- margin-left: 0pt;
-}
-
-ul.auto-toc li li,
-body.tocframe ul.auto-toc li li {
- list-style-type: none;
- margin-left: 15pt;
-}
-
-body.tocframe ul.toc,
-ul.toc {
- margin-left: 0pt;
-}
-
-body.tocframe ul.toc li,
-ul.toc li {
- list-style-type: circle;
- margin-left: 15pt;
-}
diff --git a/sandbox/agurtovoy/html_frames/writers/html4frames.py b/sandbox/agurtovoy/html_frames/writers/html4frames.py
deleted file mode 100644
index 78031436a..000000000
--- a/sandbox/agurtovoy/html_frames/writers/html4frames.py
+++ /dev/null
@@ -1,383 +0,0 @@
-# Author: Aleksey Gurtovoy
-# Contact: agurtovoy@meta-comm.com
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-from docutils import writers
-from docutils.writers import html4css1
-import docutils.nodes
-
-import urlparse
-import os.path
-import os
-import re
-
-
-class Writer(writers.Writer):
-
- settings_spec = html4css1.Writer.settings_spec + (
- 'HTML/Frames-Specific Options',
- """The HTML --stylesheet option's default is set to """
- '"frames.css".',
- ()
- )
-
- settings_default_overrides = { 'stylesheet': 'frames.css' }
- relative_path_settings = ('stylesheet_path',)
- config_section = 'html4frames writer'
- config_section_dependencies = ('writers',)
-
- def __init__(self):
- self.__super = writers.Writer
- self.__super.__init__(self)
- self.translator = frame_pages_translator
-
- def translate(self, document, page_files_dir, extension):
- visitor = self.translator(document, page_files_dir, extension)
- document.walkabout(visitor)
- self.output = None # needed by writers.Writer
- return visitor.result()
-
- def write(self, document, destination):
- self.language = docutils.languages.get_language(
- document.settings.language_code)
-
- index_file_path = destination.destination_path
- index_file_name = os.path.basename(index_file_path)
- (page_files_dir, extension) = os.path.splitext(index_file_name)
- chunk_files_path = os.path.join(
- os.path.dirname(index_file_path)
- , page_files_dir
- )
-
- (index_text, pages) = self.translate(document, page_files_dir, extension)
-
- if len(pages) > 0 and not os.path.exists(chunk_files_path):
- os.mkdir(chunk_files_path)
-
- destination.write(index_text)
-
- for c in pages.keys():
- chunk_file = self.make_chunk_output(
- destination
- , os.path.join(chunk_files_path,c + extension)
- )
-
- chunk_file.write(pages[c])
-
- def make_chunk_output(self, destination, destination_path):
- return docutils.io.FileOutput(
- destination_path=destination_path
- , encoding=destination.encoding
- , error_handler=destination.error_handler
- )
-
-
-class frame_pages_translator(docutils.nodes.NodeVisitor):
-
- page_translator = html4css1.HTMLTranslator
- tocframe = 'tocframe'
- docframe = 'docframe'
- tocframe_width = 30
- nav_bar_separator = '<hr class="navigation-bar-separator">\n'
- re_href = re.compile('(href=")(.*?)(")')
-
- def __init__(self, document, page_files_dir, extension):
- self.__super = docutils.nodes.NodeVisitor
- self.__super.__init__(self, document)
-
- self.section_level = 0
- self.max_chunk_level = 0
- self.settings = document.settings
- self.reporter = document.reporter
- self.visitors = [self.__page_translator(document, self.docframe)]
- self.toc_nav_builder = None
- self.page_files_dir = page_files_dir
- self.extension = extension
- self.pages = {}
- self.page_subtoc = {}
- self.tocframe_page = _toc_entry(id='%s_toc' % self.page_files_dir)
- self.home_page = _toc_entry(id='%s_home' % self.page_files_dir)
- self.toc = self.home_page
- self.in_home_page = 0
-
- def active_visitor(self):
- return self.visitors[-1]
-
- def result(self):
- self.pages[self.home_page.id] = self.visitors[0].astext()
- html_spec = self.visitors[0]
- index_page = ''.join(
- html_spec.head_prefix + html_spec.head + html_spec.stylesheet
- + ['</head>\n<frameset cols="%d%%,%d%%">\n'
- % (self.tocframe_width, 100 - self.tocframe_width)]
- + ['<frame name="%s" src="%s" scrolling="auto">\n'
- % (self.tocframe, self.__chunk_ref(self.tocframe_page.id, 1))]
- + ['<frame name="%s" src="%s" scrolling="auto">\n'
- % (self.docframe, self.__chunk_ref(self.home_page.id, 1))]
- + ['</frameset>\n</html>\n']
- )
-
- return (index_page, self.pages)
-
-
- def visit_section(self, node):
- self.section_level += 1
- if self.section_level <= self.max_chunk_level:
- section_id = node.get('id')
- if self.page_subtoc.has_key(section_id):
- node.append(self.page_subtoc[section_id])
-
- self.visitors.append(self.__page_translator(
- self.__node_to_document(node)
- , self.docframe
- ))
-
- self.toc = self.toc.next
- self.active_visitor().nav_bar = self.__nav_bar(self.toc)
- self.active_visitor().body.append(self.active_visitor().nav_bar)
- self.active_visitor().body.append(self.nav_bar_separator)
-
- self.active_visitor().visit_section(node)
-
- def depart_section(self, node):
- self.active_visitor().depart_section(node)
- if self.section_level <= self.max_chunk_level:
- self.active_visitor().body.append(self.nav_bar_separator)
- self.active_visitor().body.append(self.active_visitor().nav_bar)
- visitor = self.visitors.pop()
- self.pages[node.get('id')] = visitor.astext()
-
- self.section_level -= 1
-
-
- def visit_topic(self, node):
- if node.get('class') == 'contents' and not self.in_home_page:
- self.toc_nav_builder = _toc_nav_builder(home=self.home_page)
- self.visitors.append(self.__page_translator(
- self.__node_to_document(node)
- , self.tocframe
- ))
- else:
- self.active_visitor().visit_topic(node)
-
- def depart_topic(self, node):
- if node.get('class') == 'contents' and not self.in_home_page:
- self.toc_nav_builder = None
- tocframe_visitor = self.visitors.pop()
- self.pages[self.tocframe_page.id] = tocframe_visitor.astext()
- self.in_home_page = 1
- home_page_toc = self.page_subtoc[self.home_page.id]
- home_page_toc.walkabout(self)
- self.in_home_page = 0
- else:
- self.active_visitor().depart_topic(node)
-
-
- def visit_bullet_list(self, node):
- if self.__is_in_main_toc():
- section_id = self.toc_nav_builder.last_visited.id
- self.page_subtoc[section_id] = self.__subtoc(node)
- self.toc_nav_builder.subsection()
- self.section_level += 1
- if self.section_level > self.max_chunk_level:
- self.max_chunk_level = self.section_level
-
- self.active_visitor().visit_bullet_list(node)
-
- def depart_bullet_list(self, node):
- self.active_visitor().depart_bullet_list(node)
- if self.__is_in_main_toc():
- self.toc_nav_builder.up()
- self.section_level -= 1
-
-
- def visit_reference(self, node):
- self.__adjust_node_uri(node, 'refuri')
- self.active_visitor().visit_reference(node)
- if node.has_key('refuri'):
- self.active_visitor().body[-1] = self.__add_target_attr(
- self.active_visitor().body[-1]
- , '_top'
- )
-
- if node.has_key('refid'):
- section_id = node.get('refid')
- self.active_visitor().body[-1] = self.__replace_href(
- self.__chunk_ref(section_id)
- , self.active_visitor().body[-1]
- )
-
- if self.__is_in_main_toc():
- self.toc_nav_builder.along(section_id)
-
-
- def depart_reference(self, node):
- self.active_visitor().depart_reference(node)
-
-
- def visit_image(self, node):
- self.__adjust_node_uri(node, 'uri')
- self.active_visitor().visit_image(node)
-
- def depart_image(self, node):
- self.active_visitor().depart_image(node)
-
-
- def visit_title(self, node):
- self.active_visitor().visit_title(node)
- if node.has_key('refid'):
- self.active_visitor().body[-1] = self.__replace_href(
- '%s#%s' % ( self.__chunk_ref(self.toc.up.id), node.get('refid') )
- , self.active_visitor().body[-1]
- )
-
- def depart_title(self, node):
- self.active_visitor().depart_title(node)
-
-
- def __page_translator(self, document, frame):
- result = self.page_translator(document)
- result.body_prefix = ['</head>\n<body class="%s">\n' % frame]
- return result
-
- def __subtoc(self, node):
- def _auto_toc_filter(node,root=node):
- return node != root \
- and isinstance(node, docutils.nodes.bullet_list)
-
- node['id'] = 'outline'
- if node.get('class', '') == '': node['class'] = 'toc'
- return _filter_tree(
- self.__node_to_document(node)
- , _auto_toc_filter
- )
-
-
- def __add_target_attr(self, href, target):
- return self.re_href.sub(r'\1\2\3 target="%s"' % target, href)
-
- def __replace_href(self, new, old):
- if not self.__is_in_main_toc():
- return self.re_href.sub(r'\1%s\3' % new, old)
- else:
- return self.re_href.sub(
- r'\1%s\3 target="%s"' % (new, self.docframe)
- , old
- )
-
- def __nav_bar(self, toc_node):
- return '<span class="navigation-bar">%s</span>\n' \
- % '<span class="navigation-group-separator">&nbsp;|&nbsp;</span>'.join([
- self.__nav_group(['Prev', 'Next'], [toc_node.prev, toc_node.next])
- , self.__nav_group(['Back', 'Along'], [toc_node.back, toc_node.along])
- , self.__nav_group(['Up', 'Home'], [toc_node.up, self.home_page])
- ])
-
- def __nav_group(self, labels, nodes):
- return '<span class="navigation-group">%s</span>' % '&nbsp;'.join(
- map(lambda l,n: self.__toc_node_link(l, n), labels, nodes)
- )
-
-
- def __node_to_document(self, node):
- node.settings = self.settings
- node.reporter = self.reporter
- return node
-
- def __adjust_node_uri(self, node, attr):
- if node.has_key(attr):
- src_uri = node[attr]
- if _is_uri_relative(src_uri):
- node[attr] = '../%s' % src_uri
-
- def __toc_node_link(self, name, toc_node):
- if not toc_node: return name
- return '<a href="%s" class="navigation-link">%s</a>' % (
- self.__chunk_ref(toc_node.id)
- , name
- )
-
-
- def __chunk_ref(self, chunk_name, from_index=0):
- if from_index:
- return './%s/%s%s' % (self.page_files_dir, chunk_name, self.extension)
- else:
- return './%s%s' % (chunk_name, self.extension)
-
- def __is_in_main_toc(self):
- return self.toc_nav_builder
-
-
-def _setup_forwarding(visitor):
- for name in docutils.nodes.node_class_names:
- if not getattr(visitor, 'visit_' + name, None):
- def forward_visit(self, node, name=name):
- getattr(self.active_visitor(), 'visit_' + name)(node)
- def forward_depart(self, node, name=name):
- getattr(self.active_visitor(), 'depart_' + name)(node)
-
- setattr(visitor, 'visit_' + name, forward_visit)
- setattr(visitor, 'depart_' + name, forward_depart)
-
-_setup_forwarding(frame_pages_translator)
-
-
-def _filter_tree(document, filter):
-
- class filter_tree_copy_visitor(docutils.nodes.TreeCopyVisitor):
-
- def __init__(self, document, filter):
- self.__super = docutils.nodes.TreeCopyVisitor
- self.__super.__init__(self, document)
- self.filter = filter
-
- def default_visit(self, node):
- if self.filter(node):
- raise docutils.nodes.SkipNode()
-
- self.__super.default_visit(self, node)
-
- visitor = filter_tree_copy_visitor(document, filter)
- document.walkabout(visitor)
- return visitor.get_tree_copy()
-
-
-def _is_uri_relative(uri):
- (scheme, location, path, query, fragment) = urlparse.urlsplit(uri)
- return len(scheme) == 0 and len(location) == 0
-
-
-class _toc_nav_builder:
-
- def __init__(self, home):
- self.last_visited = self.last_sibling = home
-
- def subsection(self):
- parent = self.last_visited
- self.last_visited = _toc_entry(id=None)
- self.last_visited.up = self.last_visited.prev = parent
- parent.next = self.last_visited
- self.last_sibling = self.last_visited
-
- def along(self, section_id):
- last = self.last_visited
- if last.id:
- self.last_visited = _toc_entry(id=section_id)
- self.last_visited.prev = last
- self.last_visited.back = self.last_sibling
- self.last_visited.up = self.last_sibling.up
- last.next = self.last_sibling.along = self.last_visited
- self.last_sibling = self.last_visited
- else:
- self.last_visited.id = section_id
-
- def up(self):
- self.last_sibling = self.last_sibling.up
-
-
-class _toc_entry:
- def __init__(self, id):
- self.id = id
- self.prev = self.next = self.back = self.along = self.up = None
diff --git a/sandbox/amk/abc/Makefile b/sandbox/amk/abc/Makefile
deleted file mode 100644
index 6eb28fa31..000000000
--- a/sandbox/amk/abc/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-
-all:
- python ./rst2html.py --traceback sample.rst >sample.html
-
-
diff --git a/sandbox/amk/abc/README b/sandbox/amk/abc/README
deleted file mode 100644
index 033d2a839..000000000
--- a/sandbox/amk/abc/README
+++ /dev/null
@@ -1,17 +0,0 @@
-
-The abc.py module implements a Docutils directive that accepts content
-written in the ABC language for musical notation
-(http://www.gre.ac.uk/~c.walshaw/abc/).
-
-The directive relies on a number of libraries and external tools.
-Requirements:
- * abcm2ps (http://moinejf.free.fr/), which turns ABC into PostScript.
- * Ghostscript (http://www.cs.wisc.edu/~ghost/), which turns
- PostScript into PNG files.
- * The Python Imaging Library (used to crop the PNG files by removing lots of
- blank space).
-
-Images are converted to PNGs and written to the document output
-directory.
-
---amk
diff --git a/sandbox/amk/abc/TODO b/sandbox/amk/abc/TODO
deleted file mode 100644
index 291486a1d..000000000
--- a/sandbox/amk/abc/TODO
+++ /dev/null
@@ -1,4 +0,0 @@
-
-* Trim down the PNGs (with PIL?)
-* Better handling of errors in the ABC (but abcm2ps seems really dodgy on
- this point)
diff --git a/sandbox/amk/abc/abc.py b/sandbox/amk/abc/abc.py
deleted file mode 100644
index f663cd765..000000000
--- a/sandbox/amk/abc/abc.py
+++ /dev/null
@@ -1,157 +0,0 @@
-"""abc.py
-
-Implements a 'music' directive that accepts musical passages written
-in ABC notation. Requires that abcm2ps and Ghostscript be installed.
-
-.. music::
-
- % Sample file to test various features of abc2ps
- X:1
- T:Scale
- M:C
- K: clef=bass
- "C,"C,"D,"D,
-
-"""
-
-import os, sys, tempfile, popen2
-
-from docutils import nodes
-from docutils.parsers.rst.directives import register_directive
-
-music_counter = 1
-
-def ABCDirective (name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- abc_temp = tempfile.NamedTemporaryFile("wt")
- abc_temp.write("\n".join(content))
- abc_temp.flush()
- fd, ps_temp = tempfile.mkstemp()
- global music_counter
- output_path = state.document.settings._destination or '.'
- output_name = os.path.join(output_path, 'music-%i.png' % music_counter)
- music_counter += 1
- sts1 = sts2 = sts3 = 0
- pipe = popen2.Popen3('abcm2ps -O/dev/stdout - < %s > %s'
- % (abc_temp.name, ps_temp),
- capturestderr=True
- )
- pipe.tochild.close()
- pipe.fromchild.read()
- errors = pipe.childerr.read()
- errors = parse_errors(errors, lineno)
- sts1 = pipe.wait()
- if sts1 == 0:
- sts2 = os.system('gs -q -sOutputFile=%s -sDEVICE=pngmono - <%s'
- % (output_name, ps_temp))
- if sts2 == 0:
- sts3 = os.system('gs -q -sOutputFile=%s -sDEVICE=pngmono - <%s'
- % (output_name, ps_temp))
- try:
- os.unlink(ps_temp)
- except os.error:
- pass
-
- abc_temp.close()
- if sts1 != 0 or sts2 != 0:
- error = state_machine.reporter.error(
- 'Error processing music directive:\n\t' +
- ('\n\t'.join(errors)),
- nodes.literal_block(block_text, block_text),
- line=lineno)
- return [error]
- else:
- # Crop excess whitespace from the image
- crop_image(output_name)
-
- # Return an image directive.
- options['uri'] = os.path.basename(output_name)
- return [nodes.image(output_name, **options)]
-
-import re
-error_pat = re.compile('(in line )(\d+)')
-def parse_errors (errors, line_start):
- lines = errors.split('\n')
- lines = [ line for line in lines if line.startswith('Error')]
- def f (m):
- return m.group(1) + str(line_start+int(m.group(2)))
- lines = [ error_pat.sub(f, line) for line in lines]
- return lines
-
-
-def crop_image (filename):
- """Reads the image specified by filename, crops excess space off it,
- and writes it out to the same file."""
- from PIL import Image
- image = Image.open(filename)
- for edge in 'NSWE':
- image = _crop(image, edge)
- image.save(filename)
-
-def _crop (image, edge):
- im_x, im_y = image.size
- if edge == 'N':
- start = (0,0)
- scan_increment = (1,0)
- line_increment = (0,1)
- elif edge == 'S':
- start = (0,im_y-1)
- scan_increment = (1,0)
- line_increment = (0,-1)
- elif edge == 'E':
- start = (im_x-1,0)
- scan_increment = (0,1)
- line_increment = (-1,0)
- elif edge == 'W':
- start = (0,0)
- scan_increment = (0,1)
- line_increment = (1,0)
-
- # Look for blank lines
- def is_white (color):
- return color == 255
-
- def is_blank (x,y):
- x_inc, y_inc = scan_increment
- while 0 <= x < im_x and 0 <= y < im_y:
- point = image.getpixel((x,y))
- if not is_white(point):
- return False
- x += x_inc
- y += y_inc
- return True
-
- # Look for blank edges, jumping in increments of JUMP pixels.
- JUMP = 5
- x, y = start
- x_inc, y_inc = line_increment
- while is_blank(x,y):
- x += x_inc * JUMP
- y += y_inc * JUMP
-
- # Found a non-blank line, so scan back
- x -= x_inc
- y -= y_inc
- while not is_blank(x,y):
- x -= x_inc
- y -= y_inc
-
- # OK; x,y are now on the first blank line, so crop it
- if edge == 'N':
- box = (0,y, im_x, im_y)
- elif edge == 'S':
- box = (0,0, im_x, y)
- elif edge == 'E':
- box = (0,0, x, im_y)
- elif edge == 'W':
- box = (x,0, im_x, im_y)
-
- image = image.crop(box)
- image.load()
- return image
-
-
-ABCDirective.content = True
-
-def register():
- register_directive('music', ABCDirective)
diff --git a/sandbox/amk/abc/rst2html.py b/sandbox/amk/abc/rst2html.py
deleted file mode 100755
index 72e65d768..000000000
--- a/sandbox/amk/abc/rst2html.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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.
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, Publisher, default_description
-
-import abc
-abc.register() # Enable the ABC directive
-
-description = ('Generates (X)HTML documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='html', description=description)
diff --git a/sandbox/amk/abc/sample.rst b/sandbox/amk/abc/sample.rst
deleted file mode 100644
index 37d2c7c1b..000000000
--- a/sandbox/amk/abc/sample.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-
-Here is a paragraph of text.
-
-.. music::
-
- % Sample file to test various features of abc2ps
- X:1
- T:Scale
- M:C
- K: clef=bass
- "C,"C,"D,"D,"E,"E,"F,"F, "G,"G,"A,"A,"B,"B,\
- | "C"C"D"D"E"E"F"F "G"G"A"A"B"B| "c"c "d"d"e"e"f"f "g"g"a"a"b"b"c'"c' |
-
-Shorter example.
-
-.. music::
-
- % Sample file to test various features of abc2ps
- X:1
- T:Scale
- M:C
- K: clef=bass
- "C,"C,"D,"D,
-
-Here is the second paragraph of text.
-
-.. music::
-
- % Broken sample file
- X:1
-
- sdfaf asdfasf asddfas
- \ No newline at end of file
diff --git a/sandbox/axk/chm/README.txt b/sandbox/axk/chm/README.txt
deleted file mode 100644
index e1af6bcdb..000000000
--- a/sandbox/axk/chm/README.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-docutils documentation in Microsoft HTML Help (chm) format
-==========================================================
-
-:Author: Axel Kollmorgen
-:Contact: axel(at)kollmorgen[dot]net
-:Date: $Date$
-:Web site: http://docutils.sourceforge.net/sandbox/ax-/chm/
-
-this is the complete docutils_ documentation - all \*.txt files and
-`docs/user/rst/quickref.html`_ - in a single, toc'ed, and full-text searchable
-chm file. the `first version`_ was handmade (and incomplete). the current
-version uses Ollie Rutherfurd's lovely rst2chm_ and a few manual improvements
-(inclusion and "sectioning" of `docs/user/rst/quickref.html`_, some rearrangements of
-toc entries, and improved stylesheets) (and is complete).
-
-the chm is also available from http://chm.kollm.org/ [#]_.
-
-.. _docutils: http://docutils.sourceforge.net/
-.. _docs/user/rst/quickref.html: http://docutils.sourceforge.net/docs/user/rst/quickref.html
-.. _first version: http://mail.python.org/pipermail/doc-sig/2003-July/003033.html
-.. _rst2chm: http://www.rutherfurd.net/software/rst2chm/
-.. [#] my chm site, incl. more self-made chm's such as cvs.chm, html401.chm,
- PEAR.chm, phpDocumentor.chm, phptal.chm, svn.chm, xhtml1.chm
diff --git a/sandbox/axk/chm/docutils.chm b/sandbox/axk/chm/docutils.chm
deleted file mode 100644
index db3b5549a..000000000
--- a/sandbox/axk/chm/docutils.chm
+++ /dev/null
Binary files differ
diff --git a/sandbox/axk/chm/docutils.conf b/sandbox/axk/chm/docutils.conf
deleted file mode 100644
index 6164ae629..000000000
--- a/sandbox/axk/chm/docutils.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[html4css1 writer]
-stylesheet-path: ../default.css
diff --git a/sandbox/axk/default.css b/sandbox/axk/default.css
deleted file mode 100644
index b7601b09d..000000000
--- a/sandbox/axk/default.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:date: $Date$
-:version: $Revision$
-:copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-*/
-
-body {
- font: 85% Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif;
-}
-
-code, pre, tt, samp {
- font: .8em 'Lucida Console', monospace;
-}
-
-h1 { font-size: 2em; }
-
-.first {
- margin-top: 0 }
-
-.last {
- margin-bottom: 0 }
-
-a.toc-backref {
- text-decoration: none ;
- color: black }
-
-blockquote.epigraph {
- margin: 2em 5em ; }
-
-dd {
- margin-bottom: 0.5em }
-
-/* Uncomment (& remove this text!) to get bold-faced definition list terms
-dt {
- font-weight: bold }
-*/
-
-div.abstract {
- margin: 2em 5em }
-
-div.abstract p.topic-title {
- font-weight: bold ;
- text-align: center }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning, div.admonition {
- margin: 2em ;
- border: medium outset ;
- padding: 1em }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: red ;
- font-weight: bold ;
- font-family: sans-serif }
-
-div.hint p.admonition-title, div.important p.admonition-title,
-div.note p.admonition-title, div.tip p.admonition-title,
-div.admonition p.admonition-title {
- font-weight: bold ;
- font-family: sans-serif }
-
-div.dedication {
- margin: 2em 5em ;
- text-align: center ;
- font-style: italic }
-
-div.dedication p.topic-title {
- font-weight: bold ;
- font-style: normal }
-
-div.figure {
- margin-left: 2em }
-
-div.footer, div.header {
- font-size: smaller }
-
-div.sidebar {
- margin-left: 1em ;
- border: medium outset ;
- padding: 0em 1em ;
- background-color: #ffffee ;
- width: 40% ;
- float: right ;
- clear: right }
-
-div.sidebar p.rubric {
- font-family: sans-serif ;
- font-size: medium }
-
-div.system-messages {
- margin: 5em }
-
-div.system-messages h1 {
- color: red }
-
-div.system-message {
- border: medium outset ;
- padding: 1em }
-
-div.system-message p.system-message-title {
- color: red ;
- font-weight: bold }
-
-div.topic {
- margin: 2em }
-
-h1.title {
- text-align: center }
-
-h2.subtitle {
- text-align: center }
-
-hr {
- width: 75% }
-
-ol.simple, ul.simple {
- margin-bottom: 1em }
-
-ol.arabic {
- list-style: decimal }
-
-ol.loweralpha {
- list-style: lower-alpha }
-
-ol.upperalpha {
- list-style: upper-alpha }
-
-ol.lowerroman {
- list-style: lower-roman }
-
-ol.upperroman {
- list-style: upper-roman }
-
-p.attribution {
- text-align: right ;
- margin-left: 50% }
-
-p.caption {
- font-style: italic }
-
-p.credits {
- font-style: italic ;
- font-size: smaller }
-
-p.label {
- white-space: nowrap }
-
-p.rubric {
- font-weight: bold ;
- font-size: larger ;
- color: maroon ;
- text-align: center }
-
-p.sidebar-title {
- font-family: sans-serif ;
- font-weight: bold ;
- font-size: larger }
-
-p.sidebar-subtitle {
- font-family: sans-serif ;
- font-weight: bold }
-
-p.topic-title {
- font-weight: bold }
-
-pre.address {
- margin-bottom: 0 ;
- margin-top: 0 ;
- font-family: serif ;
- font-size: 100% }
-
-pre.line-block {
- font-family: serif ;
- font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
- margin-left: 2em ;
- margin-right: 2em ;
- background-color: #eeeeee }
-
-span.classifier {
- font-family: sans-serif ;
- font-style: oblique }
-
-span.classifier-delimiter {
- font-family: sans-serif ;
- font-weight: bold }
-
-span.interpreted {
- font-family: sans-serif }
-
-span.option {
- white-space: nowrap }
-
-span.option-argument {
- font-style: italic }
-
-span.pre {
- white-space: pre }
-
-span.problematic {
- color: red }
-
-table {
- margin-top: 0.5em ;
- margin-bottom: 0.5em;
- font-size: 1em;
-}
-
-table.citation {
- border-left: solid thin gray ;
- padding-left: 0.5ex }
-
-table.docinfo {
- margin: 2em 4em }
-
-table.footnote {
- border-left: solid thin black ;
- padding-left: 0.5ex }
-
-td, th {
- padding-left: 0.5em ;
- padding-right: 0.5em ;
- vertical-align: top }
-
-th.docinfo-name, th.field-name {
- font-weight: bold ;
- text-align: left ;
- white-space: nowrap }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 100% }
-
-tt {
- background-color: #eeeeee }
-
-ul.auto-toc {
- list-style-type: none }
diff --git a/sandbox/axk/viewcvs/README.txt b/sandbox/axk/viewcvs/README.txt
deleted file mode 100644
index 23460fcd0..000000000
--- a/sandbox/axk/viewcvs/README.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-rst "markup streamer" for ViewCVS_
-==================================
-
-:Author: Axel Kollmorgen
-:Contact: axel(at)kollmorgen[dot]net
-:Version: $Id$
-:Web site: http://docutils.sourceforge.net/sandbox/ax-/viewcvs/
-
-this is a modification of ViewCVS_ that enables rst .txt files in ViewCVS_
-repositories to be viewed as .html ("markup"). this is achieved by adding a new
-"markup streamer" ``markup_stream_rst()`` to viewcvs.py that basically does the
-same as docutils_' tools/html.py [DOC]_ [SRC]_. once installed, any .txt file
-w/ a link ending w/ view=auto or view=markup will be rendered as html.
-
-do you think this is useful? please `send feedback`_. much appreciated!
-
-
-requirements
-~~~~~~~~~~~~
-
-ViewCVS_ / docutils_ CVS 2003-Oct-28. it will probably work with any
-docutils_ 0.3 or newer and with newer (and a little older) versions of ViewCVS_.
-if you use a different version of ViewCVS_, do a diff of viewcvs.py before
-overwriting it - the source changes frequently.
-
-
-install
-~~~~~~~
-
-* install docutils
-
-* get ViewCVS_ from `CVS
- <http://sourceforge.net/cvs/?group_id=18760>`__ (`when prompted for a password
- for anonymous, simply press the Enter key`)::
-
- cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/viewcvs login
- cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/viewcvs co -D28-Oct-2003 viewcvs
-
-* overwrite lib/viewcvs.py with the one supplied
-* install viewcvs as usual (``./viewcvs-install``)
-
-
-todo
-~~~~
-
-* error handling (.txt may not be in rst format)
-* review the code (i'm just starting w/ python ...)
-
-.. _send feedback: mailto:axel(at)kollmorgen[dot]net
-.. _ViewCVS: http://viewcvs.sourceforge.net/
-.. _docutils: http://docutils.sourceforge.net/
-.. [DOC] http://docutils.sourceforge.net/docs/tools.html#html-py
-.. [SRC] http://docutils.sourceforge.net/tools/html.py
diff --git a/sandbox/axk/viewcvs/docutils.conf b/sandbox/axk/viewcvs/docutils.conf
deleted file mode 100644
index 6164ae629..000000000
--- a/sandbox/axk/viewcvs/docutils.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[html4css1 writer]
-stylesheet-path: ../default.css
diff --git a/sandbox/axk/viewcvs/viewcvs.py b/sandbox/axk/viewcvs/viewcvs.py
deleted file mode 100644
index 23e1cbd84..000000000
--- a/sandbox/axk/viewcvs/viewcvs.py
+++ /dev/null
@@ -1,2833 +0,0 @@
-# -*-python-*-
-#
-# Copyright (C) 1999-2002 The ViewCVS Group. All Rights Reserved.
-#
-# By using this file, you agree to the terms and conditions set forth in
-# the LICENSE.html file which can be found at the top level of the ViewCVS
-# distribution or at http://viewcvs.sourceforge.net/license-1.html.
-#
-# Contact information:
-# Greg Stein, PO Box 760, Palo Alto, CA, 94302
-# gstein@lyra.org, http://viewcvs.sourceforge.net/
-#
-# -----------------------------------------------------------------------
-#
-# viewcvs: View CVS repositories via a web browser
-#
-# -----------------------------------------------------------------------
-#
-# This software is based on "cvsweb" by Henner Zeller (which is, in turn,
-# derived from software by Bill Fenner, with additional modifications by
-# Henrik Nordstrom and Ken Coar). The cvsweb distribution can be found
-# on Zeller's site:
-# http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi/
-#
-# -----------------------------------------------------------------------
-#
-
-__version__ = '1.0-dev'
-
-#########################################################################
-#
-# INSTALL-TIME CONFIGURATION
-#
-# These values will be set during the installation process. During
-# development, they will remain None.
-#
-
-CONF_PATHNAME = None
-
-#########################################################################
-
-# this comes from our library; measure the startup time
-import debug
-debug.t_start('startup')
-debug.t_start('imports')
-
-# standard modules that we know are in the path or builtin
-import sys
-import os
-import sapi
-import cgi
-import string
-import urllib
-import mimetypes
-import time
-import re
-import stat
-import struct
-import types
-
-# these modules come from our library (the stub has set up the path)
-import compat
-import config
-import popen
-import ezt
-import accept
-import vclib
-from vclib import bincvs
-
-debug.t_end('imports')
-
-#########################################################################
-
-checkout_magic_path = '*checkout*'
-# According to RFC 1738 the '~' character is unsafe in URLs.
-# But for compatibility with URLs bookmarked with older releases of ViewCVS:
-oldstyle_checkout_magic_path = '~checkout~'
-docroot_magic_path = '*docroot*'
-viewcvs_mime_type = 'text/vnd.viewcvs-markup'
-alt_mime_type = 'text/x-cvsweb-markup'
-
-# put here the variables we need in order to hold our state - they will be
-# added (with their current value) to any link/query string you construct
-_sticky_vars = (
- 'root',
- 'hideattic',
- 'sortby',
- 'sortdir',
- 'logsort',
- 'diff_format',
- 'only_with_tag',
- 'search',
- 'dir_pagestart',
- 'log_pagestart',
- )
-
-# for reading/writing between a couple descriptors
-CHUNK_SIZE = 8192
-
-# for rcsdiff processing of header
-_RCSDIFF_IS_BINARY = 'binary'
-_RCSDIFF_ERROR = 'error'
-
-# global configuration:
-cfg = None # see below
-
-# special characters that don't need to be URL encoded
-_URL_SAFE_CHARS = "/*~"
-
-if CONF_PATHNAME:
- # installed
- g_install_dir = os.path.dirname(CONF_PATHNAME)
-else:
- # development directories
- g_install_dir = os.path.join(os.pardir, os.pardir) # typically, "../.."
-
-
-class Request:
- def __init__(self, server):
- self.server = server
- self.script_name = server.getenv('SCRIPT_NAME', '')
- self.browser = server.getenv('HTTP_USER_AGENT', 'unknown')
-
- # in lynx, it it very annoying to have two links per file, so
- # disable the link at the icon in this case:
- self.no_file_links = string.find(self.browser, 'Lynx') != -1
-
- # newer browsers accept gzip content encoding and state this in a
- # header (netscape did always but didn't state it) It has been
- # reported that these braindamaged MS-Internet Explorers claim
- # that they accept gzip .. but don't in fact and display garbage
- # then :-/
- self.may_compress = (
- ( string.find(server.getenv('HTTP_ACCEPT_ENCODING', ''), 'gzip') != -1
- or string.find(self.browser, 'Mozilla/3') != -1)
- and string.find(self.browser, 'MSIE') == -1
- )
-
- # process the Accept-Language: header
- hal = server.getenv('HTTP_ACCEPT_LANGUAGE','')
- self.lang_selector = accept.language(hal)
- self.language = self.lang_selector.select_from(cfg.general.languages)
-
- # load the key/value files, given the selected language
- self.kv = cfg.load_kv_files(self.language)
-
- def run_viewcvs(self):
-
- # global needed because "import vclib.svn" causes the
- # interpreter to make vclib a local variable
- global vclib
-
- # This function first parses the query string and sets the following
- # variables. Then it executes the request.
- self.view_func = None # function to call to process the request
- self.repos = None # object representing current repository
- self.rootname = None # name of current root (as used in viewcvs.conf)
- self.roottype = None # current root type ('svn' or 'cvs')
- self.rootpath = None # physical path to current root
- self.pathtype = None # type of path, either vclib.FILE or vclib.DIR
- self.where = None # path to file or directory in current root
- self.query_dict = None # validated and cleaned up query options
- self.path_parts = None # for convenience, equals where.split('/')
-
- # Process PATH_INFO component of query string
- path_info = self.server.getenv('PATH_INFO', '')
-
- # clean it up. this removes duplicate '/' characters and any that may
- # exist at the front or end of the path.
- path_parts = filter(None, string.split(path_info, '/'))
-
- if path_parts:
- # handle magic path prefixes
- if path_parts[0] == docroot_magic_path:
- # if this is just a simple hunk of doc, then serve it up
- self.where = string.join(path_parts[1:], '/')
- return view_doc(self)
- elif path_parts[0] in (checkout_magic_path, oldstyle_checkout_magic_path):
- path_parts.pop(0)
- self.view_func = view_checkout
-
- # see if we are treating the first path component (after any
- # magic) as the repository root. if there are parts, and the
- # first component is a named root, use it as such. else, we'll be
- # falling back to the default root a little later.
- if cfg.options.root_as_url_component and path_parts \
- and list_roots(cfg).has_key(path_parts[0]):
- self.rootname = path_parts.pop(0)
-
- # if this is a forbidden path, stop now
- if path_parts and cfg.is_forbidden(path_parts[0]):
- raise debug.ViewCVSException('Access to "%s" is forbidden.'
- % path_parts[0], '403 Forbidden')
-
- self.where = string.join(path_parts, '/')
- self.path_parts = path_parts
-
- # Done with PATH_INFO, now parse the query params
- self.query_dict = {}
-
- for name, values in self.server.params().items():
- # patch up old queries that use 'cvsroot' to look like they used 'root'
- if name == 'cvsroot':
- name = 'root'
-
- # validate the parameter
- _validate_param(name, values[0])
-
- # if we're here, then the parameter is okay
- self.query_dict[name] = values[0]
-
- # Special handling for root parameter
- root_param = self.query_dict.get('root', None)
- if root_param:
- self.rootname = root_param
-
- # in root_as_url_component mode, if we see a root in the query
- # data, we'll redirect to the new url schema. it may fail, but
- # at least we tried.
- if cfg.options.root_as_url_component:
- del self.query_dict['root']
- self.server.redirect(self.get_url())
-
- elif self.rootname is None:
- self.rootname = cfg.general.default_root
-
- # Create the repository object
- if cfg.general.cvs_roots.has_key(self.rootname):
- self.rootpath = cfg.general.cvs_roots[self.rootname]
- try:
- self.repos = bincvs.BinCVSRepository(self.rootname, self.rootpath,
- cfg.general)
- self.roottype = 'cvs'
- except vclib.ReposNotFound:
- raise debug.ViewCVSException(
- '%s not found!\nThe wrong path for this repository was '
- 'configured, or the server on which the CVS tree lives may be '
- 'down. Please try again in a few minutes.'
- % self.server.escape(self.rootname))
- # required so that spawned rcs programs correctly expand $CVSHeader$
- os.environ['CVSROOT'] = self.rootpath
- elif cfg.general.svn_roots.has_key(self.rootname):
- self.rootpath = cfg.general.svn_roots[self.rootname]
- try:
- if re.match(_re_rewrite_url, self.rootpath):
- # If the rootpath is a URL, we'll use the svn_ra module, but
- # lie about its name.
- import vclib.svn_ra
- vclib.svn = vclib.svn_ra
- else:
- import vclib.svn
- rev = None
- if self.query_dict.has_key('rev') \
- and self.query_dict['rev'] != 'HEAD':
- rev = int(self.query_dict['rev'])
- self.repos = vclib.svn.SubversionRepository(self.rootname,
- self.rootpath, rev)
- self.repos.cross_copies = cfg.options.cross_copies
- self.roottype = 'svn'
- except vclib.ReposNotFound:
- raise debug.ViewCVSException(
- '%s not found!\nThe wrong path for this repository was '
- 'configured, or the server on which the Subversion tree lives may'
- 'be down. Please try again in a few minutes.'
- % self.server.escape(self.rootname))
- except vclib.InvalidRevision, ex:
- raise debug.ViewCVSException(str(ex))
- else:
- raise debug.ViewCVSException(
- 'The root "%s" is unknown. If you believe the value is '
- 'correct, then please double-check your configuration.'
- % self.server.escape(self.rootname), "404 Repository not found")
-
- # Make sure path exists
- self.pathtype = _repos_pathtype(self.repos, self.path_parts)
-
- if self.pathtype is None:
- # path doesn't exist, try stripping known fake suffixes
- result = _strip_suffix('.diff', self.where, self.path_parts, \
- vclib.FILE, self.repos, view_diff) or \
- _strip_suffix('.tar.gz', self.where, self.path_parts, \
- vclib.DIR, self.repos, download_tarball) or \
- _strip_suffix('root.tar.gz', self.where, self.path_parts, \
- vclib.DIR, self.repos, download_tarball)
- if result:
- self.where, self.path_parts, self.pathtype, self.view_func = result
- else:
- raise debug.ViewcvsException('%s: unknown location'
- % self.where, '404 Not Found')
-
- # Try to figure out what to do based on view parameter
- self.view_func = _views.get(self.query_dict.get('view', None),
- self.view_func)
-
- if self.view_func is None:
- # view parameter is not set, try looking at pathtype and the
- # other parameters
- if self.pathtype == vclib.DIR:
- self.view_func = view_directory
- elif self.pathtype == vclib.FILE:
- if self.query_dict.has_key('rev'):
- if self.query_dict.get('content-type', None) in (viewcvs_mime_type,
- alt_mime_type):
- self.view_func = view_markup
- else:
- self.view_func = view_checkout
- elif self.query_dict.has_key('annotate'):
- self.view_func = view_annotate
- elif self.query_dict.has_key('r1') and self.query_dict.has_key('r2'):
- self.view_func = view_diff
- elif self.query_dict.has_key('tarball'):
- self.view_func = download_tarball
- elif self.query_dict.has_key('graph'):
- if not self.query_dict.has_key('makeimage'):
- self.view_func = view_cvsgraph
- else:
- self.view_func = view_cvsgraph_image
- else:
- self.view_func = view_log
-
- # Finally done parsing query string, set some extra variables
- # and call view_func
- self.full_name = self.rootpath + (self.where and '/' + self.where)
- if self.pathtype == vclib.FILE:
- self.setup_mime_type_info()
-
- # startup is done now.
- debug.t_end('startup')
-
- self.view_func(self)
-
- def get_url(self, **args):
- """Constructs a link to another ViewCVS page just like the get_link
- function except that it returns a single URL instead of a URL
- split into components"""
-
- url, params = apply(self.get_link, (), args)
- qs = compat.urlencode(params)
- if qs:
- return urllib.quote(url, _URL_SAFE_CHARS) + '?' + qs
- else:
- return urllib.quote(url, _URL_SAFE_CHARS)
-
- def get_link(self, view_func = None, rootname = None, where = None,
- params = None, pathtype = None):
- """Constructs a link pointing to another ViewCVS page. All arguments
- correspond to members of the Request object. If they are set to
- None they take values from the current page. Return value is a base
- URL and a dictionary of parameters"""
-
- if view_func is None:
- view_func = self.view_func
-
- if rootname is None:
- rootname = self.rootname
-
- if params is None:
- params = self.query_dict.copy()
-
- # must specify both where and pathtype or neither
- assert (where is None) == (pathtype is None)
-
- if where is None:
- where = self.where
- pathtype = self.pathtype
-
- last_link = view_func is view_checkout or view_func is download_tarball
-
- # The logic used to construct the URL is an inverse of the
- # logic used to interpret URLs in Request.run_viewcvs
-
- url = self.script_name
-
- # add checkout magic if possible
- if view_func is view_checkout and cfg.options.checkout_magic:
- url = url + '/' + checkout_magic_path
- view_func = None
-
- # add root name
- if cfg.options.root_as_url_component:
- url = url + '/' + rootname
- elif not (params.has_key('root') and params['root'] is None):
- if rootname != cfg.general.default_root:
- params['root'] = rootname
- else:
- params['root'] = None
-
- # if we are asking for the revision info view, we don't need any
- # path information
- if view_func == view_revision:
- where = None
- pathtype = vclib.DIR
-
- # add path
- if where:
- url = url + '/' + where
-
- # add suffix for tarball
- if view_func is download_tarball:
- if not where: url = url + '/root'
- url = url + '.tar.gz'
-
- # add trailing slash for a directory
- elif pathtype == vclib.DIR:
- url = url + '/'
-
- # no need to explicitly specify log view for a file
- if view_func is view_log and pathtype == vclib.FILE:
- view_func = None
-
- # no need to explicitly specify directory view for a directory
- if view_func is view_directory and pathtype == vclib.DIR:
- view_func = None
-
- # no need to explicitly specify annotate view when
- # there's an annotate parameter
- if view_func is view_annotate and params.has_key('annotate'):
- view_func = None
-
- # no need to explicitly specify diff view when
- # there's r1 and r2 parameters
- if view_func is view_diff and params.has_key('r1') \
- and params.has_key('r2'):
- view_func = None
-
- # no need to explicitly specify checkout view when
- # there's a rev parameter
- if view_func is view_checkout and params.has_key('rev'):
- view_func = None
-
- view_code = _view_codes.get(view_func)
- if view_code and not (params.has_key('view') and params['view'] is None):
- params['view'] = view_code
-
- return url, self.get_options(params, not last_link)
-
- def get_options(self, params = {}, sticky_vars=1):
- """Combine params with current sticky values"""
- ret = { }
- if sticky_vars:
- for name in _sticky_vars:
- value = self.query_dict.get(name)
- if value is not None and not params.has_key(name):
- ret[name] = self.query_dict[name]
- for name, val in params.items():
- if val is not None:
- ret[name] = val
- return ret
-
- def setup_mime_type_info(self):
- if cfg.general.mime_types_file:
- mimetypes.init([cfg.general.mime_types_file])
- self.mime_type, self.encoding = mimetypes.guess_type(self.where)
- if not self.mime_type:
- self.mime_type = 'text/plain'
- self.default_viewable = cfg.options.allow_markup and \
- (is_viewable_image(self.mime_type)
- or is_text(self.mime_type))
-
-def _validate_param(name, value):
- """Validate whether the given value is acceptable for the param name.
-
- If the value is not allowed, then an error response is generated, and
- this function throws an exception. Otherwise, it simply returns None.
- """
-
- try:
- validator = _legal_params[name]
- except KeyError:
- raise debug.ViewcvsException(
- 'An illegal parameter name ("%s") was passed.' % cgi.escape(name),
- '400 Bad Request')
-
- if validator is None:
- return
-
- # is the validator a regex?
- if hasattr(validator, 'match'):
- if not validator.match(value):
- raise debug.ViewcvsException(
- 'An illegal value ("%s") was passed as a parameter.' %
- cgi.escape(value), '400 Bad Request')
- return
-
- # the validator must be a function
- validator(value)
-
-def _validate_regex(value):
- # hmm. there isn't anything that we can do here.
-
- ### we need to watch the flow of these parameters through the system
- ### to ensure they don't hit the page unescaped. otherwise, these
- ### parameters could constitute a CSS attack.
- pass
-
-# obvious things here. note that we don't need uppercase for alpha.
-_re_validate_alpha = re.compile('^[a-z]+$')
-_re_validate_number = re.compile('^[0-9]+$')
-
-# when comparing two revs, we sometimes construct REV:SYMBOL, so ':' is needed
-_re_validate_revnum = re.compile('^[-_.a-zA-Z0-9:]*$')
-
-# it appears that RFC 2045 also says these chars are legal: !#$%&'*+^{|}~`
-# but woah... I'll just leave them out for now
-_re_validate_mimetype = re.compile('^[-_.a-zA-Z0-9/]+$')
-
-# the legal query parameters and their validation functions
-_legal_params = {
- 'root' : None,
- 'view' : None,
- 'search' : _validate_regex,
- 'p1' : None,
- 'p2' : None,
-
- 'hideattic' : _re_validate_number,
- 'sortby' : _re_validate_alpha,
- 'sortdir' : _re_validate_alpha,
- 'logsort' : _re_validate_alpha,
- 'diff_format' : _re_validate_alpha,
- 'only_with_tag' : _re_validate_revnum,
- 'dir_pagestart' : _re_validate_number,
- 'log_pagestart' : _re_validate_number,
- 'hidecvsroot' : _re_validate_number,
- 'annotate' : _re_validate_revnum,
- 'graph' : _re_validate_revnum,
- 'makeimage' : _re_validate_number,
- 'tarball' : _re_validate_number,
- 'r1' : _re_validate_revnum,
- 'tr1' : _re_validate_revnum,
- 'r2' : _re_validate_revnum,
- 'tr2' : _re_validate_revnum,
- 'rev' : _re_validate_revnum,
- 'content-type' : _re_validate_mimetype,
- }
-
-# regex used to move from a file to a directory
-_re_up_path = re.compile('(^|/)[^/]+$')
-_re_up_attic_path = re.compile('(^|/)(Attic/)?[^/]+$')
-def get_up_path(request, path, hideattic=0):
- if request.roottype == 'svn' or hideattic:
- return re.sub(_re_up_path, '', path)
- else:
- return re.sub(_re_up_attic_path, '', path)
-
-def _strip_suffix(suffix, where, path_parts, pathtype, repos, view_func):
- """strip the suffix from a repository path if the resulting path
- is of the specified type, otherwise return None"""
- l = len(suffix)
- if where[-l:] == suffix:
- path_parts = path_parts[:]
- path_parts[-1] = path_parts[-1][:-l]
- t = _repos_pathtype(repos, path_parts)
- if pathtype == t:
- return where[:-l], path_parts, t, view_func
- return None
-
-def _repos_pathtype(repos, path_parts):
- """return the type of a repository path, or None if the path
- does not exist"""
- type = None
- try:
- type = repos.itemtype(path_parts)
- except vclib.ItemNotFound:
- pass
- return type
-
-def generate_page(request, tname, data):
- # allow per-language template selection
- if request:
- tname = string.replace(tname, '%lang%', request.language)
- else:
- tname = string.replace(tname, '%lang%', 'en')
-
- debug.t_start('ezt-parse')
- template = ezt.Template(os.path.join(g_install_dir, tname))
- debug.t_end('ezt-parse')
-
- template.generate(sys.stdout, data)
-
-def html_footer(request):
- data = common_template_data(request)
-
- # generate the footer
- generate_page(request, cfg.templates.footer, data)
-
-def clickable_path(request, leaf_is_link, drop_leaf):
- where = ''
- s = '<a href="%s#dirlist">[%s]</a>' % (_dir_url(request, where),
- request.repos.name)
-
- for part in request.path_parts[:-1]:
- if where: where = where + '/'
- where = where + part
- s = s + ' / <a href="%s#dirlist">%s</a>' % (_dir_url(request, where), part)
-
- if not drop_leaf and request.path_parts:
- if leaf_is_link:
- s = s + ' / %s' % (request.path_parts[-1])
- else:
- if request.pathtype == vclib.DIR:
- url = request.get_url(view_func=view_directory, params={}) + '#dirlist'
- else:
- url = request.get_url(view_func=view_log, params={})
- s = s + ' / <a href="%s">%s</a>' % (url, request.path_parts[-1])
-
- return s
-
-def _dir_url(request, where):
- """convenient wrapper for get_url used by clickable_path()"""
- return request.get_url(view_func=view_directory, where=where,
- pathtype=vclib.DIR, params={})
-
-
-def prep_tags(request, tags):
- url, params = request.get_link(params={'only_with_tag': None})
- params = compat.urlencode(params)
- if params:
- url = urllib.quote(url, _URL_SAFE_CHARS) + '?' + params + '&only_with_tag='
- else:
- url = urllib.quote(url, _URL_SAFE_CHARS) + '?only_with_tag='
-
- links = [ ]
- for tag in tags:
- links.append(_item(name=tag, href=url+tag))
- return links
-
-def is_viewable_image(mime_type):
- return mime_type in ('image/gif', 'image/jpeg', 'image/png')
-
-def is_text(mime_type):
- return mime_type[:5] == 'text/'
-
-_re_rewrite_url = re.compile('((http|https|ftp|file|svn|svn\+ssh)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*(#([-a-zA-Z0-9%.~:_]+)?)?)')
-_re_rewrite_email = re.compile('([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})')
-def htmlify(html):
- html = cgi.escape(html)
- html = re.sub(_re_rewrite_url, r'<a href="\1">\1</a>', html)
- html = re.sub(_re_rewrite_email, r'<a href="mailto:\1">\1</a>', html)
- return html
-
-def format_log(log):
- s = htmlify(log[:cfg.options.short_log_len])
- if len(log) > cfg.options.short_log_len:
- s = s + '...'
- return s
-
-_time_desc = {
- 1 : 'second',
- 60 : 'minute',
- 3600 : 'hour',
- 86400 : 'day',
- 604800 : 'week',
- 2628000 : 'month',
- 31536000 : 'year',
- }
-
-def get_time_text(request, interval, num):
- "Get some time text, possibly internationalized."
- ### some languages have even harder pluralization rules. we'll have to
- ### deal with those on demand
- if num == 0:
- return ''
- text = _time_desc[interval]
- if num == 1:
- attr = text + '_singular'
- fmt = '%d ' + text
- else:
- attr = text + '_plural'
- fmt = '%d ' + text + 's'
- try:
- fmt = getattr(request.kv.i18n.time, attr)
- except AttributeError:
- pass
- return fmt % num
-
-def little_time(request):
- try:
- return request.kv.i18n.time.little_time
- except AttributeError:
- return 'very little time'
-
-def html_time(request, secs, extended=0):
- secs = long(time.time()) - secs
- if secs < 2:
- return little_time(request)
- breaks = _time_desc.keys()
- breaks.sort()
- i = 0
- while i < len(breaks):
- if secs < 2 * breaks[i]:
- break
- i = i + 1
- value = breaks[i - 1]
- s = get_time_text(request, value, secs / value)
-
- if extended and i > 1:
- secs = secs % value
- value = breaks[i - 2]
- ext = get_time_text(request, value, secs / value)
- if ext:
- ### this is not i18n compatible. pass on it for now
- s = s + ', ' + ext
- return s
-
-def common_template_data(request):
- data = {
- 'cfg' : cfg,
- 'vsn' : __version__,
- 'kv' : request.kv,
- 'icons' : cfg.options.icons,
- 'docroot' : cfg.options.docroot is None \
- and request.script_name + '/' + docroot_magic_path \
- or cfg.options.docroot,
- }
- return data
-
-def nav_header_data(request, rev):
- path, filename = os.path.split(request.where)
- if request.roottype == 'cvs' and path[-6:] == '/Attic':
- path = path[:-6]
-
- data = common_template_data(request)
- data.update({
- 'nav_path' : clickable_path(request, 1, 0),
- 'path' : path,
- 'filename' : filename,
- 'file_url' : request.get_url(view_func=view_log, params={}),
- 'rev' : rev
- })
- return data
-
-def copy_stream(fp):
- while 1:
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- break
- sys.stdout.write(chunk)
-
-def read_stream(fp):
- string = ''
- while 1:
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- break
- else:
- string = string + chunk
- return string
-
-def markup_stream_default(fp):
- print '<pre>'
- while 1:
- ### technically, the htmlify() could fail if something falls across
- ### the chunk boundary. TFB.
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- break
- sys.stdout.write(htmlify(chunk))
- print '</pre>'
-
-def markup_stream_python(fp):
- ### convert this code to use the recipe at:
- ### http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52298
- ### note that the cookbook states all the code is licensed according to
- ### the Python license.
- try:
- # see if Marc-Andre Lemburg's py2html stuff is around
- # http://starship.python.net/crew/lemburg/SoftwareDescriptions.html#py2html.py
- ### maybe restrict the import to *only* this directory?
- sys.path.insert(0, cfg.options.py2html_path)
- import py2html
- import PyFontify
- except ImportError:
- # fall back to the default streamer
- markup_stream_default(fp)
- else:
- ### it doesn't escape stuff quite right, nor does it munge URLs and
- ### mailtos as well as we do.
- html = cgi.escape(fp.read())
- pp = py2html.PrettyPrint(PyFontify.fontify, "rawhtml", "color")
- html = pp.fontify(html)
- html = re.sub(_re_rewrite_url, r'<a href="\1">\1</a>', html)
- html = re.sub(_re_rewrite_email, r'<a href="mailto:\1">\1</a>', html)
- sys.stdout.write(html)
-
-def markup_stream_php(fp):
- sys.stdout.flush()
-
- os.putenv("SERVER_SOFTWARE", "")
- os.putenv("SERVER_NAME", "")
- os.putenv("GATEWAY_INTERFACE", "")
- os.putenv("REQUEST_METHOD", "")
- php = popen.pipe_cmds([["php","-q"]])
-
- php.write("<?\n$file = '';\n")
-
- while 1:
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- if fp.eof() is None:
- time.sleep(1)
- continue
- break
- php.write("$file .= '")
- php.write(string.replace(string.replace(chunk, "\\", "\\\\"),"'","\\'"))
- php.write("';\n")
-
- php.write("\n\nhighlight_string($file);\n?>")
- php.close()
-
-def markup_stream_enscript(lang, fp):
- sys.stdout.flush()
- # I've tried to pass option '-C' to enscript to generate line numbers
- # Unfortunately this option doesn'nt work with HTML output in enscript
- # version 1.6.2.
- enscript = popen.pipe_cmds([(os.path.normpath(os.path.join(cfg.options.enscript_path,'enscript')),
- '--color', '--language=html',
- '--pretty-print=' + lang, '-o',
- '-', '-'),
- ('sed', '-n', '/^<PRE>$/,/<\\/PRE>$/p')])
-
- try:
- while 1:
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- if fp.eof() is None:
- time.sleep(1)
- continue
- break
- enscript.write(chunk)
- except IOError:
- print "<h3>Failure during use of an external program:</h3>"
- print "The command line was:"
- print "<pre>"
- print os.path.normpath(os.path.join(cfg.options.enscript_path,'enscript')
- ) + " --color --language=html --pretty-print="+lang+" -o - -"
- print "</pre>"
- print "Please look at the error log of your webserver for more info."
- raise
-
- enscript.close()
- if sys.platform != "win32":
- os.wait()
-
-def markup_stream_rst(fp):
- import locale
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- pass
-
- try:
- import docutils.readers.standalone
-
- class ViewCVSReader(docutils.readers.standalone.Reader):
-
- def __init__(self, fp):
- docutils.readers.Reader.__init__(self, parser=None, parser_name='restructuredtext')
- self.fp = fp
-
- def read(self, source, parser, settings):
- self.source = source
- if not self.parser:
- self.parser = parser
- self.settings = settings
- #self.input = self.source.read()
- # read all at once
- self.input = read_stream(self.fp)
- self.parse()
- return self.document
-
- from docutils.core import publish_file
- publish_file(reader=ViewCVSReader(fp), writer_name='html')
- except:
- raise
-
-markup_streamers = {
-# '.py' : markup_stream_python,
-# '.php' : markup_stream_php,
-# '.inc' : markup_stream_php,
- '.txt' : markup_stream_rst
- }
-
-### this sucks... we have to duplicate the extensions defined by enscript
-enscript_extensions = {
- '.C' : 'cpp',
- '.EPS' : 'postscript',
- '.DEF' : 'modula_2', # requires a patch for enscript 1.6.2, see INSTALL
- '.F' : 'fortran',
- '.H' : 'cpp',
- '.MOD' : 'modula_2', # requires a patch for enscript 1.6.2, see INSTALL
- '.PS' : 'postscript',
- '.S' : 'asm',
- '.SH' : 'sh',
- '.ada' : 'ada',
- '.adb' : 'ada',
- '.ads' : 'ada',
- '.awk' : 'awk',
- '.c' : 'c',
- '.c++' : 'cpp',
- '.cc' : 'cpp',
- '.cpp' : 'cpp',
- '.csh' : 'csh',
- '.cxx' : 'cpp',
- '.diff' : 'diffu',
- '.dpr' : 'delphi',
- '.el' : 'elisp',
- '.eps' : 'postscript',
- '.f' : 'fortran',
- '.for': 'fortran',
- '.gs' : 'haskell',
- '.h' : 'c',
- '.hpp' : 'cpp',
- '.hs' : 'haskell',
- '.htm' : 'html',
- '.html' : 'html',
- '.idl' : 'idl',
- '.java' : 'java',
- '.js' : 'javascript',
- '.lgs' : 'haskell',
- '.lhs' : 'haskell',
- '.m' : 'objc',
- '.m4' : 'm4',
- '.man' : 'nroff',
- '.nr' : 'nroff',
- '.p' : 'pascal',
- # classic setting:
- # '.pas' : 'pascal',
- # most people using pascal today are using the Delphi system originally
- # brought to us as Turbo-Pascal during the eighties of the last century:
- '.pas' : 'delphi',
- # ---
- '.patch' : 'diffu',
- # For Oracle sql packages. The '.pkg' extension might be used for other
- # file types, adjust here if necessary.
- '.pkg' : 'sql',
- '.pl' : 'perl',
- '.pm' : 'perl',
- '.pp' : 'pascal',
- '.ps' : 'postscript',
- '.s' : 'asm',
- '.scheme' : 'scheme',
- '.scm' : 'scheme',
- '.scr' : 'synopsys',
- '.sh' : 'sh',
- '.shtml' : 'html',
- '.sql' : 'sql',
- '.st' : 'states',
- '.syn' : 'synopsys',
- '.synth' : 'synopsys',
- '.tcl' : 'tcl',
- '.tex' : 'tex',
- '.texi' : 'tex',
- '.texinfo' : 'tex',
- '.v' : 'verilog',
- '.vba' : 'vba',
- '.vh' : 'verilog',
- '.vhd' : 'vhdl',
- '.vhdl' : 'vhdl',
-
- ### use enscript or py2html?
- '.py' : 'python',
- }
-enscript_filenames = {
- '.emacs' : 'elisp',
- 'GNUmakefile' : 'makefile',
- 'Makefile' : 'makefile',
- 'makefile' : 'makefile',
- 'ChangeLog' : 'changelog',
- }
-
-
-def make_time_string(date):
- """Returns formatted date string in either local time or UTC.
-
- The passed in 'date' variable is seconds since epoch.
-
- """
- if (cfg.options.use_localtime):
- localtime = time.localtime(date)
- return time.asctime(localtime) + ' ' + time.tzname[localtime[8]]
- else:
- return time.asctime(time.gmtime(date)) + ' UTC'
-
-def view_auto(request):
- if request.default_viewable:
- view_markup(request)
- else:
- view_checkout(request)
-
-def view_markup(request):
- full_name = request.full_name
- where = request.where
- query_dict = request.query_dict
- rev = request.query_dict.get('rev')
-
- fp, revision = request.repos.openfile(request.path_parts, rev)
-
- data = nav_header_data(request, revision)
- data.update({
- 'nav_file' : clickable_path(request, 1, 0),
- 'href' : request.get_url(view_func=view_checkout, params={}),
- 'text_href' : request.get_url(view_func=view_checkout,
- params={'content-type': 'text/plain'}),
- 'mime_type' : request.mime_type,
- 'log' : None,
- })
-
- if cfg.options.show_log_in_markup:
- if request.roottype == 'cvs':
- show_revs, rev_map, rev_order, taginfo, rev2tag, \
- cur_branch, branch_points, branch_names = read_log(full_name)
- entry = rev_map[revision]
-
- idx = string.rfind(revision, '.')
- branch = revision[:idx]
-
- entry.date_str = make_time_string(entry.date)
-
- data.update({
- 'roottype' : 'cvs',
- 'date_str' : entry.date_str,
- 'ago' : html_time(request, entry.date, 1),
- 'author' : entry.author,
- 'branches' : None,
- 'tags' : None,
- 'branch_points' : None,
- 'changed' : entry.changed,
- 'log' : htmlify(entry.log),
- 'size' : None,
- 'state' : entry.state,
- 'vendor_branch' : ezt.boolean(_re_is_vendor_branch.match(revision)),
- })
-
- if rev2tag.has_key(branch):
- data['branches'] = string.join(rev2tag[branch], ', ')
- if rev2tag.has_key(revision):
- data['tags'] = string.join(rev2tag[revision], ', ')
- if branch_points.has_key(revision):
- data['branch_points'] = string.join(branch_points[revision], ', ')
-
- prev_rev = string.split(revision, '.')
- while 1:
- if prev_rev[-1] == '0': # .0 can be caused by 'commit -r X.Y.Z.0'
- prev_rev = prev_rev[:-2] # X.Y.Z.0 becomes X.Y.Z
- else:
- prev_rev[-1] = str(int(prev_rev[-1]) - 1)
- prev = string.join(prev_rev, '.')
- if rev_map.has_key(prev) or prev == '':
- break
- data['prev'] = prev
- elif request.roottype == 'svn':
- alltags, logs = vclib.svn.fetch_log(request.repos, where)
- this_rev = int(revision)
- entry = logs[this_rev]
-
- data.update({
- 'roottype' : 'svn',
- 'date_str' : make_time_string(entry.date),
- 'ago' : html_time(request, entry.date, 1),
- 'author' : entry.author,
- 'branches' : None,
- 'tags' : None,
- 'branch_points' : None,
- 'changed' : entry.changed,
- 'log' : htmlify(entry.log),
- 'state' : entry.state,
- 'size' : entry.size,
- 'vendor_branch' : ezt.boolean(0),
- })
-
- revs = logs.keys()
- revs.sort()
- rev_idx = revs.index(this_rev)
- if rev_idx > 0:
- data['prev'] = str(revs[rev_idx - 1])
- else:
- data['prev'] = None
-
- data['tag'] = query_dict.get('only_with_tag')
-
- request.server.header()
- generate_page(request, cfg.templates.markup, data)
-
- if is_viewable_image(request.mime_type):
- url = request.get_url(view_func=view_checkout, params={})
- print '<img src="%s"><br>' % url
- while fp.read(8192):
- pass
- else:
- basename, ext = os.path.splitext(data['filename'])
- streamer = markup_streamers.get(ext)
- if streamer:
- streamer(fp)
- elif not cfg.options.use_enscript:
- markup_stream_default(fp)
- else:
- lang = enscript_extensions.get(ext)
- if not lang:
- lang = enscript_filenames.get(basename)
- if lang and lang not in cfg.options.disable_enscript_lang:
- markup_stream_enscript(lang, fp)
- else:
- markup_stream_default(fp)
- status = fp.close()
- if status:
- raise 'pipe error status: %d' % status
- html_footer(request)
-
-def revcmp(rev1, rev2):
- rev1 = map(int, string.split(rev1, '.'))
- rev2 = map(int, string.split(rev2, '.'))
- return cmp(rev1, rev2)
-
-def prepare_hidden_values(params):
- """returns variables from params encoded as a invisible HTML snippet.
- """
- hidden_values = []
- for name, value in params.items():
- hidden_values.append('<input type="hidden" name="%s" value="%s" />' %
- (name, value))
- return string.join(hidden_values, '')
-
-def sort_file_data(file_data, sortdir, sortby):
- def file_sort_cmp(file1, file2, sortby=sortby):
- if file1.kind == vclib.DIR: # is_directory
- if file2.kind == vclib.DIR:
- # both are directories. sort on name.
- return cmp(file1.name, file2.name)
- # file1 is a directory, it sorts first.
- return -1
- if file2.kind == vclib.DIR:
- # file2 is a directory, it sorts first.
- return 1
-
- # we should have data on these. if not, then it is because we requested
- # a specific tag and that tag is not present on the file.
- info1 = file1.rev or bincvs._FILE_HAD_ERROR
- info2 = file2.rev or bincvs._FILE_HAD_ERROR
- if info1 != bincvs._FILE_HAD_ERROR and info2 != bincvs._FILE_HAD_ERROR:
- # both are files, sort according to sortby
- if sortby == 'rev':
- return revcmp(file1.rev, file2.rev)
- elif sortby == 'date':
- return cmp(file2.date, file1.date) # latest date is first
- elif sortby == 'log':
- return cmp(file1.log, file2.log)
- elif sortby == 'author':
- return cmp(file1.author, file2.author)
- else:
- # sort by file name
- return cmp(file1.name, file2.name)
-
- # at this point only one of file1 or file2 are _FILE_HAD_ERROR.
- if info1 != bincvs._FILE_HAD_ERROR:
- return -1
-
- return 1
-
- file_data.sort(file_sort_cmp)
-
- if sortdir == "down":
- file_data.reverse()
-
-def view_directory(request):
- # if we have a directory and the request didn't end in "/", then redirect
- # so that it does.
- if request.server.getenv('PATH_INFO', '')[-1:] != '/':
- request.server.redirect(request.get_url())
-
- sortby = request.query_dict.get('sortby', cfg.options.sort_by) or 'file'
- sortdir = request.query_dict.get('sortdir', 'up')
-
- # prepare the data that will be passed to the template
- data = common_template_data(request)
- data.update({
- 'roottype' : request.roottype,
- 'where' : request.where,
- 'current_root' : request.repos.name,
- 'sortby' : sortby,
- 'sortdir' : sortdir,
- 'no_match' : None,
- 'unreadable' : None,
- 'tarball_href' : None,
- 'search_re' : None,
- 'dir_pagestart' : None,
- 'have_logs' : 'yes',
- 'sortby_file_href' : request.get_url(params={'sortby': 'file'}),
- 'sortby_rev_href' : request.get_url(params={'sortby': 'rev'}),
- 'sortby_date_href' : request.get_url(params={'sortby': 'date'}),
- 'sortby_author_href' : request.get_url(params={'sortby': 'author'}),
- 'sortby_log_href' : request.get_url(params={'sortby': 'log'}),
- 'sortdir_down_href' : request.get_url(params={'sortdir': 'down'}),
- 'sortdir_up_href' : request.get_url(params={'sortdir': 'up'}),
-
- ### in the future, it might be nice to break this path up into
- ### a list of elements, allowing the template to display it in
- ### a variety of schemes.
- 'nav_path' : clickable_path(request, 0, 0),
- })
-
- if not request.where:
- url, params = request.get_link(params={'root': None})
- data['change_root_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['change_root_hidden_values'] = prepare_hidden_values(params)
-
- # add in the roots for the selection
- allroots = list_roots(cfg)
- if len(allroots) < 2:
- roots = [ ]
- else:
- roots = allroots.keys()
- roots.sort(lambda n1, n2: cmp(string.lower(n1), string.lower(n2)))
- data['roots'] = roots
-
- if cfg.options.use_pagesize:
- url, params = request.get_link(params={'dir_pagestart': None})
- data['dir_paging_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['dir_paging_hidden_values'] = prepare_hidden_values(params)
-
- if cfg.options.allow_tar:
- data['tarball_href'] = request.get_url(view_func=download_tarball,
- params={})
-
- if request.roottype == 'svn':
- view_directory_svn(request, data, sortby, sortdir)
- else:
- view_directory_cvs(request, data, sortby, sortdir)
-
- if cfg.options.use_pagesize:
- data['dir_pagestart'] = int(query_dict.get('dir_pagestart',0))
- data['rows'] = paging(data, 'rows', data['dir_pagestart'], 'name')
-
- request.server.header()
- generate_page(request, cfg.templates.directory, data)
-
-def view_directory_cvs(request, data, sortby, sortdir):
- where = request.where
- query_dict = request.query_dict
-
- view_tag = query_dict.get('only_with_tag')
- hideattic = int(query_dict.get('hideattic', cfg.options.hide_attic))
-
- search_re = query_dict.get('search', '')
-
- # Search current directory
- file_data = request.repos.listdir(request.path_parts,
- not hideattic or view_tag)
-
- if cfg.options.use_re_search and search_re:
- file_data = search_files(request.repos, request.path_parts,
- file_data, search_re)
-
- get_dirs = cfg.options.show_subdir_lastmod and cfg.options.show_logs
-
- bincvs.get_logs(request.repos, request.path_parts,
- file_data, view_tag, get_dirs)
-
- has_tags = view_tag or request.repos.branch_tags or request.repos.plain_tags
-
- # prepare the data that will be passed to the template
- data.update({
- 'view_tag' : view_tag,
- 'attic_showing' : ezt.boolean(not hideattic),
- 'show_attic_href' : request.get_url(params={'hideattic': 0}),
- 'hide_attic_href' : request.get_url(params={'hideattic': 1}),
- 'has_tags' : ezt.boolean(has_tags),
- ### one day, if EZT has "or" capability, we can lose this
- 'selection_form' : ezt.boolean(has_tags or cfg.options.use_re_search),
- 'branch_tags': request.repos.branch_tags,
- 'plain_tags': request.repos.plain_tags,
- })
-
- if search_re:
- data['search_re'] = htmlify(search_re)
-
- # sort with directories first, and using the "sortby" criteria
- sort_file_data(file_data, sortdir, sortby)
-
- num_files = 0
- num_displayed = 0
- unreadable = 0
- have_logs = 0
- rows = data['rows'] = [ ]
-
- where_prefix = where and where + '/'
-
- ### display a row for ".." ?
- for file in file_data:
- row = _item(href=None, graph_href=None,
- author=None, log=None, log_file=None, log_rev=None,
- show_log=None, state=None)
-
- if file.rev == bincvs._FILE_HAD_ERROR:
- row.cvs = 'error'
- unreadable = 1
- elif file.rev is None:
- row.cvs = 'none'
- else:
- row.cvs = 'data'
- row.rev = file.rev
- row.author = file.author
- row.state = file.state
- row.time = html_time(request, file.date)
- if cfg.options.show_logs and file.log:
- row.show_log = 'yes'
- row.log = format_log(file.log)
- have_logs = 1
-
- row.anchor = file.name
- row.name = file.name
-
- row.type = (file.kind == vclib.FILE and 'file') or \
- (file.kind == vclib.DIR and 'dir')
-
- if file.verboten or not row.type:
- row.type = 'unreadable'
- unreadable = 1
-
- if file.kind == vclib.DIR:
- if not hideattic and file.name == 'Attic':
- continue
- if where == '' and ((file.name == 'CVSROOT' and cfg.options.hide_cvsroot)
- or cfg.is_forbidden(file.name)):
- continue
- if file.name == 'CVS': # CVS directory in repository is for fileattr.
- continue
-
- row.href = request.get_url(view_func=view_directory,
- where=where_prefix+file.name,
- pathtype=vclib.DIR,
- params={})
-
- if row.cvs == 'data':
- if cfg.options.use_cvsgraph:
- row.graph_href = '&nbsp;'
- if cfg.options.show_logs:
- row.log_file = file.newest_file
- row.log_rev = file.rev
-
- elif file.kind == vclib.FILE:
- num_files = num_files + 1
-
- if file.rev is None and not file.verboten:
- continue
- elif hideattic and view_tag and file.state == 'dead':
- continue
- num_displayed = num_displayed + 1
-
- file_where = where_prefix + (file.in_attic and 'Attic/' or '') + file.name
-
- row.href = request.get_url(view_func=view_log,
- where=file_where,
- pathtype=vclib.FILE,
- params={})
-
- row.rev_href = request.get_url(view_func=view_auto,
- where=file_where,
- pathtype=vclib.FILE,
- params={'rev': str(file.rev)})
-
- if cfg.options.use_cvsgraph:
- row.graph_href = request.get_url(view_func=view_cvsgraph,
- where=file_where,
- pathtype=vclib.FILE,
- params={})
-
- rows.append(row)
-
- data.update({
- 'num_files' : num_files,
- 'files_shown' : num_displayed,
- 'no_match' : num_files and not num_displayed and 'yes' or '',
- 'unreadable' : unreadable and 'yes' or '',
-
- # have_logs will be 0 if we only have dirs and !show_subdir_lastmod.
- # in that case, we don't need the extra columns
- 'have_logs' : have_logs and 'yes' or '',
- })
-
- if data['selection_form']:
- url, params = request.get_link(params={'only_with_tag': None,
- 'search': None})
- data['search_tag_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['search_tag_hidden_values'] = prepare_hidden_values(params)
-
-
-def view_directory_svn(request, data, sortby, sortdir):
- query_dict = request.query_dict
- where = request.where
-
- file_data = request.repos.listdir(request.path_parts)
- vclib.svn.get_logs(request.repos, where, file_data)
-
- data.update({
- 'view_tag' : None,
- 'tree_rev' : str(request.repos.rev),
- 'has_tags' : ezt.boolean(0),
- 'selection_form' : ezt.boolean(0)
- })
-
- if request.query_dict.has_key('rev'):
- data['jump_rev'] = request.query_dict['rev']
- else:
- data['jump_rev'] = str(request.repos.rev)
-
- url, params = request.get_link(params={'rev': None})
- data['jump_rev_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['jump_rev_hidden_values'] = prepare_hidden_values(params)
-
- # sort with directories first, and using the "sortby" criteria
- sort_file_data(file_data, sortdir, sortby)
-
- num_files = 0
- num_displayed = 0
- unreadable = 0
- rows = data['rows'] = [ ]
-
- where_prefix = where and where + '/'
- dir_params = {'rev': query_dict.get('rev')}
-
- for file in file_data:
- row = _item(href=None, graph_href=None,
- author=None, log=None, log_file=None, log_rev=None,
- show_log=None, state=None)
-
- row.rev = file.rev
- row.author = file.author or "&nbsp;"
- row.state = ''
- row.time = html_time(request, file.date)
- row.anchor = file.name
-
- if file.kind == vclib.DIR:
- row.type = 'dir'
- row.name = file.name
- row.cvs = 'none' # What the heck is this?
- row.href = request.get_url(view_func=view_directory,
- where=where_prefix + file.name,
- pathtype=vclib.DIR,
- params=dir_params)
- else:
- row.type = 'file'
- row.name = file.name
- row.cvs = 'data' # What the heck is this?
-
- row.href = request.get_url(view_func=view_log,
- where=where_prefix + file.name,
- pathtype=vclib.FILE,
- params={})
-
- row.rev_href = request.get_url(view_func=view_auto,
- where=where_prefix + file.name,
- pathtype=vclib.FILE,
- params={'rev': str(row.rev)})
-
- num_files = num_files + 1
- num_displayed = num_displayed + 1
- if cfg.options.show_logs:
- row.show_log = 'yes'
- row.log = format_log(file.log or "")
-
- rows.append(row)
-
- ### we need to fix the template w.r.t num_files. it usually is not a
- ### correct (original) count of the files available for selecting
- data['num_files'] = num_files
-
- # the number actually displayed
- data['files_shown'] = num_displayed
-
-def paging(data, key, pagestart, local_name):
- # Implement paging
- # Create the picklist
- picklist = data['picklist'] = []
- for i in range(0, len(data[key]), cfg.options.use_pagesize):
- pick = _item(start=None, end=None, count=None)
- pick.start = getattr(data[key][i], local_name)
- pick.count = i
- pick.page = (i / cfg.options.use_pagesize) + 1
- try:
- pick.end = getattr(data[key][i+cfg.options.use_pagesize-1], local_name)
- except IndexError:
- pick.end = getattr(data[key][-1], local_name)
- picklist.append(pick)
- data['picklist_len'] = len(picklist)
- # Need to fix
- # pagestart can be greater than the length of data[key] if you
- # select a tag or search while on a page other than the first.
- # Should reset to the first page, this test won't do that every
- # time that it is needed.
- # Problem might go away if we don't hide non-matching files when
- # selecting for tags or searching.
- if pagestart > len(data[key]):
- pagestart = 0
- pageend = pagestart + cfg.options.use_pagesize
- # Slice
- return data[key][pagestart:pageend]
-
-def logsort_date_cmp(rev1, rev2):
- # sort on date; secondary on revision number
- return -cmp(rev1.date, rev2.date) or -revcmp(rev1.rev, rev2.rev)
-
-def logsort_rev_cmp(rev1, rev2):
- # sort highest revision first
- return -revcmp(rev1.rev, rev2.rev)
-
-def find_first_rev(taginfo, revs):
- "Find first revision that matches a normal tag or is on a branch tag"
- for rev in revs:
- if taginfo.matches_rev(rev) or taginfo.holds_rev(rev):
- return rev
- return None
-
-def read_log(full_name, which_rev=None, view_tag=None, logsort='cvs'):
- head, cur_branch, taginfo, revs = bincvs.fetch_log(cfg.general,
- full_name, which_rev)
-
- rev_order = map(lambda entry: entry.rev, revs)
- rev_order.sort(revcmp)
- rev_order.reverse()
-
- # HEAD is an artificial tag which is simply the highest tag number on the
- # main branch, unless there is a branch tag in the RCS file in which case
- # it's the highest revision on that branch. Find it by looking through
- # rev_order; it is the first commit listed on the appropriate branch.
- # This is not neccesary the same revision as marked as head in the RCS file.
- ### Why are we defining our own HEAD instead of just using the revision
- ### marked as head? What's wrong with: taginfo['HEAD'] = bincvs.TagInfo(head)
- taginfo['MAIN'] = bincvs.TagInfo(cur_branch)
- taginfo['HEAD'] = find_first_rev(taginfo['MAIN'], rev_order)
-
- # map revision numbers to tag names
- rev2tag = { }
-
- # names of symbols at each branch point
- branch_points = { }
-
- branch_names = [ ]
-
- # Now that we know all of the revision numbers, we can associate
- # absolute revision numbers with all of the symbolic names, and
- # pass them to the form so that the same association doesn't have
- # to be built then.
-
- items = taginfo.items()
- items.sort()
- items.reverse()
- for name, tag in items:
- if not isinstance(tag, bincvs.TagInfo):
- taginfo[name] = tag = bincvs.TagInfo(tag)
-
- number = tag.number()
-
- if tag.is_branch():
- branch_names.append(name)
-
- if number == cur_branch:
- default_branch = name
-
- if not tag.is_trunk():
- rev = tag.branches_at()
- if branch_points.has_key(rev):
- branch_points[rev].append(name)
- else:
- branch_points[rev] = [ name ]
-
- # revision number you'd get if you checked out this branch
- tag.co_rev = find_first_rev(tag, rev_order)
- else:
- tag.co_rev = number
-
- if rev2tag.has_key(number):
- rev2tag[number].append(name)
- else:
- rev2tag[number] = [ name ]
-
- if view_tag:
- tag = taginfo.get(view_tag)
- if not tag:
- raise debug.ViewcvsException('Tag %s not defined.' % view_tag,
- '404 Tag Not Found')
-
- show_revs = [ ]
- for entry in revs:
- rev = entry.rev
- if tag.matches_rev(rev) or tag.branches_at()==rev or tag.holds_rev(rev):
- show_revs.append(entry)
- else:
- show_revs = revs
-
- if logsort == 'date':
- show_revs.sort(logsort_date_cmp)
- elif logsort == 'rev':
- show_revs.sort(logsort_rev_cmp)
- else:
- # no sorting
- pass
-
- # build a map of revision number to entry information
- rev_map = { }
- for entry in revs:
- rev_map[entry.rev] = entry
-
- ### some of this return stuff doesn't make a lot of sense...
- return show_revs, rev_map, rev_order, taginfo, rev2tag, \
- default_branch, branch_points, branch_names
-
-_re_is_vendor_branch = re.compile(r'^1\.1\.1\.\d+$')
-
-def augment_entry(entry, request, rev_map, rev2tag, branch_points,
- rev_order, extended, name_printed):
- "Augment the entry with additional, computed data from the log output."
-
- query_dict = request.query_dict
-
- rev = entry.rev
- idx = string.rfind(rev, '.')
- branch = rev[:idx]
-
- entry.vendor_branch = ezt.boolean(_re_is_vendor_branch.match(rev))
-
- entry.date_str = make_time_string(entry.date)
-
- entry.ago = html_time(request, entry.date, 1)
-
- entry.branches = prep_tags(request, rev2tag.get(branch, [ ]))
- entry.tags = prep_tags(request, rev2tag.get(rev, [ ]))
- entry.branch_points = prep_tags(request, branch_points.get(rev, [ ]))
-
- prev_rev = string.split(rev, '.')
- while 1:
- if prev_rev[-1] == '0': # .0 can be caused by 'commit -r X.Y.Z.0'
- prev_rev = prev_rev[:-2] # X.Y.Z.0 becomes X.Y.Z
- else:
- prev_rev[-1] = str(int(prev_rev[-1]) - 1)
- prev = string.join(prev_rev, '.')
- if rev_map.has_key(prev) or prev == '':
- break
- entry.prev = prev
-
- ### maybe just overwrite entry.log?
- entry.html_log = htmlify(entry.log)
-
- if extended:
- entry.tag_names = rev2tag.get(rev, [ ])
- if rev2tag.has_key(branch) and not name_printed.has_key(branch):
- entry.branch_names = rev2tag.get(branch)
- name_printed[branch] = 1
- else:
- entry.branch_names = [ ]
-
- entry.href = request.get_url(view_func=view_checkout, params={'rev': rev})
- entry.view_href = request.get_url(view_func=view_markup,
- params={'rev': rev})
- entry.text_href = request.get_url(view_func=view_checkout,
- params={'content-type': 'text/plain',
- 'rev': rev})
-
- entry.annotate_href = request.get_url(view_func=view_annotate,
- params={'annotate': rev})
-
- # figure out some target revisions for performing diffs
- entry.branch_point = None
- entry.next_main = None
-
- idx = string.rfind(branch, '.')
- if idx != -1:
- branch_point = branch[:idx]
-
- if not entry.vendor_branch \
- and branch_point != rev and branch_point != prev:
- entry.branch_point = branch_point
-
- # if it's on a branch (and not a vendor branch), then diff against the
- # next revision of the higher branch (e.g. change is committed and
- # brought over to -stable)
- if string.count(rev, '.') > 1 and not entry.vendor_branch:
- # locate this rev in the ordered list of revisions
- i = rev_order.index(rev)
-
- # create a rev that can be compared component-wise
- c_rev = string.split(rev, '.')
-
- while i:
- next = rev_order[i - 1]
- c_work = string.split(next, '.')
- if len(c_work) < len(c_rev):
- # found something not on the branch
- entry.next_main = next
- break
-
- # this is a higher version on the same branch; the lower one (rev)
- # shouldn't have a diff against the "next main branch"
- if c_work[:-1] == c_rev[:len(c_work) - 1]:
- break
-
- i = i - 1
-
- # the template could do all these comparisons itself, but let's help
- # it out.
- r1 = query_dict.get('r1')
- if r1 and r1 != rev and r1 != prev and r1 != entry.branch_point \
- and r1 != entry.next_main:
- entry.to_selected = 'yes'
- else:
- entry.to_selected = None
-
-def view_log(request):
- diff_format = request.query_dict.get('diff_format', cfg.options.diff_format)
- logsort = request.query_dict.get('logsort', cfg.options.log_sort)
-
- data = common_template_data(request)
- data.update({
- 'roottype' : request.roottype,
- 'current_root' : request.repos.name,
- 'where' : request.where,
- 'nav_path' : clickable_path(request, 1, 0),
- 'branch' : None,
- 'mime_type' : request.mime_type,
- 'rev_selected' : request.query_dict.get('r1'),
- 'path_selected' : request.query_dict.get('p1'),
- 'diff_format' : diff_format,
- 'logsort' : logsort,
- 'viewable' : ezt.boolean(request.default_viewable),
- 'is_text' : ezt.boolean(is_text(request.mime_type)),
- 'human_readable' : ezt.boolean(diff_format in ('h', 'l')),
- 'log_pagestart' : None,
- 'graph_href' : None,
- })
-
- url, params = request.get_link(view_func=view_diff,
- params={'r1': None, 'r2': None,
- 'diff_format': None})
- params = compat.urlencode(params)
- data['diff_url'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['diff_params'] = params and '&' + params
-
- if cfg.options.use_pagesize:
- url, params = request.get_link(params={'log_pagestart': None})
- data['log_paging_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['log_paging_hidden_values'] = prepare_hidden_values(params)
-
- url, params = request.get_link(params={'r1': None, 'r2': None, 'tr1': None,
- 'tr2': None, 'diff_format': None})
- data['diff_select_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['diff_select_hidden_values'] = prepare_hidden_values(params)
-
- url, params = request.get_link(params={'logsort': None})
- data['logsort_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['logsort_hidden_values'] = prepare_hidden_values(params)
-
- if request.roottype == 'svn':
- view_log_svn(request, data, logsort)
- else:
- view_log_cvs(request, data, logsort)
-
-def view_log_svn(request, data, logsort):
- query_dict = request.query_dict
-
- alltags, logs = vclib.svn.fetch_log(request.repos, request.where)
- up_where, filename = os.path.split(request.where)
-
- entries = []
- prev_rev = None
- prev_path = None
- show_revs = logs.keys()
- show_revs.sort()
- for rev in show_revs:
- entry = logs[rev]
- entry.prev = prev_rev
- entry.prev_path = prev_path
- entry.href = request.get_url(view_func=view_checkout, where=entry.filename,
- pathtype=vclib.FILE, params={'rev': rev})
- entry.view_href = request.get_url(view_func=view_markup,
- where=entry.filename,
- pathtype=vclib.FILE,
- params={'rev': rev})
- entry.text_href = request.get_url(view_func=view_checkout,
- where=entry.filename,
- pathtype=vclib.FILE,
- params={'content-type': 'text/plain',
- 'rev': rev})
- entry.revision_href = request.get_url(view_func=view_revision,
- where=None,
- pathtype=None,
- params={'rev': rev})
-
- if entry.copy_path:
- entry.copy_href = request.get_url(view_func=view_log,
- where=entry.copy_path,
- pathtype=vclib.FILE, params={})
-
- entry.tags = [ ]
- entry.branches = [ ]
- entry.branch_point = None
- entry.branch_points = [ ]
- entry.next_main = None
- entry.to_selected = None
- entry.vendor_branch = None
- entry.ago = html_time(request, entry.date, 1)
- entry.date_str = make_time_string(entry.date)
- entry.tag_names = [ ]
- entry.branch_names = [ ]
- if not entry.log:
- entry.log = ""
- entry.html_log = htmlify(entry.log)
-
- # the template could do all these comparisons itself, but let's help
- # it out.
- r1 = query_dict.get('r1')
- if r1 and r1 != str(rev) and r1 != str(prev_rev):
- entry.to_selected = 'yes'
- else:
- entry.to_selected = None
-
- entries.append(entry)
- prev_rev = rev
- prev_path = entry.filename
- show_revs.reverse()
- entries.reverse()
-
- data.update({
- 'back_url' : request.get_url(view_func=view_directory, pathtype=vclib.DIR,
- where=up_where, params={}),
- 'filename' : filename,
- 'view_tag' : None,
- 'entries' : entries,
- 'tags' : [ ],
- 'branch_names' : [ ],
- })
-
- if len(show_revs):
- data['tr1'] = show_revs[-1]
- data['tr2'] = show_revs[0]
- else:
- data['tr1'] = None
- data['tr2'] = None
-
- if cfg.options.use_pagesize:
- data['log_pagestart'] = int(query_dict.get('log_pagestart',0))
- data['entries'] = paging(data, 'entries', data['log_pagestart'], 'rev')
-
- request.server.header()
- generate_page(request, cfg.templates.log, data)
-
-def view_log_cvs(request, data, logsort):
- full_name = request.full_name
- where = request.where
- query_dict = request.query_dict
-
- view_tag = query_dict.get('only_with_tag')
-
- show_revs, rev_map, rev_order, taginfo, rev2tag, \
- cur_branch, branch_points, branch_names = \
- read_log(full_name, None, view_tag, logsort)
-
- up_where = get_up_path(request, where, int(query_dict.get('hideattic',
- cfg.options.hide_attic)))
-
- filename = os.path.basename(where)
-
- data.update({
- 'back_url' : request.get_url(view_func=view_directory, pathtype=vclib.DIR,
- where=up_where, params={}),
- 'filename' : filename,
- 'view_tag' : view_tag,
- 'entries' : show_revs, ### rename the show_rev local to entries?
-
- })
-
- if cfg.options.use_cvsgraph:
- data['graph_href'] = request.get_url(view_func=view_cvsgraph, params={})
-
- if cur_branch:
- data['branch'] = cur_branch
-
- ### I don't like this URL construction stuff. the value
- ### for head_abs_href vs head_href is a bit bogus: why decide to
- ### include/exclude the mime type from the URL? should just always be
- ### the same, right?
- if request.default_viewable:
- data['head_href'] = request.get_url(view_func=view_markup, params={})
- data['head_abs_href'] = request.get_url(view_func=view_checkout,
- params={})
- else:
- data['head_href'] = request.get_url(view_func=view_checkout, params={})
-
- name_printed = { }
- for entry in show_revs:
- # augment the entry with (extended=1) info.
- augment_entry(entry, request, rev_map, rev2tag, branch_points,
- rev_order, 1, name_printed)
-
- tagitems = taginfo.items()
- tagitems.sort()
- tagitems.reverse()
-
- data['tags'] = tags = [ ]
- for tag, rev in tagitems:
- if rev.co_rev:
- tags.append(_item(rev=rev.co_rev, name=tag))
-
- if query_dict.has_key('r1'):
- diff_rev = query_dict['r1']
- else:
- diff_rev = show_revs[-1].rev
- data['tr1'] = diff_rev
-
- if query_dict.has_key('r2'):
- diff_rev = query_dict['r2']
- else:
- diff_rev = show_revs[0].rev
- data['tr2'] = diff_rev
-
- branch_names.sort()
- branch_names.reverse()
- data['branch_names'] = branch_names
-
- if branch_names:
- url, params = request.get_link(params={'only_with_tag': None})
- data['branch_select_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['branch_select_hidden_values'] = prepare_hidden_values(params)
-
- if cfg.options.use_pagesize:
- data['log_pagestart'] = int(query_dict.get('log_pagestart',0))
- data['entries'] = paging(data, 'entries', data['log_pagestart'], 'rev')
-
- request.server.header()
- generate_page(request, cfg.templates.log, data)
-
-def view_checkout(request):
- rev = request.query_dict.get('rev')
- fp = request.repos.openfile(request.path_parts, rev)[0]
- mime_type = request.query_dict.get('content-type', request.mime_type)
- request.server.header(mime_type)
- copy_stream(fp)
-
-def view_annotate(request):
- if not cfg.options.allow_annotate:
- raise "annotate no allows"
-
- rev = request.query_dict.get('annotate')
- data = nav_header_data(request, rev)
-
- request.server.header()
- generate_page(request, cfg.templates.annotate, data)
-
- ### be nice to hook this into the template...
- import blame
- blame.make_html(request.repos.rootpath, request.where + ',v', rev,
- compat.urlencode(request.get_options()))
-
- html_footer(request)
-
-
-def view_cvsgraph_image(request):
- "output the image rendered by cvsgraph"
- # this function is derived from cgi/cvsgraphmkimg.cgi
-
- if not cfg.options.use_cvsgraph:
- raise "cvsgraph no allows"
-
- request.server.header('image/png')
- fp = popen.popen(os.path.normpath(os.path.join(cfg.options.cvsgraph_path,'cvsgraph')),
- ("-c", cfg.options.cvsgraph_conf,
- "-r", request.repos.rootpath,
- request.where + ',v'), 'rb', 0)
- copy_stream(fp)
- fp.close()
-
-def view_cvsgraph(request):
- "output a page containing an image rendered by cvsgraph"
- # this function is derived from cgi/cvsgraphwrapper.cgi
-
- if not cfg.options.use_cvsgraph:
- raise "cvsgraph no allows"
-
- where = request.where
-
- pathname, filename = os.path.split(where)
- if pathname[-6:] == '/Attic':
- pathname = pathname[:-6]
-
- data = nav_header_data(request, None)
-
- # Required only if cvsgraph needs to find it's supporting libraries.
- # Uncomment and set accordingly if required.
- #os.environ['LD_LIBRARY_PATH'] = '/usr/lib:/usr/local/lib'
-
- query = compat.urlencode(request.get_options({}))
- amp_query = query and '&' + query
- qmark_query = query and '?' + query
-
- imagesrc = request.get_url(view_func=view_cvsgraph_image)
-
- # Create an image map
- fp = popen.popen(os.path.join(cfg.options.cvsgraph_path, 'cvsgraph'),
- ("-i",
- "-c", cfg.options.cvsgraph_conf,
- "-r", request.repos.rootpath,
- "-6", amp_query,
- "-7", qmark_query,
- request.where + ',v'), 'rb', 0)
-
- data.update({
- 'imagemap' : fp,
- 'imagesrc' : imagesrc,
- })
-
- request.server.header()
- generate_page(request, cfg.templates.graph, data)
-
-def search_files(repos, path_parts, files, search_re):
- """ Search files in a directory for a regular expression.
-
- Does a check-out of each file in the directory. Only checks for
- the first match.
- """
-
- # Pass in search regular expression. We check out
- # each file and look for the regular expression. We then return the data
- # for all files that match the regex.
-
- # Compile to make sure we do this as fast as possible.
- searchstr = re.compile(search_re)
-
- # Will become list of files that have at least one match.
- # new_file_list also includes directories.
- new_file_list = [ ]
-
- # Loop on every file (and directory)
- for file in files:
- # Is this a directory? If so, append name to new_file_list
- # and move to next file.
- if file.kind != vclib.FILE:
- new_file_list.append(file)
- continue
-
- # Only files at this point
-
- # figure out where we are and its mime type
- mime_type, encoding = mimetypes.guess_type(file.name)
- if not mime_type:
- mime_type = 'text/plain'
-
- # Shouldn't search binary files, or should we?
- # Should allow all text mime types to pass.
- if mime_type[:4] != 'text':
- continue
-
- # Only text files at this point
-
- # process_checkout will checkout the head version out of the repository
- # Assign contents of checked out file to fp.
- fp = repos.openfile(path_parts + [file.name])[0]
-
- # Read in each line, use re.search to search line.
- # If successful, add file to new_file_list and break.
- while 1:
- line = fp.readline()
- if not line:
- break
- if searchstr.search(line):
- new_file_list.append(file)
- # close down the pipe (and wait for the child to terminate)
- fp.close()
- break
-
- return new_file_list
-
-
-def view_doc(request):
- """Serve ViewCVS help pages locally.
-
- Using this avoids the need for modifying the setup of the web server.
- """
- help_page = request.where
- if CONF_PATHNAME:
- doc_directory = os.path.join(g_install_dir, "doc")
- else:
- # aid testing from CVS working copy:
- doc_directory = os.path.join(g_install_dir, "website")
- try:
- fp = open(os.path.join(doc_directory, help_page), "rb")
- except IOError, v:
- raise debug.ViewcvsException('help file "%s" not available\n(%s)'
- % (help_page, str(v)), '404 Not Found')
- if help_page[-3:] == 'png':
- request.server.header('image/png')
- elif help_page[-3:] == 'jpg':
- request.server.header('image/jpeg')
- elif help_page[-3:] == 'gif':
- request.server.header('image/gif')
- else: # assume HTML:
- request.server.header()
- copy_stream(fp)
- fp.close()
-
-def rcsdiff_date_reformat(date_str):
- try:
- date = compat.cvs_strptime(date_str)
- except ValueError:
- return date_str
- return make_time_string(compat.timegm(date))
-
-_re_extract_rev = re.compile(r'^[-+]+ [^\t]+\t([^\t]+)\t((\d+\.)*\d+)$')
-_re_extract_info = re.compile(r'@@ \-([0-9]+).*\+([0-9]+).*@@(.*)')
-def human_readable_diff(request, fp, rev1, rev2, sym1, sym2):
- # do this now, in case we need to print an error
- request.server.header()
-
- query_dict = request.query_dict
-
- where = request.where
-
- data = nav_header_data(request, rev2)
-
- log_rev1 = log_rev2 = None
- date1 = date2 = ''
- rcsdiff_eflag = 0
- while 1:
- line = fp.readline()
- if not line:
- break
-
- # Use regex matching to extract the data and to ensure that we are
- # extracting it from a properly formatted line. There are rcsdiff
- # programs out there that don't supply the correct format; we'll be
- # flexible in case we run into one of those.
- if line[:4] == '--- ':
- match = _re_extract_rev.match(line)
- if match:
- date1 = match.group(1)
- log_rev1 = match.group(2)
- elif line[:4] == '+++ ':
- match = _re_extract_rev.match(line)
- if match:
- date2 = match.group(1)
- log_rev2 = match.group(2)
- break
-
- # Didn't want to put this here, but had to. The DiffSource class
- # picks up fp after this loop has processed the header. Previously
- # error messages and the 'Binary rev ? and ? differ' where thrown out
- # and DiffSource then showed no differences.
- # Need to process the entire header before DiffSource is used.
- if line[:3] == 'Bin':
- rcsdiff_eflag = _RCSDIFF_IS_BINARY
- break
-
- if (string.find(line, 'not found') != -1 or
- string.find(line, 'illegal option') != -1):
- rcsdiff_eflag = _RCSDIFF_ERROR
- break
-
- if (log_rev1 and log_rev1 != rev1) or (log_rev2 and log_rev2 != rev2):
- ### it would be nice to have an error.ezt for things like this
- print '<strong>ERROR:</strong> rcsdiff did not return the correct'
- print 'version number in its output.'
- print '(got "%s" / "%s", expected "%s" / "%s")' % \
- (log_rev1, log_rev2, rev1, rev2)
- print '<p>Aborting operation.'
- sys.exit(0)
-
- # Process any special lines in the header, or continue to
- # get the differences from DiffSource.
- if rcsdiff_eflag == _RCSDIFF_IS_BINARY:
- rcs_diff = [ (_item(type='binary-diff')) ]
- elif rcsdiff_eflag == _RCSDIFF_ERROR:
- rcs_diff = [ (_item(type='error')) ]
- else:
- rcs_diff = DiffSource(fp)
-
- data.update({
- 'where' : where,
- 'rev1' : rev1,
- 'rev2' : rev2,
- 'tag1' : sym1,
- 'tag2' : sym2,
- 'date1' : ', ' + rcsdiff_date_reformat(date1),
- 'date2' : ', ' + rcsdiff_date_reformat(date2),
- 'changes' : rcs_diff,
- 'diff_format' : query_dict.get('diff_format', cfg.options.diff_format),
- })
-
- params = request.query_dict.copy()
- params['diff_format'] = None
-
- url, params = request.get_link(params=params)
- data['diff_format_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['diff_format_hidden_values'] = prepare_hidden_values(params)
-
- generate_page(request, cfg.templates.diff, data)
-
-def spaced_html_text(text):
- text = string.expandtabs(string.rstrip(text))
-
- # in the code below, "\x01" will be our stand-in for "&". We don't want
- # to insert "&" because it would get escaped by htmlify(). Similarly,
- # we use "\x02" as a stand-in for "<br>"
-
- if cfg.options.hr_breakable > 1 and len(text) > cfg.options.hr_breakable:
- text = re.sub('(' + ('.' * cfg.options.hr_breakable) + ')',
- '\\1\x02',
- text)
- if cfg.options.hr_breakable:
- # make every other space "breakable"
- text = string.replace(text, ' ', ' \x01nbsp;')
- else:
- text = string.replace(text, ' ', '\x01nbsp;')
- text = htmlify(text)
- text = string.replace(text, '\x01', '&')
- text = string.replace(text, '\x02', '<font color=red>\</font><br>')
- return text
-
-class DiffSource:
- def __init__(self, fp):
- self.fp = fp
- self.save_line = None
-
- # keep track of where we are during an iteration
- self.idx = -1
- self.last = None
-
- # these will be set once we start reading
- self.left = None
- self.right = None
- self.state = 'no-changes'
- self.left_col = [ ]
- self.right_col = [ ]
-
- def __getitem__(self, idx):
- if idx == self.idx:
- return self.last
- if idx != self.idx + 1:
- raise DiffSequencingError()
-
- # keep calling _get_row until it gives us something. sometimes, it
- # doesn't return a row immediately because it is accumulating changes
- # when it is out of data, _get_row will raise IndexError
- while 1:
- item = self._get_row()
- if item:
- self.idx = idx
- self.last = item
- return item
-
- def _get_row(self):
- if self.state[:5] == 'flush':
- item = self._flush_row()
- if item:
- return item
- self.state = 'dump'
-
- if self.save_line:
- line = self.save_line
- self.save_line = None
- else:
- line = self.fp.readline()
-
- if not line:
- if self.state == 'no-changes':
- self.state = 'done'
- return _item(type='no-changes')
-
- # see if there are lines to flush
- if self.left_col or self.right_col:
- # move into the flushing state
- self.state = 'flush-' + self.state
- return None
-
- # nothing more to return
- raise IndexError
-
- if line[:2] == '@@':
- self.state = 'dump'
- self.left_col = [ ]
- self.right_col = [ ]
-
- match = _re_extract_info.match(line)
- return _item(type='header', line1=match.group(1), line2=match.group(2),
- extra=match.group(3))
-
- if line[0] == '\\':
- # \ No newline at end of file
-
- # move into the flushing state. note: it doesn't matter if we really
- # have data to flush or not; that will be figured out later
- self.state = 'flush-' + self.state
- return None
-
- diff_code = line[0]
- output = spaced_html_text(line[1:])
-
- if diff_code == '+':
- if self.state == 'dump':
- return _item(type='add', right=output)
-
- self.state = 'pre-change-add'
- self.right_col.append(output)
- return None
-
- if diff_code == '-':
- self.state = 'pre-change-remove'
- self.left_col.append(output)
- return None
-
- if self.left_col or self.right_col:
- # save the line for processing again later
- self.save_line = line
-
- # move into the flushing state
- self.state = 'flush-' + self.state
- return None
-
- return _item(type='context', left=output, right=output)
-
- def _flush_row(self):
- if not self.left_col and not self.right_col:
- # nothing more to flush
- return None
-
- if self.state == 'flush-pre-change-remove':
- return _item(type='remove', left=self.left_col.pop(0))
-
- # state == flush-pre-change-add
- item = _item(type='change', have_left=None, have_right=None)
- if self.left_col:
- item.have_left = 'yes'
- item.left = self.left_col.pop(0)
- if self.right_col:
- item.have_right = 'yes'
- item.right = self.right_col.pop(0)
- return item
-
-class DiffSequencingError(Exception):
- pass
-
-def view_diff(request):
- query_dict = request.query_dict
-
- rev1 = r1 = query_dict['r1']
- rev2 = r2 = query_dict['r2']
- p1 = query_dict.get('p1', request.where)
- p2 = query_dict.get('p2', request.where)
- sym1 = sym2 = None
-
- if r1 == 'text':
- rev1 = query_dict.get('tr1', None)
- if not rev1:
- raise debug.ViewcvsException('Missing revision from the diff '
- 'form text field', '400 Bad Request')
- else:
- idx = string.find(r1, ':')
- if idx == -1:
- rev1 = r1
- else:
- rev1 = r1[:idx]
- sym1 = r1[idx+1:]
-
- if r2 == 'text':
- rev2 = query_dict.get('tr2', None)
- if not rev2:
- raise debug.ViewcvsException('Missing revision from the diff '
- 'form text field', '400 Bad Request')
- sym2 = ''
- else:
- idx = string.find(r2, ':')
- if idx == -1:
- rev2 = r2
- else:
- rev2 = r2[:idx]
- sym2 = r2[idx+1:]
-
- try:
- if revcmp(rev1, rev2) > 0:
- rev1, rev2 = rev2, rev1
- sym1, sym2 = sym2, sym1
- p1, p2 = p2, p1
- except ValueError:
- raise debug.ViewcvsException('Invalid revision(s) passed to diff',
- '400 Bad Request')
-
- human_readable = 0
- unified = 0
- args = [ ]
-
- ### Note: these options only really work out where rcsdiff (used by
- ### CVS) and regular diff (used by SVN) overlap. If for some reason
- ### our use of the options for these starts to deviate too much,
- ### this code may a re-org to just do different things for different
- ### VC types.
-
- format = query_dict.get('diff_format', cfg.options.diff_format)
- if format == 'c':
- args.append('-c')
- elif format == 's':
- args.append('--side-by-side')
- args.append('--width=164')
- elif format == 'l':
- args.append('--unified=15')
- human_readable = 1
- unified = 1
- elif format == 'h':
- args.append('-u')
- human_readable = 1
- unified = 1
- elif format == 'u':
- args.append('-u')
- unified = 1
- else:
- raise debug.ViewcvsException('Diff format %s not understood'
- % format, '400 Bad Request')
-
- if human_readable:
- if cfg.options.hr_funout:
- args.append('-p')
- if cfg.options.hr_ignore_white:
- args.append('-w')
- if cfg.options.hr_ignore_keyword_subst and request.roottype == 'cvs':
- # -kk isn't a regular diff option. it exists only for rcsdiff
- # (as in "-ksubst") ,so 'svn' roottypes can't use it.
- args.append('-kk')
-
- file1 = None
- file2 = None
- if request.roottype == 'cvs':
- args[len(args):] = ['-r' + rev1, '-r' + rev2, request.full_name]
- fp = bincvs.rcs_popen(cfg.general, 'rcsdiff', args, 'rt')
- else:
- try:
- date1 = vclib.svn.date_from_rev(request.repos, int(rev1))
- date2 = vclib.svn.date_from_rev(request.repos, int(rev2))
- except vclib.InvalidRevision:
- raise debug.ViewcvsException('Invalid revision(s) passed to diff',
- '400 Bad Request')
-
- date1 = time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date1))
- date2 = time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date2))
- args.append("-L")
- args.append(p1 + "\t" + date1 + "\t" + rev1)
- args.append("-L")
- args.append(p2 + "\t" + date2 + "\t" + rev2)
-
- # Need to keep a reference to the FileDiff object around long
- # enough to use. It destroys its underlying temporary files when
- # the class is destroyed.
- diffobj = vclib.svn.do_diff(request.repos, p1, int(rev1),
- p2, int(rev2), args)
-
- fp = diffobj.get_pipe()
-
- if human_readable:
- human_readable_diff(request, fp, rev1, rev2, sym1, sym2)
- return
-
- request.server.header('text/plain')
-
- rootpath = request.repos.rootpath
- if unified:
- f1 = '--- ' + rootpath
- f2 = '+++ ' + rootpath
- else:
- f1 = '*** ' + rootpath
- f2 = '--- ' + rootpath
-
- while 1:
- line = fp.readline()
- if not line:
- break
-
- if line[:len(f1)] == f1:
- line = string.replace(line, rootpath + '/', '')
- if sym1:
- line = line[:-1] + ' %s\n' % sym1
- elif line[:len(f2)] == f2:
- line = string.replace(line, rootpath + '/', '')
- if sym2:
- line = line[:-1] + ' %s\n' % sym2
-
- print line[:-1]
-
-
-def generate_tarball_header(out, name, size=0, mode=None, mtime=0, uid=0, gid=0, typefrag=None, linkname='', uname='viewcvs', gname='viewcvs', devmajor=1, devminor=0, prefix=None, magic='ustar', version='', chksum=None):
- if not mode:
- if name[-1:] == '/':
- mode = 0755
- else:
- mode = 0644
-
- if not typefrag:
- if name[-1:] == '/':
- typefrag = '5' # directory
- else:
- typefrag = '0' # regular file
-
- if not prefix:
- prefix = ''
-
- block1 = struct.pack('100s 8s 8s 8s 12s 12s',
- name,
- '%07o' % mode,
- '%07o' % uid,
- '%07o' % gid,
- '%011o' % size,
- '%011o' % mtime)
-
- block2 = struct.pack('c 100s 6s 2s 32s 32s 8s 8s 155s',
- typefrag,
- linkname,
- magic,
- version,
- uname,
- gname,
- '%07o' % devmajor,
- '%07o' % devminor,
- prefix)
-
- if not chksum:
- dummy_chksum = ' '
- block = block1 + dummy_chksum + block2
- chksum = 0
- for i in range(len(block)):
- chksum = chksum + ord(block[i])
-
- block = block1 + struct.pack('8s', '%07o' % chksum) + block2
- block = block + '\0' * (512 - len(block))
-
- out.write(block)
-
-def generate_tarball_cvs(out, request, tar_top, rep_top, reldir, tag, stack=[]):
- if (rep_top == '' and 0 < len(reldir) and
- ((reldir[0] == 'CVSROOT' and cfg.options.hide_cvsroot)
- or cfg.is_forbidden(reldir[0]))):
- return
-
- rep_path = rep_top + reldir
- tar_dir = string.join(tar_top + reldir, '/') + '/'
-
- entries = request.repos.listdir(rep_path, tag)
-
- subdirs = [ ]
- for file in entries:
- if not file.verboten and file.kind == vclib.DIR:
- subdirs.append(file.name)
-
- stack.append(tar_dir)
-
- bincvs.get_logs(request.repos, rep_path, entries, tag)
-
- entries.sort(lambda a, b: cmp(a.name, b.name))
-
- for file in entries:
- if file.rev is None or file.state == 'dead':
- continue
-
- for dir in stack:
- generate_tarball_header(out, dir)
- del stack[0:]
-
- info = os.stat(file.path)
- mode = (info[stat.ST_MODE] & 0555) | 0200
-
- rev_flag = '-p' + file.rev
- fp = bincvs.rcs_popen(cfg.general, 'co', (rev_flag, file.path), 'rb', 0)
- contents = fp.read()
- status = fp.close()
-
- generate_tarball_header(out, tar_dir + file.name,
- len(contents), mode, file.date)
- out.write(contents)
- out.write('\0' * (511 - ((len(contents) + 511) % 512)))
-
- subdirs.sort()
- for subdir in subdirs:
- if subdir != 'Attic':
- generate_tarball_cvs(out, request, tar_top, rep_top,
- reldir + [subdir], tag, stack)
-
- if len(stack):
- del stack[-1:]
-
-def generate_tarball_svn(out, request, tar_top, rep_top, reldir, tag, stack=[]):
- rep_dir = string.join(rep_top + reldir, '/')
- tar_dir = string.join(tar_top + reldir, '/') + '/'
-
- entries = request.repos.listdir(rep_top + reldir)
-
- subdirs = []
- for entry in entries:
- if entry.kind == vclib.DIR:
- subdirs.append(entry.name)
-
- vclib.svn.get_logs(request.repos, rep_dir, entries)
-
- stack.append(tar_dir)
-
- for file in entries:
- if file.kind != vclib.FILE:
- continue
-
- for dir in stack:
- generate_tarball_header(out, dir)
- del stack[0:]
-
- mode = 0644
-
- fp = request.repos.openfile(rep_top + reldir + [file.name])[0]
-
- contents = ""
- while 1:
- chunk = fp.read(CHUNK_SIZE)
- if not chunk:
- break
- contents = contents + chunk
-
- status = fp.close()
-
- generate_tarball_header(out, tar_dir + file.name,
- len(contents), mode, file.date)
- out.write(contents)
- out.write('\0' * (511 - ((len(contents) + 511) % 512)))
-
- for subdir in subdirs:
- generate_tarball_svn(out, request, tar_top, rep_top,
- reldir + [subdir], tag, stack)
-
- if len(stack):
- del stack[-1:]
-
-def download_tarball(request):
- if not cfg.options.allow_tar:
- raise "tarball no allows"
-
- query_dict = request.query_dict
- rep_top = tar_top = request.path_parts
- tag = query_dict.get('only_with_tag')
-
- ### look for GZIP binary
-
- request.server.header('application/octet-stream')
- sys.stdout.flush()
- fp = popen.pipe_cmds([('gzip', '-c', '-n')])
-
- # Switch based on the repository root type.
- if request.roottype == 'cvs':
- generate_tarball_cvs(fp, request, tar_top, rep_top, [], tag)
- elif request.roottype == 'svn':
- generate_tarball_svn(fp, request, tar_top, rep_top, [], tag)
-
- fp.write('\0' * 1024)
- fp.close()
-
-def view_revision(request):
- data = common_template_data(request)
- data.update({
- 'roottype' : request.roottype,
- })
-
- if request.roottype == "cvs":
- raise ViewcvsException("Revision view not supported for CVS repositories "
- "at this time.", "400 Bad Request")
- else:
- view_revision_svn(request, data)
-
-def view_revision_svn(request, data):
- query_dict = request.query_dict
- date, author, msg, changes = vclib.svn.get_revision_info(request.repos)
- date_str = make_time_string(date)
- rev = request.repos.rev
-
- # add the hrefs, types, and prev info
- for change in changes:
- change.view_href = change.diff_href = change.type = None
- change.prev_path = change.prev_rev = None
- if change.pathtype is vclib.FILE:
- change.type = 'file'
- change.view_href = request.get_url(view_func=view_markup,
- where=change.filename,
- pathtype=change.pathtype,
- params={'rev' : str(rev)})
- if change.action == "copied" or change.action == "modified":
- change.prev_path = change.base_path
- change.prev_rev = change.base_rev
- change.diff_href = request.get_url(view_func=view_diff,
- where=change.filename,
- pathtype=change.pathtype,
- params={})
- elif change.pathtype is vclib.DIR:
- change.type = 'dir'
- change.view_href = request.get_url(view_func=view_directory,
- where=change.filename,
- pathtype=change.pathtype,
- params={'rev' : str(rev)})
-
- prev_rev_href = next_rev_href = None
- if rev > 0:
- prev_rev_href = request.get_url(view_func=view_revision,
- where=None,
- pathtype=None,
- params={'rev': str(rev - 1)})
- if rev < request.repos.youngest:
- next_rev_href = request.get_url(view_func=view_revision,
- where=None,
- pathtype=None,
- params={'rev': str(rev + 1)})
- if msg:
- msg = htmlify(msg)
- data.update({
- 'rev' : str(rev),
- 'author' : author,
- 'date_str' : date_str,
- 'log' : msg,
- 'ago' : html_time(request, date, 1),
- 'changes' : changes,
- 'jump_rev' : str(rev),
- 'prev_href' : prev_rev_href,
- 'next_href' : next_rev_href,
- })
-
- url, params = request.get_link(view_func=view_revision,
- where=None,
- pathtype=None,
- params={'rev': None})
- data['jump_rev_action'] = urllib.quote(url, _URL_SAFE_CHARS)
- data['jump_rev_hidden_values'] = prepare_hidden_values(params)
-
- request.server.header()
- generate_page(request, cfg.templates.revision, data)
-
-
-_views = {
- 'annotate': view_annotate,
- 'auto': view_auto,
- 'co': view_checkout,
- 'diff': view_diff,
- 'dir': view_directory,
- 'graph': view_cvsgraph,
- 'graphimg': view_cvsgraph_image,
- 'log': view_log,
- 'markup': view_markup,
- 'rev': view_revision,
- 'tar': download_tarball,
-}
-
-_view_codes = {}
-for code, view in _views.items():
- _view_codes[view] = code
-
-def list_roots(cfg):
- allroots = { }
- allroots.update(cfg.general.cvs_roots)
- allroots.update(cfg.general.svn_roots)
- return allroots
-
-def handle_config():
- debug.t_start('load-config')
- global cfg
- if cfg is None:
- cfg = config.Config()
- cfg.set_defaults()
-
- # load in configuration information from the config file
- pathname = CONF_PATHNAME or os.path.join(g_install_dir, 'viewcvs.conf')
- if sapi.server:
- cfg.load_config(pathname, sapi.server.getenv('HTTP_HOST'))
- else:
- cfg.load_config(pathname, None)
-
- # special handling for svn_parent_path. any subdirectories
- # present in the directory specified as the svn_parent_path that
- # have a child file named "format" will be treated as svn_roots.
- if cfg.general.svn_parent_path is not None:
- pp = cfg.general.svn_parent_path
- try:
- subpaths = os.listdir(pp)
- except OSError:
- raise debug.ViewcvsException(
- "The setting for 'svn_parent_path' does not refer to "
- "a valid directory.")
-
- for subpath in subpaths:
- if os.path.exists(os.path.join(pp, subpath)) \
- and os.path.exists(os.path.join(pp, subpath, "format")):
- cfg.general.svn_roots[subpath] = os.path.join(pp, subpath)
-
- debug.t_end('load-config')
-
-
-def view_error(server):
- exc_dict = debug.GetExceptionData()
- status = exc_dict['status']
- handled = 0
-
- # use the configured error template if possible
- try:
- if cfg:
- server.header(status=status)
- generate_page(None, cfg.templates.error, exc_dict)
- handled = 1
- except:
- # get new exception data, more important than the first
- exc_dict = debug.GetExceptionData()
-
- # but fallback to the old exception printer if no configuration is
- # available, or if something went wrong
- if not handled:
- debug.PrintException(server, exc_dict)
-
-def main(server):
- try:
- debug.t_start('main')
- try:
- # handle the configuration stuff
- handle_config()
-
- # build a Request object, which contains info about the HTTP request
- request = Request(server)
- request.run_viewcvs()
- except SystemExit, e:
- return
- except:
- view_error(server)
-
- finally:
- debug.t_end('main')
- debug.dump()
- debug.DumpChildren(server)
-
-
-class _item:
- def __init__(self, **kw):
- vars(self).update(kw)
-
diff --git a/sandbox/bbum/00README.txt b/sandbox/bbum/00README.txt
deleted file mode 100644
index c5d461b6d..000000000
--- a/sandbox/bbum/00README.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-=======================
-bbum's Docutils sandbox
-=======================
-
-:Author: Bill Bumgarner
-:Contact: bbum@codefab.com
-:Copyright: See individual modules for copyright & license information
-
-DocArticle
-==========
-
-A plain HTML writer for Docutils. Produces non-CSS based HTML that is
-compliant with the O'Reilly DevCenter's article submission guidelines.
-
diff --git a/sandbox/bbum/ChangeLog b/sandbox/bbum/ChangeLog
deleted file mode 100644
index 598c618e5..000000000
--- a/sandbox/bbum/ChangeLog
+++ /dev/null
@@ -1,38 +0,0 @@
-2003-02-27 Bill Bumgarner <bbum@codefab.com>
- * DocArticle/DocArticle/__init__.py: Added sidebar and title_reference
- support.
-
-2003-01-07 Bill Bumgarner <bbum@codefab.com>
- * DocArticle/DocArticle/__init__.py: Improved formatting of admonitions.
- Sort of. Would like to make them better. Maybe add little icons, if
- icons are enabled (need to fix settings).
- * DocArticle/DocArticle/__init__.py: Improved formatting of
- abstract/dedication block. Now in 'box' w/abstract/dedication centered
- at top. Should all be in italics, but that'll hose the body formatting
- of the contained text.
-
-2003-01-05 Bill Bumgarner <bbum@codefab.com>
- * DocArticle/DocArticle/__init__.py: Can now successfully [I think]
- process test.txt. Output is not exactly pretty yet.
-
-2002-12-28 Bill Bumgarner <bbum@codefab.com>
- * Added support for subtitle, note, and block_quote. Cleaned up a
- compile of CSS leftovers.
- * DocArticle/DocArticle/__init__.py: Added support for arbitrary fields
- and moved docinfo presentation to being table based (so that multiline
- field values actually work). Lots of cleanup-- reordered a bunch of
- methods that had gotten out of order. Added limited support for
- Admonitions-- not at all useful yet.
- (HTMLDocArticleTranslator.visit_enumerated_list): Added support for
- enumerated lists and modified the paragraph tag rules for all lists.
- (HTMLDocArticleTranslator.visit_enumerated_list): Added support for
- non-css based typed enumerated lists.
-
-2002-12-27 Bill Bumgarner <bbum@codefab.com>
- * DocArticle/DocArticle/__init__.py: Added support for subtitle and
- block_quote nodes.
- * Added initial working implementation of DocArticle HTML writer.
- * 00README.txt: Added basic information.
- (HTMLDocArticleTranslator.__init__): Moved to a more traditional
- initialization of instance variables.
-
diff --git a/sandbox/bbum/DocArticle/00README.txt b/sandbox/bbum/DocArticle/00README.txt
deleted file mode 100644
index cf0061624..000000000
--- a/sandbox/bbum/DocArticle/00README.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-==========
-DocArticle
-==========
-
-:Author: Bill Bumgarner
-:Contact: bbum@codefab.com
-:Copyright: 2002 - Bill Bumgarner - All Rights Reserved
-:License: The MIT License -- see LICENSE.txt
-:Abstract: A writer for Docutils_ that produces straight, non-CSS, HTML
- output.
-
-A plain HTML writer for Docutils_. Produces non-CSS based HTML that is
-compliant with the O'Reilly DevCenter's article submission guidelines.
-
-.. _Docutils: http://docutils.sourceforge.net/
diff --git a/sandbox/bbum/DocArticle/DocArticle/DocArticleText.py b/sandbox/bbum/DocArticle/DocArticle/DocArticleText.py
deleted file mode 100644
index c9eec0f53..000000000
--- a/sandbox/bbum/DocArticle/DocArticle/DocArticleText.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Author: Bill Bumgarner
-# Contact: bbum@codefab.com
-# Copyright: 2002 - Bill Bumgarner - All Rights Reserved
-# License: The MIT License -- see LICENSE.txt
-
-"""
-Defines various chunks o' static text that are spewed into Articles.
-
-A sort of half-baked library of templates. Currently extremely limited in scope.
-"""
-
-__docformat__ = 'reStructuredText'
-
-contentStart = """<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-"""
-
-headerStart = """<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-"""
-
-titleStart = """<title>
-"""
-titleEnd = """</title>
-"""
-
-headerEnd = """</head>
-"""
-
-bodyStart = """<body>
-"""
-bodyEnd = """</body>
-"""
-
-contentEnd = """</html>
-"""
diff --git a/sandbox/bbum/DocArticle/DocArticle/__init__.py b/sandbox/bbum/DocArticle/DocArticle/__init__.py
deleted file mode 100644
index 9a6b421e2..000000000
--- a/sandbox/bbum/DocArticle/DocArticle/__init__.py
+++ /dev/null
@@ -1,988 +0,0 @@
-# Author: Bill Bumgarner
-# Contact: bbum@mac.com
-# Copyright: 2002 - Bill Bumgarner - All Rights Reserved
-# License: The MIT License -- see LICENSE.txt
-
-"""
-This is the DocArticle package.
-
-This package provides a writer for DocUtils that spews HTML compliant
-with O'Reilly's Dev Center article submission guidelines.
-"""
-
-try:
- x = True
-except NameError:
- True = 1
- False = 0
-
-__docformat__ = 'reStructuredText'
-
-import sys
-from warnings import warn
-import re
-from types import *
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-from DocArticle import DocArticleText
-
-class DocArticleWriter(writers.Writer):
- supported = ('html',)
- """Formats this writer supports."""
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = HTMLDocArticleTranslator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-SpewNothing = 0
-SpewParagraph = 1
-SpewBreak = 2
-SpewBreakBreak = 3
-SpewNothingThenPara = 4
-
-olTypeTranslator = {
- 'arabic' : '1',
- 'upperalpha' : 'A',
- 'loweralpha' : 'a',
- 'upperroman' : 'I',
- 'lowerroman' : 'i'
- }
-
-class HTMLDocArticleTranslator(nodes.NodeVisitor):
- named_tags = {'a': 1,
- 'applet': 1,
- 'form': 1,
- 'frame': 1,
- 'iframe': 1,
- 'img': 1,
- 'map': 1}
-
- words_and_spaces = re.compile(r'\S+| +|\n')
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.section_level = 0
- self.headerContent = []
- self.bodyContent = []
- self.bodySuffix = []
- self.metaContent = []
- self.context = []
- self.spewTextContext = [True]
- self.spewParaTag = [SpewParagraph]
- self.paraFormat = [(None,None)]
- self.colspecs = []
-
- self.body_pre_docinfo = []
- self.docinfo = []
- self.compact_simple = None
- self.compact_p = 1
-
- self.firstFootnoteVisited = False
-
- # lcode = settings.language_code
- lcode = 'en'
- self.language = languages.get_language(lcode)
-
- def astext(self):
- return ''.join([DocArticleText.contentStart, DocArticleText.headerStart] +
- self.headerContent +
- [DocArticleText.headerEnd, DocArticleText.bodyStart] +
- self.body_pre_docinfo + self.docinfo + self.bodyContent + self.bodySuffix +
- [DocArticleText.bodyEnd, DocArticleText.contentEnd])
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- # @@@ A codec to do these and all other HTML entities would be nice.
- text = text.replace('&', '&amp;')
- text = text.replace('<', '&lt;')
- text = text.replace('"', '&quot;')
- text = text.replace('>', '&gt;')
- return text
-
- def popAndAppend(self, node):
- possiblePoppedContent = self.context.pop()
- if possiblePoppedContent:
- self.bodyContent.append(possiblePoppedContent)
-
- def attval(self, text,
- whitespace=re.compile('[\n\r\t\v\f]')):
- """Cleanse, HTML encode, and return attribute value text."""
- return self.encode(whitespace.sub(' ', text))
-
- def emptytag(self, node, tagname, suffix='\n', **attributes):
- """Construct and return an XML-compatible empty tag."""
- return self.starttag(node, tagname, suffix, infix=' /', **attributes)
-
- def starttag(self, node, tagname, suffix='\n', infix='', **attributes):
- tagname = tagname.lower()
- atts = {}
- for (name, value) in attributes.items():
- atts[name.lower()] = value
- for att in ('id',): # node attribute overrides
- if node.has_key(att):
- atts[att] = node[att]
- if atts.has_key('id') and self.named_tags.has_key(tagname):
- atts['name'] = atts['id'] # for compatibility with old browsers
- attlist = atts.items()
- attlist.sort()
- parts = [tagname]
- for name, value in attlist:
- if value is None: # boolean attribute
- # According to the HTML spec, ``<element boolean>`` is good,
- # ``<element boolean="boolean">`` is bad.
- # (But the XHTML (XML) spec says the opposite. <sigh>)
- parts.append(name.lower())
- elif isinstance(value, ListType):
- values = [str(v) for v in value]
- parts.append('%s="%s"' % (name.lower(),
- self.attval(' '.join(values))))
- else:
- parts.append('%s="%s"' % (name.lower(),
- self.attval(str(value))))
- return '<%s%s>%s' % (' '.join(parts), infix, suffix)
-
- def visit_Text(self, node):
- if self.spewTextContext[-1]:
- self.bodyContent.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- self.visit_docinfo_item(node, 'address', meta=None)
- self.bodyContent.append(self.starttag(node, 'pre'))
-
- def depart_address(self, node):
- self.bodyContent.append('\n</pre>\n')
- self.depart_docinfo_item(node)
-
- def visit_admonition(self, node, name='', admonitionCellAtts={}):
- baseAdmonitionCellAtts = {"width" : "15%"}
- baseAdmonitionCellAtts.update(admonitionCellAtts)
- self.bodyContent.append('<table width="90%" border="1" align="center">\n'
- '<tbody><tr><td><table width="100%"><tbody><tr>\n')
- self.bodyContent.append(self.starttag(node, 'td', **baseAdmonitionCellAtts))
- if name:
- self.bodyContent.append(self.language.labels[name.lower()])
- self.bodyContent.append('</td><td>')
-
-
- def depart_admonition(self, node):
- self.bodyContent.append('</td></tr></tbody></table></td></tr></tbody></table>')
-
- attribution_formats = {'dash': ('&mdash;', ''),
- 'parentheses': ('(', ')'),
- 'parens': ('(', ')'),
- 'none': ('', '')}
-
- def visit_attribution(self, node):
- # prefix, suffix = self.attribution_formats[self.settings.attribution]
- prefix, suffix = ('(', ')')
- self.context.append(suffix)
- self.bodyContent.append(
- self.starttag(node, 'p', prefix))
-
- def depart_attribution(self, node):
- self.bodyContent.append(self.context.pop() + '</p>\n')
-
-
- def visit_author(self, node):
- self.visit_docinfo_item(node, 'Author')
-
- def depart_author(self, node):
- self.depart_docinfo_item(node)
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention', admonitionCellAtts={"bgcolor":"#ffffcc"})
-
- def depart_attention(self, node):
- self.depart_admonition(node)
-
- def visit_block_quote(self, node):
- self.bodyContent.append(self.starttag(node, 'blockquote'))
-
- def depart_block_quote(self, node):
- self.bodyContent.append('</blockquote>\n')
-
- def visit_line_block(self, node):
- self.bodyContent.append(self.starttag(node, 'pre'))
-
- def depart_line_block(self, node):
- self.bodyContent.append('\n</pre>\n')
-
- def visit_bullet_list(self, node):
- self.bodyContent.append(self.starttag(node, 'ul'))
- self.spewParaTag.append(SpewNothing)
-
- def depart_bullet_list(self, node):
- self.bodyContent.append('</ul>\n')
- self.spewParaTag.pop()
-
- def visit_caption(self, node):
- self.bodyContent.append(self.starttag(node, 'p', ''))
-
- def depart_caption(self, node):
- self.bodyContent.append('</p>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution', admonitionCellAtts={"bgcolor":"#ffff99"})
-
- def depart_caution(self, node):
- self.depart_admonition(node)
-
- def visit_citation(self, node):
- ##! verify col configuration
- self.bodyContent.append(self.starttag(node, 'table'))
- self.bodyContent.append('<colgroup><col /><col /></colgroup>\n'
- '<col />\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- self.bodyContent.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.bodyContent.append(self.starttag(node, 'a', '[', href=href))
-
- def depart_citation_reference(self, node):
- self.bodyContent.append(']</a>')
-
- def visit_classifier(self, node):
- pass
-
- def depart_classifier(self, node):
- pass
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- ##! verify
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.bodyContent.append(self.emptytag(node, 'col', width='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node, sub=re.compile('-(?=-)').sub):
- self.bodyContent.append('<!-- %s -->\n' % sub('- ', node.astext()))
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'Contact')
-
- def depart_contact(self, node):
- self.depart_docinfo_item(node)
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item(node)
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger', admonitionCellAtts={"bgcolor":"#ff6666"})
-
- def depart_danger(self, node):
- self.depart_admonition(node)
-
- def visit_date(self, node):
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item(node)
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- self.bodyContent.append('</dt>\n')
- self.bodyContent.append(self.starttag(node, 'dd', ''))
-
- def depart_definition(self, node):
- self.bodyContent.append('</dd>\n')
-
- def visit_definition_list(self, node):
- self.bodyContent.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- self.bodyContent.append('</dl>\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- self.bodyContent.append(self.starttag(node, 'td', ''))
-
- def depart_description(self, node):
- self.bodyContent.append('</td>')
-
- def visit_docinfo(self, node):
- self.context.append(len(self.bodyContent))
- self.bodyContent.append(self.starttag(node, 'table'))
- self.bodyContent.append('<tbody valign="top">\n')
- self.in_docinfo = 1
-
- def depart_docinfo(self, node):
- self.bodyContent.append('</tbody>\n</table>\n')
- self.in_docinfo = None
- start = self.context.pop()
- self.body_pre_docinfo = self.bodyContent[:start]
- self.docinfo = self.bodyContent[start:]
- self.bodyContent = []
-
- def visit_docinfo_item(self, node, name, meta=1):
- if meta:
- self.headerContent.append('<meta name="%s" content="%s" />\n' %
- (name, self.attval(node.astext())))
- self.bodyContent.append(self.starttag(node, 'tr', ''))
- self.bodyContent.append('<th >%s:</th>\n<td>' % self.language.labels[name.lower()])
-
- def depart_docinfo_item(self, node):
- self.bodyContent.append('</td></tr>\n')
-
- def visit_doctest_block(self, node):
- self.bodyContent.append(self.starttag(node, 'pre'))
-
- def depart_doctest_block(self, node):
- self.bodyContent.append('\n</pre>\n')
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.bodyContent.append('<i>')
-
- def depart_emphasis(self, node):
- self.bodyContent.append('</i>')
-
- def visit_entry(self, node):
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.bodyContent.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.bodyContent.append('&nbsp;')
-
- def depart_entry(self, node):
- self.bodyContent.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['type'] = olTypeTranslator[node['enumtype']]
- self.bodyContent.append(self.starttag(node, 'ol', **atts))
-
- def depart_enumerated_list(self, node):
- self.bodyContent.append('</ol>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error', admonitionCellAtts={"bgcolor":"#ff6666"})
-
- def depart_error(self, node):
- self.depart_admonition(node)
-
- def visit_field(self, node):
- self.bodyContent.append(self.starttag(node, 'tr', ''))
-
- def depart_field(self, node):
- self.bodyContent.append('</tr>\n')
-
- def visit_field_body(self, node):
- self.bodyContent.append(self.starttag(node, 'td', ''))
- self.spewParaTag.append(SpewBreak)
-
- def depart_field_body(self, node):
- self.bodyContent.append('</td>\n')
- self.spewParaTag.pop()
-
- def visit_field_list(self, node):
- self.bodyContent.append(self.starttag(node, 'table'))
- self.bodyContent.append('<tbody valign="top">\n')
-
- def depart_field_list(self, node):
- self.bodyContent.append('</tbody>\n</table>\n')
-
- def visit_field_name(self, node):
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.bodyContent.append(self.starttag(node, 'th', '', **atts))
-
- def depart_field_name(self, node):
- self.bodyContent.append(':</th>')
- self.bodyContent.append(self.context.pop())
-
- def visit_figure(self, node):
- self.bodyContent.append(self.starttag(node, 'div'))
-
- def depart_figure(self, node):
- self.bodyContent.append('</div>\n')
-
- def visit_footer(self, node):
- self.context.append(len(self.body))
-
- def depart_footer(self, node):
- start = self.context.pop()
- footer = (['<hr/>\n',
- self.starttag(node, 'div')]
- + self.bodyContent[start:] + ['</div>\n'])
- self.bodySuffix[:0] = footer
- del self.bodyContent[start:]
-
- def check_simple_list(self, node):
- """Check for a simple list that can be rendered compactly."""
- visitor = SimpleListChecker(self.document)
- try:
- node.walk(visitor)
- except nodes.NodeFound:
- return None
- else:
- return 1
-
- def visit_footnote(self, node):
- if not self.firstFootnoteVisited:
- self.bodyContent.append('<hr />')
- self.firstFootnoteVisited = True
- self.bodyContent.append(self.starttag(node, 'table'))
- self.bodyContent.append('<tbody valign="top">\n<tr>')
- self.spewParaTag.append(SpewBreak)
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- # if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- self.context.append('')
- self.context.append('<a href="#%s" name="%s">' % (backrefs[0], node['id']))
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a href="#%s">%s</a>' % (backref, i))
- i += 1
- self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
- self.context.append('<a name="%s">' % node['id'])
- else:
- self.context.append('')
- self.context.append('<a name="%s">' % node['id'])
-
- def depart_footnote(self, node):
- self.spewParaTag.pop()
- self.paraFormat.pop()
- self.bodyContent.append('</td></tr>\n</tbody>\n</table>\n')
-
- def visit_footnote_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- # format = self.settings.footnote_references
- format = 'superscript'
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '<sup>'
- self.context.append('</sup>')
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.bodyContent.append('<b>')
- self.bodyContent.append(suffix)
- self.bodyContent.append(self.starttag(node, 'a', '', href=href))
-
- def depart_footnote_reference(self, node):
- self.bodyContent.append('</a>')
- self.bodyContent.append(self.context.pop())
- self.bodyContent.append('</b>')
-
- def visit_rubric(self, node):
- self.bodyContent.append(self.starttag(node, 'p', ''))
-
- def depart_rubric(self, node):
- self.bodyContent.append('</p>\n')
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint', admonitionCellAtts={"bgcolor":"#99ff99"})
-
- def depart_hint(self, node):
- self.depart_admonition(node)
-
- def visit_image(self, node):
- atts = node.attributes.copy()
- atts['src'] = atts['uri']
- del atts['uri']
- if not atts.has_key('alt'):
- atts['alt'] = atts['src']
- if isinstance(node.parent, nodes.TextElement):
- self.context.append(None)
- else:
- self.bodyContent.append('<p>')
- self.context.append('</p>\n')
- self.bodyContent.append(self.emptytag(node, 'img', '', **atts))
-
- depart_image = popAndAppend
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important', admonitionCellAtts={"bgcolor":"#ffcccc"})
-
- def depart_important(self, node):
- self.depart_admonition(node)
-
- def visit_interpreted(self, node):
- ###! no idea what to do here
- pass
-
- def depart_interpreted(self, node):
- pass
-
- def visit_label(self, node):
- self.bodyContent.append(self.starttag(node, 'td', '<b>[%s' % self.context.pop()))
-
- def depart_label(self, node):
- self.paraFormat.append(('<font size=-1><i>', '</i></font>'))
- self.bodyContent.append('</a>]</b></td><td>%s' % self.context.pop())
-
- def visit_legend(self, node):
- self.bodyContent.append(self.starttag(node, 'div'))
-
- def depart_legend(self, node):
- self.bodyContent.append('</div>\n')
-
- def visit_list_item(self, node):
- self.bodyContent.append(self.starttag(node, 'li', ''))
- self.spewParaTag.append(SpewNothingThenPara)
-
- def depart_list_item(self, node):
- self.bodyContent.append('</li>\n')
- self.spewParaTag.pop()
-
- def visit_literal(self, node):
- self.bodyContent.append(self.starttag(node, 'code', ''))
- text = node.astext()
- for token in self.words_and_spaces.findall(text):
- if token.strip():
- # Protect text like "--an-option" from bad line wrapping:
- self.bodyContent.append('<span>%s</span>' % self.encode(token))
- elif token in ('\n', ' '):
- # Allow breaks at whitespace:
- self.bodyContent.append(token)
- else:
- # Protect runs of multiple spaces; the last space can wrap:
- self.bodyContent.append('&nbsp;' * (len(token) - 1) + ' ')
- self.bodyContent.append('</code>')
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_literal_block(self, node):
- self.bodyContent.append(self.starttag(node, 'pre'))
-
- def depart_literal_block(self, node):
- self.bodyContent.append('\n</pre>\n')
-
- def visit_meta(self, node):
- self.headerContent.append(self.emptytag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition(node)
-
- def visit_option(self, node):
- if self.context[-1]:
- self.bodyContent.append(', ')
-
- def depart_option(self, node):
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- self.bodyContent.append(node.get('delimiter', ' '))
- self.bodyContent.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- self.bodyContent.append('</var>')
-
- def visit_option_group(self, node):
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.bodyContent.append(self.starttag(node, 'td', **atts))
- self.bodyContent.append('<kbd>') ###! What tag is this?
- self.context.append(0) # count number of options
-
- def depart_option_group(self, node):
- self.context.pop()
- self.bodyContent.append('</kbd></td>\n')
- self.bodyContent.append(self.context.pop())
-
- def visit_option_list(self, node):
- self.bodyContent.append(self.starttag(node, 'table'))
- self.bodyContent.append('<tbody valign="top">\n')
-
- def depart_option_list(self, node):
- self.bodyContent.append('</tbody>\n</table>\n')
-
- def visit_option_list_item(self, node):
- self.bodyContent.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- self.bodyContent.append('</tr>\n')
-
- def visit_option_string(self, node):
- self.bodyContent.append(self.starttag(node, 'span', ''))
-
- def depart_option_string(self, node):
- self.bodyContent.append('</span>')
-
- def visit_organization(self, node):
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- self.depart_docinfo_item(node)
-
- def visit_paragraph(self, node):
- currentSpewParaTag = self.spewParaTag[-1]
- if currentSpewParaTag == SpewParagraph:
- self.bodyContent.append(self.starttag(node, 'p', ''))
- self.context.append('</p>\n')
- elif currentSpewParaTag == SpewBreak:
- self.context.append('<br />\n')
- elif currentSpewParaTag == SpewBreakBreak:
- self.context.append('<br /><br />\n')
- elif currentSpewParaTag == SpewNothingThenPara:
- self.context.append(None)
- self.spewParaTag[-1] = SpewParagraph
- else:
- self.context.append(None)
-
- start, end = self.paraFormat[-1]
- if start:
- self.bodyContent.append(start)
- if end:
- self.context.append(end)
- else:
- self.context.append(None)
-
- def depart_paragraph(self, node):
- self.popAndAppend(node) # pop end formatting tag, if any
- self.popAndAppend(node) # pop end paragraph tag, if any
-
- def visit_problematic(self, node):
- if node.hasattr('refid'):
- self.bodyContent.append('<a href="#%s" name="%s">' % (node['refid'], node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.bodyContent.append(self.starttag(node, 'span', ''))
-
- def depart_problematic(self, node):
- self.bodyContent.append('</span>')
- self.bodyContent.append(self.context.pop())
-
- def visit_reference(self, node):
- if node.has_key('refuri'):
- href = node['refuri']
- elif node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.bodyContent.append(self.starttag(node, 'a', '', href=href))
- self.context.append('</a>')
-
- depart_reference = popAndAppend
-
- def visit_revision(self, node):
- self.visit_docinfo_item(node, 'revision')
-
- def depart_revision(self, node):
- self.depart_docinfo_item(node)
-
- def visit_row(self, node):
- self.bodyContent.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- self.bodyContent.append('</tr>\n')
-
- def visit_section(self, node):
- self.section_level += 1
- #hTag = 'h%s'% self.section_level
- #self.bodyContent.append(self.starttag(node, hTag))
- #self.bodyContent.append('</%s>\n' % hTag)
-
- def depart_section(self, node):
- self.section_level -= 1
-
- def visit_sidebar(self, node):
- self.bodyContent.append('<hr width="80%" align="center"/>')
- self.bodyContent.append('<table border="0" width="80%" align="center"><tbody><tr><td>')
-
- def depart_sidebar(self, node):
- self.bodyContent.append('</td></tr></tbody></table>\n')
- self.bodyContent.append('<hr width="80%" align="center"/>')
-
- def visit_status(self, node):
- self.visit_docinfo_item(node, 'status', meta=None)
-
- def depart_status(self, node):
- self.depart_docinfo_item(node)
-
- def visit_strong(self, node):
- self.bodyContent.append('<strong>')
-
- def depart_strong(self, node):
- self.bodyContent.append('</strong>')
-
- def visit_subscript(self, node):
- self.bodyContent.append(self.starttag(node, 'sub', ''))
-
- def depart_subscript(self, node):
- self.bodyContent.append('</sub>')
-
- def visit_substitution_definition(self, node):
- raise nodes.SkipNode # internal
-
- def visit_substitution_reference(self, node):
- pass
-
- def visit_subtitle(self, node):
- self.bodyContent.append(self.starttag(node, 'h3', ''))
-
- def depart_subtitle(self, node):
- self.bodyContent.append('</h3>\n')
-
- def visit_superscript(self, node):
- self.bodyContent.append(self.starttag(node, 'sup', ''))
-
- def depart_superscript(self, node):
- self.bodyContent.append('</sup>')
-
- def visit_table(self, node):
- self.bodyContent.append(self.starttag(node, 'table'))
-
- def depart_table(self, node):
- self.bodyContent.append('</table>\n')
-
- def visit_target(self, node):
- if not (node.has_key('refuri') or node.has_key('refid') or node.has_key('refname')):
- self.bodyContent.append(self.starttag(node, 'a', ''))
- self.context.append('</a>')
- else:
- self.context.append(None)
-
- depart_target = popAndAppend
-
- def visit_tbody(self, node):
- self.write_colspecs()
- self.bodyContent.append(self.context.pop()) # '</colgroup>\n' or ''
- self.bodyContent.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- self.bodyContent.append('</tbody>\n')
-
- def visit_term(self, node):
- self.bodyContent.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- pass
-
- def visit_tgroup(self, node):
- ###! verify
- # Mozilla needs <colgroup>:
- self.bodyContent.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- self.write_colspecs()
- self.bodyContent.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.bodyContent.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- self.bodyContent.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition(node)
-
- def visit_title(self, node):
- if isinstance(node.parent, nodes.topic) and (node.parent.attributes.get('name', None) != 'contents'):
- self.bodyContent.append('<i><center>')
- if node.parent.hasattr('id'):
- self.bodyContent.append(self.starttag({},'a','',name=node.parent['id']))
- self.context.append('</a></center></i><br />\n')
- else:
- self.context.append('</center></i><br />\n')
- elif self.section_level == 0:
- self.headerContent.append(DocArticleText.titleStart)
- self.headerContent.append(self.encode(node.astext()))
- self.headerContent.append(DocArticleText.titleEnd)
- self.bodyContent.append(self.starttag(node, 'h2', ''))
- self.context.append('</h2>\n')
- else:
- ### O'Reilly uses h2 to denote title and h3 for all sections. In theory,
- ### nothing should hang below h3. In practice, we leave it up to the
- ### author.
- level = self.section_level + 1
- self.bodyContent.append(self.starttag(node, 'h%s' % level, ''))
- atts = {}
- if node.parent.hasattr('id'):
- atts['name'] = node.parent['id']
- if node.hasattr('refid'):
- atts['href'] = '#' + node['refid']
- self.bodyContent.append(self.starttag({}, 'a', '', **atts))
- self.context.append('</a></h%s>\n' % level)
-
- def depart_title(self, node):
- self.popAndAppend(node)
-
- def visit_title_reference(self, node):
- self.bodyContent.append(self.starttag(node, 'cite', ''))
-
- def depart_title_reference(self, node):
- self.bodyContent.append('</cite>')
-
- def visit_topic(self, node):
- if node.attributes.get('name', None) != 'contents':
- self.spewParaTag.append(SpewNothingThenPara)
- self.bodyContent.append('<table border="1" width="80%" align="center"><tbody><tr><td>')
-
- def depart_topic(self, node):
- if node.attributes.get('name', None) != 'contents':
- self.bodyContent.append('</td></tr></tbody></table>\n')
- self.spewParaTag.pop()
-
- def visit_transition(self, node):
- self.bodyContent.append(self.emptytag(node, 'hr'))
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- self.visit_docinfo_item(node, 'version')
-
- def depart_version(self, node):
- self.depart_docinfo_item(node)
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning', admonitionCellAtts={"bgcolor":"#ffff33"})
-
- def depart_warning(self, node):
- self.depart_admonition(node)
-
- def unknown_visit(self, node):
- print 'Node: %s' % node.__class__.__name__
- print "Failure processing at line (%s) of node:\n %s" % (node.line, node.pformat())
- raise NotImplementedError('visiting unknown node type: %s'
- % node.__class__.__name__)
-
- def visit_system_message(self, node):
- if node['level'] < self.document.reporter['writer'].report_level:
- # Level is too low to display:
- raise nodes.SkipNode
- self.bodyContent.append(self.starttag(node, 'div'))
- self.bodyContent.append('<p>')
- attr = {}
- backref_text = ''
- if node.hasattr('id'):
- attr['name'] = node['id']
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- backref_text = ('; <em><a href="#%s">backlink</a></em>'
- % backrefs[0])
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a href="#%s">%s</a>' % (backref, i))
- i += 1
- backref_text = ('; <em>backlinks: %s</em>'
- % ', '.join(backlinks))
- if node.hasattr('line'):
- line = ', line %s' % node['line']
- else:
- line = ''
- if attr:
- a_start = self.starttag({}, 'a', '', **attr)
- a_end = '</a>'
- else:
- a_start = a_end = ''
- self.bodyContent.append('System Message: %s%s/%s%s (<tt>%s</tt>%s)%s</p>\n'
- % (a_start, node['type'], node['level'], a_end,
- node['source'], line, backref_text))
-
- def depart_system_message(self, node):
- self.bodyContent.append('</div>\n')
-
diff --git a/sandbox/bbum/DocArticle/LICENSE.txt b/sandbox/bbum/DocArticle/LICENSE.txt
deleted file mode 100644
index 435339fe2..000000000
--- a/sandbox/bbum/DocArticle/LICENSE.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-(This is the MIT license)
-
- Copyright (c) 2002 - Bill Bumgarner - All Rights Reserved.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
diff --git a/sandbox/bbum/DocArticle/docarticle.py b/sandbox/bbum/DocArticle/docarticle.py
deleted file mode 100755
index fe1f68c78..000000000
--- a/sandbox/bbum/DocArticle/docarticle.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Bill Bumgarner
-# Contact: bbum@codefab.com
-# Copyright: This module has been placed in the public domain.
-
-"""
-docarticle.py
-=============
-
-This module provides a simple command line interface that uses the
-DocArticle HTML writer to produce plain HTML output from
-ReStructuredText source.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-from DocArticle import DocArticleWriter
-
-description = ("Generates plain HTML. " + default_description)
-
-publish_cmdline(writer=DocArticleWriter(), description=description)
diff --git a/sandbox/bbum/DocArticle/setup.py b/sandbox/bbum/DocArticle/setup.py
deleted file mode 100755
index 8557e4554..000000000
--- a/sandbox/bbum/DocArticle/setup.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Bill Bumgarner
-# Contact: bbum@codefab.com
-# Copyright: 2002 - Bill Bumgarner - All Rights Reserved
-# License: The MIT License -- see LICENSE.txt
-
-from distutils.core import setup
-
-setup(name = "DocArticle",
- version = "0.1",
- description = "Turn reStructuredText source into O'Reilly DevCenter compatible HTML.",
- author = "Bill Bumgarner",
- url = "mailto:bbum@codefab.com",
- author_email = "bbum@codefab.com",
- packages = ['DocArticle'],
- scripts = ['docarticle.py']
- )
diff --git a/sandbox/blais/css_tricks/README.txt b/sandbox/blais/css_tricks/README.txt
deleted file mode 100644
index 4c2546482..000000000
--- a/sandbox/blais/css_tricks/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-==========
-CSS Tricks
-==========
-
-:Author: Martin Blais <blais@furius.ca>
-:Date: $Date$
-
-This mini-project is meant to contain neat tricks with cascading
-stylesheet to spice up the looks of reST documents converted to HTML
-with the default HTML converter.
diff --git a/sandbox/blais/css_tricks/boxed_titles/castro.png b/sandbox/blais/css_tricks/boxed_titles/castro.png
deleted file mode 100644
index 84b3c15a0..000000000
--- a/sandbox/blais/css_tricks/boxed_titles/castro.png
+++ /dev/null
Binary files differ
diff --git a/sandbox/blais/css_tricks/boxed_titles/clinton.png b/sandbox/blais/css_tricks/boxed_titles/clinton.png
deleted file mode 100644
index 91d21c357..000000000
--- a/sandbox/blais/css_tricks/boxed_titles/clinton.png
+++ /dev/null
Binary files differ
diff --git a/sandbox/blais/css_tricks/boxed_titles/docutils.conf b/sandbox/blais/css_tricks/boxed_titles/docutils.conf
deleted file mode 100644
index da04cb9cd..000000000
--- a/sandbox/blais/css_tricks/boxed_titles/docutils.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[html4css1 writer]
-
-stylesheet-path: style.css
diff --git a/sandbox/blais/css_tricks/boxed_titles/index.txt b/sandbox/blais/css_tricks/boxed_titles/index.txt
deleted file mode 100644
index 07e894063..000000000
--- a/sandbox/blais/css_tricks/boxed_titles/index.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-.. -*- mode: rst; -*-
-
-.. image:: castro.png
- :align: left
-
-Box Title
-=========
-
-.. .. raw:: html
-..
-.. <img src="castro.png" alt="My Face" class="home-image1" />
-.. <h1 class="box-title">Viva Los Boxed Titles!</h1>
-
-This is a trick that shows how to do a kind of slightly fancier heading with an
-image by using a tiny bit of raw HTML and CSS. There would be a way to minimize
-the few raw HTML directives that this requires:
-
-From <http://docutils.sf.net/spec/notes.html#directives>:
-
-Add a "class" option to many/most directives, to set an arbitrary "class"
-attribute on the enclosing element? Perhaps "name" as well?
-
-It may be useful to add an option [*] to the HTML writer to restrict the
-document title to <head><title> only, and not include it in the document body.
-As for the "raw" stuff, a combination of the "image" directive's "align" option,
-the yet-to-be-implemented "class" directive, and stylesheet magic may allow such
-effects without resorting to raw HTML.
-
-We continue with a similar trick for the bottom part.
-
-.. raw:: html
-
- <img SRC="clinton.png" class="home-image2" />
- <h2 class="box-title">I love boxed titles too!</h2>
-
-Oh yeah!
-
diff --git a/sandbox/blais/css_tricks/boxed_titles/style.css b/sandbox/blais/css_tricks/boxed_titles/style.css
deleted file mode 100644
index 9fe378f1e..000000000
--- a/sandbox/blais/css_tricks/boxed_titles/style.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.home-image1 { float: left; border: 0; padding: 5px; }
-.home-image2 { float: right; border: 0; padding: 5px; }
-
-H1 {
- background-color: #EEF;
- border: thin dashed black;
- padding: 10px;
- margin: 20px
-}
-
-.box-title {
- background-color: #EEF;
- border: thin dashed black;
- padding: 10px;
- margin: 20px
-}
diff --git a/sandbox/blais/css_tricks/section_based/docutils.conf b/sandbox/blais/css_tricks/section_based/docutils.conf
deleted file mode 100644
index da04cb9cd..000000000
--- a/sandbox/blais/css_tricks/section_based/docutils.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[html4css1 writer]
-
-stylesheet-path: style.css
diff --git a/sandbox/blais/css_tricks/section_based/index.txt b/sandbox/blais/css_tricks/section_based/index.txt
deleted file mode 100644
index fcec84658..000000000
--- a/sandbox/blais/css_tricks/section_based/index.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-.. -*- mode: rst; -*-
-
-=========================
-Section-Based CSS Changes
-=========================
-
-Introduction
-------------
-
-In this example, we just want to demonstrate simply that one can customize the
-content style by using CSS with the automatically-generated title classes.
-
-This is a bit of a hack but it can be useful under some circumstances.
-
-Red Section
------------
-
-For example, this section contains red items.
-
-* Yes, this should be read.
-* No, you must be ``red``.
-
-
-Green Section
--------------
-
-* But here we turn green.
-
-
-Blue Section
-------------
-
-* A problem with this approach is that if you change the section title the CSS
- file has to be changed as well.
-
diff --git a/sandbox/blais/css_tricks/section_based/style.css b/sandbox/blais/css_tricks/section_based/style.css
deleted file mode 100644
index 6754ed865..000000000
--- a/sandbox/blais/css_tricks/section_based/style.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.section#red-section LI {
- color: red;
-}
-
-.section#green-section LI {
- color: green;
-}
-
-.section#blue-section LI {
- color: blue;
-}
diff --git a/sandbox/blais/emacs-movie/demo-adjust.txt b/sandbox/blais/emacs-movie/demo-adjust.txt
deleted file mode 100755
index 0e7813df8..000000000
--- a/sandbox/blais/emacs-movie/demo-adjust.txt
+++ /dev/null
@@ -1,740 +0,0 @@
-=======================
- Using rst-adjust
-=======================
-
-:Abstract:
-
- This is a short interactive demonstration to show-off some of
- the features of the emacs support in rst.el
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[A] There is a single multi-purpose key binding for underlining
-section titles. By default it is bound to C-=. It can do all sorts
-of things.
-
-Apples, what else?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[B] By default, the newly suggested title is one "below" the last
- one in the hierarchy.
-
-Oranges too
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[C] Invoke it twice to go up the hierarchy.
- After it gets to the top, it cycles back down.
-
-Bananas contain healthy sugar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[D] Use a negative argument to go in the other direction.
-
-Lemon is tasty
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[E] If a region is active, the promotion/demotion occurs for all
- the titles within the region.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Don't drop pommegranate in your washing machine
-
-Fruta Bomba is also known as Mayabe
-
-Jaune-citron is a colour name in french
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Another useful binding exists on C-x C-=
-
-1. [F] Invoked, it displays a temporary buffer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2. [G] With a prefix arg (C-u C-x C-=), it displays the hierarchy
- of the title decorations.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[H] You can insert a table of contents with C-x +
-
- Here:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[I] This is useful at the top of the document, in a comment.
- [above]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[J] You can maintain this up-to-date automatically by binding a
- special function to rst-adjust-hook::
-
- (add-hook 'rst-adjust-hook 'rst-toc-insert-update)
-
- [eval, then above]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[K] You can also navigate between the section titles
- with C-M-{ and C-M-}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-[END] Visit rst.el for details about how to customize
- various aspects of these functions. Thanks for your attention!
-
diff --git a/sandbox/blais/movesec/README.txt b/sandbox/blais/movesec/README.txt
deleted file mode 100644
index 04e4e44aa..000000000
--- a/sandbox/blais/movesec/README.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-================
-docutils-movesec
-================
-
-:Author: Martin Blais
-:Contact: blais@furius.ca
-:Date: $Date$
-
-
-A script that can raise or lower (shift) the levels of the underline characters
-defining the sections of a file.
-
-From an email on the list::
-
- > > i want to contribute my movesec script that rotates the section
- > > markers. i use it every now and then and i'm finding it useful and
- > > stable enough that i think other should be able to enjoy it too.
- >
- > "Rotates"?
-
- yes, it raises or lowers the "levels" of the underline characters of a
- file. it shifts them either up or down (in level), and introduces a
- new underline character for the new level.
-
- this is useful when you're reorganizing the sections of part of a
- file, for example. you could use this on a section of a file only
- using shell-command-on-region in emacs (i still need to write a hook
- to do that).
-
-
-.. important::
-
- You can now do that within emacs using rest-adjust with an active region, see
- restructuredtext.el for details.
diff --git a/sandbox/blais/movesec/docutils-movesec b/sandbox/blais/movesec/docutils-movesec
deleted file mode 100755
index cd8b8f951..000000000
--- a/sandbox/blais/movesec/docutils-movesec
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: iso-8859-1 -*-
-#******************************************************************************\
-#* $Source$
-#* $Id$
-#*
-#* Copyright (C) 2003, Martin Blais <blais@furius.ca>
-#*
-#* This program is free software; you can redistribute it and/or modify
-#* it under the terms of the GNU General Public License as published by
-#* the Free Software Foundation; either version 2 of the License, or
-#* (at your option) any later version.
-#*
-#* This program is distributed in the hope that it will be useful,
-#* but WITHOUT ANY WARRANTY; without even the implied warranty of
-#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#* GNU General Public License for more details.
-#*
-#* You should have received a copy of the GNU General Public License
-#* along with this program; if not, write to the Free Software
-#* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#*
-#*****************************************************************************/
-
-"""docutils-movesec [<options>] <newchar> <file>
-
-Move docutils section underlines one level up or down. This program can be used
-to change the level of your sections within a restructured text file.
-
-'newchar' is the character to use for the replacing the bottom-level (or
-top-level if --down) section underlines.
-
-Note: the whitespace characters that appear after the section underlines are
-preserved.
-
-Note2: this might screw up transition markers.
-
-"""
-
-__version__ = "$Revision$"
-__author__ = "Martin Blais <blais@furius.ca>"
-
-#===============================================================================
-# EXTERNAL DECLARATIONS
-#===============================================================================
-
-import sys, re
-
-#===============================================================================
-# LOCAL DECLARATIONS
-#===============================================================================
-
-# regular expression to get lines with no whitespace in front and a single word.
-secre = re.compile('^([^\s]+)\s*$')
-
-#-------------------------------------------------------------------------------
-#
-def getlines( fn ):
- """Opens the given file and detects the section lines. Return the line
- numbers."""
-
- if fn == '-':
- f = sys.stdin
- else:
- try:
- f = open(fn, 'r')
- except IOError, e:
- raise SystemExit("Error: opening file '%s':\n%s" % (fn, str(e)))
-
- filelines = f.readlines()
-
- minthres = 3
- seclines = []
- lc = -1
- for l in filelines:
- lc += 1
-
- mo = secre.match(l)
- if not mo:
- continue
-
- l = mo.group(1)
- if len(l) < minthres:
- continue
-
- c = l[0]
- skip = 0
- for cc in l[1:]:
- if c != cc:
- skip = 1
- break
- if not skip:
- seclines.append(lc)
-
- return seclines, filelines
-
-#-------------------------------------------------------------------------------
-#
-def compute_order( seclines, filelines ):
- """Compute ordering characters."""
-
- secorder = []
- prevord = -1
- for sl in seclines:
- l = filelines[sl]
-
- try:
- prevord = secorder.index(l[0])
- except ValueError:
- if prevord != len(secorder) - 1:
- raise SystemExit(\
- "Error: sections are not consistent at line '%d'" % (sl+1))
- prevord = len(secorder)
- secorder.append(l[0])
-
- return secorder
-
-#===============================================================================
-# MAIN
-#===============================================================================
-
-#-------------------------------------------------------------------------------
-#
-def main():
- debug = False
-
- import optparse
- parser = optparse.OptionParser(__doc__)
- parser.add_option('-u', '--up', action="store_true", dest="direction",
- default=True,
- help="specify move sections up (default)")
- parser.add_option('-d', '--down', action="store_false", dest="direction",
- help="specify move sections down")
- opts, args = parser.parse_args()
-
- if len(args) != 2:
- raise SystemExit('Error: please a new character and a single filename.')
- newchar, fn = args
-
- seclines, filelines = getlines(fn)
-
- secorder = compute_order(seclines, filelines)
-
- # create new output order.
- if opts.direction: # up
- neworder = [newchar] + secorder[:-1]
- else: # down
- neworder = secorder[1:] + [newchar]
-
- # compute a mapping of old to new
- omap = {}
- for i in xrange(len(secorder)):
- omap[ secorder[i] ] = neworder[i]
-
- if debug:
- for sl in seclines:
- l = filelines[sl]
- print secorder.index(l[0]), l,
- from pprint import pprint
- print secorder
- print neworder
- pprint(omap)
-
- # perform replacement of desired line, preserve original whitespace.
- for sl in seclines:
- l = filelines[sl]
- nc = len(l.strip())
- filelines[sl] = omap[ l[0] ] * nc + l[nc:]
-
- # output.
- for l in filelines:
- sys.stdout.write(l)
-
-if __name__ == '__main__':
- main()
diff --git a/sandbox/blais/pickle_writer/README.txt b/sandbox/blais/pickle_writer/README.txt
deleted file mode 100644
index 13cbee2b6..000000000
--- a/sandbox/blais/pickle_writer/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-===================
- A pickle writer
-===================
-
-:Author: Martin Blais
-:Contact: blais@furius.ca
-:Date: $Date$
-
-
-A pickle Writer.
diff --git a/sandbox/blais/pickle_writer/pickle.py b/sandbox/blais/pickle_writer/pickle.py
deleted file mode 100644
index 3d7608dd7..000000000
--- a/sandbox/blais/pickle_writer/pickle.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Authors: Martin Blais
-# Contact: blais@furius.ca
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A writer that pickles the document tree to a binary string.
-Later unpickling will allow you to publish with other Writers.
-"""
-
-from docutils import writers
-import cPickle as pickle
-
-
-class Writer(writers.UnfilteredWriter):
-
- supported = ('pickle')
- """Formats this writer supports."""
-
- config_section = 'pickle writer'
- config_section_dependencies = ('writers',)
-
- output = None
- """Final translated form of `document`."""
-
- def translate(self):
- # Remove stuff that cannot be pickled:
- self.document.transformer = None
- self.document.reporter = None
- # Note: we use the highest protocol, it has some binary in it:
- self.output = pickle.dumps(self.document)
diff --git a/sandbox/blais/rstserver/README.txt b/sandbox/blais/rstserver/README.txt
deleted file mode 100644
index a5c093487..000000000
--- a/sandbox/blais/rstserver/README.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-===============
-ReST CGI server
-===============
-
-:Author: Martin Blais
-:Contact: blais@furius.ca
-:Date: $Date$
-
-These tools are used to automatically convert a hierarchy of rest (docutils)
-documents into HTML, from a CGI script running off an HTTP server.
-
-
diff --git a/sandbox/blais/rstserver/TODO.txt b/sandbox/blais/rstserver/TODO.txt
deleted file mode 100644
index 07a227ff8..000000000
--- a/sandbox/blais/rstserver/TODO.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-====
-TODO
-====
-
-:Author: Martin Blais <blais@iro.umontreal.ca>
-
-
-Devel version
--------------
-
-- add title
-- style.css
-- remove .txt in indexes
-- read index.txt if present, concat info
-- read titles instead of using filenames (parse by hand)
-- filter directories (e.g. cvs)
-- use appropriate style.css
-- remove second header page
-- use HTMLout to produce html?
-- what if a file disappears?
-- don't output errors from docutils
-- add instructions on how to create a config file
-- how to setup web server, etc.
-- clean up file and functions
-- fix major problem with images and links within subdirectories
-- add %(home) to the default config parser environment
-- add redirect "Please wait... regenerating file."
-
-Ideas:
-
-- parse the whole thing, extract document titles
-- generate index.txt for each directory
-- unless a special directive is present within the index.txt file (if
- present), concatenate to the read index.txt
-- output all documents in a separate root directory, with the same
- structure
-- start from buildhtml.py
-
diff --git a/sandbox/blais/rstserver/bin/rst-server.cgi b/sandbox/blais/rstserver/bin/rst-server.cgi
deleted file mode 100755
index 03cada1cc..000000000
--- a/sandbox/blais/rstserver/bin/rst-server.cgi
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/env python2
-#
-# $Id$
-# $Source$
-#
-
-"""docutils to HTML CGI converter.
-
-CGI script that automatically converts docutils files into html and serves
-it. The script caches the HTML files and uses the timestamps to regenerate if
-necessary. Also, the indexes are generated automatically.
-
-
-"""
-
-__author__ = 'Martin Blais <blais@iro.umontreal.ca>'
-__version__ = '$Revision$'
-
-#===============================================================================
-# EXTERNAL DECLARATIONS
-#===============================================================================
-
-import sys
-assert sys.version_info[0] == 2
-if sys.version_info[1] > 1:
- import cgitb; cgitb.enable()
-
-import os, cgi, stat, re
-from os.path import *
-import commands
-from pprint import pprint
-
-from ConfigParser import ConfigParser
-#cgi.print_environ()
-
-if not os.environ.has_key('NO_CONTENT_TYPE'):
- print "Content-type: text/html"
-
-
-#===============================================================================
-# LOCAL DECLARATIONS
-#===============================================================================
-
-configfn = join(os.getcwd(), 'rst-server.conf')
-if not exists(configfn):
- print 'Error: config file "%s" does not exist' % configfn
- sys.exit(1)
-
-confparser = ConfigParser()
-confparser.add_section('options')
-confparser.read(configfn)
-
-class Dummy: pass
-opts = Dummy()
-
-for o in ['source', 'cache', 'converter']:
- if not confparser.has_option('options', o):
- print 'Error: must configure variable', o
- raise SystemExit()
- setattr(opts, o.replace('-', '_'), confparser.get('options', o))
-
-for o in ['docutils-config']:
- val = None
- if confparser.has_option('options', o):
- val = confparser.get('options', o)
- setattr(opts, o.replace('-', '_'), val)
-
-form = cgi.FieldStorage()
-if form.has_key('p'):
- fn = form["p"].value
-else:
- fn = ''
-
-if os.environ.has_key('CONVERTER'):
- opts.converter = os.environ['CONVERTER']
-
-# if from_php:
-# if len(sys.argv) > 1:
-# fn = sys.argv[1]
-
-#===============================================================================
-# LOCAL DECLARATIONS
-#===============================================================================
-
-rootstr = '(notes)'
-
-rejre = map(re.compile, ['^\s*[-=]+\s*$', '^\.\.', '^\s*$', '\s*:\w+:'])
-
-def gettitle( fn ):
-
- #print '<pre>'
- try:
- f = open(fn, 'r')
- while 1:
- l = f.readline()
- if not l:
- break
- rej = 0
- for r in rejre:
- if r.match(l):
- rej = 1
- break
- if rej:
- #print l
- continue
-
- title = l.strip()
- break
- f.close()
- except:
- title = fn
- #print '</pre>'
-
- # prevent tag-only titles, at least we'll get an error message
- if title[0] == '<' and title[-1] == '>':
- title = title[1:-1]
- return title
-
-valre = re.compile('(.*)\.txt')
-
-def nav( fn, script ):
- if fn and isfile(join(opts.source, fn)):
- mo = valre.match(fn)
- assert(mo)
- fn = mo.group(1)
-
- comps = []
- if fn:
- fn = normpath(fn)
- comps += fn.split(os.sep)
-
- print '<table class="toptable">'
- print '<tr><td>'
- ccomps = []
- cpath = ''
- if comps:
- for i in comps[0:-1]:
- cpath = join(cpath, i)
- ccomps.append('<a href="%s?p=%s">%s</a>' % (script, cpath, i))
- ccomps.append('%s' % comps[-1])
- ccomps = ['<a href="%s">%s</a>' % (script, rootstr)] + ccomps
- print '&nbsp;&raquo;&nbsp;'.join(ccomps)
- print '</td></tr>'
- print '</table>'
-
-print """
-<?xml version="1.0" encoding="iso8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="GENERATOR" content="home made recipe in python">
- <style type="text/css"><!--
-
-.toptable {
- width: 100%;
- background-color: #EEEEEE }
-
-.sep {
- width: 100px }
-
-.conversion-error {
- background-color: #FF8888;
- margin: 0.5em;
- padding: 1em }
-
---></style>
-</head>
-
-<body>
-"""
-
-
-
-script = os.environ['SCRIPT_NAME']
-
-# make sure the cache directory exists
-if not exists(opts.cache):
- os.mkdir(opts.cache)
-
-if fn:
- srcfn = join(opts.source, fn)
-else:
- srcfn = opts.source
-
-nav(fn, script)
-
-class Page:
- def __init__( self, fn, base ):
- self.fn = fn
- self.base = base
- self.title = base
-
-if not exists(srcfn):
- print 'Error: this file does not exist'
-else:
- if isdir(srcfn):
- #cachefn = join(cache, fn, 'index.html')
-
- files, dirs = [], []
- for f in os.listdir(srcfn):
- if f.startswith('.') or f.startswith('#'):
- continue
- if f == 'CVS':
- continue
- af = join(srcfn, f)
- if isfile(af):
- mo = valre.match(f)
- if mo:
- files.append( Page(f, mo.group(1)) )
- elif isdir(af):
- dirs.append(f)
-
- print '<ul>'
- for f in files:
- f.title = gettitle(join(srcfn, f.fn))
- files.sort(lambda x, y: cmp(x.title, y.title))
-
- for f in files:
- print '<li><a href="%s?p=%s">%s</li>' % \
- (script, join(fn, f.fn), f.title)
- print '</ul>'
-
- print '<ul>'
- for f in dirs:
- print '<li><a href="%s?p=%s">%s</li>' % (script, join(fn, f), f)
- print '</ul>'
- else:
- if not fn.endswith('.txt'):
- print 'request for file not ending in .txt', fn
- sys.exit(0)
-
- cachefn = join(opts.cache, '%s.html' % splitext(fn)[0])
- regen = 1
- if exists(srcfn) and exists(cachefn):
- fnstat, cachestat = map(os.stat, [srcfn, cachefn])
- if fnstat[stat.ST_MTIME] <= cachestat[stat.ST_MTIME]:
- # use cache
- regen = 0
-
- if regen:
- cachedir = dirname(cachefn)
- if not exists(cachedir):
- os.makedirs(cachedir)
-
- cmd = opts.converter
- if opts.docutils_config:
- cmd += ' --config="%s"' % opts.docutils_config
- cmd += ' "%s" "%s" 2>&1' % (srcfn, cachefn)
- if 0:
- chin, chout, cherr = os.popen3(cmd)
- chin.close()
- err = chout.read()
- out = chout.read()
- else:
- s, out = commands.getstatusoutput(cmd)
- if out:
- print '<div class="conversion-error">'
- print 'Error: converting document:'
- print '<pre>'
- print out
- print '</pre>'
- print '</div>'
-
-
- print open(cachefn, 'r').read()
-
-print """
-</body>
-</html>
-"""
-
diff --git a/sandbox/blais/rstserver/etc/rst-server.php b/sandbox/blais/rstserver/etc/rst-server.php
deleted file mode 100644
index 1e4238bd3..000000000
--- a/sandbox/blais/rstserver/etc/rst-server.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-#
-# $Id$
-# $Source$
-#
-# PHP script to call on the python CGI script.
-#
-# This is only an example, where a site has PHP enabled but not CGI.
-#
-
-$p = $_GET["p"];
-$python = "/DLlocal/blais/httpd-soft/bin/python";
-$env =
-"CONVERTER=\"$python ".
-"/DLlocal/blais/httpd-soft/bin/html.py\" ".
-"NO_CONTENT_TYPE=1 ".
-"SCRIPT_NAME=$SCRIPT_NAME ";
-
-system("$env $python rst-server.cgi \"p=$p\" 2>&1 ");
-
-?>
diff --git a/sandbox/cben/make/Makefile b/sandbox/cben/make/Makefile
deleted file mode 100644
index 81679f24d..000000000
--- a/sandbox/cben/make/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# .. -*- Makefile -*-
-
-# This makefile only builds documention for ``Makefile.docutils`` (which see).
-
-DOCS = Makefile.docutils.txt README.txt
-ALL = html
-
-include Makefile.docutils
-
-Makefile.docutils.txt: Makefile.docutils
- ./make2rst.py $< > $@
diff --git a/sandbox/cben/make/Makefile.docutils b/sandbox/cben/make/Makefile.docutils
deleted file mode 100644
index c7f785327..000000000
--- a/sandbox/cben/make/Makefile.docutils
+++ /dev/null
@@ -1,454 +0,0 @@
-# .. -*- Makefile -*-
-
-# ******************************************************
-# Generic makefile for document processing with docutils
-# ******************************************************
-
-# This file provides typical rules for processing documents with docutils. By
-# default it provides common targets (`all`, `pdf`, `clean`, etc.) for
-# processing all ``*.txt`` files in this directory.
-
-# You should be able to customize just about everything by setting variables
-# defined here (they all have defaults and are documented in comments). You
-# can set them on make's command line or by building your own makefile that
-# sets them before including this one. For simplest cases, you'd want to give
-# `DOCS` and perhaps `ALL`.
-#
-# Some things can be customized per document with make's
-# per-target/per-pattern variable assignment syntax, e.g. ``mydoc.ps: FLAGS +=
-# --no-doc-title``. Unfortunately this won't work for any variables that
-# affect rules sources/targets (in particular, extension variables and
-# variables that enable pre/postprocessing).
-
-# If you want deeper customization or to integrate this into your makefile(s)
-# for other things, you can make it very include-friendly by flipping a few
-# settings:
-#
-# - All variables can be put in a "namespace" by setting the variable
-# `docutils.` (note the dot!) to the desired prefix. In comments, variable
-# names are given without the prefix.
-#
-# - The non-pattern common targets and, to a lesser degree, the LaTeX rules
-# might conflict with your rules. You can disable them by setting
-# `ENABLE_COMMON_TARGETS` and/or `ENABLE_LATEX_RULES` to ``0``.
-#
-# - The most common targets, like `all`, don't have commands but depend on
-# targets like `docutils.all` that do the real work. This way they are
-# automatically merged with your dependencies and commands for the same
-# name.
-
-# This file should be self-documenting; read it file for the full list of
-# customizable variables and other gory details...
-
-# GNU Make is required! Some targets use common unix utils.
-
-# The latest version of this file lives at
-# http://docutils.sourceforge.net/sandbox/cben/make/Makefile.docutils
-
-
-# "Namespace"
-# ***********
-
-# All variables defined in this file can be optionally prefixed with anything
-# you want (e.g. ``DOCUTILS.``) to avoid namespace pollution. To enable
-# this, set the variable `docutils.` (note the period in the variable name) to
-# the desired prefix. Note that then, you would have to use the prefix when
-# setting any variables that affect this file...
-docutils. ?=
-##docutils. ?= DOCUTILS.
-
-# Pattern rules - very include-friendly makefile portion
-# ******************************************************
-
-# This part is designed to be included in makefiles. It supplies implicit
-# pattern rules for docutils' tools. All that is left to you is to request
-# building of files with extensions of the output formats (.html, .tex, .dvi,
-# .ps, .pdf). You should have (or be able to build) input files with .txt
-# extension. Almost everything (including extensions) is configurable by
-# setting variables defined in this file. You should set these variables
-# before including this file to avoid problems.
-
-# If you also want typical explicit rules for targets like ``html``, ``dvi``
-# and ``clean`` to build associated files, you will find them in later
-# sections...
-
-# Tool names
-# ==========
-
-# `TOOLS` lists the tools / processing stages that are supported and have [at
-# least some] associated variables according to the conventions below. It
-# provides some introspection ablity, currently used in the `docutils.clean`
-# target for computing the list of output extensions.
-$(docutils.)TOOLS += RST2HTML PEPTOOL RST2LATEX RST2PDFLATEX \
- MATHHACK IMGMATHHACK \
- HTML_WILD_EXTS LATEX_WILD_EXTS PDFLATEX_WILD_EXTS
-
-# As accustomed in makefiles, tool names can be customized by setting
-# variables named after the tools. Here they are slightly more systemathic
-# than their current names.
-
-# ``html.py`` is expected to be renamed to ``rst2html.py`` soon.
-ifneq "$(shell which rst2html.py)" ""
-$(docutils.)RST2HTML ?= rst2html.py
-else
-$(docutils.)RST2HTML ?= html.py
-endif
-
-$(docutils.)RST2LATEX ?= rst2latex.py
-
-# ``rstpep2html.py`` is the RST PEP -> HTML converter tool;
-# ``pep2html.py`` also supports old PEP format and does extra PEP
-# services.
-$(docutils.)RSTPEP2HTML ?= rstpep2html.py
-
-$(docutils.)PEPTOOL ?= pep2html.py
-
-# In this makefile I use only PEPTOOL (too bad RSTPEP2HTML doesn't support the
-# old pep format, it has a better command-line interface).
-
-# More such variables appear in the pre/postprocessing sections below.
-
-# @@@ TODO: Support other tools, e.g. RST2XML.
-
-# Extensions
-# ==========
-
-# For simplicity, only one source extension is supported at a time. If you
-# need to allow several (e.g. ``.txt`` and ``.rst``), you should be able to
-# call make recursively several times, setting `SRCEXT` to a different value
-# each time...
-$(docutils.)SRCEXT ?= .txt
-
-# There are various reasons to preprocess/postprocess docutils. This makefile
-# directly supports some ways and should play nice with others. It's more
-# convenient to use intermediate files than pipes (because then you can easily
-# inspect them for debugging). So we need a way to insert intermediate files
-# into the dependency chain. Solution: variables (`<toolname>.SRCEXT` and
-# `<toolname>.TRGEXT`) that control the source/target extensions of each rule.
-# These variables must be set before the rules that use them.
-$(docutils.)PEPTOOL.SRCEXT ?= $($(docutils.)SRCEXT)
-$(docutils.)PEPTOOL.TRGEXT ?= .html
-$(docutils.)RST2HTML.SRCEXT ?= $($(docutils.)SRCEXT)
-$(docutils.)RST2HTML.TRGEXT ?= .html
-$(docutils.)RST2LATEX.SRCEXT ?= $($(docutils.)SRCEXT)
-$(docutils.)RST2LATEX.TRGEXT ?= .tex
-
-# PDFLaTeX might need different processing and extension (in particular
-# because no image format is supported by both it and LaTeX). This is sort of
-# a hack: pretend we have a separate RST2PDFLATEX tool.
-$(docutils.)RST2PDFLATEX.SRCEXT ?= $($(docutils.)RST2LATEX.SRCEXT)
-$(docutils.)RST2PDFLATEX.TRGEXT ?= .pdftex
-
-# Specific preprocessing/postprocessing support
-# ---------------------------------------------
-
-# The extension manipulation is subtle. It's important to use simple
-# variables (set with ``:=``) to allow chaining. Since each processing stage
-# can be enabled independently of others, they can only be attached to the
-# main tool (e.g. RST2HTML).
-
-# Note that PEPTOOL is not supported here because non-standard processing is
-# not a good idea in PEPs anyway. Won't be a big problem to add if needed...
-
-# @@@ TODO: Support as many external/sandbox tools as possible.
-
-# sandbox/cben/rolehack math preprocessing hacks
-# ..............................................
-
-# This makefile provides rules that support preprocessing by
-# `<../rolehack/mathhack.py>`_ and `<../rolehack/imgmathhack.py>`_. Set
-# `ENABLE_MATHHACK` to 1 to run them before rst2html.py and rst2latex.py.
-$(docutils.)ENABLE_MATHHACK ?= 0
-
-$(docutils.)MATHHACK.SRCEXT := $($(docutils.)RST2LATEX.SRCEXT)
-ifeq "$(origin $(docutils.)MATHHACK.TRGEXT)" "undefined"
-$(docutils.)MATHHACK.TRGEXT := $($(docutils.)RST2LATEX.SRCEXT).mathhack
-endif
-
-# In theory, IMGMATHHACK is applicable to all tools. It's not very useful
-# with anything but RST2HTML, so that's the only one we attach to currently...
-$(docutils.)IMGMATHHACK.SRCEXT := $($(docutils.)RST2HTML.SRCEXT)
-ifeq "$(origin $(docutils.)IMGMATHHACK.TRGEXT)" "undefined"
-$(docutils.)IMGMATHHACK.TRGEXT := $($(docutils.)RST2HTML.SRCEXT).imgmathhack
-endif
-
-ifeq "$($(docutils.)ENABLE_MATHHACK)" "1"
-$(docutils.)RST2LATEX.SRCEXT := $($(docutils.)MATHHACK.TRGEXT)
-$(docutils.)RST2HTML.SRCEXT := $($(docutils.)IMGMATHHACK.TRGEXT)
-endif
-
-# If any preprocessing has been applied, it's good to tell docutils the name
-# of the original file. But in current docutils, ``--source-url`` forces on
-# ``--source-link``. So you can control this option, per tool.
-$(docutils.)RST2LATEX.ENABLE_SOURCE_URL ?= 0
-ifeq "$($(docutils.)RST2LATEX.ENABLE_SOURCE_URL)" "1"
-$(docutils.)RST2LATEX.FLAGS += --source-url=$*$($(docutils.)SRCEXT)
-endif
-
-$(docutils.)RST2HTML.ENABLE_SOURCE_URL ?= 0
-ifeq "$($(docutils.)RST2HTML.ENABLE_SOURCE_URL)" "1"
-$(docutils.)RST2HTML.FLAGS += --source-url=$*$($(docutils.)SRCEXT)
-endif
-
-# You can set `MATHHACK_DIR` to provide an explicit location for these scripts
-# (you must include a trailing slash!). You can also change the tool name
-# variables completely...
-$(docutils.)MATHHACK_DIR ?=
-$(docutils.)MATHHACK ?= $($(docutils.)MATHHACK_DIR)mathhack.py
-$(docutils.)IMGMATHHACK ?= $($(docutils.)MATHHACK_DIR)imgmathhack.py
-
-%$($(docutils.)MATHHACK.TRGEXT): %$($(docutils.)MATHHACK.SRCEXT)
- $($(docutils.)MATHHACK) $< $@
-
-%$($(docutils.)IMGMATHHACK.TRGEXT): %$($(docutils.)IMGMATHHACK.SRCEXT)
- $($(docutils.)IMGMATHHACK) $< $@
-
-# Rudimentary adaptation of ``.*`` file extensions to output format
-# .................................................................
-
-# Docutils currently doesn't support referencing different files depending on
-# on the output format (e.g. LaTeX requires EPS images but HTML supports
-# everything else). Here are simple sed scripts, converting ``.*`` to one
-# extension for images and one for links, different for each tool. **Be
-# warned that the regexps are not bullet-proof and could be confused!**
-
-# Set `ENABLE_WILD_EXTS` to 1 if you want to enable them.
-$(docutils.)ENABLE_WILD_EXTS ?= 0
-
-# This is an arbitrary guess, quite probable that you would want to change it.
-$(docutils.)HTML_WILD_EXTS.IMGEXT ?= .png
-# ``.htm`` is also widespread but here we mostly talk about local files
-# produced with docutils.
-$(docutils.)HTML_WILD_EXTS.LINKEXT ?= .html
-
-# LaTeX only undestands Encapsulated PostScript.
-$(docutils.)LATEX_WILD_EXTS.IMGEXT ?= .eps
-# LaTeX is just as well convetible to PS but only PDF supports links, so this
-# is a good guess...
-$(docutils.)LATEX_WILD_EXTS.LINKEXT ?= .pdf
-
-# PDFLaTeX understands common formats like PNG but doesn't understand EPS!
-$(docutils.)PDFLATEX_WILD_EXTS.IMGEXT ?= .png
-# Again, PDFLaTeX supports links.
-$(docutils.)PDFLATEX_WILD_EXTS.LINKEXT ?= .pdf
-
-# Intermediate extensions:
-$(docutils.)HTML_WILD_EXTS.SRCEXT ?= .html.wild_exts
-$(docutils.)LATEX_WILD_EXTS.SRCEXT ?= .tex.wild_exts
-$(docutils.)PDFLATEX_WILD_EXTS.SRCEXT ?= .pdftex.wild_exts
-
-# Chain to the tools.
-$(docutils.)HTML_WILD_EXTS.TRGEXT := $($(docutils.)RST2HTML.TRGEXT)
-$(docutils.)LATEX_WILD_EXTS.TRGEXT := $($(docutils.)RST2LATEX.TRGEXT)
-$(docutils.)PDFLATEX_WILD_EXTS.TRGEXT := $($(docutils.)RST2PDFLATEX.TRGEXT)
-
-ifeq "$($(docutils.)ENABLE_WILD_EXTS)" "1"
-$(docutils.)RST2HTML.TRGEXT := $($(docutils.)HTML_WILD_EXTS.SRCEXT)
-$(docutils.)RST2LATEX.TRGEXT := $($(docutils.)LATEX_WILD_EXTS.SRCEXT)
-$(docutils.)RST2PDFLATEX.TRGEXT := $($(docutils.)PDFLATEX_WILD_EXTS.SRCEXT)
-endif
-
-%$($(docutils.)HTML_WILD_EXTS.TRGEXT): %$($(docutils.)HTML_WILD_EXTS.SRCEXT)
- sed -e 's/\( [sS][rR][cC]="[^"]*\)\.\*"/\1$($(docutils.)HTML_WILD_EXTS.IMGEXT)"/g' -e "s/\( [sS][rR][cC]='[^']*\)\.\*'/\1$($(docutils.)HTML_WILD_EXTS.IMGEXT)'/g" -e 's/\( [hH][rR][eE][fF]="[^"]*\)\.\*"/\1$($(docutils.)HTML_WILD_EXTS.LINKEXT)"/g' -e "s/\( [hH][rR][eE][fF]='[^']*\)\.\*'/\1$($(docutils.)HTML_WILD_EXTS.LINKEXT)'/g" $< > $@
-
-%$($(docutils.)LATEX_WILD_EXTS.TRGEXT): %$($(docutils.)LATEX_WILD_EXTS.SRCEXT)
- sed -e 's/\(\\includegraphics{[^}]*\)\.\*}/\1$($(docutils.)LATEX_WILD_EXTS.IMGEXT)}/g' -e 's/\(\\href{[^}]*\)\.\*}/\1$($(docutils.)LATEX_WILD_EXTS.LINKEXT)}/g' $< > $@
-
-%$($(docutils.)PDFLATEX_WILD_EXTS.TRGEXT): %$($(docutils.)PDFLATEX_WILD_EXTS.SRCEXT)
- sed -e 's/\(\\includegraphics{[^}]*\)\.\*}/\1$($(docutils.)PDFLATEX_WILD_EXTS.IMGEXT)}/g' -e 's/\(\\href{[^}]*\)\.\*}/\1$($(docutils.)PDFLATEX_WILD_EXTS.LINKEXT)}/g' $< > $@
-
-
-# Config files and extra flags
-# ============================
-
-# Consider using config files instead of flags for most tasks. To specify
-# config file(s) other than the default, set `CONFIG` to a space-separated
-# list of them. Later files override earlier ones (and all override the
-# `DOCUTILSCONFIG` environment variable, which you should *not* touch in a
-# Makefile, it's for the user). Non-existant config files are ignored.
-#
-# Relative file names in `CONFIG` are relative to the current directory,
-# independently of the target name. If you use ``%`` in `CONFIG`, it will be
-# replaced with the target name (without extension) and it will be
-# interpretted relative to the target's directory -- giving you per-file
-# configs.
-$(docutils.)CONFIG ?=
-
-# I found absolutely no way to implement in make per-directory config file
-# dependencies that don't depend on the target basename. You can just do::
-#
-# $(docutils.)FLAGS += $(*D)/config.file.name
-#
-# but it won't be considered a dependency (which is not such a big issue). Or
-# you can always run make in the directory of the target...
-
-# You can provide extra docutils options by setting variables named
-# `<toolname>.FLAGS`. `FLAGS` gives default flags for all tools.
-$(docutils.)FLAGS += $(foreach c,$($(docutils.)CONFIG),--config=$(subst %,$(*D)/,$(findstring %,$(c)))$(subst %,$(*F),$(c)))
-$(docutils.)RST2HTML.FLAGS += $($(docutils.)FLAGS)
-$(docutils.)RST2LATEX.FLAGS += $($(docutils.)FLAGS)
-$(docutils.)PEPTOOL.FLAGS += $($(docutils.)FLAGS)
-
-
-# Extra dependencies
-# ==================
-
-# When docutils config files change, it usually affects docutils' so it should
-# be rebuilt. So we add them as dependencies.
-#
-# .. note:: Deletion of a config file will *not* cause a rebuild.
-
-# Figure out the default config files from the environment:
-DOCUTILSCONFIG ?= /etc/docutils.conf:./docutils.conf:$(HOME)/.docutils
-
-# You can set `CONFIG_DEPS` to override the depencies on config files without
-# changing the actual config files used by docutils. It's space-separated.
-$(docutils.)CONFIG_DEPS ?= $(subst :, ,$(DOCUTILSCONFIG)) $($(docutils.)CONFIG)
-
-# `EXTRA_DEPS` specifies the actual extra dependencies.
-#
-# Config files that exist are automatically included (unexistant ones would
-# cause make to complain that it doesn't know how to build them).
-$(docutuls.)EXTRA_DEPS += $(wildcard $($(docutils.)CONFIG_DEPS))
-
-# Note also that you can supply extra dependencies for pattern rules by
-# yourself, as long as you don't provide commands, e.g. ::
-#
-# foo.html: extra_deps
-#
-# Typical extra depencies you'd want to add: HTML stylesheets (if you embed
-# them), files appearing in ``.. include::``.
-
-
-# HTML output
-# ===========
-
-# pep-%.html must be before the %.html rule to get higher priority.
-pep-%$($(docutils.)PEPTOOL.TRGEXT): pep-%$($(docutils.)PEPTOOL.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)PEPTOOL) $($(docutils.)PEPTOOL.FLAGS) $<
-ifneq "$($(docutils.)PEPTOOL.TRGEXT)" ".html"
- # $($(docutils.)PEPTOOL) lacks output file name control, work around.
- mv $(basename $<).html $<
-endif
-
-%$($(docutils.)RST2HTML.TRGEXT): %$($(docutils.)RST2HTML.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)RST2HTML) $($(docutils.)RST2HTML.FLAGS) $< $@
-
-# LaTeX output
-# ============
-
-%$($(docutils.)RST2LATEX.TRGEXT): %$($(docutils.)RST2LATEX.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)RST2LATEX) $($(docutils.)RST2LATEX.FLAGS) $< $@
-
-# LaTeX processing rules
-# ----------------------
-
-# This part is not fully parametrized; it's not related to docutils so if you
-# want to get fancy in this respect, provide your own rules. You can disable
-# the rules here, by setting `ENABLE_LATEX_RULES` to 0.
-$(docutils.)ENABLE_LATEX_RULES ?= 1
-
-# PDFLaTeX does a better job than LaTeX->DVIPDF (e.g. it supports hyperlinks
-# and generates a PDF outline) but you usually can't run the same file through
-# both LaTeX and PDFLaTeX because they don't understand a single common
-# format. Solution: there is a separate preprocessing stage
-# PDFLATEX_WILD_EXTS. Set this to 0 to go through DVIPDF.
-$(docutils.)ENABLE_PDFLATEX ?= 1
-
-ifeq "$($(docutils.)ENABLE_LATEX_RULES)" "1"
-
-# These variables are common-practice but it's still cleaner to put them in
-# the "namespace".
-
-$(docutils.)LATEX ?= latex
-$(docutils.)PDFLATEX ?= pdflatex
-$(docutils.)DVIPS ?= dvips
-$(docutils.)DVIPDF ?= dvipdf
-
-%.dvi: %.tex
- cd $(*D); $(LATEX) $(*F)
-
-%.ps: %.dvi
- $(DVIPS) $< -o $@
-
-ifeq "$($(docutils.)ENABLE_PDFLATEX)" "1"
-%.pdf: %.pdftex
- cd $(*D); $(PDFLATEX) $(*F).pdftex
-else
-%.pdf: %.dvi
- $(DVIPDF) $< $@
-endif
-
-endif # ENABLE_LATEX_RULES
-
-# Fallback when you don't provide for different PDFLaTeX processing.
-%$($(docutils.)RST2PDFLATEX.TRGEXT): %$($(docutils.)RST2LATEX.TRGEXT)
- cp $< $@
-
-
-# Typical standard targets
-# ************************
-
-# This section provides typical rules for processing documents with docutils.
-# Since they might clash with your rules, they are optional and can be
-# disabled by setting `ENABLE_COMMON_TARGETS` to ``0``.
-$(docutils.)ENABLE_COMMON_TARGETS ?= 1
-
-# `DOCS` gives the documents to process. You should typically set this
-# (defaults to all files with the source extension in current directory).
-$(docutils.)DOCS ?= $(wildcard *$($(docutils.)SRCEXT))
-
-# `STEMS` is the docs list without the source extension, (makes rules shorter).
-$(docutils.)STEMS ?= $($(docutils.)DOCS:$($(docutils.)SRCEXT)=)
-
-# Set `ALL` to change the things to build by default.
-$(docutils.)ALL ?= html ps pdf
-
-ifeq "$($(docutils.)ENABLE_COMMON_TARGETS)" "1"
-
-docutils.all: $($(docutils.)ALL)
-
-# Targets like ``clean`` weren't directly used. Rather they don't have
-# commands but have targets like ``docutils.clean`` (that do have commands) as
-# prerequisites. This allows you to give your commands for them. You can
-# inhibit these alias dependencies by setting `ENABLE_SHORT_TARGETS` to 0.
-$(docutils.)ENABLE_SHORT_TARGETS ?= 1
-
-ifeq "$($(docutils.)ENABLE_SHORT_TARGETS)" "1"
-all: docutils.all
-safeclean: docutils.safeclean
-mostlyclean: docutils.mostlyclean
-clean: docutils.clean
-endif
-
-html: $($(docutils.)STEMS:=.html)
-tex: $($(docutils.)STEMS:=.tex)
-dvi: $($(docutils.)STEMS:=.dvi)
-ps: $($(docutils.)STEMS:=.ps)
-pdf: $($(docutils.)STEMS:=.pdf)
-
-# Extensions of unneeded byproducts (specifically, LaTeX byproducts).
-$(docutils.)SAFECLEAN_EXTS += .log .aux .out .toc
-
-# Extensions that are direct outputs of this makefile.
-$(docutils.)CLEAN_EXTS += $(foreach tool,$($(docutils.)TOOLS),$($(docutils.)$(tool).TRGEXT))
-$(docutils.)CLEAN_EXTS += .dvi .ps .pdf
-
-# `safeclean` cleans only unneeded byproducts.
-docutils.safeclean:
- -rm -f $(foreach ext,$($(docutils.)SAFECLEAN_EXTS),$($(docutils.)STEMS:=$(ext)))
-
-# `mostlyclean` cleans almost everything.
-docutils.mostlyclean: docutils.safeclean
- -rm -f $(foreach ext,$($(docutils.)CLEAN_EXTS),$($(docutils.)STEMS:=$(ext)))
-
-# `clean` also cleans imgmathhack images that take a lot of time to rebuild.
-docutils.clean: docutils.mostlyclean
-ifeq "$($(docutils.)ENABLE_MATHHACK)" "1"
- -rm -rf ./imgmath/
-endif
-
-endif # ENABLE_COMMON_TARGETS
diff --git a/sandbox/cben/make/Makefile.docutils.txt b/sandbox/cben/make/Makefile.docutils.txt
deleted file mode 100644
index 956ecdb06..000000000
--- a/sandbox/cben/make/Makefile.docutils.txt
+++ /dev/null
@@ -1,617 +0,0 @@
- .. -*- Makefile -*-
-
-******************************************************
-Generic makefile for document processing with docutils
-******************************************************
-
-This file provides typical rules for processing documents with docutils. By
-default it provides common targets (`all`, `pdf`, `clean`, etc.) for
-processing all ``*.txt`` files in this directory.
-
-You should be able to customize just about everything by setting variables
-defined here (they all have defaults and are documented in comments). You
-can set them on make's command line or by building your own makefile that
-sets them before including this one. For simplest cases, you'd want to give
-`DOCS` and perhaps `ALL`.
-
-Some things can be customized per document with make's
-per-target/per-pattern variable assignment syntax, e.g. ``mydoc.ps: FLAGS +=
---no-doc-title``. Unfortunately this won't work for any variables that
-affect rules sources/targets (in particular, extension variables and
-variables that enable pre/postprocessing).
-
-If you want deeper customization or to integrate this into your makefile(s)
-for other things, you can make it very include-friendly by flipping a few
-settings:
-
-- All variables can be put in a "namespace" by setting the variable
- `docutils.` (note the dot!) to the desired prefix. In comments, variable
- names are given without the prefix.
-
-- The non-pattern common targets and, to a lesser degree, the LaTeX rules
- might conflict with your rules. You can disable them by setting
- `ENABLE_COMMON_TARGETS` and/or `ENABLE_LATEX_RULES` to ``0``.
-
- - The most common targets, like `all`, don't have commands but depend on
- targets like `docutils.all` that do the real work. This way they are
- automatically merged with your dependencies and commands for the same
- name.
-
-This file should be self-documenting; read it file for the full list of
-customizable variables and other gory details...
-
-GNU Make is required! Some targets use common unix utils.
-
-The latest version of this file lives at
-http://docutils.sourceforge.net/sandbox/cben/make/Makefile.docutils
-
-
-"Namespace"
-***********
-
-All variables defined in this file can be optionally prefixed with anything
-you want (e.g. ``DOCUTILS.``) to avoid namespace pollution. To enable
-this, set the variable `docutils.` (note the period in the variable name) to
-the desired prefix. Note that then, you would have to use the prefix when
-setting any variables that affect this file...
-
-::
-
- docutils. ?=
- ##docutils. ?= DOCUTILS.
-
-
-Pattern rules - very include-friendly makefile portion
-******************************************************
-
-This part is designed to be included in makefiles. It supplies implicit
-pattern rules for docutils' tools. All that is left to you is to request
-building of files with extensions of the output formats (.html, .tex, .dvi,
-.ps, .pdf). You should have (or be able to build) input files with .txt
-extension. Almost everything (including extensions) is configurable by
-setting variables defined in this file. You should set these variables
-before including this file to avoid problems.
-
-If you also want typical explicit rules for targets like ``html``, ``dvi``
-and ``clean`` to build associated files, you will find them in later
-sections...
-
-Tool names
-==========
-
-`TOOLS` lists the tools / processing stages that are supported and have [at
-least some] associated variables according to the conventions below. It
-provides some introspection ablity, currently used in the `docutils.clean`
-target for computing the list of output extensions.
-
-::
-
- $(docutils.)TOOLS += RST2HTML PEPTOOL RST2LATEX RST2PDFLATEX \
- MATHHACK IMGMATHHACK \
- HTML_WILD_EXTS LATEX_WILD_EXTS PDFLATEX_WILD_EXTS
-
-
-As accustomed in makefiles, tool names can be customized by setting
-variables named after the tools. Here they are slightly more systemathic
-than their current names.
-
-``html.py`` is expected to be renamed to ``rst2html.py`` soon.
-
-::
-
- ifneq "$(shell which rst2html.py)" ""
- $(docutils.)RST2HTML ?= rst2html.py
- else
- $(docutils.)RST2HTML ?= html.py
- endif
-
- $(docutils.)RST2LATEX ?= rst2latex.py
-
-
-``rstpep2html.py`` is the RST PEP -> HTML converter tool;
-``pep2html.py`` also supports old PEP format and does extra PEP
-services.
-
-::
-
- $(docutils.)RSTPEP2HTML ?= rep.py
-
- $(docutils.)PEPTOOL ?= pep2html.py
-
-
-In this makefile I use only PEPTOOL (too bad RSTPEP2HTML doesn't support the
-old pep format, it has a better command-line interface).
-
-More such variables appear in the pre/postprocessing sections below.
-
-@@@ TODO: Support other tools, e.g. RST2XML.
-
-Extensions
-==========
-
-For simplicity, only one source extension is supported at a time. If you
-need to allow several (e.g. ``.txt`` and ``.rst``), you should be able to
-call make recursively several times, setting `SRCEXT` to a different value
-each time...
-
-::
-
- $(docutils.)SRCEXT ?= .txt
-
-
-There are various reasons to preprocess/postprocess docutils. This makefile
-directly supports some ways and should play nice with others. It's more
-convenient to use intermediate files than pipes (because then you can easily
-inspect them for debugging). So we need a way to insert intermediate files
-into the dependency chain. Solution: variables (`<toolname>.SRCEXT` and
-`<toolname>.TRGEXT`) that control the source/target extensions of each rule.
-These variables must be set before the rules that use them.
-
-::
-
- $(docutils.)PEPTOOL.SRCEXT ?= $($(docutils.)SRCEXT)
- $(docutils.)PEPTOOL.TRGEXT ?= .html
- $(docutils.)RST2HTML.SRCEXT ?= $($(docutils.)SRCEXT)
- $(docutils.)RST2HTML.TRGEXT ?= .html
- $(docutils.)RST2LATEX.SRCEXT ?= $($(docutils.)SRCEXT)
- $(docutils.)RST2LATEX.TRGEXT ?= .tex
-
-
-PDFLaTeX might need different processing and extension (in particular
-because no image format is supported by both it and LaTeX). This is sort of
-a hack: pretend we have a separate RST2PDFLATEX tool.
-
-::
-
- $(docutils.)RST2PDFLATEX.SRCEXT ?= $($(docutils.)RST2LATEX.SRCEXT)
- $(docutils.)RST2PDFLATEX.TRGEXT ?= .pdftex
-
-
-Specific preprocessing/postprocessing support
----------------------------------------------
-
-The extension manipulation is subtle. It's important to use simple
-variables (set with ``:=``) to allow chaining. Since each processing stage
-can be enabled independently of others, they can only be attached to the
-main tool (e.g. RST2HTML).
-
-Note that PEPTOOL is not supported here because non-standard processing is
-not a good idea in PEPs anyway. Won't be a big problem to add if needed...
-
-@@@ TODO: Support as many external/sandbox tools as possible.
-
-sandbox/cben/rolehack math preprocessing hacks
-..............................................
-
-This makefile provides rules that support preprocessing by
-`<../rolehack/mathhack.py>`_ and `<../rolehack/imgmathhack.py>`_. Set
-`ENABLE_MATHHACK` to 1 to run them before rst2html.py and rst2latex.py.
-
-::
-
- $(docutils.)ENABLE_MATHHACK ?= 0
-
- $(docutils.)MATHHACK.SRCEXT := $($(docutils.)RST2LATEX.SRCEXT)
- ifeq "$(origin $(docutils.)MATHHACK.TRGEXT)" "undefined"
- $(docutils.)MATHHACK.TRGEXT := $($(docutils.)RST2LATEX.SRCEXT).mathhack
- endif
-
-
-In theory, IMGMATHHACK is applicable to all tools. It's not very useful
-with anything but RST2HTML, so that's the only one we attach to currently...
-
-::
-
- $(docutils.)IMGMATHHACK.SRCEXT := $($(docutils.)RST2HTML.SRCEXT)
- ifeq "$(origin $(docutils.)IMGMATHHACK.TRGEXT)" "undefined"
- $(docutils.)IMGMATHHACK.TRGEXT := $($(docutils.)RST2HTML.SRCEXT).imgmathhack
- endif
-
- ifeq "$($(docutils.)ENABLE_MATHHACK)" "1"
- $(docutils.)RST2LATEX.SRCEXT := $($(docutils.)MATHHACK.TRGEXT)
- $(docutils.)RST2HTML.SRCEXT := $($(docutils.)IMGMATHHACK.TRGEXT)
- endif
-
-
-If any preprocessing has been applied, it's good to tell docutils the name
-of the original file. But in current docutils, ``--source-url`` forces on
-``--source-link``. So you can control this option, per tool.
-
-::
-
- $(docutils.)RST2LATEX.ENABLE_SOURCE_URL ?= 0
- ifeq "$($(docutils.)RST2LATEX.ENABLE_SOURCE_URL)" "1"
- $(docutils.)RST2LATEX.FLAGS += --source-url=$*$($(docutils.)SRCEXT)
- endif
-
- $(docutils.)RST2HTML.ENABLE_SOURCE_URL ?= 0
- ifeq "$($(docutils.)RST2HTML.ENABLE_SOURCE_URL)" "1"
- $(docutils.)RST2HTML.FLAGS += --source-url=$*$($(docutils.)SRCEXT)
- endif
-
-
-You can set `MATHHACK_DIR` to provide an explicit location for these scripts
-(you must include a trailing slash!). You can also change the tool name
-variables completely...
-
-::
-
- $(docutils.)MATHHACK_DIR ?=
- $(docutils.)MATHHACK ?= $($(docutils.)MATHHACK_DIR)mathhack.py
- $(docutils.)IMGMATHHACK ?= $($(docutils.)MATHHACK_DIR)imgmathhack.py
-
- %$($(docutils.)MATHHACK.TRGEXT): %$($(docutils.)MATHHACK.SRCEXT)
- $($(docutils.)MATHHACK) $< $@
-
- %$($(docutils.)IMGMATHHACK.TRGEXT): %$($(docutils.)IMGMATHHACK.SRCEXT)
- $($(docutils.)IMGMATHHACK) $< $@
-
-
-Rudimentary adaptation of ``.*`` file extensions to output format
-.................................................................
-
-Docutils currently doesn't support referencing different files depending on
-on the output format (e.g. LaTeX requires EPS images but HTML supports
-everything else). Here are simple sed scripts, converting ``.*`` to one
-extension for images and one for links, different for each tool. **Be
-warned that the regexps are not bullet-proof and could be confused!**
-
-Set `ENABLE_WILD_EXTS` to 1 if you want to enable them.
-
-::
-
- $(docutils.)ENABLE_WILD_EXTS ?= 0
-
-
-This is an arbitrary guess, quite probable that you would want to change it.
-
-::
-
- $(docutils.)HTML_WILD_EXTS.IMGEXT ?= .png
-
-``.htm`` is also widespread but here we mostly talk about local files
-produced with docutils.
-
-::
-
- $(docutils.)HTML_WILD_EXTS.LINKEXT ?= .html
-
-
-LaTeX only undestands Encapsulated PostScript.
-
-::
-
- $(docutils.)LATEX_WILD_EXTS.IMGEXT ?= .eps
-
-LaTeX is just as well convetible to PS but only PDF supports links, so this
-is a good guess...
-
-::
-
- $(docutils.)LATEX_WILD_EXTS.LINKEXT ?= .pdf
-
-
-PDFLaTeX understands common formats like PNG but doesn't understand EPS!
-
-::
-
- $(docutils.)PDFLATEX_WILD_EXTS.IMGEXT ?= .png
-
-Again, PDFLaTeX supports links.
-
-::
-
- $(docutils.)PDFLATEX_WILD_EXTS.LINKEXT ?= .pdf
-
-
-Intermediate extensions:
-
-::
-
- $(docutils.)HTML_WILD_EXTS.SRCEXT ?= .html.wild_exts
- $(docutils.)LATEX_WILD_EXTS.SRCEXT ?= .tex.wild_exts
- $(docutils.)PDFLATEX_WILD_EXTS.SRCEXT ?= .pdftex.wild_exts
-
-
-Chain to the tools.
-
-::
-
- $(docutils.)HTML_WILD_EXTS.TRGEXT := $($(docutils.)RST2HTML.TRGEXT)
- $(docutils.)LATEX_WILD_EXTS.TRGEXT := $($(docutils.)RST2LATEX.TRGEXT)
- $(docutils.)PDFLATEX_WILD_EXTS.TRGEXT := $($(docutils.)RST2PDFLATEX.TRGEXT)
-
- ifeq "$($(docutils.)ENABLE_WILD_EXTS)" "1"
- $(docutils.)RST2HTML.TRGEXT := $($(docutils.)HTML_WILD_EXTS.SRCEXT)
- $(docutils.)RST2LATEX.TRGEXT := $($(docutils.)LATEX_WILD_EXTS.SRCEXT)
- $(docutils.)RST2PDFLATEX.TRGEXT := $($(docutils.)PDFLATEX_WILD_EXTS.SRCEXT)
- endif
-
- %$($(docutils.)HTML_WILD_EXTS.TRGEXT): %$($(docutils.)HTML_WILD_EXTS.SRCEXT)
- sed -e 's/\( [sS][rR][cC]="[^"]*\)\.\*"/\1$($(docutils.)HTML_WILD_EXTS.IMGEXT)"/g' -e "s/\( [sS][rR][cC]='[^']*\)\.\*'/\1$($(docutils.)HTML_WILD_EXTS.IMGEXT)'/g" -e 's/\( [hH][rR][eE][fF]="[^"]*\)\.\*"/\1$($(docutils.)HTML_WILD_EXTS.LINKEXT)"/g' -e "s/\( [hH][rR][eE][fF]='[^']*\)\.\*'/\1$($(docutils.)HTML_WILD_EXTS.LINKEXT)'/g" $< > $@
-
- %$($(docutils.)LATEX_WILD_EXTS.TRGEXT): %$($(docutils.)LATEX_WILD_EXTS.SRCEXT)
- sed -e 's/\(\\includegraphics{[^}]*\)\.\*}/\1$($(docutils.)LATEX_WILD_EXTS.IMGEXT)}/g' -e 's/\(\\href{[^}]*\)\.\*}/\1$($(docutils.)LATEX_WILD_EXTS.LINKEXT)}/g' $< > $@
-
- %$($(docutils.)PDFLATEX_WILD_EXTS.TRGEXT): %$($(docutils.)PDFLATEX_WILD_EXTS.SRCEXT)
- sed -e 's/\(\\includegraphics{[^}]*\)\.\*}/\1$($(docutils.)PDFLATEX_WILD_EXTS.IMGEXT)}/g' -e 's/\(\\href{[^}]*\)\.\*}/\1$($(docutils.)PDFLATEX_WILD_EXTS.LINKEXT)}/g' $< > $@
-
-
-
-Config files and extra flags
-============================
-
-Consider using config files instead of flags for most tasks. To specify
-config file(s) other than the default, set `CONFIG` to a space-separated
-list of them. Later files override earlier ones (and all override the
-`DOCUTILSCONFIG` environment variable, which you should *not* touch in a
-Makefile, it's for the user). Non-existant config files are ignored.
-
-Relative file names in `CONFIG` are relative to the current directory,
-independently of the target name. If you use ``%`` in `CONFIG`, it will be
-replaced with the target name (without extension) and it will be
-interpretted relative to the target's directory -- giving you per-file
-configs.
-
-::
-
- $(docutils.)CONFIG ?=
-
-
-I found absolutely no way to implement in make per-directory config file
-dependencies that don't depend on the target basename. You can just do::
-
- $(docutils.)FLAGS += $(*D)/config.file.name
-
-but it won't be considered a dependency (which is not such a big issue). Or
-you can always run make in the directory of the target...
-
-You can provide extra docutils options by setting variables named
-`<toolname>.FLAGS`. `FLAGS` gives default flags for all tools.
-
-::
-
- $(docutils.)FLAGS += $(foreach c,$($(docutils.)CONFIG),--config=$(subst %,$(*D)/,$(findstring %,$(c)))$(subst %,$(*F),$(c)))
- $(docutils.)RST2HTML.FLAGS += $($(docutils.)FLAGS)
- $(docutils.)RST2LATEX.FLAGS += $($(docutils.)FLAGS)
- $(docutils.)PEPTOOL.FLAGS += $($(docutils.)FLAGS)
-
-
-
-Extra dependencies
-==================
-
-When docutils config files change, it usually affects docutils' so it should
-be rebuilt. So we add them as dependencies.
-
-.. note:: Deletion of a config file will *not* cause a rebuild.
-
-Figure out the default config files from the environment:
-
-::
-
- DOCUTILSCONFIG ?= /etc/docutils.conf:./docutils.conf:$(HOME)/.docutils
-
-
-You can set `CONFIG_DEPS` to override the depencies on config files without
-changing the actual config files used by docutils. It's space-separated.
-
-::
-
- $(docutils.)CONFIG_DEPS ?= $(subst :, ,$(DOCUTILSCONFIG)) $($(docutils.)CONFIG)
-
-
-`EXTRA_DEPS` specifies the actual extra dependencies.
-
-Config files that exist are automatically included (unexistant ones would
-cause make to complain that it doesn't know how to build them).
-
-::
-
- $(docutuls.)EXTRA_DEPS += $(wildcard $($(docutils.)CONFIG_DEPS))
-
-
-Note also that you can supply extra dependencies for pattern rules by
-yourself, as long as you don't provide commands, e.g. ::
-
- foo.html: extra_deps
-
-Typical extra depencies you'd want to add: HTML stylesheets (if you embed
-them), files appearing in ``.. include::``.
-
-
-HTML output
-===========
-
-pep-%.html must be before the %.html rule to get higher priority.
-
-::
-
- pep-%$($(docutils.)PEPTOOL.TRGEXT): pep-%$($(docutils.)PEPTOOL.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)PEPTOOL) $($(docutils.)PEPTOOL.FLAGS) $<
- ifneq "$($(docutils.)PEPTOOL.TRGEXT)" ".html"
- # $($(docutils.)PEPTOOL) lacks output file name control, work around.
- mv $(basename $<).html $<
- endif
-
- %$($(docutils.)RST2HTML.TRGEXT): %$($(docutils.)RST2HTML.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)RST2HTML) $($(docutils.)RST2HTML.FLAGS) $< $@
-
-
-LaTeX output
-============
-
-
-::
-
- %$($(docutils.)RST2LATEX.TRGEXT): %$($(docutils.)RST2LATEX.SRCEXT) \
- $($(docutils.)EXTRA_DEPS)
- $($(docutils.)RST2LATEX) $($(docutils.)RST2LATEX.FLAGS) $< $@
-
-
-LaTeX processing rules
-----------------------
-
-This part is not fully parametrized; it's not related to docutils so if you
-want to get fancy in this respect, provide your own rules. You can disable
-the rules here, by setting `ENABLE_LATEX_RULES` to 0.
-
-::
-
- $(docutils.)ENABLE_LATEX_RULES ?= 1
-
-
-PDFLaTeX does a better job than LaTeX->DVIPDF (e.g. it supports hyperlinks
-and generates a PDF outline) but you usually can't run the same file through
-both LaTeX and PDFLaTeX because they don't understand a single common
-format. Solution: there is a separate preprocessing stage
-PDFLATEX_WILD_EXTS. Set this to 0 to go through DVIPDF.
-
-::
-
- $(docutils.)ENABLE_PDFLATEX ?= 1
-
- ifeq "$($(docutils.)ENABLE_LATEX_RULES)" "1"
-
-
-These variables are common-practice but it's still cleaner to put them in
-the "namespace".
-
-
-::
-
- $(docutils.)LATEX ?= latex
- $(docutils.)PDFLATEX ?= pdflatex
- $(docutils.)DVIPS ?= dvips
- $(docutils.)DVIPDF ?= dvipdf
-
- %.dvi: %.tex
- cd $(*D); $(LATEX) $(*F)
-
- %.ps: %.dvi
- $(DVIPS) $< -o $@
-
- ifeq "$($(docutils.)ENABLE_PDFLATEX)" "1"
- %.pdf: %.pdftex
- cd $(*D); $(PDFLATEX) $(*F).pdftex
- else
- %.pdf: %.dvi
- $(DVIPDF) $< $@
- endif
-
- endif # ENABLE_LATEX_RULES
-
-
-Fallback when you don't provide for different PDFLaTeX processing.
-
-::
-
- %$($(docutils.)RST2PDFLATEX.TRGEXT): %$($(docutils.)RST2LATEX.TRGEXT)
- cp $< $@
-
-
-
-Typical standard targets
-************************
-
-This section provides typical rules for processing documents with docutils.
-Since they might clash with your rules, they are optional and can be
-disabled by setting `ENABLE_COMMON_TARGETS` to ``0``.
-
-::
-
- $(docutils.)ENABLE_COMMON_TARGETS ?= 1
-
-
-`DOCS` gives the documents to process. You should typically set this
-(defaults to all files with the source extension in current directory).
-
-::
-
- $(docutils.)DOCS ?= $(wildcard *$($(docutils.)SRCEXT))
-
-
-`STEMS` is the docs list without the source extension, (makes rules shorter).
-
-::
-
- $(docutils.)STEMS ?= $($(docutils.)DOCS:$($(docutils.)SRCEXT)=)
-
-
-Set `ALL` to change the things to build by default.
-
-::
-
- $(docutils.)ALL ?= html ps pdf
-
- ifeq "$($(docutils.)ENABLE_COMMON_TARGETS)" "1"
-
- docutils.all: $($(docutils.)ALL)
-
-
-Targets like ``clean`` weren't directly used. Rather they don't have
-commands but have targets like ``docutils.clean`` (that do have commands) as
-prerequisites. This allows you to give your commands for them. You can
-inhibit these alias dependencies by setting `ENABLE_SHORT_TARGETS` to 0.
-
-::
-
- $(docutils.)ENABLE_SHORT_TARGETS ?= 1
-
- ifeq "$($(docutils.)ENABLE_SHORT_TARGETS)" "1"
- all: docutils.all
- safeclean: docutils.safeclean
- mostlyclean: docutils.mostlyclean
- clean: docutils.clean
- endif
-
- html: $($(docutils.)STEMS:=.html)
- tex: $($(docutils.)STEMS:=.tex)
- dvi: $($(docutils.)STEMS:=.dvi)
- ps: $($(docutils.)STEMS:=.ps)
- pdf: $($(docutils.)STEMS:=.pdf)
-
-
-Extensions of unneeded byproducts (specifically, LaTeX byproducts).
-
-::
-
- $(docutils.)SAFECLEAN_EXTS += .log .aux .out .toc
-
-
-Extensions that are direct outputs of this makefile.
-
-::
-
- $(docutils.)CLEAN_EXTS += $(foreach tool,$($(docutils.)TOOLS),$($(docutils.)$(tool).TRGEXT))
- $(docutils.)CLEAN_EXTS += .dvi .ps .pdf
-
-
-`safeclean` cleans only unneeded byproducts.
-
-::
-
- docutils.safeclean:
- -rm -f $(foreach ext,$($(docutils.)SAFECLEAN_EXTS),$($(docutils.)STEMS:=$(ext)))
-
-
-`mostlyclean` cleans almost everything.
-
-::
-
- docutils.mostlyclean: docutils.safeclean
- -rm -f $(foreach ext,$($(docutils.)CLEAN_EXTS),$($(docutils.)STEMS:=$(ext)))
-
-
-`clean` also cleans imgmathhack images that take a lot of time to rebuild.
-
-::
-
- docutils.clean: docutils.mostlyclean
- ifeq "$($(docutils.)ENABLE_MATHHACK)" "1"
- -rm -rf ./imgmath/
- endif
-
- endif # ENABLE_COMMON_TARGETS
diff --git a/sandbox/cben/make/README.txt b/sandbox/cben/make/README.txt
deleted file mode 100644
index 6447967cb..000000000
--- a/sandbox/cben/make/README.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-`<Makefile.docutils>`_ is a makefile that handles most things one would want
-to do with docutils. For minimal applications it can be used directly;
-typically you would include it in your makefiles, e.g.::
-
- DOCS = foo.txt bar.txt
-
- include Makefile.docutils
-
-For quick jobs ``make DOCS=foo.txt\ bar.txt`` or just ``make`` (taking all
-``*.txt`` files) will also work.
-
-This makefile is very flexible and can be configured by setting many
-variables. It also supports pre/postprocessing, currently with
-`sandbox/cben/rolehack <../rolehack>`_ scripts and rudimentary
-output-format-dependant adaptation of ``.*`` names with sed scripts.
-
-The makefile is heavily commented and the comments themeselves are in reST
-(sort of literate programming). A script (`<make2rst.py>`_) is provided that
-can convert the whole file to legal reST - run ``make`` in this directory to
-build the docs (``make ps pdf`` would give you more formats).
-
-Enjoy and tell me (cben@users.sf.net) if you miss any functionality or
-flexibility...
diff --git a/sandbox/cben/make/make2rst.py b/sandbox/cben/make/make2rst.py
deleted file mode 100755
index 1a4498f0c..000000000
--- a/sandbox/cben/make/make2rst.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-"""
-A simple tool for converting a Makefile to reStructuredText.
-
-Basically it strips all comments starting at column 0 that don't start with
-``##`` and converts all the rest to literal blocks. The first comment line
-defines the number of spaces after the comment sign to be ignored (this allows
-``# text...`` which is more readable than ``#text...``).
-
-"""
-
-from __future__ import generators
-
-import fileinput, sys
-
-def convert(lines):
- """Generate lines of reST from makefile lines."""
- in_literal_block = False # state
- comment_spaces = None # stripped from all lines
- leading_spaces = 0 # this/last line's indentation
-
- for line in lines:
- if line.isspace():
- # Empty line accepted in both states.
- if not in_literal_block:
- line = '#\n'
- else:
- line = '\n'
- if line[0] == '#' and not line[:2] == '##':
- # Comment line
- if in_literal_block:
- yield '\n'
- in_literal_block = False
-
- line = line.expandtabs()[1:]
- leading_spaces = len(line) - len(line.lstrip(' '))
- if comment_spaces is None:
- comment_spaces = leading_spaces
- else:
- line = line[min(leading_spaces, comment_spaces):]
-
- yield line
- else:
- # Literal line
- if not in_literal_block:
- yield '\n'
- yield '::\n'
- yield '\n'
- in_literal_block = True
-
- yield '\t' + line
-
-def main(*args):
- sys.stdout.writelines(convert(fileinput.input(args)))
-
-if __name__ == '__main__':
- main(*sys.argv[1:])
diff --git a/sandbox/cben/rolehack/README.txt b/sandbox/cben/rolehack/README.txt
deleted file mode 100644
index 1ec7d8bda..000000000
--- a/sandbox/cben/rolehack/README.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-Mathhack Instructions
-=====================
-
-Formula syntax is everything LaTeX supports in math mode. This is supported
-for the LaTeX writer and for anything else by converting with LaTeX (and some
-external_ commands) to *images*.
-
-There are now other solutions (see the FAQ entry__) that employ dialects of
-LaTeX for translation to MathML so you should consider limiting yourself to
-the intersection of the syntaxes if you want to allow all possible convertions.
-
-__ http://docutils.sourceforge.net/
- FAQ.html#how-can-i-include-mathematical-equations-in-documents
-
-Just write::
-
- text... :texmath:`formula` ...text
-
-or simply::
-
- text... `formula` ...text
-
-for inline formulas; for display formulas use a directive::
-
- .. texmath:: formula
-
-Inline formulas can also be written with substitution references::
-
- text... |name| ...text
-
- .. |name| texmath:: formula
-
-Now you take this (in file foo.txt) and run::
-
- mathhack.py foo.txt | rst2latex.py - foo.tex
-
-which converts the roles/directives to ``raw:: latex`` directives or::
-
- imgmathhack.py foo.txt | html.py - foo.html
-
-which runs TeX (generating images into a subdirectory!) and converts
-the roles/directives into ``img::`` directives. Quick, dirty and
-convenient ;-).
-
-To allow including preprocessed files, do::
-
- mathhack.py included.txt > included.txt.mathhack
- imgmathhack.py included.txt > included.txt.imgmathhack
-
-and include ``included.txt.mathhack`` (imgmathhack.py will mangle this to
-include ``included.txt.imgmathhack`` automatically). My makefile_ can do all
-this for you (just set ENABLE_MATHHACK=1).
-
-.. _makefile: ../make/Makefile.docutils
-
-.. _external:
-
-Note that the `<imgmathhack.py>`_ script relies on some external commands (see
-the comments at its top). `tex_to_images` seems to be separately availiable
-from the `speech_tools CVS`__
-
-__ http://cvs.sf.net/viewcvs.py/*checkout*/emu/speech_tools/scripts/tex_to_images.prl?rev=HEAD
-
-Also note that the scripts use regexps to "parse" the roles/directives, so
-expect some bugs (e.g. don't try to split a formula into multiple lines inside
-a table cell...).
diff --git a/sandbox/cben/rolehack/imgmathhack.py b/sandbox/cben/rolehack/imgmathhack.py
deleted file mode 100755
index 084dc05f0..000000000
--- a/sandbox/cben/rolehack/imgmathhack.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-"""
-Convert latex math to images. Treats the default and ``texmath`` roles as
-inline LaTeX math and the ``texmath::`` directive as display latex math.
-
-If you include a file which also needs mathhack/imgmathhack preprocessing,
-write a name containing ``.mathhack`` in the include directive and it will be
-replaced with ``.imgmathhack`` when preprocessed by this script (of course,
-you should create both preprocessed versions of the file).
-
-.. note::
- This runs external commands and leaves files after itself! To reduce
- running time when images are not changed and to reuse images for equal
- fomulas, image names are md5 of the formula (hoping that no collisions
- will happen) and images that already exist are not rebuilt. You should
- purge the ``imgmath`` subdirectory manually to get rid of unused formulas.
-
- You'll need:
-
- - ``tex_to_images``, last version seems to live at the `speech_tools
- CVS`__.
-
- __ http://cvs.sourceforge.net/viewcvs.py/*checkout*/
- emu/speech_tools/scripts/tex_to_images.prl?rev=HEAD
-
- It, in turn, relies upon:
-
- - LaTeX
- - ``dviselect`` (part of ``dviutils``)
- - ``dvips``
- - Ghoscript
- - netpbm tools
-"""
-
-import os, os.path, md5
-
-from rolehack import *
-
-class Tex_to_images(object):
- """Feeds math to ``tex_to_images``. Always goes through ppm."""
- def __init__(self, dir='./imgmath', options='-s 1.5',
- converter='pnmtopng', extension='.png'):
- try:
- os.mkdir(dir)
- except OSError:
- pass
- self.options = options
- self.dir = dir
- self.converter = converter
- self.extension = extension
- def process(self, text):
- """Returns output filename."""
- dir = self.dir
- extension = self.extension
- options = self.options
- converter = self.converter
- fname = md5.new(text).hexdigest()
- fpath = os.path.join(dir, fname)
- if not os.path.exists(fpath + extension):
- f = file(fpath, 'w')
- f.write('@Start\n%s\n@End\n' % (text,))
- f.close()
- os.system(('tex_to_images -f ppm -d %(dir)s -o %(fname)s.tmp '
- '%(options)s < %(fpath)s >& /dev/null' % vars()))
- if self.converter:
- os.system('%s < %s.tmp > %s%s' %
- (self.converter, fpath, fpath, extension))
- else:
- os.rename(fpath + '.tmp', fpath + '.ppm')
- os.remove(fpath + '.tmp')
- return fpath + extension
- def texmath(self, text):
- text = ' '.join(text.split())
- src = self.process(text)
- return '''\
-image:: %(src)s
- :align: middle
- :class: texmath
- :alt: %(text)s
-''' % locals()
- def texdisplay(self, text):
- src = self.process(text)
- return '''\
-image:: %(src)s
- :align: center
- :class: texdisplay
- :alt: %(text)s
-''' % locals()
-
-child = Tex_to_images()
-texmath = child.texmath
-texdisplay = child.texdisplay
-
-def mangle_include(text):
- return 'include:: ' + text.replace('.mathhack', '.imgmathhack')
-
-main({'texmath': texmath}, texmath,
- {'texmath': texdisplay, 'include': mangle_include})
diff --git a/sandbox/cben/rolehack/mathhack.py b/sandbox/cben/rolehack/mathhack.py
deleted file mode 100755
index 0a02f231c..000000000
--- a/sandbox/cben/rolehack/mathhack.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env python
-"""
-.. epigraph::
-
- Using ``raw`` is almost always evidence of a hack in progress. It's not a
- clean solution.
-
- -- David Goodger.
-
-Convert the default and ``texmath`` role to raw latex inline math and the
-``texmath`` directive to display math.
-"""
-
-from rolehack import *
-
-texmath = template('''\
-raw:: latex
-
- $''', '$\n')
-
-texdisplay = template('''\
-raw:: latex
-
- \[ ''', ' \]\n')
-
-main({'texmath': texmath}, texmath,
- {'texmath': texdisplay})
diff --git a/sandbox/cben/rolehack/rolehack.py b/sandbox/cben/rolehack/rolehack.py
deleted file mode 100644
index 13895caa5..000000000
--- a/sandbox/cben/rolehack/rolehack.py
+++ /dev/null
@@ -1,192 +0,0 @@
-"""Preprocess reStructuredText roles to directives.
-
-This is a stop-gap hack for prototyping new syntaxes for reST, mainly useful
-when you find yourself using directives every 3 lines. In such cases an
-extension to docutils allowing some inline syntax is desired thing and such
-extensions most probably will take the form of new interpretted text roles.
-
-This module allows to easily prototype them by converting given interpretted
-text roles to directives. To make them inline, the uses of the roles are
-replaced with substitutions and all substitution definitions are appeneded at
-the end of the document (hint: use ``replace::`` if you don't want a
-directive).
-
-Since what's useful for inline syntaxes might also be useful outside of
-paragraphs, preprocessing simple directives (only an argument, no options or
-content) into other directives is also supported.
-
-I was too lazy to implement an elaborate command-line interface, so this is
-only a module. You should import it from a python script and call this module
-with specific role->template mappings to do the work.
-
-BUGS
-====
-
-There are too many. Most can't be fixed here, the right thing is to extend
-the docutils parser...
-
-- Backslashes are not interpretted in any way (except that backticks preceded
- by backslashes are won't be treated as start/end of interpretted text).
- This means backslashes are passed to the directive which probably won't stay
- this way if the role is accepted into docutils (only the double-backtick
- literal text syntax behaves this way).
-
- This bug is semi-intentional because it makes LaTeX generation easier...
-
-- Any number of lines is consumed in search for the closing backtick,
- disregarding indentation. The content is pasted into the directive as one
- line with normalized whitespace.
-
-- The width of the substitution references is not equal to the original, so
- you can't use it in tables.
-
-- Long parts of the document without empty lines might cause ``recursion limit
- exceeded`` errors.
-
-- Directives not recognized if preceded by non-whitespace (e.g. in a table).
-
-"""
-
-import re
-
-# Named groups are used to allow simultaneous replacement of all roles.
-
-_re_options = re.IGNORECASE | re.MULTILINE | re.DOTALL | re.VERBOSE
-
-def _role_re(group_name):
- return r'''
- # Start-string:
- (?:^|(?<=\s|[\'"([{<\-/:]))
- `
- (?=\S)
- # Content:
- (?P<%(group_name)s>
- (?:[^`]|\\.)+ # skip escaped chars
- )
- # End-string:
- (?<=\S)
- `
- (?=$|\s|[#\'")\]}>\-/:.,;!?\\])
- ''' % locals()
-
-_default_re = _role_re('_DEFAULT')
-
-def _role2regexp(role):
- """Return regexp for approximate recognition of `role`."""
- prefix_re = _role_re('prefix_' + role)
- postfix_re = _role_re('postfix_' + role)
- return r'''
- :%(role)s:
- %(prefix_re)s
- |
- %(postfix_re)s
- :%(role)s:
- ''' % locals()
-
-def _dir2regexp(dir):
- """Return regexp for approximate recognition of directive `dir`."""
- return r'''
- ^(?P<indent_%(dir)s> [ \t]* ) # record indentation
- \.\. \s+
- (?P<subst_%(dir)s>
- ## (?:|[^|]*|)? # optional substitution
- )
- \s*
- %(dir)s \s* ::
- (?P<argument_%(dir)s>
- [^\n]*
- (?:
- \n
- (?P=indent_%(dir)s) [ \t] # bigger indentation
- [^\n]+
- )*
- )
- ''' % locals()
-
-def process(doc, roles={}, default_role=None, directives={}):
- """Process `doc` replacing given `roles`.
-
- `doc` should be a single string containing the whole document. The
- `roles` dictionary maps from role names to replacement functions that
- should accept the role content and return the directive text, starting
- from the directive name, e.g.::
-
- def repl(text):
- return 'raw:: latex\n\n %s\n' % (text,)
-
- See `template()` for an easy way to create such trivial functions. The
- optional `default_role` argument specifies a replacement for the default
- role.
-
- The `directives` dictionary like `roles` but specifies directive names to
- handle. The directive can have only an argument; substitution definitions
- with these directives are also recognized. Indentation is adjusted
- properly for directives.
-
- """
- re_parts = []
- repls = {}
- if default_role:
- re_parts.append(_default_re)
- repls['_DEFAULT'] = default_role
- for role, repl in roles.items():
- re_parts.append(_role2regexp(role))
- repls['prefix_' + role] = repls['postfix_' + role] = repl
- for dir, repl in directives.items():
- re_parts.append(_dir2regexp(dir))
- repls['argument_' + dir] = repl
- full_re = '\n|'.join(re_parts)
- full_re = re.compile(full_re, _re_options)
-
- after_output = []
- def count(n=0):
- while True:
- yield n
- n += 1
- ids = count()
- def dispatch(match):
- groupname = match.lastgroup
- content = match.group(groupname)
- kind, name = groupname.split('_', 1)
- if kind == 'argument': # substitution
- indent = match.group('indent_' + name)
- subst = match.group('subst_' + name)
- repl = '\n.. %s %s' % (subst, repls[groupname](content))
- return indent + repl.replace('\n', '\n' + indent)
- else: # role
- id = ids.next()
- subst = '|rolehack_%d|' % (id,)
- repl = '.. %s %s' % (subst, repls[groupname](content))
- after_output.append(repl)
- return subst
-
- # Hack: process by chunks separated by blank lines, trying to avoid
- # "recursion limit exceeded" errors.
- empty_line_re = re.compile(r'\n[ \t]*\n')
- output = [full_re.sub(dispatch, chunk)
- for chunk in empty_line_re.split(doc)]
- return '\n\n'.join(output + after_output)
-
-def template(pre, post):
- """Make replacement function for wrapping content with two strings."""
- def repl(text):
- return ''.join((pre, text, post))
- return repl
-
-def main(*args, **kw_args):
- """Simple command-line interface."""
- import sys
- def parse_args(input='-', output='-'):
- if input == '-':
- input = sys.stdin
- else:
- input = file(input)
- if output == '-':
- output = sys.stdout
- else:
- output = file(output, 'w')
- output.write(process(input.read(), *args, **kw_args))
- parse_args(*sys.argv[1:])
-
-##main({'foo': template('foo::\n\n ', '\n')},
-## template('default::\n\n ', '\n'))
diff --git a/sandbox/cliechti/README.txt b/sandbox/cliechti/README.txt
deleted file mode 100644
index b91dd7c9e..000000000
--- a/sandbox/cliechti/README.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-README
-======
-
-Welcome to chris' sandbox. Here's a short overview of some things in this
-directory:
-
-- ``aafigure/`` experimental ASCII art to image (SVG) converter
-- ``html2rst/`` a simple, experimental, HTML to reST converter
diff --git a/sandbox/cliechti/aafigure/README.txt b/sandbox/cliechti/aafigure/README.txt
deleted file mode 100644
index 473fa0e70..000000000
--- a/sandbox/cliechti/aafigure/README.txt
+++ /dev/null
@@ -1,177 +0,0 @@
-aafigure README
-===============
-
-Overview
---------
-
-The idea is to parse ASCII art images, embedded in reST documents and output
-an image. This would mean that simple illustrations could be embedded as
-ASCII art in the reST source and still look nice when converted to e.g. HTML
-
-Implementation
---------------
-
-Files:
-
-aafigure.py
- ASCII art parser. This is the main module.
-
-aafigure_directive.py
- Implmements the ``aafigure`` Docutils directive that takes these
- ASCII art figures ang generates SVG.
-
-aa.py
- ASCII art output backend. Intended for tests, not for the end user.
-
-rst2html.py
- Patched version that adds the ``aafigure`` Docutils directive.
-
-svg.py
- SVG output backend.
-
-
-Usage
------
-::
-
- ./rst2html.py README.txt >README.html
-
-This results in the ``README.html`` file and a ``.svg`` file for each
-``aafigure``.
-
-Display the resulting ``README.html`` file in a SVG capable browser. It has
-been tested with Firefox 1.5.
-
-TODO
-----
-
-- symbol detection: scan for some predefined shapes in the ASCII image
- and output them as symbol form a library
-- symbol libraries for UML, flowchart, electronic schematics, ...
-- more arrow heads
-- the way the image is embedded is a hack (inserting an ``<embed ..>`` tag
- trough a raw node...
-- search for ways to bring in color
-- aafigure probably need arguments like ``font-family``, ...
-- punctuation not included in strings
-
-License
--------
-
-BSD
-
-Tests
------
-
-Simple tests
-~~~~~~~~~~~~
-.. aafigure::
-
- -->
-
-.. aafigure::
-
- +---------------+
- |A box with text|
- +---------------+
-
-.. aafigure::
-
- ---> | ^| |
- <--- | || --+--
- <--> | |V |
- __ __
- | |__ +---+ |__|
- |box| ..
- +---+ Xenophon
-
-A flow chart
-~~~~~~~~~~~~
-.. aafigure::
- :scale: 0.6
-
- +---------+
- | State 1 |
- +----+----+
- |
- +<------+
- | |
- V |
- +----+----+ |
- | State 2 | |
- +----+----+ |
- | |
- V |
- +----+----+ |
- | State 3 | |
- +----+----+ |
- | |
- +-------+
-
-UML
-~~~
-No not realy, yet. But you get the idea.
-
-.. aafigure::
-
- object 1 object 2
- ----+---- ----+----
- | |
- | |
- X |
- X--------->X
- X X
- X<---------X
- X |
- | |
- | |
-
-Electronics
-~~~~~~~~~~~
-It would be cool if it could display simple schematics.
-
-.. aafigure::
-
- R1
- o------XXXX----+-----o
- 100k |
- -+- C1
- -+- 100n
- |
- o--------------+-----o
-
-- Resistor should not be filled -> can be solved by symbol detection
-- Capacitor not good, would prefer --||-- -> symbol detection
-
-Timing diagrams
-~~~~~~~~~~~~~~~
-.. aafigure::
- :scale: 0.4
-
- ___ ___
- ___| |___| |_____________________
- ___ ___
- _____| |___| |___________________
-
-Or one with descriptions:
-
-.. aafigure::
- :scale: 0.8
-
- sda_edge
- start stop
- | | | |
- v v v v
- ___ __________ ___
- SDA | | | |
- |____| |_____..._________|
- ______ _____ _..._ _____
- SCL | | | | | |
- |____| |_____| |_____|
-
- ^ ^ ^ ^ ^ ^
- | | | | | |
- | sh_in | sh_in | sh_in
- sh_out sh_out sh_out
-
- scl_edge
diff --git a/sandbox/cliechti/aafigure/aa.py b/sandbox/cliechti/aafigure/aa.py
deleted file mode 100644
index 69d62b4fd..000000000
--- a/sandbox/cliechti/aafigure/aa.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Simple ASCII output of the rendered image.
-Think of it as a low resolution black and white image.
-
-(C) 2006 Chris Liechti <cliechti@gmx.net>
-"""
-
-import sys
-
-class AsciiOutputVisitor:
- """Render a list of shapes as ASCII art.
- Scaled, think of it as a low resolution black and white image
- """
-
- def __init__(self, scale=3):
- self.image = {}
- self.scale = scale
-
- def visit(self, aa_image):
- for shape in aa_image.shapes:
- shape_name = shape.__class__.__name__.lower()
- visitor_name = 'visit_%s' % shape_name
- if hasattr(self, visitor_name):
- getattr(self, visitor_name)(shape)
- else:
- print "don't know how to handle shape %r" % shape
-
- def visit_point(self, point):
- self.image[point.x*self.scale, point.y*self.scale] = '#'
-
- def visit_line(self, line):
- x1, x2 = line.start.x*self.scale, line.end.x*self.scale
- y1, y2 = line.start.y*self.scale, line.end.y*self.scale
- if x1 > x2: x1, x2 = x2, x1
- if y1 > y2: y1, y2 = y2, y1
- dx = x2 - x1
- dy = y2 - y1
- if dx > dy:
- y = y1
- if dx:
- m = float(dy)/dx
- else:
- m = 0
- for x in range(x1, x2+1):
- self.image[x,int(y)] = '#'
- y += m
- else:
- x = x1
- if dy:
- m = float(dx)/dy
- else:
- m = 0
- for y in range(y1, y2+1):
- self.image[int(x),y] = '#'
- x += m
- if line.start_style:
- self.image[line.start.x*self.scale,line.start.y*self.scale] = 'O'
- if line.end_style:
- self.image[line.end.x*self.scale,line.end.y*self.scale] = 'O'
-
- def visit_rectangle(self, rectangle):
- x1, x2 = rectangle.p1.x*self.scale, rectangle.p2.x*self.scale
- y1, y2 = rectangle.p1.y*self.scale, rectangle.p2.y*self.scale
- if x1 > x2: x1, x2 = x2, x1
- if y1 > y2: y1, y2 = y2, y1
- for y in range(y1, y2):
- for x in range(x1, x2):
- self.image[x,y] = '#'
-
- def visit_label(self, label):
- x, y = label.position.x*self.scale, label.position.y*self.scale
- for character in label.text:
- self.image[x, y] = character
- x += 1
-
- def __str__(self):
- """return a cropped image"""
- #find out size
- min_x = min_y = sys.maxint
- max_x = max_y = -sys.maxint
- for x,y in self.image:
- min_x = min(min_x, x)
- max_x = max(max_x, x)
- min_y = min(min_y, y)
- max_y = max(max_y, y)
- #render image to lines of text, fill unused fields with a dot
- result = []
- for y in range(min_y, max_y+1):
- line = []
- for x in range(min_x, max_x+1):
- line.append(self.image.get((x,y), '.'))
- result.append(''.join(line))
- return '\n'.join(result)
diff --git a/sandbox/cliechti/aafigure/aafigure.py b/sandbox/cliechti/aafigure/aafigure.py
deleted file mode 100644
index 74a3900ff..000000000
--- a/sandbox/cliechti/aafigure/aafigure.py
+++ /dev/null
@@ -1,308 +0,0 @@
-"""
-ASCII art to image converter.
-
-This is the main modlue that contains the parser.
-See svg.py and aa.py for output modules, that can reder the parsed structure.
-
-(C) 2006 Chris Liechti <cliechti@gmx.net>
-"""
-
-import pprint
-import svg
-import aa
-
-NOMINAL_SIZE = 2
-LEFT = TOP = 0
-CENTER = NOMINAL_SIZE/2
-RIGHT = BOTTOM = NOMINAL_SIZE
-
-CLASS_LINE = 'line'
-CLASS_STRING = 'str'
-CLASS_RECTANGLE = 'rect'
-
-# - - - - - - - - - - - - - - Shapes - - - - - - - - - - - - - - -
-class Point:
- """A single point. This class is primary use is to represent coordinates
- for the other shapes.
- """
- def __init__(self, x, y):
- self.x = x
- self.y = y
-
- def __repr__(self):
- return 'Point(%r, %r)' % (self.x, self.y)
-
-class Line:
- """Line with starting and ending point. Both ends can have arrows"""
- def __init__(self, start, end, start_style=None, end_style=None):
- self.start = start
- self.end = end
- self.start_style = start_style
- self.end_style = end_style
-
- def __repr__(self):
- return 'Line(%r, %r, %r, %r)' % (
- self.start,
- self.end,
- self.start_style,
- self.end_style
- )
-
-class Rectangle:
- """Rectangle with to edge coordiantes."""
- def __init__(self, p1, p2):
- self.p1 = p1
- self.p2 = p2
- def __repr__(self):
- return 'Rectangle(%r, %r)' % (self.p1, self.p2)
-
-class Label:
- """A label at a position"""
- def __init__(self, position, text):
- self.position = position
- self.text = text
- def __repr__(self):
- return 'Label(%r, %r)' % (self.position, self.text)
-
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-class AsciiArtImage:
- """This class hold a ASCII art figure and has methods to parse it.
- The resaulting list of shapes is also stored here.
- """
- ARROW_HEADS = list('<>Vv^')
-
- def __init__(self, text):
- """Take a ASCII art figure and store it, prepare for ``recognize``"""
- #XXX TODO tab expansion
- #detect size of input image
- self.image = []
- max_x = 0
- for y, line in enumerate(text.splitlines()):
- max_x = max(max_x, len(line))
- self.image.append(line)
- self.width = max_x
- self.height = y+1
- #make sure it's rectangular
- for y, line in enumerate(self.image):
- if len(line) < max_x:
- self.image[y] = line + ' '*(max_x-len(line))
- #initialize other data structures
- self.classification = [[None]*self.width for y in range(self.height)]
- self.shapes = []
- self.nominal_size = NOMINAL_SIZE
-
- def __repr__(self):
- return '%s\n%s' % (
- '\n'.join([','.join([str(self.classification[y][x])
- for x in range(self.width)])
- for y in range(self.height)]),
- pprint.pformat(self.shapes)
- )
-
- def __str__(self):
- """Return the original image"""
- return '\n'.join([self.image[y] for y in range(self.height)])
-
- def get(self, x, y):
- """Get character from image. Gives no error for access out of
- bounds, just returns a space. This simplifies the scanner
- functions.
- """
- try:
- return self.image[y][x]
- except IndexError:
- return ' '
-
- def tag(self, coordinates, classification):
- """Tag coordinates as used, store classification"""
- for x, y in coordinates:
- self.classification[y][x] = classification
-
- def recognize(self):
- """Try to convert ASCII are to vector graphics."""
- #XXX search for symbols
- #search for standard shapes
- for y in range(self.height):
- for x in range(self.width):
- #if not yet classified, check for a line
- character = self.image[y][x]
- if self.classification[y][x] != CLASS_LINE:
- if character == '-':
- self.shapes.append(self._follow_horizontal_line(x, y))
- elif character == '|':
- self.shapes.append(self._follow_vertical_line(x, y))
- elif character == '_':
- self.shapes.append(self._follow_lower_horizontal_line(x, y))
- if self.classification[y][x] is None:
- if character == 'X' and (self.get(x+1,y) == 'X' or self.get(x,y+1) == 'X'):
- self.shapes.append(self._follow_filled_rectangle(x, y))
- elif character.isalnum():
- self.shapes.append(self._follow_horizontal_string(x, y))
- elif character == '.':
- self.shapes.append(Point(x*NOMINAL_SIZE+CENTER,y*NOMINAL_SIZE+CENTER)) #XXX
-
- def _follow_vertical_line(self, x, y):
- """find a vertical line with optional arrow heads"""
- #follow line to the bottom
- _, end_y, line_end_style = self._follow_line(x, y, dy=1, line_character='|')
- #follow line to the top
- _, start_y, line_start_style = self._follow_line(x, y, dy=-1, line_character='|')
- #if a '+' follows a line, then the line is streched to hit the '+' center
- start_y_fix = end_y_fix = 0
- if self.get(x, start_y-1) == '+':
- start_y_fix = -NOMINAL_SIZE+CENTER
- if self.get(x, end_y+1) == '+':
- end_y_fix = CENTER
- #tag characters as used
- self.tag([(x, y) for y in range(start_y, end_y+1)], CLASS_LINE)
- #return the new shape object
- return Line(
- Point(x*NOMINAL_SIZE+CENTER, start_y*NOMINAL_SIZE+TOP+start_y_fix),
- Point(x*NOMINAL_SIZE+CENTER, end_y*NOMINAL_SIZE+BOTTOM+end_y_fix),
- line_start_style,
- line_end_style
- )
-
- def _follow_horizontal_line(self, x, y):
- """find a horizontal line with optional arrow heads"""
- #follow line to the right
- end_x, _, line_end_style = self._follow_line(x, y, dx=1, line_character='-')
- #follow line to the left
- start_x, _, line_start_style = self._follow_line(x, y, dx=-1, line_character='-')
- start_x_fix = end_x_fix = 0
- if self.get(start_x-1, y) == '+':
- start_x_fix = -NOMINAL_SIZE+CENTER
- if self.get(end_x+1, y) == '+':
- end_x_fix = CENTER
- self.tag([(x, y) for x in range(start_x, end_x+1)], CLASS_LINE)
- return Line(
- Point(start_x*NOMINAL_SIZE+LEFT+start_x_fix, y*NOMINAL_SIZE+CENTER),
- Point(end_x*NOMINAL_SIZE+RIGHT+end_x_fix, y*NOMINAL_SIZE+CENTER),
- line_start_style,
- line_end_style
- )
-
- def _follow_lower_horizontal_line(self, x, y):
- """find a horizontal line, the line is aligned to the bottom and a bit
- wider, so that it can be used for shapes like this:
- ___
- __| |___
- """
- #follow line to the right
- end_x, _, line_end_style = self._follow_line(x, y, dx=1, line_character='_')
- #follow line to the left
- start_x, _, line_start_style = self._follow_line(x, y, dx=-1, line_character='_')
- self.tag([(x, y) for x in range(start_x, end_x+1)], CLASS_LINE)
- return Line(
- Point(start_x*NOMINAL_SIZE+LEFT-CENTER, y*NOMINAL_SIZE+BOTTOM),
- Point(end_x*NOMINAL_SIZE+RIGHT+CENTER, y*NOMINAL_SIZE+BOTTOM),
- line_start_style,
- line_end_style
- )
-
- def _follow_line(self, x, y, dx=0, dy=0, line_character=None):
- """helper function for all the line functions"""
- #follow line in the given direction
- while 0 <= x < self.width and 0<= y < self.height and self.get(x+dx, y+dy) == line_character:
- x += dx
- y += dy
- #check for arrow head
- if self.get(x+dx, y+dy) in self.ARROW_HEADS:
- line_end_style = 'arrow' #XXX
- x += dx
- y += dy
- else:
- line_end_style = None
- return x, y, line_end_style
-
- def _follow_filled_rectangle(self, start_x, start_y):
- """detect the size of a filled rectangle. width is scanned first.
- shapes like these:
-
- XXXX
- XX
-
- are detected as two rectangles.
- """
- x = start_x
- y = start_y
- #expand as fas as possible to the right
- while x < self.width and self.get(x+1, y) == 'X':
- x += 1
- #expand height as long as the width stays the same
- while y < self.height and False not in [self.get(i,y+1) == 'X' for i in range(start_x, x+1)]:
- y += 1
- for i in range(start_y, y+1):
- self.tag([(x, i) for x in range(start_x, x+1)], CLASS_RECTANGLE)
- return Rectangle(
- Point(start_x*NOMINAL_SIZE+LEFT, start_y*NOMINAL_SIZE+TOP),
- Point(x*NOMINAL_SIZE+RIGHT, y*NOMINAL_SIZE+BOTTOM),
- )
-
- def _follow_horizontal_string(self, start_x, y):
- """find a string. may contain single spaces, but the detection is
- aborted after more than one space.
-
- Text one Text two
- """
- #follow line in the given direction
- x = start_x
- text = []
- text.append(self.get(x, y))
- is_first_space = True
- while 0 <= x < self.width \
- and (self.get(x+1, y).isalnum() \
- or (self.get(x+1, y) == ' ' and is_first_space)) \
- :
- x += 1
- text.append(self.get(x, y))
- if self.get(x, y) == ' ':
- is_first_space = False
- else:
- is_first_space = True
- if text[-1] == ' ':
- del text[-1]
- x -= 1
- self.tag([(x, y) for x in range(start_x, x+1)], CLASS_STRING)
- return Label(
- Point(start_x*NOMINAL_SIZE+LEFT, y*NOMINAL_SIZE+BOTTOM),
- ''.join(text)
- )
-
-
-def render(text):
- """helper function for tests. scan the given image and create svg output"""
- aaimg = AsciiArtImage(text)
- print text
- aaimg.recognize()
- aav = aa.AsciiOutputVisitor()
- pprint.pprint(aaimg.shapes)
- aav.visit(aaimg)
- print aav
- svgout = svg.SVGOutputVisitor(
- file('aafigure_%x.svg' % (long(hash(text)) & 0xffffffffL,), 'w'),
- scale = 10
- )
- svgout.visit(aaimg)
-
-
-if __name__ == '__main__':
- aaimg = AsciiArtImage("""
- ---> | ^| |
- <--- | || --+--
- <--> | |V |
- __ __
- | |__ +---+ |__|
- |box| ..
- +---+ Xenophon
- """)
- print aaimg
- aaimg.recognize()
- print "%r" % aaimg
- aav = aa.AsciiOutputVisitor()
- aav.visit(aaimg)
- print aav
-
diff --git a/sandbox/cliechti/aafigure/aafigure_directive.py b/sandbox/cliechti/aafigure/aafigure_directive.py
deleted file mode 100644
index d13f98f11..000000000
--- a/sandbox/cliechti/aafigure/aafigure_directive.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""
-implement aafigure directive
-"""
-
-import os, sys, tempfile, popen2
-import aafigure, svg
-
-from docutils import nodes
-from docutils.parsers.rst.directives import register_directive
-
-aafigure_counter = 0
-
-def AAFigureDrective(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- text = '\n'.join(content)
-
- global aafigure_counter
- aafigure_counter += 1
- output_name = 'aafigure-%i.svg' % aafigure_counter
-
- aaimg = aafigure.AsciiArtImage(text)
- #~ print text
- aaimg.recognize()
- if not options.has_key('scale'):
- options['scale'] = 1
-
- svgout = svg.SVGOutputVisitor(
- file(output_name, 'w'),
- scale = options['scale']*10,
- debug = True
- )
- svgout.visit(aaimg)
-
- # Return an image directive.
- #~ options['uri'] = os.path.basename(output_name)
- #~ return [nodes.image(output_name, **options)]
-
- attributes = {'format': 'html'}
- return [nodes.raw('', '<embed src="%s" %s/>' % (
- output_name,
- svgout.get_size_attrs()
- ), **attributes)]
-
-AAFigureDrective.content = True
-#~ AAFigureDrective.arguments = (1, 1, 1)
-AAFigureDrective.options = {'scale': float}
-
-def register():
- register_directive('aafigure', AAFigureDrective)
diff --git a/sandbox/cliechti/aafigure/makefile b/sandbox/cliechti/aafigure/makefile
deleted file mode 100644
index 7ddb89b5e..000000000
--- a/sandbox/cliechti/aafigure/makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# this makefile is for my convenience beacuse my editor has a handy shortcut to
-# run make
-
-all:
- python rst2html.py --traceback README.txt >readme.html \ No newline at end of file
diff --git a/sandbox/cliechti/aafigure/rst2html.py b/sandbox/cliechti/aafigure/rst2html.py
deleted file mode 100644
index 5dec1df40..000000000
--- a/sandbox/cliechti/aafigure/rst2html.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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.
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, Publisher, default_description
-
-import aafigure_directive
-aafigure_directive.register() # Enable the ABC directive
-
-description = ('Generates (X)HTML documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='html', description=description)
diff --git a/sandbox/cliechti/aafigure/svg.py b/sandbox/cliechti/aafigure/svg.py
deleted file mode 100644
index b10423654..000000000
--- a/sandbox/cliechti/aafigure/svg.py
+++ /dev/null
@@ -1,145 +0,0 @@
-"""
-SVG renderer.
-
-(C) 2006 Chris Liechti <cliechti@gmx.net>
-"""
-
-from xml.sax.saxutils import escape
-
-class SVGOutputVisitor:
- """Render a list of shapes as ASCII art.
- """
-
- def __init__(self, file_like, scale = 1, unit='px', debug=False):
- self.file_like = file_like
- self.scale = scale
- self.unit = unit
- self.debug = debug
-
- def _num(self, number):
- """helper number to format numers for svg output"""
- return "%d%s" % (int(number*self.scale), self.unit)
-
- def get_size_attrs(self):
- """get image size as svg text"""
- #this function is here beacuse of a hack. the rst2html converter
- #has to know the size of the figure it inserts
- return 'width="%s" height="%s"' % (
- self._num(self.width),
- self._num(self.height)
- )
-
- def visit(self, aa_image):
- """Process the gived ASCIIArtFigure and output the shapes in
- the SVG file
- """
- self.aa_image = aa_image #save fore later XXX not optimal to do it here
- self.width = (aa_image.width+1)*aa_image.nominal_size
- self.height = (aa_image.height+1)*aa_image.nominal_size
- self.file_like.write("""\
-<?xml version="1.0" standalone="no" ?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg width="%s" height="%s" xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink">
-""" % (
- self._num(self.width),
- self._num(self.height)
- ))
-
- #~ if self.debug:
- #~ #draw a rectangle around entire image
- #~ self._rectangle(
- #~ 0,0,
- #~ aa_image.width, aa_image.height,
- #~ style = 'fill:none;',
- #~ )
-
- for shape in aa_image.shapes:
- shape_name = shape.__class__.__name__.lower()
- visitor_name = 'visit_%s' % shape_name
- if hasattr(self, visitor_name):
- getattr(self, visitor_name)(shape)
- else:
- print "don't know how to handle shape %r" % shape
-
- self.file_like.write("""</svg>""")
-
- # - - - - - - SVG drawing helpers - - - - - - -
- def _line_c(self, p1, p2):
- """Draw a line, coordinates given as complex number"""
- self._line(p1.real, p1.imag, p2.real, p2.imag)
-
- def _line(self, x1, y1, x2, y2):
- """Draw a line, coordinates given as four decimal numbers"""
- self.file_like.write("""\
-<line x1="%s" y1="%s" x2="%s" y2="%s"
- style="stroke:black; stroke-width:2px;" />
-""" % (self._num(x1), self._num(y1), self._num(x2), self._num(y2)))
-
- def _rectangle(self, x1, y1, x2, y2, style=''):
- """Draw a rectange, coordinates given as four decimal numbers.
- ``style`` is inserted in the SVG. It could be e.g. "fill:yellow"
- """
- self.file_like.write("""\
-<rect x="%s" y="%s"
- width="%s"
- height="%s"
- style="stroke:black; stroke-width:2px; %s"
-/>
-""" % (
- self._num(x1), self._num(y1),
- self._num(x2-x1), self._num(y2-y1),
- style
- ))
-
- # - - - - - - visitor function for the different shape types - - - - - - -
-
- def visit_point(self, point):
- self.file_like.write("""\
-<cirlce cx="%s" cy="%s" r="%s"
- style="fill:black; stroke:black; stroke-width:2px;" />
-""" % (self._num(point.x), self._num(point.y), self._num(2)))
-
- def visit_line(self, line):
- self.file_like.write("<!-- line -->\n")
- x1, x2 = line.start.x, line.end.x
- y1, y2 = line.start.y, line.end.y
- self._line(x1, y1, x2, y2)
- #arrows
- p1 = complex(line.start.x,line.start.y)
- p2 = complex(line.end.x,line.end.y)
- if line.start_style:
- self.file_like.write("<!-- start arrow -->\n")
- directon_vector = p1 - p2
- directon_vector /= abs(directon_vector)
- self._line_c(p1, p1-directon_vector+directon_vector*0.5j)
- self._line_c(p1, p1-directon_vector+directon_vector*-0.5j)
- if line.end_style:
- self.file_like.write("<!-- end arrow -->\n")
- directon_vector = p2 - p1
- directon_vector /= abs(directon_vector)
- self._line_c(p2, p2-directon_vector+directon_vector*0.5j)
- self._line_c(p2, p2-directon_vector+directon_vector*-0.5j)
-
- def visit_rectangle(self, rectangle):
- self._rectangle(
- rectangle.p1.x, rectangle.p1.y,
- rectangle.p2.x, rectangle.p2.y
- )
-
- def visit_label(self, label):
- # font-weight="bold"
- self.file_like.write("""\
-<text x="%s" y="%s"
- font-family="Verdana,sans-serif"
- font-size="%s"
->
- %s
-</text>
-""" % (
- self._num(label.position.x), self._num(label.position.y-0.3), #XXX static offset not good in all situations
- self._num(self.aa_image.nominal_size),
- escape(label.text)
- ))
-
diff --git a/sandbox/cliechti/html2rst/README.txt b/sandbox/cliechti/html2rst/README.txt
deleted file mode 100644
index e6acc83f6..000000000
--- a/sandbox/cliechti/html2rst/README.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-html2rst README
-===============
-
-Overview
---------
-
-This is a hacked up version of Aaron Swartz' html2text_ to output reST.
-
-Features:
-
-- converts basic HTML documents to reST (titles, paragraphs, emphasizing)
-- lists <ul> <ol>, images, <code> and <pre> blocks
-- build a list of links, add reST references
-- the output is word-wrapped
-
-Problems:
-
-- tables are not fully supported (cell contents is output, but no borders)
-- it happens that it word-wraps URLs or does not catch the whole address
- in a reference
-- it doesn't like non-ASCII characters, currently replaces them with a ``?``
-- single backticks are put around all references even if it's one word.
-- not configurable (wrap optional, references per chapter , etc.)
-
-
-ToDo:
-
-- totaly reinvent the thing and write a xml2rst writer (rst2rst ;-) and use
- XML transformations
-
-
-Usage
------
-::
-
- html2rst.py index.html >index.txt
-
-
-License
--------
-
-The html2text_ script the code is based on, is licensed under the `GNU GPL 2`_.
-This code is under the same license.
-
-
-
-.. _html2text: http://www.aaronsw.com/2002/html2text/
-.. _GNU GPL 2: http://www.gnu.org/copyleft/gpl.html \ No newline at end of file
diff --git a/sandbox/cliechti/html2rst/html2rst.py b/sandbox/cliechti/html2rst/html2rst.py
deleted file mode 100644
index 4962493f9..000000000
--- a/sandbox/cliechti/html2rst/html2rst.py
+++ /dev/null
@@ -1,453 +0,0 @@
-"""html2rst: Turn HTML into reStructured text.
-
-based on Aaron Swartz <me@aaronsw.com> html2text V 2.23
-http://www.aaronsw.com/2002/html2text/
-
-| GNU GPL 2.
-| (C) 2004 Aaron Swartz.
-| (C) 2005 Chris Liechti.
-
-Changes to the original:
-
-- generate reST comaptible output
-- don't number links, use named references
-- redo wrap function so that it keeps indents in lists
-
-
-There a re a number of problems with this approach and implementation, see
-README.txt
-"""
-
-
-# TODO:
-# Support decoded entities with unifiable.
-# Relative URL resolution
-
-if not hasattr(__builtins__, 'True'): True, False = 1, 0
-import re, sys, urllib, htmlentitydefs, codecs, StringIO, types
-import sgmllib
-sgmllib.charref = re.compile('&#([xX]?[0-9a-fA-F]+)[^0-9a-fA-F]')
-
-try: from textwrap import wrap
-except: pass
-
-# Use Unicode characters instead of their ascii psuedo-replacements
-UNICODE_SNOB = 0
-
-# Put the links after each paragraph instead of at the end.
-LINKS_EACH_PARAGRAPH = 0
-
-# Wrap long lines at position. 0 for no wrapping. (Requires Python 2.3.)
-BODY_WIDTH = 0
-
-### Entity Nonsense ###
-
-def name2cp(k):
- if k == 'apos': return ord("'")
- if hasattr(htmlentitydefs, "name2codepoint"): # requires Python 2.3
- return htmlentitydefs.name2codepoint[k]
- else:
- k = htmlentitydefs.entitydefs[k]
- if k.startswith("&#") and k.endswith(";"): return int(k[2:-1]) # not in latin-1
- return ord(codecs.latin_1_decode(k)[0])
-
-unifiable = {'rsquo':"'", 'lsquo':"'", 'rdquo':'"', 'ldquo':'"',
-'copy':'(C)', 'mdash':'--', 'nbsp':' ', 'rarr':'->', 'larr':'<-', 'middot':'*',
-'ndash':'-', 'oelig':'oe', 'aelig':'ae',
-'agrave':'a', 'aacute':'a', 'acirc':'a', 'atilde':'a', 'auml':'a', 'aring':'a',
-'egrave':'e', 'eacute':'e', 'ecirc':'e', 'euml':'e',
-'igrave':'i', 'iacute':'i', 'icirc':'i', 'iuml':'i',
-'ograve':'o', 'oacute':'o', 'ocirc':'o', 'otilde':'o', 'ouml':'o',
-'ugrave':'u', 'uacute':'u', 'ucirc':'u', 'uuml':'u'}
-
-unifiable_n = {}
-
-for k in unifiable.keys():
- unifiable_n[name2cp(k)] = unifiable[k]
-
-def charref(name):
- if name[0] in ['x','X']:
- c = int(name[1:], 16)
- else:
- c = int(name)
-
- if not UNICODE_SNOB and c in unifiable_n.keys():
- return unifiable_n[c]
- else:
- return unichr(c)
-
-def entityref(c):
- if not UNICODE_SNOB and c in unifiable.keys():
- return unifiable[c]
- else:
- try: name2cp(c)
- except KeyError: return "&" + c
- else: return unichr(name2cp(c))
-
-def replaceEntities(s):
- s = s.group(1)
- if s[0] == "#":
- return charref(s[1:])
- else: return entityref(s)
-
-r_unescape = re.compile(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));")
-def unescape(s):
- return r_unescape.sub(replaceEntities, s)
-
-def fixattrs(attrs):
- # Fix bug in sgmllib.py
- if not attrs: return attrs
- newattrs = []
- for attr in attrs:
- newattrs.append((attr[0], unescape(attr[1])))
- return newattrs
-
-### End Entity Nonsense ###
-
-def onlywhite(line):
- """Return true if the line does only consist of whitespace characters."""
- for c in line:
- if c is not ' ' and c is not ' ':
- return c is ' '
- return line
-
-def optwrap(text):
- """Wrap all paragraphs in the provided text."""
- if not BODY_WIDTH:
- return text
-
- assert wrap # Requires Python 2.3.
- result = ''
- newlines = 0
- for para in text.split("\n"):
- if len(para) > 0:
- if para[0] is not ' ' and para[0] is not '-' and para[0] is not '*':
- for line in wrap(para, BODY_WIDTH):
- result += line + "\n"
- result += "\n"
- newlines = 2
- else:
- if not onlywhite(para):
- result += para + "\n"
- newlines = 1
- else:
- if newlines < 2:
- result += "\n"
- newlines += 1
- return result
-
-TITLE_UNDERLININGS = "$=-~:."
-
-def hn(tag):
- if tag[0] == 'h' and len(tag) == 2:
- try:
- n = int(tag[1])
- if n in range(1, 10): return n
- except ValueError: return 0
-
-class _html2text(sgmllib.SGMLParser):
- def __init__(self, out=sys.stdout.write):
- sgmllib.SGMLParser.__init__(self)
-
- if out is None: self.out = self.outtextf
- else: self.out = out
- self.outtext = u''
- self.quiet = 0
- self.p_p = 0
- self.outcount = 0
- self.start = 1
- self.space = 0
- self.a = []
- self.astack = []
- self.acount = 0
- self.list = []
- self.blockquote = 0
- self.pre = 0
- self.startpre = 0
- self.lastWasNL = 0
- self.indentation = 0
- self.indentation_stack = []
- """required to keep indent after unbalanced <li>s"""
-
- def outtextf(self, s):
- if type(s) is type(''): s = codecs.utf_8_decode(s)[0]
- self.outtext += s
-
- def close(self):
- sgmllib.SGMLParser.close(self)
-
- self.pbr()
- self.o('', 0, 'end')
-
- return self.outtext
-
- def handle_charref(self, c):
- self.o(charref(c))
-
- def handle_entityref(self, c):
- self.o(entityref(c))
-
- def unknown_starttag(self, tag, attrs):
- self.handle_tag(tag, attrs, 1)
-
- def unknown_endtag(self, tag):
- self.handle_tag(tag, None, 0)
-
- def previousIndex(self, attrs):
- """ returns the index of certain set of attributes (of a link) in the
- self.a list
-
- If the set of attributes is not found, returns None
- """
- if not attrs.has_key('href'): return None
-
- i = -1
- for a in self.a:
- i += 1
- match = 0
-
- if a.has_key('href') and a['href'] == attrs['href']:
- if a.has_key('title') or attrs.has_key('title'):
- if (a.has_key('title') and attrs.has_key('title') and
- a['title'] == attrs['title']):
- match = True
- else:
- match = True
-
- if match: return i
-
- def handle_tag(self, tag, attrs, start):
- attrs = fixattrs(attrs)
-
- if hn(tag):
- #~ if start: self.o(hn(tag)*"#" + ' ')
- if start:
- self.o('\n')
- else:
- self.o('\n' + TITLE_UNDERLININGS[hn(tag)]*len(self.last_output))
- self.p()
-
- if tag in ['p', 'div']: self.p()
-
- if tag == "br" and start: self.o(" \n")
-
- if tag == "hr" and start:
- self.p()
- self.o("--------")
- self.p()
-
- if tag in ["head", "style", 'script']:
- if start:
- self.quiet += 1
- else:
- self.quiet -= 1
-
- if tag == "blockquote":
- if start:
- self.p(); self.o('> ', 0, 1); self.start = 1
- self.blockquote += 1
- else:
- self.blockquote -= 1
- self.p()
-
- if tag in ['em', 'i', 'u']:
- self.o("*")
- if tag in ['strong', 'b']:
- self.o("**")
- if tag in ['code', 'tt'] and not self.pre:
- self.o('``') #TODO: `` `this` ``
-
- if tag == "a":
- if start:
- attrsD = {}
- for (x, y) in attrs: attrsD[x] = y
- attrs = attrsD
- if attrs.has_key('href'):
- self.astack.append(attrs)
- self.o("`")
- else:
- self.astack.append(None)
- else:
- if self.astack:
- a = self.astack.pop()
- if a:
- i = self.previousIndex(a)
- if i is not None:
- a = self.a[i]
- else:
- self.acount += 1
- a['count'] = self.acount
- a['outcount'] = self.outcount
- a['data'] = self.last_output.replace('\n', ' ')
- self.a.append(a)
- self.o("`_")
-
- if tag == "img" and start:
- attrsD = {}
- for (x, y) in attrs: attrsD[x] = y
- attrs = attrsD
- if attrs.has_key('src'):
- #~ attrs['href'] = attrs['src']
- alt = attrs.get('alt', '')
- #~ i = self.previousIndex(attrs)
- #~ if i is not None:
- #~ attrs = self.a[i]
- #~ else:
- #~ self.acount += 1
- #~ attrs['count'] = self.acount
- #~ attrs['outcount'] = self.outcount
- #~ attrs['data'] = attrs['src']
- #~ self.a.append(attrs)
- self.o(".. image:: %s\n" % attrs['src'])
- if alt:
- self.o(" :alt: %s\n" % alt)
- #~ self.o("["+ repr(attrs['count']) +"]")
-
- if tag in ["ol", "ul"]:
- if start:
- self.list.append({'name':tag, 'num':0})
- self.indentation_stack.append(self.indentation)
- else:
- if self.list: self.list.pop()
- self.indentation = self.indentation_stack.pop()
- self.p()
-
- if tag == 'li':
- if start:
- if self.indentation_stack:
- self.indentation = self.indentation_stack[-1]
- self.pbr()
- if self.list: li = self.list[-1]
- else: li = {'name':'ul', 'num':0}
- #~ self.o(" "*len(self.list)) #TODO: line up <ol><li>s > 9 correctly.
- if li['name'] == "ul": self.o("- ")
- elif li['name'] == "ol":
- li['num'] += 1
- self.o('%-4s' % ('%d.' % li['num']))
- self.start = 1
- self.indentation += 1
- else:
- self.indentation -= 1
- self.pbr()
-
- if tag in ['tr']: self.pbr()
-
- if tag == "pre":
- if start:
- self.o('::')
- self.startpre = 1
- self.pre = 1
- else:
- self.pre = 0
- #~ self.p()
-
- def pbr(self):
- if self.p_p == 0: self.p_p = 1
-
- def p(self): self.p_p = 2
-
- def o(self, data, puredata=0, force=0):
- if not self.quiet:
- if puredata and not self.pre:
- data = re.sub(r'\s+', ' ', data)
- if data and data[0] == ' ':
- self.space = 1
- data = data[1:]
- if not data and not force: return
-
- if self.startpre:
- #self.out(" :") #TODO: not output when already one there
- self.startpre = 0
-
- bq = (">" * self.blockquote)
- if not (force and data and data[0] == ">") and self.blockquote: bq += " "
- bq += ' '*self.indentation
-
- if self.pre:
- bq += " "
- data = data.replace("\n", "\n"+bq)
-
- if self.start:
- self.space = 0
- self.p_p = 0
- self.start = 0
-
- if force == 'end':
- # It's the end.
- self.p_p = 0
- self.out("\n")
- self.space = 0
-
- if self.p_p:
- self.out(('\n'+bq)*self.p_p)
- self.space = 0
-
- if self.space:
- if not self.lastWasNL: self.out(' ')
- self.space = 0
-
- if self.a and ((self.p_p == 2 and LINKS_EACH_PARAGRAPH) or force == "end"):
- if force == "end": self.out("\n")
-
- newa = []
- for link in self.a:
- if self.outcount > link['outcount']:
- self.out(".. _"+link['data']+": " + link['href']) #TODO: base href
- if link.has_key('title'): self.out(" ("+link['title']+")")
- self.out("\n")
- else:
- newa.append(link)
-
- if self.a != newa: self.out("\n") # Don't need an extra line when nothing was done.
-
- self.a = newa
-
- self.p_p = 0
- self.out(data)
- self.lastWasNL = data and data[-1] == '\n'
- self.outcount += 1
-
- def handle_data(self, data):
- self.last_output = data
- self.o(data, 1)
-
- def unknown_decl(self, data): pass
-
-def html2text_file(html, out=sys.stdout.write):
- h = _html2text(out)
- h.feed(html)
- h.feed("")
- return h.close()
-
-def html2text(html):
- return optwrap(html2text_file(html, None))
-
-import textwrap
-def optwrap(text):
- """smart wrapping, keeping indents"""
- output = []
- iii = re.compile(r'(\.\. )|(\d+.)|(- )')
- for p in text.splitlines():
- indent = 0
- while indent < len(p) and p[indent] == ' ':
- indent += 1
- j = '\n'
- un = p[indent:]
- if iii.match(p):
- j += ' '
- j += ' '*indent
- output.append(j.join(textwrap.wrap(p, width=78-len(j))))
- return '\n'.join(output)
-
-if __name__ == "__main__":
- if sys.argv[1:]:
- arg = sys.argv[1]
- if arg.startswith('http://'):
- data = urllib.urlopen(arg).read()
- else:
- data = open(arg, 'r').read()
- else:
- data = sys.stdin.read()
- #~ html2text_file(data)
- rest = optwrap(html2text_file(data, None))
- sys.stdout.write(rest.encode('ascii', 'replace'))
diff --git a/sandbox/davidg/pysource_reader/en.py b/sandbox/davidg/pysource_reader/en.py
deleted file mode 100644
index 78a383ab3..000000000
--- a/sandbox/davidg/pysource_reader/en.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#! /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.
-
-"""
-
-interpreted = {
- 'package': nodes.package,
- 'module': nodes.module,
- 'class': nodes.inline_class,
- 'method': nodes.method,
- 'function': nodes.function,
- 'variable': nodes.variable,
- 'parameter': nodes.parameter,
- 'type': nodes.type,
- 'class attribute': nodes.class_attribute,
- 'classatt': nodes.class_attribute,
- 'instance attribute': nodes.instance_attribute,
- 'instanceatt': nodes.instance_attribute,
- 'module attribute': nodes.module_attribute,
- 'moduleatt': nodes.module_attribute,
- 'exception class': nodes.exception_class,
- 'exception': nodes.exception_class,
- 'warning class': nodes.warning_class,
- 'warning': nodes.warning_class,}
-"""Mapping of interpreted text role name to nodes.py class."""
diff --git a/sandbox/davidg/pysource_reader/nodes.py b/sandbox/davidg/pysource_reader/nodes.py
deleted file mode 100644
index 6aae3bdb6..000000000
--- a/sandbox/davidg/pysource_reader/nodes.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#! /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.
-
-"""
-
-from dps import nodes
-from dps.nodes import Element, TextElement, Structural, Component, Inline
-
-
-# =====================
-# Structural Elements
-# =====================
-
-class package_section(Structural, Element): pass
-class module_section(Structural, Element): pass
-class class_section(Structural, Element): pass
-class method_section(Structural, Element): pass
-class function_section(Structural, Element): pass
-class module_attribute_section(Structural, Element): pass
-class class_attribute_section(Structural, Element): pass
-class instance_attribute_section(Structural, Element): pass
-
-# Structural Support Elements
-# ---------------------------
-
-class inheritance_list(Component, Element): pass
-class parameter_list(Component, Element): pass
-class parameter_item(Component, Element): pass
-class optional_parameters(Component, Element): pass
-class parameter_tuple(Component, Element): pass
-class parameter_default(Component, TextElement): pass
-class initial_value(Component, TextElement): pass
-
-
-# =================
-# Inline Elements
-# =================
-
-class package(Component, Inline, TextElement): pass
-class module(Component, Inline, TextElement): pass
-
-
-class inline_class(Component, Inline, TextElement):
-
- tagname = 'class'
-
-
-class method(Component, Inline, TextElement): pass
-class function(Component, Inline, TextElement): pass
-class variable(Inline, TextElement): pass
-class parameter(Component, Inline, TextElement): pass
-class type(Inline, TextElement): pass
-class class_attribute(Component, Inline, TextElement): pass
-class module_attribute(Component, Inline, TextElement): pass
-class instance_attribute(Component, Inline, TextElement): pass
-class exception_class(Inline, TextElement): pass
-class warning_class(Inline, TextElement): pass
-
-
-class SpecificVisitor(nodes.SpecificVisitor):
-
- """
- """
-
- def visit_class_attribute(self, node, ancestry): pass
- def visit_class_attribute_section(self, node, ancestry): pass
- def visit_class_section(self, node, ancestry): pass
- def visit_exception_class(self, node, ancestry): pass
- def visit_function(self, node, ancestry): pass
- def visit_function_section(self, node, ancestry): pass
- def visit_inheritance_list(self, node, ancestry): pass
- def visit_initial_value(self, node, ancestry): pass
- def visit_inline_class(self, node, ancestry): pass
- def visit_instance_attribute(self, node, ancestry): pass
- def visit_instance_attribute_section(self, node, ancestry): pass
- def visit_method(self, node, ancestry): pass
- def visit_method_section(self, node, ancestry): pass
- def visit_module(self, node, ancestry): pass
- def visit_module_attribute(self, node, ancestry): pass
- def visit_module_attribute_section(self, node, ancestry): pass
- def visit_module_section(self, node, ancestry): pass
- def visit_optional_parameters(self, node, ancestry): pass
- def visit_package(self, node, ancestry): pass
- def visit_package_section(self, node, ancestry): pass
- def visit_parameter(self, node, ancestry): pass
- def visit_parameter_default(self, node, ancestry): pass
- def visit_parameter_item(self, node, ancestry): pass
- def visit_parameter_list(self, node, ancestry): pass
- def visit_parameter_tuple(self, node, ancestry): pass
- def visit_type(self, node, ancestry): pass
- def visit_variable(self, node, ancestry): pass
- def visit_warning_class(self, node, ancestry): pass
diff --git a/sandbox/delza/parsers/rst/directives/misc.py b/sandbox/delza/parsers/rst/directives/misc.py
deleted file mode 100644
index 40e908b83..000000000
--- a/sandbox/delza/parsers/rst/directives/misc.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# Authors: David Goodger, Dethe Elza
-# Contact: goodger@users.sourceforge.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""Miscellaneous directives."""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os.path
-import re
-from urllib2 import urlopen, URLError
-from docutils import io, nodes, statemachine, utils
-from docutils.parsers.rst import directives, states
-from docutils.transforms import misc
-
-include_registry = {}
-def include(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- """Include a reST file as part of the content of this reST file."""
- try:
- source = state_machine.input_lines.source(
- lineno - state_machine.input_offset - 1)
- source_dir = os.path.dirname(os.path.abspath(source))
- except AttributeError:
- # It might be that we're not actually reading from a file
- # right now; so just read the first line of block_text
- # instead and grab the filename from that
- process_me=block_text
- lines=re.compile("\n").split(process_me)
- path=re.sub(re.compile("..\s+include::\s+"),"",lines[0])
- source_dir = os.path.dirname(os.path.abspath(path))
-
- path = ''.join(arguments[0].splitlines())
- if path.find(' ') != -1:
- error = state_machine.reporter.error(
- '"%s" directive path contains whitespace.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- path = os.path.normpath(os.path.join(source_dir, path))
- path = utils.relative_path(None, path)
- if include_registry.has_key(path): return []
- include_registry[path] = True
- try:
- include_file = io.FileInput(
- source_path=path, encoding=state.document.settings.input_encoding,
- handle_io_errors=None)
- except IOError, error:
- severe = state_machine.reporter.severe(
- 'Problems with "%s" directive path:\n%s: %s.'
- % (name, error.__class__.__name__, error),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [severe]
- include_text = include_file.read()
- if options.has_key('literal'):
- literal_block = nodes.literal_block(include_text, include_text,
- source=path)
- literal_block.line = 1
- return literal_block
- else:
- include_lines = statemachine.string2lines(include_text,
- convert_whitespace=1)
- state_machine.insert_input(include_lines, path)
- return []
-
-include.arguments = (1, 0, 1)
-include.options = {'literal': directives.flag}
-
-def raw(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- """
- Pass through content unchanged
-
- Content is included in output based on type argument
-
- Content may be included inline (content section of directive) or
- imported from a file or url.
- """
- attributes = {'format': arguments[0]}
- if content:
- if options.has_key('file') or options.has_key('url'):
- error = state_machine.reporter.error(
- '"%s" directive may not both specify an external file and '
- 'have content.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- text = '\n'.join(content)
- elif options.has_key('file'):
- if options.has_key('url'):
- error = state_machine.reporter.error(
- 'The "file" and "url" options may not be simultaneously '
- 'specified for the "%s" directive.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- source_dir = os.path.dirname(
- os.path.abspath(state.document.current_source))
- path = os.path.normpath(os.path.join(source_dir, options['file']))
- path = utils.relative_path(None, path)
- try:
- raw_file = open(path)
- except IOError, error:
- severe = state_machine.reporter.severe(
- 'Problems with "%s" directive path:\n%s.' % (name, error),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [severe]
- text = raw_file.read()
- raw_file.close()
- attributes['source'] = path
- elif options.has_key('url'):
- try:
- raw_file = urlopen(options['url'])
- except (URLError, IOError, OSError), error:
- severe = state_machine.reporter.severe(
- 'Problems with "%s" directive URL "%s":\n%s.'
- % (name, options['url'], error),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [severe]
- text = raw_file.read()
- raw_file.close()
- attributes['source'] = options['file']
- else:
- error = state_machine.reporter.warning(
- 'The "%s" directive requires content; none supplied.' % (name),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- raw_node = nodes.raw('', text, **attributes)
- return [raw_node]
-
-raw.arguments = (1, 0, 1)
-raw.options = {'file': directives.path,
- 'url': directives.path}
-raw.content = 1
-
-def replace(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- if not isinstance(state, states.SubstitutionDef):
- error = state_machine.reporter.error(
- 'Invalid context: the "%s" directive can only be used within a '
- 'substitution definition.' % (name),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- text = '\n'.join(content)
- element = nodes.Element(text)
- if text:
- state.nested_parse(content, content_offset, element)
- if len(element) != 1 or not isinstance(element[0], nodes.paragraph):
- messages = []
- for node in element:
- if isinstance(node, nodes.system_message):
- if node.has_key('backrefs'):
- del node['backrefs']
- messages.append(node)
- error = state_machine.reporter.error(
- 'Error in "%s" directive: may contain a single paragraph '
- 'only.' % (name), line=lineno)
- messages.append(error)
- return messages
- else:
- return element[0].children
- else:
- error = state_machine.reporter.error(
- 'The "%s" directive is empty; content required.' % (name),
- line=lineno)
- return [error]
-
-replace.content = 1
-
-def unicode_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- r"""
- Convert Unicode character codes (numbers) to characters. Codes may be
- decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
- ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
- entities (e.g. ``&#x262E;``). Text following ".." is a comment and is
- ignored. Spaces are ignored, and any other text remains as-is.
- """
- if not isinstance(state, states.SubstitutionDef):
- error = state_machine.reporter.error(
- 'Invalid context: the "%s" directive can only be used within a '
- 'substitution definition.' % (name),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- codes = arguments[0].split('.. ')[0].split()
- element = nodes.Element()
- for code in codes:
- try:
- if code.isdigit():
- element += nodes.Text(unichr(int(code)))
- else:
- match = unicode_pattern.match(code)
- if match:
- value = match.group(1) or match.group(2)
- element += nodes.Text(unichr(int(value, 16)))
- else:
- element += nodes.Text(code)
- except (ValueError, OverflowError), err:
- error = state_machine.reporter.error(
- 'Invalid character code: %s\n%s: %s'
- % (code, err.__class__.__name__, err),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- return element.children
-
-unicode_directive.arguments = (1, 0, 1)
-unicode_pattern = re.compile(
- r'(?:0x|x|\x00x|U\+?|\x00u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
-
-def class_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- """"""
- class_value = nodes.make_id(arguments[0])
- if class_value:
- pending = nodes.pending(misc.ClassAttribute,
- {'class': class_value, 'directive': name},
- block_text)
- state_machine.document.note_pending(pending)
- return [pending]
- else:
- error = state_machine.reporter.error(
- 'Invalid class attribute value for "%s" directive: %s'
- % (name, arguments[0]),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
-
-class_directive.arguments = (1, 0, 0)
-class_directive.content = 1
-
-def directive_test_function(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- if content:
- text = '\n'.join(content)
- info = state_machine.reporter.info(
- 'Directive processed. Type="%s", arguments=%r, options=%r, '
- 'content:' % (name, arguments, options),
- nodes.literal_block(text, text), line=lineno)
- else:
- info = state_machine.reporter.info(
- 'Directive processed. Type="%s", arguments=%r, options=%r, '
- 'content: None' % (name, arguments, options), line=lineno)
- return [info]
-
-directive_test_function.arguments = (0, 1, 1)
-directive_test_function.options = {'option': directives.unchanged_required}
-directive_test_function.content = 1
diff --git a/sandbox/dkuhlman/Docs/Makefile b/sandbox/dkuhlman/Docs/Makefile
deleted file mode 100644
index 6e6218f94..000000000
--- a/sandbox/dkuhlman/Docs/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-# Makefile to process a file LaTeX with the Python LaTeX system.
-# Optionally processes reStructuredText files.
-
-#
-# Change the following to point to your Python source code.
-#
-PYTHON_SRC = /w1/Python/Python-2.3b2
-DOCUTILS_DIR = /w1/Python/DocUtils/docutils
-
-#
-# Change the following to point to your Docutils installation.
-#
-DOCUTILSTOOLS_DIR = $(DOCUTILS_DIR)/tools
-TRANSFORMDOCPY = $(DOCUTILSTOOLS_DIR)/python_latex.py \
- --documentclass=howto
-
-#
-# Change these flags for your purposes.
-#
-#HTMLFLAGS= --image-type png --html -s 1 --favicon ../icons/pyfav.gif
-HTMLFLAGS= --iconserver ../icons --html -s 1 --favicon ../icons/pyfav.gif
-
-MKHOWTO = $(PYTHON_SRC)/Doc/tools/mkhowto
-
-PAPER = a4
-
-#
-# Change this to the name of your source file (without extension).
-#
-#SRC_NAME=zip-ls
-ifndef SRC_NAME
-$(error Must define SRC_NAME (no extension), e.g. make SRC_NAME=mysourcefile)
-endif
-
-TARGETS = $(SRC_NAME)/$(SRC_NAME).html
-
-FIGURES =
-
-all: html
-
-html: $(TARGETS) $(FIGURES)
-
-$(SRC_NAME)/$(SRC_NAME).html: $(SRC_NAME).tex
- $(MKHOWTO) $(HTMLFLAGS) $(SRC_NAME).tex
-
-#
-# Remove or Comment out the following lines if your source file
-# is a LaTeX file not a reST file.
-#
-$(SRC_NAME).tex: $(SRC_NAME).txt
- $(TRANSFORMDOCPY) $(SRC_NAME).txt > $(SRC_NAME).tex
-
-clean:
- rm -f *~ *.aux *.idx *.ilg *.ind *.log *.toc *.bkm *.syn \
-*.pla *.eps *.pdf *.ps *.lof *.l2h *.tex2 *.dvi
- -rm -f $(SRC_NAME).tex
- -rm -f $(SRC_NAME)/*
- -rmdir $(SRC_NAME)
- -rm -f $(SRC_NAME).tex
-
-
diff --git a/sandbox/dkuhlman/Docs/rstpythonlatex_intro.txt b/sandbox/dkuhlman/Docs/rstpythonlatex_intro.txt
deleted file mode 100644
index cc37d6562..000000000
--- a/sandbox/dkuhlman/Docs/rstpythonlatex_intro.txt
+++ /dev/null
@@ -1,215 +0,0 @@
-
-:author: Dave Kuhlman
-:revision: 1.0a
-:date: July 1, 2003
-
-:copyright: Copyright (c) 2003 Dave Kuhlman
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use, copy,
- modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
-:abstract: This document describes a Docutils writer for use with
- Python LaTeX and the Python project's documentation tools.
-
-
-==============================================
-Introduction to the Documenting Python Writer
-==============================================
-
-
--------------
-What It Does
--------------
-
-This writer for Docutils generates LaTeX suitable for
-input to the documentation system described in `Documenting
-Python`_
-
-.. _`Documenting Python`: http://www.python.org/dev/doc/devel/doc/doc.html
-
-
----------------
-Where to Get It
----------------
-
-This writer is not yet part of the Docutils distribution. Until
-it is, you can find it at
-`"A Docutils writer for the Documenting Python system"`_.
-
-.. _`"A Docutils writer for the Documenting Python system"`:
- http://www.rexx.com/~dkuhlman/#docutils_pythonlatex
-
-
---------------
-How to Use It
---------------
-
-Conversion has several steps:
-
-1. Run the writer -- Run *documenting_python.py* in
- *docutils/tools*, for example::
-
- $ docutils/tools/python_latex.py --documentclass=howto rstpythonlatex_intro.txt
-
- There is one option:
-
-
- --documentclass=class
-
- Selects the template type from Doc/templates in the Python
- source distribution. Possible values are ``howto``,
- ``manual``, and ``module``. The ``module`` document type is
- not yet implemented. See the Doc/templates subdirectory in the
- Python Source code distribution for samples of these document
- types.
-
- .. ("module" too, according to the writer's settings_spec. Or should
- "module" be removed from the writer?)
-
-2. Run the "Documenting Python" document processor.
-
-
-Here is a Makefile that performs these two steps. It was used to
-convert the document that you are currently reading::
-
- # Makefile to process a file LaTeX with the Python LaTeX system.
- # Optionally processes reStructuredText files.
-
- #
- # Change the following to point to your Python source code.
- #
- PYTHON_SRC = /w1/Python/Python-2.3b2
- DOCUTILS_DIR = /w1/Python/DocUtils/docutils
-
- #
- # Change the following to point to your Docutils installation.
- #
- DOCUTILSTOOLS_DIR = $(DOCUTILS_DIR)/tools
- TRANSFORMDOCPY = $(DOCUTILSTOOLS_DIR)/python_latex.py \
- --documentclass=howto
-
- #
- # Change these flags for your purposes.
- #
- #HTMLFLAGS= --image-type png --html -s 1 --favicon ../icons/pyfav.gif
- HTMLFLAGS= --iconserver ../icons --html -s 1 --favicon ../icons/pyfav.gif
-
- MKHOWTO = $(PYTHON_SRC)/Doc/tools/mkhowto
-
- PAPER = a4
-
- #
- # Change this to the name of your source file (without extension).
- #
- #SRC_NAME=zip-ls
- ifndef SRC_NAME
- $(error Must define SRC_NAME (no extension), e.g. make SRC_NAME=mysourcefile)
- endif
-
- TARGETS = $(SRC_NAME)/$(SRC_NAME).html
-
- FIGURES =
-
- all: html
-
- html: $(TARGETS) $(FIGURES)
-
- $(SRC_NAME)/$(SRC_NAME).html: $(SRC_NAME).tex
- $(MKHOWTO) $(HTMLFLAGS) $(SRC_NAME).tex
-
- #
- # Remove or Comment out the following lines if your source file
- # is a LaTeX file not a reST file.
- #
- $(SRC_NAME).tex: $(SRC_NAME).txt
- $(TRANSFORMDOCPY) $(SRC_NAME).txt > $(SRC_NAME).tex
-
- clean:
- rm -f *~ *.aux *.idx *.ilg *.ind *.log *.toc *.bkm *.syn \
- *.pla *.eps *.pdf *.ps *.lof *.l2h *.tex2 *.dvi
- -rm -f $(SRC_NAME).tex
- -rm -f $(SRC_NAME)/*
- -rmdir $(SRC_NAME)
- -rm -f $(SRC_NAME).tex
-
-
-Run this Makefile with the following commands::
-
- $ make SRC_NAME=rstpythonlatex_intro clean
- $ make SRC_NAME=rstpythonlatex_intro
-
-
-
-
-------------------------------
-Special Formatting Constructs
-------------------------------
-
-See the companion document 'Quick reStructuredText for
-"Documenting Python"' for additional mark-up that can be used when
-generating LaTeX for "Documenting Python". It is included in the
-distribution file for this writer.
-
-The first section of that document has information specific to the
-generation of LaTeX for Documenting Python.
-
-In addition, that document also adds another column to the
-specification tables. This additional column describes the LaTeX
-commands generated by this writer.
-
-
------------------
-Acknowledgements
------------------
-
-Thanks to the Docutils project members for Docutils. In
-particular, thanks to project coordinator David Goodger.
-
-Thanks to Engelbert Gruber for the implementation of the LaTeX
-writer. That implementation formed the starting point for this
-writer. He should get much of the credit for this writer also,
-however, any bugs were likely introduced by me.
-
-Thanks to Fred Drake (and many more I'm sure) for the Python
-documentation tools, the Python documentation project, and the
-Python documentation itself.
-
----------
-See Also
----------
-
-`The Docutils Home Page`_
-
-.. _`The Docutils Home Page`: http://docutils.sourceforge.net/
-
-
-`The Python home page`_
-
-.. _`The Python home page`: http://www.python.org/
-
-
-`The documentation on the Documenting Python system`_
-
-.. _`The documentation on the Documenting Python system`:
- http://www.python.org/dev/doc/devel/doc/doc.html
-
-`"A Docutils writer for the Documenting Python system"`_
-
-.. _`"A Docutils writer for the Documenting Python system"`:
- http://www.rexx.com/~dkuhlman/#docutils_pythonlatex
-
-
diff --git a/sandbox/dkuhlman/Extract/Makefile b/sandbox/dkuhlman/Extract/Makefile
deleted file mode 100644
index f0df1a5ef..000000000
--- a/sandbox/dkuhlman/Extract/Makefile
+++ /dev/null
@@ -1,64 +0,0 @@
-# Makefile to process a file LaTeX with the Python LaTeX system.
-# Optionally processes reStructuredText files.
-
-#
-# Change the following to point to your Python source code.
-#
-PYTHON_SRC = /w1/Python/Python-2.3b2
-DOCUTILS_DIR = /w1/Python/DocUtils/docutils
-
-#
-# Change the following to point to your Docutils installation.
-#
-DOCUTILSTOOLS_DIR = $(DOCUTILS_DIR)/tools
-TRANSFORMDOCPY = $(DOCUTILSTOOLS_DIR)/python_latex.py \
- --documentclass=howto
-
-#
-# Change these flags for your purposes.
-#
-#HTMLFLAGS= --image-type png --html -s 1 --favicon ../icons/pyfav.gif
-#HTMLFLAGS= --iconserver ../icons --html -s 1 --favicon ../icons/pyfav.gif
-HTMLFLAGS= --iconserver ../icons --html -s 1 \
- --favicon ../icons/pyfav.gif \
- --about $(PYTHON_SRC)/Doc/html/about_docutils.dat
-
-MKHOWTO = $(PYTHON_SRC)/Doc/tools/mkhowto
-
-PAPER = a4
-
-#
-# Change this to the name of your source file (without extension).
-#
-#SRC_NAME=pythonlatexsetup
-ifndef SRC_NAME
-$(error Must define SRC_NAME (no extension), e.g. make SRC_NAME=mysourcefile)
-endif
-
-TARGETS = $(SRC_NAME)/$(SRC_NAME).html
-
-FIGURES =
-
-all: html
-
-html: $(TARGETS) $(FIGURES)
-
-$(SRC_NAME)/$(SRC_NAME).html: $(SRC_NAME).tex
- $(MKHOWTO) $(HTMLFLAGS) $(SRC_NAME).tex
-
-#
-# Remove or Comment out the following lines if your source file
-# is a LaTeX file not a reST file.
-#
-$(SRC_NAME).tex: $(SRC_NAME).txt
- $(TRANSFORMDOCPY) $(SRC_NAME).txt > $(SRC_NAME).tex
-
-clean:
- rm -f *~ *.aux *.idx *.ilg *.ind *.log *.toc *.bkm *.syn \
-*.pla *.eps *.pdf *.ps *.lof *.l2h *.tex2 *.dvi
- -rm -f $(SRC_NAME).tex
- -rm -f $(SRC_NAME)/*
- -rmdir $(SRC_NAME)
- -rm -f $(SRC_NAME).tex
-
-
diff --git a/sandbox/dkuhlman/Extract/extract_doc.py b/sandbox/dkuhlman/Extract/extract_doc.py
deleted file mode 100755
index 2ac742de8..000000000
--- a/sandbox/dkuhlman/Extract/extract_doc.py
+++ /dev/null
@@ -1,436 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import string
-import time
-import getopt
-import textwrap
-import traceback
-import inspect
-import __builtin__
-
-from pydoc import *
-
-
-TARGET_rest = 1
-TARGET_latex = 2
-UseOverTitleAdornment = 0
-TitleAdornmentChars_noover = '=-.,^+~:;_"\''
-TitleAdornmentChars_over = '==--..,,^^++~~'
-TitleAdornmentChars = TitleAdornmentChars_noover
-
-
-## class Doc:
-## def document(self, thing, name=None, *args):
-## """Generate documentation for an object."""
-## args = (thing, name) + args
-## # 'try' clause is to attempt to handle the possibility that inspect
-## # identifies something in a way that pydoc itself has issues handling;
-## # think 'super' and how it is a descriptor (which raises the exception
-## # by lacking a __name__ attribute) and an instance.
-## ## try:
-## if inspect.ismodule(thing):
-## result = self.docmodule(*args)
-## return result
-## if inspect.isclass(thing):
-## result = self.docclass(*args)
-## return result
-## if inspect.isroutine(thing):
-## result = self.docroutine(*args)
-## return result
-## ## except AttributeError:
-## ## traceback.print_last()
-## ## pass
-## result = self.docother(*args)
-## return result
-##
-## def fail(self, thing, name=None, *args):
-## """Raise an exception for unimplemented types."""
-## message = "don't know how to document thing%s of type %s" % (
-## name and ' ' + repr(name), type(thing).__name__)
-## raise TypeError, message
-##
-## docmodule = docclass = docroutine = docother = fail
-
-
-class ReSTDoc(Doc):
- """Formatter class for reStructuredText documentation."""
-
- def __init__(self):
- self.lines = []
- self.titleLevel = 0
-
- _repr_instance = TextRepr()
- repr = _repr_instance.repr
-
- def push(self, text=''):
- """Push one line of output onto the collected output."""
- self.lines.append(text)
-
- def get_lines(self):
- """Get the accumulated lines of output."""
- return self.lines
-
- def emphasize(self, text):
- """Add emphasis to a piece of text."""
- text1 = '*%s*' % text
- return text1
-
- def formatvalue(self, thing):
- """Format an argument default value as text."""
- return '=' + self.repr(thing)
-
- def escape(self, text):
- """Escape special reStructuredText characters."""
- text1 = text.replace('*', '\\*')
- return text1
-
- def genTitle(self, text):
- """Generate a title according to the current title level."""
- adornment = TitleAdornmentChars[self.titleLevel]
- # If it's an even numbered title level, then generate
- # adornment above the title.
- if UseOverTitleAdornment:
- if ((self.titleLevel / 2) * 2) == self.titleLevel:
- self.push(adornment * len(text))
- self.push(text)
- self.push(adornment * len(text))
- self.push()
-
- def incTitleLevel(self):
- self.titleLevel += 1
-
- def decTitleLevel(self):
- self.titleLevel -= 1
-
- def docmodule(self, thing, name=None, mod=None):
- """Produce text documentation for a given module object."""
- # Ignore the passed-in name.
- name = thing.__name__
- synop, desc = splitdoc(getdoc(thing))
- self.genTitle('SYNOPSIS')
- if synop:
- line = '%s -- %s' % (name, synop)
- line = textwrap.fill(line, 68)
- else:
- line = name
- self.push(line)
- self.push()
- self.genTitle('DESCRIPTION')
- if desc:
- self.push(desc)
- else:
- self.push('No description for this module')
- self.push()
- classes = []
- for key, value in inspect.getmembers(thing, inspect.isclass):
- if (inspect.getmodule(value) or thing) is thing:
- if visiblename(key):
- classes.append((key, value))
- funcs = []
- for key, value in inspect.getmembers(thing, inspect.isroutine):
- if inspect.isbuiltin(value) or inspect.getmodule(value) is thing:
- if visiblename(key):
- funcs.append((key, value))
- data = []
- for key, value in inspect.getmembers(thing, isdata):
- if visiblename(key):
- data.append((key, value))
- self.genTitle('CLASSES')
- self.incTitleLevel()
- if classes:
- for key, value in classes:
- self.document(value, key, name)
- else:
- self.push('No classes in this module')
- self.push()
- self.decTitleLevel()
- self.genTitle('FUNCTIONS')
- self.incTitleLevel()
- if funcs:
- for key, value in funcs:
- self.document(value, key, name)
- else:
- self.push('No global functions in this module')
- self.push()
- self.decTitleLevel()
- self.genTitle('DATA')
- self.incTitleLevel()
- if data:
- for key, value in data:
- self.document(value, key, name)
- else:
- self.push('No global data in this module')
- self.push()
- self.decTitleLevel()
- if hasattr(thing, '__version__'):
- version = str(thing.__version__)
- if version[:11] == '$' + 'Revision: ' and version[-1:] == '$':
- version = strip(version[11:-1])
- self.genTitle('VERSION')
- self.push(version)
- self.push()
- if hasattr(thing, '__date__'):
- self.genTitle('DATE')
- self.push(thing.__date__)
- self.push()
- if hasattr(thing, '__author__'):
- self.genTitle('AUTHOR')
- self.push(thing.__author__)
- self.push()
- if hasattr(thing, '__credits__'):
- self.genTitle('CREDITS')
- self.push(thing.__credits__)
- self.push()
-
- def genlevel(self, level):
- pad = ' ' * level
- return pad
-
- def genbases(self, obj):
- level = 0
- self.genbases_aux(obj, level)
-
- def genbases_aux(self, obj, level):
- bases = obj.__bases__
- for base in bases:
- pad = self.genlevel(level)
- self.push('%s- %s' % (pad, base.__name__))
- self.push()
- self.genbases_aux(base, level + 1)
-
- def docclass(self, thing, name=None, mod=None):
- """Produce text documentation for a given class object."""
- realname = thing.__name__
- name = name or realname
- self.genTitle('class %s' % name)
- self.incTitleLevel()
- docstr = getdoc(thing)
- self.genTitle('Description')
- if docstr:
- self.push(docstr)
- else:
- self.push('No documentation for this class.')
- self.push()
- self.genTitle('Base Classes')
- if thing.__bases__:
- self.genbases(thing)
- else:
- self.push('No superclasses for this class.')
- self.push()
- attrs = filter(lambda (name, kind, cls, value): visiblename(name),
- inspect.classify_class_attrs(thing))
- self.genTitle('Methods')
- self.incTitleLevel()
- found = 0
- for attr in attrs:
- if attr[1] == 'method':
- self.document(attr[3], attr[0])
- found = 1
- if not found:
- self.push('No methods for this class')
- self.decTitleLevel()
- self.genTitle('Data')
- self.incTitleLevel()
- found = 0
- for attr in attrs:
- if attr[1] == 'data':
- self.document(attr[3], attr[0])
- found = 1
- if not found:
- self.push('No data for this class')
- self.push()
- self.decTitleLevel()
- self.decTitleLevel()
-
- def docroutine(self, thing, name=None, mod=None, cl=None):
- """Produce text documentation for a function or method object."""
- realname = thing.__name__
- name = name or realname
- note = ''
- skipdocs = 0
- if inspect.ismethod(thing):
- imclass = thing.im_class
- if cl:
- if imclass is not cl:
- note = 'from ' + classname(imclass, mod)
- else:
- if thing.im_self:
- note = 'method of %s instance' % classname(
- thing.im_self.__class__, mod)
- else:
- note = 'unbound %s method' % classname(imclass,mod)
- thing = thing.im_func
- if name == realname:
- title = self.emphasize(realname)
- else:
- if (cl and realname in cl.__dict__ and
- cl.__dict__[realname] is thing):
- skipdocs = 1
- title = '%s = %s' % (self.emphasize(name), realname)
- if inspect.isfunction(thing):
- args, varargs, varkw, defaults = inspect.getargspec(thing)
- argspec = inspect.formatargspec(
- args, varargs, varkw, defaults, formatvalue=self.formatvalue)
- if realname == '<lambda>':
- title = 'lambda'
- argspec = argspec[1:-1] # remove parentheses
- else:
- argspec = '(...)'
- argspec = self.escape(argspec)
- decl = '%s %s %s' % (title, argspec, note)
- if inspect.isfunction(thing):
- line = 'function %s' % name
- elif inspect.ismethod(thing):
- line = 'method %s' % name
- else:
- line = 'thing %s' % name
- self.genTitle(line)
- self.incTitleLevel()
- self.genTitle('Prototype')
- self.push(decl)
- self.push()
- if not skipdocs:
- self.genTitle('Description')
- doc = getdoc(thing)
- if doc:
- doc = doc.rstrip()
- self.push(doc)
- else:
- self.push('No description for this function/method.')
- self.push()
- self.decTitleLevel()
-
- def docother(self, thing, name=None, mod=None, maxlen=None, doc=None):
- """Produce text documentation for a data object."""
- objRepr = self.repr(thing)
- if name:
- line = '- %s = %s' % (self.emphasize(name), objRepr)
- else:
- line = objRepr
- self.push(line)
- self.push()
-
-# end class ReSTDoc
-
-
-class PythonLaTeXDoc(Doc):
- pass
-
-
-def extract_to_rest(thing,
- usePager=None,
- title='Python Library Documentation: %s',
- forceload=0
- ):
- """Display reSturcturedText documentation, given
- an object or a path to an object.
- Push the resulting text through a pager, if requested,
- else print it to stdout.
- Add a minimal amount of header and trailer information to
- the document.
- """
- formatter = ReSTDoc()
- try:
- thing1, name = resolve(thing, forceload)
- except (ImportError, ErrorDuringImport), value:
- print value
- return
- desc = describe(thing1)
- module = inspect.getmodule(thing1)
- if name and '.' in name:
- desc += ' in ' + name[:name.rfind('.')]
- elif module and module is not thing1:
- desc += ' in module ' + module.__name__
- title1 = title % desc
- formatter.genTitle(title1)
- formatter.incTitleLevel()
- #
- # Add and replace header content here.
- #
- formatter.push('Generated by extract_doc.py on %s.' % time.ctime())
- formatter.push()
- formatter.document(thing1, name)
- #
- # Add and replace trailer content here.
- #
- doclines = formatter.get_lines()
- content = '\n'.join(doclines)
- #
- # Add and replace post-processing here.
- # You might consider sending the output through one of the
- # reSTructuredText writers.
- #
- if usePager:
- pager(content)
- else:
- sys.stdout.write(content)
- sys.stdout.write('\n')
-
-
-def extract_to_latex(module_name):
- print 'Not implemented yet'
-
-
-
-
-USAGE_TEXT = """
-Usage:
- python extract_doc.py [options] <module_name>
-Options:
- -h, --help Display this help message.
- -r, --rest Extract to decorated reST.
- -l, --latex Extract to Python LaTeX (module doc type). Not implemented.
- -p, --pager Use a pager; else write to stdout.
- -o, --over Use over *and* under title adornment, else only under.
-Example:
- python extract_doc.py -r mymodule1
- python extract_doc.py -p -o -r mymodule2
-"""
-
-def usage():
- print USAGE_TEXT
- sys.exit(-1)
-
-
-def main():
- global UseOverTitleAdornment, TitleAdornmentChars
- args = sys.argv[1:]
- try:
- opts, args = getopt.getopt(args, 'hrlpdo',
- ['help', 'rest', 'latex', 'pager', 'over'])
- except:
- usage()
- target = None
- usePager = None
- for opt, val in opts:
- if opt in ('-h', '--help'):
- usage()
- elif opt in ('-r', '--rest'):
- target = TARGET_rest
- elif opt in ('-l', '--latex'):
- target = TARGET_latex
- elif opt in ('-p', '--pager'):
- usePager = 1
- elif opt in ('-o', '--over'):
- UseOverTitleAdornment = 1
- TitleAdornmentChars = TitleAdornmentChars_over
- if len(args) != 1:
- usage()
- if target == TARGET_rest:
- extract_to_rest(args[0], usePager)
- elif target == TARGET_latex:
- extract_to_latex(args[0], usePager)
- else:
- usage()
-
-
-if __name__ == '__main__':
- args = sys.argv[1:]
- if '-d' not in args:
- main()
- else:
- import pdb
- pdb.run('main()')
-
-
diff --git a/sandbox/dkuhlman/Extract/extract_doc.txt b/sandbox/dkuhlman/Extract/extract_doc.txt
deleted file mode 100644
index 167b103dc..000000000
--- a/sandbox/dkuhlman/Extract/extract_doc.txt
+++ /dev/null
@@ -1,222 +0,0 @@
-
-:author: Dave Kuhlman
-:address: dkuhlman@rexx.com \\\\
- http://www.rexx.com/~dkuhlman
-
-:revision: 1.0a
-:date: July 22, 2003
-
-:copyright: Copyright (c) 2003 Dave Kuhlman.
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions: The above copyright notice and this permission
- notice shall be included in all copies or substantial portions
- of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT
- WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
- LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
- OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-:abstract: This document describes extract_doc.py which is a
- program for extracting documentation from Python source code
- files and producing reStructuredText output.
-
-
-=============================================================
-*extract_doc.py* --- Extract Python Source Code Documentation
-=============================================================
-
-
-Description
-===========
-
-*extract_doc* extracts documentation embedded in Python source
-code files.
-
-Currently, it generates reStructuredText. An extension that
-generates LaTeX for the Python LaTeX documentation system is
-being investigated.
-
-*extract_doc* is derived from and uses code in *pydoc.py* from the
-Python standard library.
-
-One goal of *extract_doc* is to provide code that is simple enough
-so that the implementation and the output it produces can be
-customized for specific applications or by specific users.
-
-
-Where to Get It
-===============
-
-You can find a distribution file for ``extract_doc`` at:
-
- http://www.rexx.com/~dkuhlman/extract_doc.zip
-
-
-How to Use extract_doc
-======================
-
-Here is the usage information from `extract_doc`::
-
- Usage:
- python extract_doc.py [options] <module_name>
- Options:
- -h, --help Display this help message.
- -r, --rest Extract to decorated reST.
- -l, --latex Extract to Python LaTeX (module doc type). Not implemented.
- -p, --pager Use a pager; else write to stdout.
- -o, --over Use over *and* under title adornment, else only under.
- Example:
- python extract_doc.py -r mymodule1
- python extract_doc.py -p -o -r mymodule2
-
-
-Command line flag descriptions
-------------------------------
-
--r, --rest Generate reStructuredText output.
-
--l, --latex Generate LaTeX for the Python LaTeX documentation
- system. Not yet implemented.
-
--p, --pager Use a pager, else write to stdout. Selects a pager
- and pushes generated output through the pager. On
- my system it selects *less*.
-
--o, --over Generate over *and* under title adornment, else
- generate under title adornment only.
-
-
-
-How to Modify *extract_doc*
-===========================
-
-*extract_doc* contains one important class: ReSTDoc. It is a
-subclass of class Doc in module pydoc in the Python standard
-library. As such, it should have followed other sub-classes of
-class Doc closely. However, it does not. ReSTDoc is a fairly
-radical re-write of TextDoc. This re-write had these goals:
-
-- Produce reStructuredText (rather than text or HTML).
-
-- Provide code that is simple, consistent, and clear enough so
- that others can understand and modify it.
-
-Basically, I want it to produce reStructuredText and to enables
-others to customize the reStructuredText that it produces for
-their individual needs.
-
-The current class ``ReSTDoc`` produces reStructuredText. You can
-try it for yourself.
-
-Here is a bit of guidance for the second aspect of the goal, i.e.
-modifiability:
-
-- Output is accumulated by calling ``self.push(line)`` for each
- line of text to be produced.
-
-- There are four functions that produce output. They are as
- follows:
-
- - ``docmodule`` is called for the module. It is responsible for
- producing the documentation for a module.
-
- - ``docclass`` is called for each class. It is responsible for
- producing the documentation for a class.
-
- - ``docroutine`` -- Called for each method (in a class) and each
- function (at top level in a module). It is responsible for
- producing the documentation for a method or a function.
-
- - ``docother`` -- Called for data members. It is responsible for
- producing the documentation for a data member.
-
-- Module ``inspect`` from the Python standard library is used to
- obtain the internals of an object such as its members, to
- determine the type of an object (e.g. method or function),
- format the arguments for a function, etc.
-
-- Function getdoc in module ``pydoc`` is called to get the
- documentation for an object, for example the documentation for a
- module, a class, a method, or a function.
-
-- There is a method (emphasize) to emphasize a piece of text. It
- adds asterisks around the text.
-
-In order to produce your own customized documentation extraction
-capability, you might want to do the following:
-
-- Copy class ``ReSTDoc``.
-
-- Modify methods ``docmodule``, ``docclass``, ``docroutine``, and
- ``docother`` in class ``ReSTDoc``.
-
-- copy function ``extract_to_rest``.
-
-- Modify function ``extract_to_rest``:
-
- - Add your own title, preferatory stuff, etc. Note where method
- ``genTitle`` is called and where the "Generated by ..."
- content is added.
-
- - Add your own end-of-doc content. Add this after the call to
- ``formatter.document()``.
-
-
-Related Work
-============
-
-*PySource* -- Python Source Reader
-----------------------------------
-
-This documentation extractor takes a very different approach. It
-is *not* modelled on pydoc in the Python standard library. It
-does not use the inspect module from the Python standard library.
-(I grepped for "inspect" in ``sandbox/davidg/pysource_reader``.)
-The documentation says that it:
-
- "... scans a parsed Python module, and returns an ordered tree
- containing the names, docstrings (including attribute and
- additional docstrings), and additional info ..."
-
-The approach followed by ``PySource`` appears more complex than
-that of ``extract_doc, but also more powerful. I'm going to guess
-that the start-up time for a simple-minded programmer (like me) to
-begin modifying and customizing ``PySource`` for user specific
-needs would be longer than for ``extract_doc``.
-
-I'd appreciate any comments and comparisons that others might
-have.
-
-Credits
-=======
-
-Thanks to the developers of Docutils, in particular, David
-Goodger, project lead.
-
-Thanks to Ka-Ping Yee for *pydoc*.
-
-
-See Also
-========
-
-`Docutils: Python Documentation Utilities`_
-
-.. _`Docutils: Python Documentation Utilities`:
- http://docutils.sourceforge.net/
-
-`pydoc -- Documentation generator and online help system`_
-
-.. _`pydoc -- Documentation generator and online help system`:
- http://www.python.org/doc/current/lib/module-pydoc.html
-
-
-
diff --git a/sandbox/dkuhlman/README_docpy b/sandbox/dkuhlman/README_docpy
deleted file mode 100644
index f5dfec768..000000000
--- a/sandbox/dkuhlman/README_docpy
+++ /dev/null
@@ -1,102 +0,0 @@
-=======================================================
-Python LaTeX -- reStructuredText for Documenting Python
-=======================================================
-
-
-What it does -- Python LaTeX generates LaTeX suitable as input to
-the "Documenting Python" system. This system is described at:
-
- http://www.python.org/dev/doc/devel/doc/doc.html
-
-
-Installation
-------------
-
-If you have a standard Docutils installation, then you should be
-able to go to the parent directory of the ``docutils`` directory,
-then do the following::
-
- unzip rstdocpy-1.0b.zip
-
-This will create (overlay) the following files::
-
- README_docpy
- Docs/Makefile
- Docs/pythonlatex_intro.txt
- docutils/docs/rst/docpy.html
- docutils/docutils/writers/python_latex.py
- docutils/tools/python_latex.py
-
-In order to use the above files in place, you may have to do
-something like::
-
- export PYTHONPATH=/w1/Python/DocUtils/docutils:$PYTHONPATH
-
-You will also need the "Documenting Python" tools installed. They
-are in the ``Doc`` directory of the Python source code
-distribution.
-
-
-Testing
--------
-
-After the above installation, you should be able to go to the
-``Msgs`` directory and convert the document ``docpy_intro.rst``.
-
-First, edit the file ``Msgs/Makefile``. Change the path that
-points to the location where the Python source code is installed.
-Then type::
-
- cd Msgs
- make clean
- make
-
-
-Documentation
--------------
-
-The file ``Msgs/docpy_intro.rst`` contains an introduction.
-
-See the companion document 'Quick reStructuredText for
-"Documenting Python"' (docutils/docs/rst/docpy.html) for
-additional mark-up that can be used when generating LaTeX for
-"Documenting Python". The first section of this document has
-information specific to the generation of LaTeX for Documenting
-Python. In addition, that document also adds another column to the
-specification tables. This additional column describes the LaTeX
-commands generated by this writer.
-
-
-More Information
-----------------
-
-Find out more about Docutils at::
-
- http://docutils.sourceforge.net/
-
-More information about the Documenting Python system is at::
-
- http://www.python.org/dev/doc/devel/doc/doc.html
-
-
-Acknowledgements
------------------
-
-Thanks to the Docutils project members for Docutils. In
-particular, thanks to project coordinator David Goodger.
-
-Thanks to Engelbert Gruber for the implementation of the latex
-writer. That implementation formed the starting point for this
-writer. He should get much of the credit for this writer also,
-however, any bugs were likely introduced by me.
-
-
-Contact
--------
-
-Please let me know about suggestions and problems::
-
- Dave Kuhlman
- dkuhlman@rexx.com
- http://www.rexx.com/~dkuhlman
-
diff --git a/sandbox/dkuhlman/docutils/docs/rst/pythonlatex_quickref.html b/sandbox/dkuhlman/docutils/docs/rst/pythonlatex_quickref.html
deleted file mode 100644
index 99bbd5611..000000000
--- a/sandbox/dkuhlman/docutils/docs/rst/pythonlatex_quickref.html
+++ /dev/null
@@ -1,1593 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
- <head>
- <title>Quick reStructuredText</title>
-
- <style type="text/css"><!--
- a.backref { text-decoration: none ; color: black }
- --></style>
-
- </head>
-
- <body>
- <h1>Quick <i>re</i><font
-size="+4"><tt>Structured</tt></font><i>Text</i> for "Documenting
-Python"</h1>
-
- <!-- Caveat: if you're reading the HTML for the examples, -->
- <!-- beware that it was hand-generated, not by Docutils/ReST. -->
-
- <p align="right"><em><a href="http://docutils.sourceforge.net/docs/rst/quickref.html"
- >http://docutils.sourceforge.net/docs/rst/quickref.html</a></em>
- <br align="right"><em>Being a cheat-sheet for reStructuredText</em>
- <br align="right"><em>Updated 2003-06-10</em>
-
- <blockquote>
- <p>Copyright: This document has been placed in the public domain.
- </blockquote>
-
-
- <p>The full details of the markup may be found on the
- <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a>
- page. This document is just intended as a reminder.
-
- <p>Links that look like "(<a href="#details">details</a>)" point
- into the HTML version of the full <a
- href="../../spec/rst/reStructuredText.html">reStructuredText
- specification</a> document. These are relative links; if they
- don't work, please use the <a
- href="http://docutils.sourceforge.net/docs/rst/quickref.html"
- >master "Quick reStructuredText"</a> document.
-
- <h2><a name="contents">Contents</a></h2>
-
- <ul>
- <li><a href="#docpy">&quot;Documenting Python&quot;</a></li>
- <li><a href="#inline-markup">Inline Markup</a></li>
- <li><a href="#escaping">Escaping with Backslashes</a></li>
- <li><a href="#section-structure">Section Structure</a></li>
- <li><a href="#paragraphs">Paragraphs</a></li>
- <li><a href="#bullet-lists">Bullet Lists</a></li>
- <li><a href="#enumerated-lists">Enumerated Lists</a></li>
- <li><a href="#definition-lists">Definition Lists</a></li>
- <li><a href="#field-lists">Field Lists</a></li>
- <li><a href="#option-lists">Option Lists</a></li>
- <li><a href="#literal-blocks">Literal Blocks</a></li>
- <li><a href="#block-quotes">Block Quotes</a></li>
- <li><a href="#doctest-blocks">Doctest Blocks</a></li>
- <li><a href="#tables">Tables</a></li>
- <li><a href="#transitions">Transitions</a></li>
- <li><a href="#explicit-markup">Explicit Markup</a>
- <ul>
- <li><a href="#footnotes">Footnotes</a></li>
- <li><a href="#citations">Citations</a></li>
- <li><a href="#hyperlink-targets">Hyperlink Targets</a>
- <ul>
- <li><a href="#external-hyperlink-targets">External Hyperlink Targets</a></li>
- <li><a href="#internal-hyperlink-targets">Internal Hyperlink Targets</a></li>
- <li><a href="#indirect-hyperlink-targets">Indirect Hyperlink Targets</a></li>
- <li><a href="#implicit-hyperlink-targets">Implicit Hyperlink Targets</a></li>
- </ul></li>
- <li><a href="#directives">Directives</a></li>
- <li><a href="#substitution-references-and-definitions">Substitution References and Definitions</a></li>
- <li><a href="#comments">Comments</a></li>
- </ul></li>
- <li><a href="#getting-help">Getting Help</a></li>
- </ul>
-
- <h2><a href="#contents" name="docpy" class="backref"
- >Documenting Python</a></h2>
-
- <h3>Introduction</h3>
-
- <p>What it does -- It generates LaTeX suitable as input to the
- "Documenting Python" system.</p>
-
- <p>How to run it:
-
- <pre>
- $ docutils/tools/documenting_python.py --documentclass=howto infile.rst
- </pre>
-
- <h3>Command-line options</h3>
-
- <dl>
-
- <dt>documentclass</dt>
- <dd>
- <ul>
-
- <li> Controls rusulting document class.</li>
-
- <li>Allowed values are "manual" and "howto".</li>
-
- <li>Default is "howto".</li>
-
- <li>Generates "\documentclass{manual}" or
- "\documentclass{howto}".</li>
-
- </ul>
- </dd>
-
- </dl>
-
- <h3>The heading section and controlling it</h3>
-
- <p>The following docinfo items, fields, and topics are
- supported:</p>
-
- <ul>
-
- <li>:author: -- Generates "\author{}"..</li>
-
- <li>:date: -- Generates "\date{}".</li>
-
- <li>:revisision: -- Generates "release{}".</li>
-
- <li>:copyright: -- Generated at the beginning of the document.</li>
-
- <li>:abstract: -- Generates:
-
- <pre>
- \begin{abstract}
- \noindent
-
- [stuff]
- \end{abstract}
- </pre>
- </li>
-
- <li>[The first] title -- Generates "\title{}". Note: I don't
- understand the title promotion stuff. I'm guessing that I
- have a bug here that will be discovered when we try a
- different input (rST) document.</li>
-
- </ul>
-
- <p><strong>Example:</strong> -- Here is (the first few lines
- of) a sample input rST file:</p>
-
- <pre>
- :author: Dave Kuhlman
- :date: 2003/06/05
- :revision: 1.27
-
- :copyright: This document has been placed in the public domain. You
- may do with it as you wish. You may copy, modify,
- redistribute, reattribute, sell, buy, rent, lease,
- destroy, or improve it, quote it at length, excerpt,
- incorporate, collate, fold, staple, or mutilate it, or do
- anything else to it that your or anyone else's heart
- desires.
-
- :abstract: This is a test document, containing at least one
- example of each reStructuredText construct.
-
- ======================================
- reStructuredText Test Document (title)
- ======================================
- o
- o
- o
- </pre>
-
- <p>If we run the above through this command:</p>
-
- <pre>
- $ ../docutils/tools/documenting_python.py --documentclass=howto testdocpy1.rst
- </pre>
-
- <p>And, here is what the above rST would generate:</p>
-
- <pre>
- \documentclass{howto}
- %% generator Docutils: http://docutils.sourceforge.net/
- \title{reStructuredText Test Document (title)}
- \release{1.27}
- \date{2003/06/05}
- \author{Dave Kuhlman}
- \begin{document}
- \maketitle
- \ifhtml
- \chapter*{Front Matter\label{front}}
- \fi
-
- This document has been placed in the public domain. You
- may do with it as you wish. You may copy, modify,
- redistribute, reattribute, sell, buy, rent, lease,
- destroy, or improve it, quote it at length, excerpt,
- incorporate, collate, fold, staple, or mutilate it, or do
- anything else to it that your or anyone else's heart
- desires.
- \begin{abstract}
- \noindent
-
- This is a test document, containing at least one
- example of each reStructuredText construct.
- \end{abstract}
- \tableofcontents
- o
- o
- o
- </pre>
-
- <h3>The "See Also" section</h3>
-
- <p>If a section title matches the string "see also" (case
- insensitive, then hyperlinks are treated slightly differently.
- In particular, we generate "\seeurl{}".</p>
-
-
- <h2><a href="#contents" name="inline-markup" class="backref"
- >Inline Markup</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#inline-markup">details</a>)
-
- <p>Inline markup allows words and phrases within text to have
- character styles (like italics and boldface) and functionality
- (like hyperlinks).
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th>Plain text
- <th>Typical result
- <th>Notes
- <th>Doc Py
- </thead>
- <tbody>
- <tr valign="top">
- <td nowrap><samp>*emphasis*</samp>
- <td><em>emphasis</em>
- <td>Normally rendered as italics.
- <td><pre>\emph{some text}</pre></td>
-
- <tr valign="top">
- <td nowrap><samp>**strong&nbsp;emphasis**</samp>
- <td><strong>strong emphasis</strong>
- <td>Normally rendered as boldface.
- <td><pre>\strong{some text}</pre></td>
-
- <tr valign="top">
- <td nowrap><samp>`interpreted&nbsp;text`</samp>
- <td>(see note at right)
- <td>The rendering and <em>meaning</em> of interpreted text is
- domain- or application-dependent. It can be used for things
- like index entries or explicit descriptive markup (like program
- identifiers).
-
- <tr valign="top">
- <td nowrap><samp>``inline&nbsp;literal``</samp>
- <td><code>inline&nbsp;literal</code>
- <td>Normally rendered as monospaced text. Spaces should be
- preserved, but line breaks will not be.
- <td>
- <p> Generates \code{word}, if no embedded whitespace. Generates
- \samp{some text}, if there is embedded whitespace.</p>
- </td>
-
- <tr valign="top">
- <td nowrap><samp>reference_</samp>
- <td><a href="#hyperlink-targets">reference</a>
- <td>A simple, one-word hyperlink reference. See <a
- href="#hyperlinks" >Hyperlinks</a>.
- <td>
- <pre>\ulink{label}{url}</pre>
- <p>In "See Also" section:</p>
- <pre>\seeurl{url}{label}</pre>
- </td>
-
- <tr valign="top">
- <td nowrap><samp>`phrase reference`_</samp>
- <td><a href="#hyperlink-targets">phrase reference</a>
- <td>A hyperlink reference with spaces or punctuation needs to be
- quoted with backquotes. See <a
- href="#hyperlink-targets">Hyperlinks</a>.
- <td>
- <pre>\ulink{label}{url}</pre>
- <p>In "See Also" section:</p>
- <pre>\seeurl{url}{label}</pre>
- </td>
-
- <tr valign="top">
- <td nowrap><samp>anonymous__</samp>
- <td><a href="#hyperlink-targets">anonymous</a>
- <td>With two underscores instead of one, both simple and phrase
- references may be anonymous (the reference text is not repeated
- at the target). See <a
- href="#hyperlink-targets">Hyperlinks</a>.
-
- <tr valign="top">
- <td nowrap><samp>_`inline internal target`</samp>
- <td><a name="inline-internal-target">inline internal target</a>
- <td>A crossreference target within text.
- See <a href="#hyperlink-targets">Hyperlinks</a>.
-
- <tr valign="top">
- <td nowrap><samp>|substitution reference|</samp>
- <td>(see note at right)
- <td>The result is substituted in from the <a
- href="#substitution-references-and-definitions">substitution
- definition</a>. It could be text, an image, a hyperlink, or a
- combination of these and others.
-
- <tr valign="top">
- <td nowrap><samp>footnote reference [1]_</samp>
- <td>footnote reference <sup><a href="#footnotes">1</a></sup>
- <td>See <a href="#footnotes">Footnotes</a>.
-
- <tr valign="top">
- <td nowrap><samp>citation reference [CIT2002]_</samp>
- <td>citation reference <a href="#citations">[CIT2002]</a>
- <td>See <a href="#citations">Citations</a>.
-
- <tr valign="top">
- <td nowrap><samp>http://docutils.sf.net/</samp>
- <td><a href="http://docutils.sf.net/">http://docutils.sf.net/</a>
- <td>A standalone hyperlink.
- <td><pre>\url{http://docutils.sf.net/}</pre></td>
-
- </table>
-
- <p>Asterisk, backquote, vertical bar, and underscore are inline
- delimiter characters. Asterisk, backquote, and vertical bar act
- like quote marks; matching characters surround the marked-up word
- or phrase, whitespace or other quoting is required outside them,
- and there can't be whitespace just inside them. If you want to use
- inline delimiter characters literally, <a href="#escaping">escape
- (with backslash)</a> or quote them (with double backquotes; i.e.
- use inline literals).
-
- <p>In detail, the reStructuredText specification says that in
- inline markup, the following rules apply to start-strings and
- end-strings (inline markup delimiters):
-
- <ol>
- <li>The start-string must start a text block or be
- immediately preceded by whitespace or any of&nbsp;
- <samp>' " ( [ {</samp> or&nbsp;<samp>&lt;</samp>.
- <li>The start-string must be immediately followed by non-whitespace.
- <li>The end-string must be immediately preceded by non-whitespace.
- <li>The end-string must end a text block (end of document or
- followed by a blank line) or be immediately followed by whitespace
- or any of&nbsp;<samp>' " . , : ; ! ? - ) ] } / \</samp>
- or&nbsp;<samp>&gt;</samp>.
- <li>If a start-string is immediately preceded by one of&nbsp;
- <samp>' " ( [ {</samp> or&nbsp;<samp>&lt;</samp>, it must not be
- immediately followed by the corresponding character from&nbsp;
- <samp>' " ) ] }</samp> or&nbsp;<samp>&gt;</samp>.
- <li>An end-string must be separated by at least one
- character from the start-string.
- <li>An <a href="#escaping">unescaped</a> backslash preceding a
- start-string or end-string will disable markup recognition, except
- for the end-string of inline literals.
- </ol>
-
- <p>Also remember that inline markup may not be nested (well,
- except that inline literals can contain any of the other inline
- markup delimiter characters, but that doesn't count because
- nothing is processed).
-
- <h2><a href="#contents" name="escaping" class="backref"
- >Escaping with Backslashes</a></h2>
-
- <p>(<a
- href="../../spec/rst/reStructuredText.html#backslashes">details</a>)
-
- <p>reStructuredText uses backslashes ("\") to override the special
- meaning given to markup characters and get the literal characters
- themselves. To get a literal backslash, use an escaped backslash
- ("\\"). For example:
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Raw reStructuredText
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top"><td>
- <samp>*escape*&nbsp;``with``&nbsp;"\"</samp>
- <td><em>escape</em> <samp>with</samp> ""
- <tr valign="top"><td>
- <samp>\*escape*&nbsp;\``with``&nbsp;"\\"</samp>
- <td>*escape* ``with`` "\"
- <td><pre>$\backslash$</pre></td>
- </table>
-
- <p>In Python strings it will, of course, be necessary
- to escape any backslash characters so that they actually
- <em>reach</em> reStructuredText.
- The simplest way to do this is to use raw strings:
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Python string
- <th width="50%">Typical result
- </thead>
- <tbody>
- <tr valign="top"><td>
- <samp>r"""\*escape*&nbsp;\`with`&nbsp;"\\""""</samp>
- <td>*escape* `with` "\"
- <tr valign="top"><td>
- <samp>&nbsp;"""\\*escape*&nbsp;\\`with`&nbsp;"\\\\""""</samp>
- <td>*escape* `with` "\"
- <tr valign="top"><td>
- <samp>&nbsp;"""\*escape*&nbsp;\`with`&nbsp;"\\""""</samp>
- <td><em>escape</em> with ""
- </table>
-
- <h2><a href="#contents" name="section-structure" class="backref"
- >Section Structure</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#sections">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>=====</samp>
-<br><samp>Title</samp>
-<br><samp>=====</samp>
-<br><samp>Subtitle</samp>
-<br><samp>--------</samp>
-<br><samp>Titles&nbsp;are&nbsp;underlined&nbsp;(or&nbsp;over-</samp>
-<br><samp>and&nbsp;underlined)&nbsp;with&nbsp;a&nbsp;printing</samp>
-<br><samp>nonalphanumeric&nbsp;7-bit&nbsp;ASCII</samp>
-<br><samp>character.&nbsp;Recommended&nbsp;choices</samp>
-<br><samp>are&nbsp;"``=&nbsp;-&nbsp;`&nbsp;:&nbsp;'&nbsp;"&nbsp;~&nbsp;^&nbsp;_&nbsp;*&nbsp;+&nbsp;#&nbsp;&lt;&nbsp;&gt;``".</samp>
-<br><samp>The&nbsp;underline/overline&nbsp;must&nbsp;be&nbsp;at</samp>
-<br><samp>least&nbsp;as&nbsp;long&nbsp;as&nbsp;the&nbsp;title&nbsp;text.</samp>
-
- <td>
- <font size="+2"><strong>Title</strong></font>
- <p><font size="+1"><strong>Subtitle</strong></font>
- <p>Titles are underlined (or over-
- and underlined) with a printing
- nonalphanumeric 7-bit ASCII
- character. Recommended choices
- are "<samp>= - ` : ' " ~ ^ _ * + # &lt; &gt;</samp>".
- The underline/overline must be at
- least as long as the title text.
-<td>
-\chapter{Title}<br/>
-\section{Subtitle}<br/>
-\subsection{Subsubtitle}
-</td>
- </table>
-
- <h2><a href="#contents" name="paragraphs" class="backref"
- >Paragraphs</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#paragraphs">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<p><samp>This&nbsp;is&nbsp;a&nbsp;paragraph.</samp>
-
-<p><samp>Paragraphs&nbsp;line&nbsp;up&nbsp;at&nbsp;their&nbsp;left</samp>
-<br><samp>edges,&nbsp;and&nbsp;are&nbsp;normally&nbsp;separated</samp>
-<br><samp>by&nbsp;blank&nbsp;lines.</samp>
-
- <td>
- <p>This is a paragraph.
-
- <p>Paragraphs line up at their left edges, and are normally
- separated by blank lines.
-
- <td>
- <p>This is a paragraph.
-
- <p>Paragraphs line up at their left edges, and are normally
- separated by blank lines.
- </td>
-
- </table>
-
- <h2><a href="#contents" name="bullet-lists" class="backref"
- >Bullet Lists</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#bullet-lists">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>Bullet&nbsp;lists:</samp>
-
-<p><samp>-&nbsp;This&nbsp;is&nbsp;item&nbsp;1</samp>
-<br><samp>-&nbsp;This&nbsp;is&nbsp;item&nbsp;2</samp>
-
-<p><samp>-&nbsp;Bullets&nbsp;are&nbsp;"-",&nbsp;"*"&nbsp;or&nbsp;"+".</samp>
-<br><samp>&nbsp;&nbsp;Continuing&nbsp;text&nbsp;must&nbsp;be&nbsp;aligned</samp>
-<br><samp>&nbsp;&nbsp;after&nbsp;the&nbsp;bullet&nbsp;and&nbsp;whitespace.</samp>
-
-<p><samp>Note&nbsp;that&nbsp;a&nbsp;blank&nbsp;line&nbsp;is&nbsp;required</samp>
-<br><samp>before&nbsp;the&nbsp;first&nbsp;item&nbsp;and&nbsp;after&nbsp;the</samp>
-<br><samp>last,&nbsp;but&nbsp;is&nbsp;optional&nbsp;between&nbsp;items.</samp>
- <td>Bullet lists:
- <ul>
- <li>This is item 1
- <li>This is item 2
- <li>Bullets are "-", "*" or "+".
- Continuing text must be aligned
- after the bullet and whitespace.
- </ul>
- <p>Note that a blank line is required before the first
- item and after the last, but is optional between items.
-<td>
-<pre>
-\begin{itemize}
-
-\item This is item 1
-
-\item This is item 2
-
-\end{itemize}
-</pre>
-<p>Note: Embedded lists are supported.</p>
-</td>
- </table>
-
- <h2><a href="#contents" name="enumerated-lists" class="backref"
- >Enumerated Lists</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#enumerated-lists">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>Enumerated&nbsp;lists:</samp>
-
-<p><samp>3.&nbsp;This&nbsp;is&nbsp;the&nbsp;first&nbsp;item</samp>
-<br><samp>4.&nbsp;This&nbsp;is&nbsp;the&nbsp;second&nbsp;item</samp>
-<br><samp>5.&nbsp;Enumerators&nbsp;are&nbsp;arabic&nbsp;numbers,</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;single&nbsp;letters,&nbsp;or&nbsp;roman&nbsp;numerals</samp>
-<br><samp>6.&nbsp;List&nbsp;items&nbsp;should&nbsp;be&nbsp;sequentially</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;numbered,&nbsp;but&nbsp;need&nbsp;not&nbsp;start&nbsp;at&nbsp;1</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;(although&nbsp;not&nbsp;all&nbsp;formatters&nbsp;will</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;honour&nbsp;the&nbsp;first&nbsp;index).</samp>
- <td>Enumerated lists:
- <ol type="1">
- <li value="3">This is the first item
- <li>This is the second item
- <li>Enumerators are arabic numbers, single letters,
- or roman numerals
- <li>List items should be sequentially numbered,
- but need not start at 1 (although not all
- formatters will honour the first index).
- </ol>
-<td>
-<pre>
-\begin{enumerate}
-
-\item This is item 1
-
-\item This is item 2
-
-\end{enumerate}
-</pre>
-<p>Note: Embedded lists are supported.</p>
-</td>
- </table>
-
- <h2><a href="#contents" name="definition-lists" class="backref"
- >Definition Lists</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#definition-lists">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>Definition&nbsp;lists:</samp>
-<br>
-<br><samp>what</samp>
-<br><samp>&nbsp;&nbsp;Definition&nbsp;lists&nbsp;associate&nbsp;a&nbsp;term&nbsp;with</samp>
-<br><samp>&nbsp;&nbsp;a&nbsp;definition.</samp>
-<br>
-<br><samp>how</samp>
-<br><samp>&nbsp;&nbsp;The&nbsp;term&nbsp;is&nbsp;a&nbsp;one-line&nbsp;phrase,&nbsp;and&nbsp;the</samp>
-<br><samp>&nbsp;&nbsp;definition&nbsp;is&nbsp;one&nbsp;or&nbsp;more&nbsp;paragraphs&nbsp;or</samp>
-<br><samp>&nbsp;&nbsp;body&nbsp;elements,&nbsp;indented&nbsp;relative&nbsp;to&nbsp;the</samp>
-<br><samp>&nbsp;&nbsp;term.&nbsp;Blank&nbsp;lines&nbsp;are&nbsp;not&nbsp;allowed</samp>
-<br><samp>&nbsp;&nbsp;between&nbsp;term&nbsp;and&nbsp;definition.</samp>
- <td>Definition lists:
- <dl>
- <dt><strong>what</strong>
- <dd>Definition lists associate a term with
- a definition.
-
- <dt><strong>how</strong>
- <dd>The term is a one-line phrase, and the
- definition is one or more paragraphs or
- body elements, indented relative to the
- term. Blank lines are not allowed
- between term and definition.
- </dl>
-<td><pre>
-\begin{description}
-
-\item[label 1]Some descriptive text.
-
-\item[label 2]More descriptive text.
-
-\end{description}
-</pre></td>
- </table>
-
- <h2><a href="#contents" name="field-lists" class="backref"
- >Field Lists</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#field-lists">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>:Authors:</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;Tony&nbsp;J.&nbsp;(Tibs)&nbsp;Ibbs,</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;David&nbsp;Goodger</samp>
-
-<p><samp>&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;sundry&nbsp;other&nbsp;good-natured&nbsp;folks)</samp>
-
-<p><samp>:Version:&nbsp;1.0&nbsp;of&nbsp;2001/08/08</samp>
-<br><samp>:Dedication:&nbsp;To&nbsp;my&nbsp;father.</samp>
- <td>
- <table>
- <tr valign="top">
- <td><strong>Authors:</strong>
- <td>Tony J. (Tibs) Ibbs,
- David Goodger
- <tr><td><td>(and sundry other good-natured folks)
- <tr><td><strong>Version:</strong><td>1.0 of 2001/08/08
- <tr><td><strong>Dedication:</strong><td>To my father.
- </table>
- </table>
-
- <p>Field lists are used as part of an extension syntax, such as
- options for <a href="#directives">directives</a>, or database-like
- records meant for further processing. Field lists may also be
- used as generic two-column table constructs in documents.
-
- <h2><a href="#contents" name="option-lists" class="backref"
- >Option Lists</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#option-lists">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
- <p><samp>
--a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command-line&nbsp;option&nbsp;"a"
-<br>-b&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options&nbsp;can&nbsp;have&nbsp;arguments
-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;long&nbsp;descriptions
-<br>--long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options&nbsp;can&nbsp;be&nbsp;long&nbsp;also
-<br>--input=file&nbsp;&nbsp;long&nbsp;options&nbsp;can&nbsp;also&nbsp;have
-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments
-<br>/V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOS/VMS-style&nbsp;options&nbsp;too
-</samp>
-
- <td>
- <table border="0" width="100%">
- <tbody valign="top">
- <tr>
- <td width="30%"><p><samp>-a</samp>
- <td><p>command-line option "a"
- <tr>
- <td><p><samp>-b <i>file</i></samp>
- <td><p>options can have arguments and long descriptions
- <tr>
- <td><p><samp>--long</samp>
- <td><p>options can be long also
- <tr>
- <td><p><samp>--input=<i>file</i></samp>
- <td><p>long options can also have arguments
- <tr>
- <td><p><samp>/V</samp>
- <td><p>DOS/VMS-style options too
- </table>
-<td><pre>
-\programopt{-a}
-\longprogramopt{long}
-\programopt{/V}
-</pre></td>
- </table>
-
- <p>There must be at least two spaces between the option and the
- description.
-
- <h2><a href="#contents" name="literal-blocks" class="backref"
- >Literal Blocks</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#literal-blocks">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>A&nbsp;paragraph&nbsp;containing&nbsp;only&nbsp;two&nbsp;colons</samp>
-<br><samp>indicates&nbsp;that&nbsp;the&nbsp;following&nbsp;indented</samp>
-<br><samp>text&nbsp;is&nbsp;a&nbsp;literal&nbsp;block.</samp>
-<br>
-<br><samp>::</samp>
-<br>
-<br><samp>&nbsp;&nbsp;Whitespace,&nbsp;newlines,&nbsp;blank&nbsp;lines,&nbsp;and</samp>
-<br><samp>&nbsp;&nbsp;all&nbsp;kinds&nbsp;of&nbsp;markup&nbsp;(like&nbsp;*this*&nbsp;or</samp>
-<br><samp>&nbsp;&nbsp;\this)&nbsp;is&nbsp;preserved&nbsp;by&nbsp;literal&nbsp;blocks.</samp>
-<br>
-<br><samp>&nbsp;&nbsp;The&nbsp;paragraph&nbsp;containing&nbsp;only&nbsp;'::'</samp>
-<br><samp>&nbsp;&nbsp;will&nbsp;be&nbsp;omitted&nbsp;from&nbsp;the&nbsp;result.</samp>
-<br>
-<br><samp>The&nbsp;``::``&nbsp;may&nbsp;be&nbsp;tacked&nbsp;onto&nbsp;the&nbsp;very</samp>
-<br><samp>end&nbsp;of&nbsp;any&nbsp;paragraph.&nbsp;The&nbsp;``::``&nbsp;will&nbsp;be</samp>
-<br><samp>omitted&nbsp;if&nbsp;it&nbsp;is&nbsp;preceded&nbsp;by&nbsp;whitespace.</samp>
-<br><samp>The&nbsp;``::``&nbsp;will&nbsp;be&nbsp;converted&nbsp;to&nbsp;a&nbsp;single</samp>
-<br><samp>colon&nbsp;if&nbsp;preceded&nbsp;by&nbsp;text,&nbsp;like&nbsp;this::</samp>
-<br>
-<br><samp>&nbsp;&nbsp;It's&nbsp;very&nbsp;convenient&nbsp;to&nbsp;use&nbsp;this&nbsp;form.</samp>
-<br>
-<br><samp>Literal&nbsp;blocks&nbsp;end&nbsp;when&nbsp;text&nbsp;returns&nbsp;to</samp>
-<br><samp>the&nbsp;preceding&nbsp;paragraph's&nbsp;indentation.</samp>
-<br><samp>This&nbsp;means&nbsp;that&nbsp;something&nbsp;like::</samp>
-<br>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We&nbsp;start&nbsp;here</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;continue&nbsp;here</samp>
-<br><samp>&nbsp;&nbsp;and&nbsp;end&nbsp;here.</samp>
-<br>
-<br><samp>is&nbsp;possible.</samp>
-
- <td>
- <p>A paragraph containing only two colons
-indicates that the following indented
-text is a literal block.
-
- <pre>
- Whitespace, newlines, blank lines, and
- all kinds of markup (like *this* or
- \this) is preserved by literal blocks.
-
- The paragraph containing only '::'
- will be omitted from the result.</pre>
-
- <p>The <samp>::</samp> may be tacked onto the very
-end of any paragraph. The <samp>::</samp> will be
-omitted if it is preceded by whitespace.
-The <samp>::</samp> will be converted to a single
-colon if preceded by text, like this:
-
- <pre>
- It's very convenient to use this form.</pre>
-
- <p>Literal blocks end when text returns to
-the preceding paragraph's indentation.
-This means that something like:
-
- <pre>
- We start here
- and continue here
- and end here.</pre>
-
- <p>is possible.
-<td><pre>
-
-
-A paragraph containing only two colons
-indicates that the following indented
-text is a literal block.
-
-\begin{verbatim}
- Whitespace, newlines, blank lines, and
- all kinds of markup (like *this* or
- \this) is preserved by literal blocks.
-
- The paragraph containing only '::'
- will be omitted from the result.
-\end{verbatim}
-
-The <samp>::</samp> may be tacked onto the very
-end of any paragraph. The <samp>::</samp> will be
-omitted if it is preceded by whitespace.
-The <samp>::</samp> will be converted to a single
-colon if preceded by text, like this:
-
-\begin{verbatim}
- It's very convenient to use this form.
-\end{verbatim}
-
-Literal blocks end when text returns to
-the preceding paragraph's indentation.
-This means that something like:
-
-\begin{verbatim}
- We start here
- and continue here
- and end here.
-\end{verbatim}
-
-is possible.
-
-
-</pre></td>
- </table>
-
- <h2><a href="#contents" name="block-quotes" class="backref"
- >Block Quotes</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#block-quotes">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<samp>Block&nbsp;quotes&nbsp;are&nbsp;just:</samp>
-
-<p><samp>&nbsp;&nbsp;&nbsp;&nbsp;Indented&nbsp;paragraphs,</samp>
-
-<p><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;they&nbsp;may&nbsp;nest.</samp>
- <td>
- Block quotes are just:
- <blockquote>
- <p>Indented paragraphs,
- <blockquote>
- <p>and they may nest.
- </blockquote>
- </blockquote>
-<td><pre>
-Block quotes are just:
-
-\begin{quotation}
-Indented paragraphs
-\end{quotation}
-</pre></td>
- </table>
-
- <h2><a href="#contents" name="doctest-blocks" class="backref"
- >Doctest Blocks</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#doctest-blocks">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
- <p><samp>Doctest&nbsp;blocks&nbsp;are&nbsp;interactive
-<br>Python&nbsp;sessions.&nbsp;They&nbsp;begin&nbsp;with
-<br>"``&gt;&gt;&gt;``"&nbsp;and&nbsp;end&nbsp;with&nbsp;a&nbsp;blank&nbsp;line.</samp>
-
- <p><samp>&gt;&gt;&gt;&nbsp;print&nbsp;"This&nbsp;is&nbsp;a&nbsp;doctest&nbsp;block."
-<br>This&nbsp;is&nbsp;a&nbsp;doctest&nbsp;block.</samp>
-
- <td>
- <p>Doctest blocks are interactive
- Python sessions. They begin with
- "<samp>&gt;&gt;&gt;</samp>" and end with a blank line.
-
- <p><samp>&gt;&gt;&gt;&nbsp;print&nbsp;"This&nbsp;is&nbsp;a&nbsp;doctest&nbsp;block."
-<br>This&nbsp;is&nbsp;a&nbsp;doctest&nbsp;block.</samp>
-<td><pre>
-\begin{verbatim}
-<samp>&gt;&gt;&gt;&nbsp;print&nbsp;"This&nbsp;is&nbsp;a&nbsp;doctest&nbsp;block."
-\end{verbatim}
-</pre></td>
- </table>
-
- <p>"The <a
- href="http://www.python.org/doc/current/lib/module-doctest.html">doctest</a>
- module searches a module's docstrings for text that looks like an
- interactive Python session, then executes all such sessions to
- verify they still work exactly as shown." (From the doctest docs.)
-
- <h2><a href="#contents" name="tables" class="backref"
- >Tables</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#tables">details</a>)
-
- <p>There are two syntaxes for tables in reStructuredText. Grid
- tables are complete but cumbersome to create. Simple tables are
- easy to create but limited (no row spans, etc.).</p>
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
-<p><samp>Grid table:</samp></p>
-
-<p><samp>+------------+------------+-----------+</samp>
-<br><samp>|&nbsp;Header&nbsp;1&nbsp;&nbsp;&nbsp;|&nbsp;Header&nbsp;2&nbsp;&nbsp;&nbsp;|&nbsp;Header&nbsp;3&nbsp;&nbsp;|</samp>
-<br><samp>+============+============+===========+</samp>
-<br><samp>|&nbsp;body&nbsp;row&nbsp;1&nbsp;|&nbsp;column&nbsp;2&nbsp;&nbsp;&nbsp;|&nbsp;column&nbsp;3&nbsp;&nbsp;|</samp>
-<br><samp>+------------+------------+-----------+</samp>
-<br><samp>|&nbsp;body&nbsp;row&nbsp;2&nbsp;|&nbsp;Cells&nbsp;may&nbsp;span&nbsp;columns.|</samp>
-<br><samp>+------------+------------+-----------+</samp>
-<br><samp>|&nbsp;body&nbsp;row&nbsp;3&nbsp;|&nbsp;Cells&nbsp;may&nbsp;&nbsp;|&nbsp;-&nbsp;Cells&nbsp;&nbsp;&nbsp;|</samp>
-<br><samp>+------------+&nbsp;span&nbsp;rows.&nbsp;|&nbsp;-&nbsp;contain&nbsp;|</samp>
-<br><samp>|&nbsp;body&nbsp;row&nbsp;4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;-&nbsp;blocks.&nbsp;|</samp>
-<br><samp>+------------+------------+-----------+</samp></p>
- <td>
- <p>Grid table:</p>
- <table border="1">
- <tr valign="top">
- <th>Header 1
- <th>Header 2
- <th>Header 3
- <tr>
- <td>body row 1
- <td>column 2
- <td>column 3
- <tr>
- <td>body row 2
- <td colspan="2">Cells may span columns.
- <tr valign="top">
- <td>body row 3
- <td rowspan="2">Cells may<br>span rows.
- <td rowspan="2">
- <ul>
- <li>Cells
- <li>contain
- <li>blocks.
- </ul>
- <tr valign="top">
- <td>body row 4
- </table>
-
-<td><pre>
-Two-column table:
-
-\begin{tableii}{l|l}{character}{Heading 1}
- {Heading 2}
-\lineii{value 1-1}{value 1-2}
-\lineii{value 2-1}{value 2-2}
-\end{tableii}
-
-Three-column table:
-
-\begin{tableiii}{l|l|l}{character}
- {Heading 1}{Heading 2}{Heading 3}
-\lineiii{value 1-1}{value 1-2}{value 1-3}
-\lineiii{value 2-1}{value 2-2}{value 2-3}
-\end{tableii}
-
-</pre></td>
-
- <tr valign="top">
- <td>
-<p><samp>Simple table:</samp></p>
-
-<p><samp>=====&nbsp;&nbsp;=====&nbsp;&nbsp;======</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;Inputs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Output</samp>
-<br><samp>------------&nbsp;&nbsp;------</samp>
-<br><samp>&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;or&nbsp;B</samp>
-<br><samp>=====&nbsp;&nbsp;=====&nbsp;&nbsp;======</samp>
-<br><samp>False&nbsp;&nbsp;False&nbsp;&nbsp;False</samp>
-<br><samp>True&nbsp;&nbsp;&nbsp;False&nbsp;&nbsp;True</samp>
-<br><samp>False&nbsp;&nbsp;True&nbsp;&nbsp;&nbsp;True</samp>
-<br><samp>True&nbsp;&nbsp;&nbsp;True&nbsp;&nbsp;&nbsp;True</samp>
-<br><samp>=====&nbsp;&nbsp;=====&nbsp;&nbsp;======</samp></p>
-
- <td>
- <p>Simple table:</p>
- <table frame="border" rules="all">
- <colgroup>
- <col colwidth="31%" />
- <col colwidth="31%" />
- <col colwidth="38%" />
- </colgroup>
- <thead valign="bottom">
- <tr>
- <th colspan="2">Inputs
- <th>Output
- <tr>
- <th>A
- <th>B
- <th>A or B
- <tbody valign="top">
- <tr>
- <td>False
- <td>False
- <td>False
- <tr>
- <td>True
- <td>False
- <td>True
- <tr>
- <td>False
- <td>True
- <td>True
- <tr>
- <td>True
- <td>True
- <td>True
- </table>
-
- <td>
- <p>Notes and limitations:</p>
- <ul>
- <li>Only regular tables supported. No COLSPAN or
- ROWSPAN.</li>
- <li>Tables with 2-columns, 3-columns, 4-columns, and
- 5-columns are supported.</li>
- <li>All columns are left-aligned.</li>
- </ul>
- </td>
- </table>
-
- <h2><a href="#contents" name="transitions" class="backref"
- >Transitions</a></h2>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#transitions">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td>
- <p><samp>
-A&nbsp;transition&nbsp;marker&nbsp;is&nbsp;a&nbsp;horizontal&nbsp;line
-<br>of&nbsp;4&nbsp;or&nbsp;more&nbsp;repeated&nbsp;punctuation
-<br>characters.</samp>
-
- <p><samp>------------</samp>
-
- <p><samp>A&nbsp;transition&nbsp;should&nbsp;not&nbsp;begin&nbsp;or&nbsp;end&nbsp;a
-<br>section&nbsp;or&nbsp;document,&nbsp;nor&nbsp;should&nbsp;two
-<br>transitions&nbsp;be&nbsp;immediately&nbsp;adjacent.</samp>
-
- <td>
- <p>A transition marker is a horizontal line
- of 4 or more repeated punctuation
- characters.</p>
-
- <hr>
-
- <p>A transition should not begin or end a
- section or document, nor should two
- transitions be immediately adjacent.
-<td>
- <p>A transition marker is a horizontal line
- of 4 or more repeated punctuation
- characters.</p>
-
- \hrule{}
-
- <p>A transition should not begin or end a
- section or document, nor should two
- transitions be immediately adjacent.
-</td>
- </table>
-
- <p>Transitions are commonly seen in novels and short fiction, as a
- gap spanning one or more lines, marking text divisions or
- signaling changes in subject, time, point of view, or emphasis.
-
- <h2><a href="#contents" name="explicit-markup" class="backref"
- >Explicit Markup</a></h2>
-
- <p>Explicit markup blocks are used for constructs which float
- (footnotes), have no direct paper-document representation
- (hyperlink targets, comments), or require specialized processing
- (directives). They all begin with two periods and whitespace, the
- "explicit markup start".
-
- <h3><a href="#contents" name="footnotes" class="backref"
- >Footnotes</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#footnotes">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
-
- <tr valign="top">
- <td>
- <samp>Footnote&nbsp;references,&nbsp;like&nbsp;[5]_.</samp>
- <br><samp>Note&nbsp;that&nbsp;footnotes&nbsp;may&nbsp;get</samp>
- <br><samp>rearranged,&nbsp;e.g.,&nbsp;to&nbsp;the&nbsp;bottom&nbsp;of</samp>
- <br><samp>the&nbsp;"page".</samp>
-
- <p><samp>..&nbsp;[5]&nbsp;A&nbsp;numerical&nbsp;footnote.&nbsp;Note</samp>
- <br><samp>&nbsp;&nbsp;&nbsp;there's&nbsp;no&nbsp;colon&nbsp;after&nbsp;the&nbsp;``]``.</samp>
-
- <td>
- Footnote references, like <sup><a href="#5">5</a></sup>.
- Note that footnotes may get rearranged, e.g., to the bottom of
- the "page".
-
- <p><table>
- <tr><td colspan="2"><hr>
- <!-- <tr><td colspan="2">Footnotes: -->
- <tr><td><a name="5"><strong>[5]</strong></a><td> A numerical footnote.
- Note there's no colon after the <samp>]</samp>.
- </table>
- <td>
-Footnote references, like\footnote{A numerical footnote.
-Note there's no colon after the <samp>]</samp>.}.
-Note that footnotes may get
-rearranged, e.g., to the bottom of
-the "page".
- <tr valign="top">
- <td>
- <samp>Autonumbered&nbsp;footnotes&nbsp;are</samp>
- <br><samp>possible,&nbsp;like&nbsp;using&nbsp;[#]_&nbsp;and&nbsp;[#]_.</samp>
- <p><samp>..&nbsp;[#]&nbsp;This&nbsp;is&nbsp;the&nbsp;first&nbsp;one.</samp>
- <br><samp>..&nbsp;[#]&nbsp;This&nbsp;is&nbsp;the&nbsp;second&nbsp;one.</samp>
-
- <p><samp>They&nbsp;may&nbsp;be&nbsp;assigned&nbsp;'autonumber</samp>
- <br><samp>labels'&nbsp;-&nbsp;for&nbsp;instance,
- <br>[#fourth]_&nbsp;and&nbsp;[#third]_.</samp>
-
- <p><samp>..&nbsp;[#third]&nbsp;a.k.a.&nbsp;third_</samp>
- <p><samp>..&nbsp;[#fourth]&nbsp;a.k.a.&nbsp;fourth_</samp>
- <td>
- Autonumbered footnotes are possible, like using <sup><a
- href="#auto1">1</a></sup> and <sup><a href="#auto2">2</a></sup>.
-
- <p>They may be assigned 'autonumber labels' - for instance,
- <sup><a href="#fourth">4</a></sup> and <sup><a
- href="#third">3</a></sup>.
-
- <p><table>
- <tr><td colspan="2"><hr>
- <!-- <tr><td colspan="2">Footnotes: -->
- <tr><td><a name="auto1"><strong>[1]</strong></a><td> This is the first one.
- <tr><td><a name="auto2"><strong>[2]</strong></a><td> This is the second one.
- <tr><td><a name="third"><strong>[3]</strong></a><td> a.k.a. <a href="#third">third</a>
- <tr><td><a name="fourth"><strong>[4]</strong></a><td> a.k.a. <a href="#fourth">fourth</a>
- </table>
- <td>
-<p>Autonumbered footnotes are possible, like using\footnote{This is
-the first one.} and \footnote{This is the second one.}. </p>
-
-<p>They may be assigned 'autonumber labels' - for instance,
-\footnote{a.k.a. third} and \footnote{a.k.a. fourth}. </p>
-
-<p>[Note: Re-ordering of footnotes is not supported in DocPy.]</p>
-
- </br></td>
-
- <tr valign="top">
- <td>
- <samp>Auto-symbol&nbsp;footnotes&nbsp;are&nbsp;also</samp>
- <br><samp>possible,&nbsp;like&nbsp;this:&nbsp;[*]_&nbsp;and&nbsp;[*]_.</samp>
- <p><samp>..&nbsp;[*]&nbsp;This&nbsp;is&nbsp;the&nbsp;first&nbsp;one.</samp>
- <br><samp>..&nbsp;[*]&nbsp;This&nbsp;is&nbsp;the&nbsp;second&nbsp;one.</samp>
-
- <td>
- Auto-symbol footnotes are also
- possible, like this: <sup><a href="#symbol1">*</a></sup>
- and <sup><a href="#symbol2">&dagger;</a></sup>.
-
- <p><table>
- <tr><td colspan="2"><hr>
- <!-- <tr><td colspan="2">Footnotes: -->
- <tr><td><a name="symbol1"><strong>[*]</strong></a><td> This is the first symbol footnote
- <tr><td><a name="symbol2"><strong>[&dagger;]</strong></a><td> This is the second one.
- </table>
-
- <td>
- [Not supported in DocPy.]
-
- </table>
-
- <p>The numbering of auto-numbered footnotes is determined by the
- order of the footnotes, not of the references. For auto-numbered
- footnote references without autonumber labels
- ("<samp>[#]_</samp>"), the references and footnotes must be in the
- same relative order. Similarly for auto-symbol footnotes
- ("<samp>[*]_</samp>").
-
- <h3><a href="#contents" name="citations" class="backref"
- >Citations</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#citations">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
-
- <tr valign="top">
- <td>
- <samp>Citation&nbsp;references,&nbsp;like&nbsp;[CIT2002]_.</samp>
- <br><samp>Note&nbsp;that&nbsp;citations&nbsp;may&nbsp;get</samp>
- <br><samp>rearranged,&nbsp;e.g.,&nbsp;to&nbsp;the&nbsp;bottom&nbsp;of</samp>
- <br><samp>the&nbsp;"page".</samp>
-
- <p><samp>..&nbsp;[CIT2002]&nbsp;A&nbsp;citation</samp>
- <br><samp>&nbsp;&nbsp;&nbsp;(as&nbsp;often&nbsp;used&nbsp;in&nbsp;journals).</samp>
-
- <p><samp>Citation&nbsp;labels&nbsp;contain&nbsp;alphanumerics,</samp>
- <br><samp>underlines,&nbsp;hyphens&nbsp;and&nbsp;fullstops.</samp>
- <br><samp>Case&nbsp;is&nbsp;not&nbsp;significant.</samp>
-
- <p><samp>Given&nbsp;a&nbsp;citation&nbsp;like&nbsp;[this]_,&nbsp;one</samp>
- <br><samp>can&nbsp;also&nbsp;refer&nbsp;to&nbsp;it&nbsp;like&nbsp;this_.</samp>
-
- <p><samp>..&nbsp;[this]&nbsp;here.</samp>
-
- <td>
- Citation references, like <a href="#cit2002">[CIT2002]</a>.
- Note that citations may get rearranged, e.g., to the bottom of
- the "page".
-
- <p>Citation labels contain alphanumerics, underlines, hyphens
- and fullstops. Case is not significant.
-
- <p>Given a citation like <a href="#this">[this]</a>, one
- can also refer to it like <a href="#this">this</a>.
-
- <p><table>
- <tr><td colspan="2"><hr>
- <!-- <tr><td colspan="2">Citations: -->
- <tr><td><a name="cit2002"><strong>[CIT2002]</strong></a><td> A citation
- (as often used in journals).
- <tr><td><a name="this"><strong>[this]</strong></a><td> here.
- </table>
-
- </table>
-
- <h3><a href="#contents" name="hyperlink-targets" class="backref"
- >Hyperlink Targets</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#hyperlink-targets">details</a>)
-
- <h4><a href="#contents" name="external-hyperlink-targets" class="backref"
- >External Hyperlink Targets</a></h4>
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
-
- <tr valign="top">
- <td>
- <samp>External&nbsp;hyperlinks,&nbsp;like&nbsp;Python_.</samp>
-
- <p><samp>..&nbsp;_Python:&nbsp;http://www.python.org/</samp>
- <td>
- <table width="100%">
- <tr bgcolor="#99CCFF"><td><em>Fold-in form</em>
- <tr><td>Indirect hyperlinks, like
- <a href="http://www.python.org">Python</a>.
- <tr bgcolor="#99CCFF"><td><em>Call-out form</em>
- <tr><td>External hyperlinks, like
- <a href="#labPython"><i>Python</i></a>.
-
- <p><table>
- <tr><td colspan="2"><hr>
- <tr><td><a name="labPython"><i>Python:</i></a>
- <td> <a href="http://www.python.org/">http://www.python.org/</a>
- </table>
- </table>
- <td>
- <p>External hyperlinks, like
- \ulink{Python}{http://www.python.org/}.</p>
- </table>
-
- <p>"<em>Fold-in</em>" is the representation typically used in HTML
- documents (think of the indirect hyperlink being "folded in" like
- ingredients into a cake), and "<em>call-out</em>" is more suitable for
- printed documents, where the link needs to be presented explicitly, for
- example as a footnote.
-
- <h4><a href="#contents" name="internal-hyperlink-targets" class="backref"
- >Internal Hyperlink Targets</a></h4>
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
-
- <tr valign="top">
- <td><samp>Internal&nbsp;crossreferences,&nbsp;like&nbsp;example_.</samp>
-
- <p><samp>..&nbsp;_example:</samp>
-
- <p><samp>This&nbsp;is&nbsp;an&nbsp;example&nbsp;crossreference&nbsp;target.</samp>
- <td>
- <table width="100%">
- <tr bgcolor="#99CCFF"><td><em>Fold-in form</em>
- <!-- Note that some browsers may not like an "a" tag that -->
- <!-- does not have any content, so we could arbitrarily -->
- <!-- use the first word as content - *or* just trust to -->
- <!-- luck! -->
- <tr><td>Internal crossreferences, like <a href="#example-foldin">example</a>
- <p><a name="example-foldin">This</a> is an example
- crossreference target.
- <tr><td bgcolor="#99CCFF"><em>Call-out form</em>
- <tr><td>Internal crossreferences, like <a href="#example-callout">example</a>
-
- <p><a name="example-callout"><i>example:</i></a>
- <br>This is an example crossreference target.
- </table>
-
- </table>
-
- <h4><a href="#contents" name="indirect-hyperlink-targets" class="backref"
- >Indirect Hyperlink Targets</a></h4>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#indirect-hyperlink-targets">details</a>)
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
-
- <tr valign="top">
- <td>
- <samp>Python_&nbsp;is&nbsp;`my&nbsp;favourite
-<br>programming&nbsp;language`__.</samp>
-
- <p><samp>..&nbsp;_Python:&nbsp;http://www.python.org/</samp>
-
- <p><samp>__&nbsp;Python_</samp>
-
- <td>
- <p><a href="http://www.python.org/">Python</a> is
- <a href="http://www.python.org/">my favourite
- programming language</a>.
-
- </table>
-
- <p>The second hyperlink target (the line beginning with
- "<samp>__</samp>") is both an indirect hyperlink target
- (<i>indirectly</i> pointing at the Python website via the
- "<samp>Python_</samp>" reference) and an <b>anonymous hyperlink
- target</b>. In the text, a double-underscore suffix is used to
- indicate an <b>anonymous hyperlink reference</b>. In an anonymous
- hyperlink target, the reference text is not repeated. This is
- useful for references with long text or throw-away references, but
- the target should be kept close to the reference to prevent them
- going out of sync.
-
- <h4><a href="#contents" name="implicit-hyperlink-targets" class="backref"
- >Implicit Hyperlink Targets</a></h4>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#implicit-hyperlink-targets">details</a>)
-
- <p>Section titles, footnotes, and citations automatically generate
- hyperlink targets (the title text or footnote/citation label is
- used as the hyperlink name).
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3"> <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
-
- <tr valign="top">
- <td>
- <samp>Titles&nbsp;are&nbsp;targets,&nbsp;too</samp>
- <br><samp>=======================</samp>
- <br><samp>Implict&nbsp;references,&nbsp;like&nbsp;`Titles&nbsp;are</samp>
- <br><samp>targets,&nbsp;too`_.</samp>
- <td>
- <font size="+2"><strong><a name="title">Titles are targets, too</a></strong></font>
- <p>Implict references, like <a href="#Title">Titles are
- targets, too</a>.
- </table>
-
- <h3><a href="#contents" name="directives" class="backref"
- >Directives</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#directives">details</a>)
-
- <p>Directives are a general-purpose extension mechanism, a way of
- adding support for new constructs without adding new syntax. For
- a description of all standard directives, see <a
- href="../../spec/rst/directives.html" >reStructuredText
- Directives</a>.
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
- <tr valign="top">
- <td><samp>For&nbsp;instance:</samp>
-
- <p><samp>..&nbsp;image::&nbsp;images/ball1.gif</samp>
-
- <td>
- For instance:
- <p><img src="images/ball1.gif" alt="ball1">
- </table>
-
- <h3><a href="#contents" name="substitution-references-and-definitions"
- class="backref" >Substitution References and Definitions</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#substitution-definitions">details</a>)
-
- <p>Substitutions are like inline directives, allowing graphics and
- arbitrary constructs within text.
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="50%">Plain text
- <th width="50%">Typical result
- </thead>
- <tbody>
- <tr valign="top">
- <td><samp>
-The&nbsp;|biohazard|&nbsp;symbol&nbsp;must&nbsp;be
-used&nbsp;on&nbsp;containers&nbsp;used&nbsp;to
-dispose&nbsp;of&nbsp;medical&nbsp;waste.</samp>
-
- <p><samp>
-..&nbsp;|biohazard|&nbsp;image::&nbsp;biohazard.png</samp>
-
- <td>
-
- <p>The <img src="images/biohazard.png" align="bottom" alt="biohazard"> symbol
- must be used on containers used to dispose of medical waste.
-
- </table>
-
- <h3><a href="#contents" name="comments" class="backref"
- >Comments</a></h3>
-
- <p>(<a href="../../spec/rst/reStructuredText.html#comments">details</a>)
-
- <p>Any text which begins with an explicit markup start but doesn't
- use the syntax of any of the constructs above, is a comment.
-
- <p><table border="1" width="100%" bgcolor="#ffffcc" cellpadding="3">
- <thead>
- <tr align="left" bgcolor="#99CCFF">
- <th width="33%">Plain text
- <th width="33%">Typical result
- <th>Doc Py</th>
- </thead>
- <tbody>
- <tr valign="top">
- <td><samp>..&nbsp;This&nbsp;text&nbsp;will&nbsp;not&nbsp;be&nbsp;shown</samp>
- <br><samp>&nbsp;&nbsp;&nbsp;(but,&nbsp;for&nbsp;instance,&nbsp;in&nbsp;HTML&nbsp;might&nbsp;be</samp>
- <br><samp>&nbsp;&nbsp;&nbsp;rendered&nbsp;as&nbsp;an&nbsp;HTML&nbsp;comment)</samp>
-
- <td>&nbsp;
- <!-- This text will not be shown -->
- <!-- (but, for instance in HTML might be -->
- <!-- rendered as an HTML comment) -->
-
-<td><pre>
-% This text will not be shown
-% (but, for instance, in HTML might be
-% rendered as an HTML comment)
-</pre></td>
- <tr valign="top">
- <td>
- <samp>An&nbsp;empty&nbsp;"comment"&nbsp;does&nbsp;not</samp>
- <br><samp>"consume"&nbsp;following&nbsp;blocks.</samp>
- <p><samp>..</samp>
- <p><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;So&nbsp;this&nbsp;block&nbsp;is&nbsp;not&nbsp;"lost",</samp>
- <br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;despite&nbsp;its&nbsp;indentation.</samp>
- <td>
- An empty "comment" does not
- "consume" following blocks.
- <blockquote>
- So this block is not "lost",
- despite its indentation.
- </blockquote>
- </table>
-
- <h2><a href="#contents" name="getting-help" class="backref"
- >Getting Help</a></h2>
-
- <p>Users who have questions or need assistance with Docutils or
- reStructuredText should <a
- href="mailto:docutils-users@lists.sourceforge.net" >post a
- message</a> to the <a
- href="http://lists.sourceforge.net/lists/listinfo/docutils-users"
- >Docutils-Users mailing list</a>. The <a
- href="http://docutils.sourceforge.net/" >Docutils project web
- site</a> has more information.
-
- <p><hr>
- <address>
- <p>Authors:
- <a href="http://www.tibsnjoan.co.uk/">Tibs</a>
- (<a href="mailto:tony@lsl.co.uk"><tt>tony@lsl.co.uk</tt></a> or
- <a href="mailto:tibs@tibsnjoan.co.uk"><tt>tibs@tibsnjoan.co.uk</tt></a>)
- and David Goodger
- (<a href="mailto:goodger@users.sourceforge.net">goodger@users.sourceforge.net</a>)
- </address>
- <!-- Created: Fri Aug 03 09:11:57 GMT Daylight Time 2001 -->
- </body>
-</html>
diff --git a/sandbox/dkuhlman/docutils/docutils/writers/python_latex.py b/sandbox/dkuhlman/docutils/docutils/writers/python_latex.py
deleted file mode 100644
index 62f4c0363..000000000
--- a/sandbox/dkuhlman/docutils/docutils/writers/python_latex.py
+++ /dev/null
@@ -1,1114 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:Author: Dave Kuhlman
-:Contact: dkuhlman@rexx.com
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-LaTeX2e document tree Writer.
-"""
-
-__docformat__ = 'reStructuredText'
-
-# convention deactivate code by two # e.g. ##.
-
-import sys
-import time
-import re
-import string
-import urllib, urlparse
-from docutils import writers, nodes, languages
-
-## from IPython.Shell import IPShellEmbed
-## args = ''
-## ipshell = IPShellEmbed(args,
-## banner = 'Dropping into IPython',
-## exit_msg = 'Leaving Interpreter, back to program.')
-
-
-# To turn off debug printing, set to 0.
-DEBUG_FLAG = 1
-
-# Constants and globals:
-
-COMMENT_RE_SUB = re.compile('\n').sub
-PROGRAMOPT_RE = re.compile('(--[_\-a-zA-Z0-9]+)')
-EMAILADDR_RE = re.compile(r'[_\-a-zA-Z0-9.]+@[_\-a-zA-Z0-9.]+')
-WEBADDR_RE = re.compile(r'http://[_\-a-zA-Z0-9./~]+')
-
-TABLE_MODE_NONE = 0
-TABLE_MODE_HEAD = 1
-TABLE_MODE_BODY = 2
-
-class TableSpec:
- def __init__(self):
- self.columnCount = 0
- self.mode = TABLE_MODE_NONE
- def getColumnCount(self): return self.columnCount
- def setColumnCount(self, columnCount): self.columnCount = columnCount
- def getMode(self): return self.mode
- def setMode(self, mode): self.mode = mode
-
-
-class Writer(writers.Writer):
-
- supported = ('latex','latex2e')
- """Formats this writer supports."""
-
- settings_spec = (
- 'Documenting Python LaTeX Specific Options',
- 'The LaTeX "--output-encoding" default is "latin-1:strict".',
- (('Specify documentclass (one of howto, manual, module). Default is "howto".',
-# (('Specify documentclass (one of howto, manual). Default is "howto".',
- ['--documentclass'],
- {'default': 'howto', }),
- ))
-
- #settings_defaults = {}
- settings_defaults = {'output_encoding': 'latin-1'}
-
- output = None
- """Final translated form of `document`."""
-
- def translate(self):
- visitor = DocPyTranslator(self.document)
- self.document.walkabout(visitor)
- #import pdb
- #pdb.run('self.document.walkabout(visitor)', globals(), locals())
- self.output = visitor.astext()
-
-
-class DocPyTranslator(nodes.NodeVisitor):
- latex_head = '\\documentclass{%s}\n'
- # add a generated on day , machine by user using docutils version.
- generator = '\n%% generator -- Docutils: http://docutils.sourceforge.net/\n' \
- '%% writer -- documenting_python\n' \
- '%% generated on -- %s\n\n' % time.ctime()
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.docinfo = {}
- self.settings = settings = document.settings
- if self.settings.documentclass == 'module':
- raise NotImplementedError, 'Error: module document type not yet implemented.'
- self.head_prefix = [
- self.latex_head % (self.settings.documentclass, ),
- #self.encoding,
- #self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
- # geometry and fonts might go into style.tex.
- #self.geometry % (self.d_paper, self.d_margins),
- #
- self.generator,
- '\\usepackage{html}\n',
- ]
-
- # NOTE: Latex wants a date and an author, rst puts this into
- # docinfo, so normally we donot want latex author/date handling.
- # latex article has its own handling of date and author, deactivate.
- self.latex_docinfo = 0
- self.head = [ ]
- self.body_prefix = []
- # separate title, so we can appen subtitle.
- self.title = ""
- self.body = []
- self.body_suffix = ['\n']
- self.section_level = 0
- self.context = []
- self.topic_class = ''
- # Flags to encode
- # ---------------
- # verbatim: to tell encode not to encode.
- self.verbatim = 0
- # insert_newline: to tell encode to replace blanks by "~".
- self.insert_none_breaking_blanks = 0
- # insert_newline: to tell encode to add latex newline.
- self.insert_newline = 0
- # mbox_newline: to tell encode to add mbox and newline.
- self.mbox_newline = 0
-
- # inside literal block: no quote mangling.
- self.literal = 0
- self.seealso = 0
- self.title_before_section = 0
- self.seen_section = 0
-
- def pdebug(self, msg):
- if DEBUG_FLAG >= 1:
- self.body.append(msg)
-
- def encode(self, text):
- """
- Encode special characters in `text` & return.
- # $ % & ~ _ ^ \ { }
- Escaping with a backslash does not help with backslashes, ~ and ^.
-
- < > are only available in math-mode (really ?)
- $ starts math- mode.
- AND quotes:
-
- """
- if self.verbatim:
- return text
- # compile the regexps once. do it here so one can see them.
- #
- # first the braces.
- if not self.__dict__.has_key('encode_re_braces'):
- self.encode_re_braces = re.compile(r'([{}])')
- text = self.encode_re_braces.sub(r'{\\\1}',text)
- if not self.__dict__.has_key('encode_re_bslash'):
- # find backslash: except in the form '{\{}' or '{\}}'.
- self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
- # then the backslash: except in the form from line above:
- # either '{\{}' or '{\}}'.
- text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
-
- # then dollar
- text = text.replace("$", '{\\$}')
- # then all that needs math mode
- text = text.replace("<", '{$<$}')
- text = text.replace(">", '{$>$}')
- # then
- text = text.replace("&", '{\\&}')
- text = text.replace("_", '{\\_}')
- # the ^:
- # * verb|^| does not work in mbox.
- # * mathmode has wedge. hat{~} would also work.
- text = text.replace("^", '{\\ensuremath{^\\wedge}}')
- text = text.replace("%", '{\\%}')
- text = text.replace("#", '{\\#}')
- text = text.replace("~", '{\\~{}}')
- if self.insert_newline:
- # HACK: insert a blank before the newline, to avoid
- # ! LaTeX Error: There's no line here to end.
- text = text.replace("\n", '~\\\\\n')
- elif self.mbox_newline:
- text = text.replace("\n", '}\\\\\n\\mbox{')
- if self.insert_none_breaking_blanks:
- text = text.replace(' ', '~')
- # unicode !!!
- text = text.replace(u'\u2020', '{$\\dagger$}')
- return text
-
- def attval(self, text,
- whitespace=re.compile('[\n\r\t\v\f]')):
- """Cleanse, encode, and return attribute value text."""
- return self.encode(whitespace.sub(' ', text))
-
- def replace_email_addr(self, mo):
- addr = mo.group(0)
- outtext = '\\ulink{%s}{mailto:%s}' % (addr, addr)
- return outtext
-
- def replace_web_addr(self, mo):
- addr = mo.group(0)
- outtext = '\\ulink{%s}{%s}' % (addr, addr)
- return outtext
-
- def linkify(self, intext):
- # If it looks like an email address, convert it to a "mailto" URL.
- text1 = EMAILADDR_RE.sub(self.replace_email_addr, intext)
- # If it looks like a URL, convert it to a ulink.
- text2 = WEBADDR_RE.sub(self.replace_web_addr, text1)
- return text2
-
- def astext(self):
- title = '\\title{%s}\n' % self.title
- if self.docinfo.has_key('revision'):
- self.head.append('\\release{%s}\n' % self.docinfo['revision'])
- if self.docinfo.has_key('date'):
- self.head.append('\\date{%s}\n' % self.docinfo['date'])
- if self.docinfo.has_key('author'):
- self.head.append('\\author{%s}\n' % self.docinfo['author'])
- if self.docinfo.has_key('address'):
- self.pdebug('%% [(astext) text: %s]\n' % self.docinfo['address'])
- self.head.append('\\authoraddress{%s}\n' % \
- #self.linkify(self.cleanHref(self.docinfo['address'])))
- self.cleanHref(self.linkify(
- self.docinfo['address'])).replace('\n', '\\\\\n'))
- self.body_prefix.append('\\maketitle\n')
- self.body_prefix.append('\\ifhtml\n')
- self.body_prefix.append('\\chapter*{Front Matter\\label{front}}\n')
- self.body_prefix.append('\\fi\n')
- if self.docinfo.has_key('copyright'):
- self.body_prefix.append('\n%s\n' % self.docinfo['copyright'])
- if self.docinfo.has_key('abstract'):
- self.body_prefix.append('\\begin{abstract}\n\\noindent\n')
- self.body_prefix.append('%s\n' % self.docinfo['abstract'])
- self.body_prefix.append('\\end{abstract}\n')
- self.body_prefix.append('\\tableofcontents\n')
- result = ''.join(
- self.head_prefix +
- [title] +
- self.head +
- self.body_prefix +
- self.body +
- self.body_suffix)
- return result
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- self.visit_docinfo_item(node, 'address')
- raise nodes.SkipNode
-
- def depart_address(self, node):
- self.depart_docinfo_item(node)
-
- def visit_admonition(self, node, name):
- self.body.append('\\begin{center}\\begin{sffamily}\n')
- self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
- self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
- self.body.append('\\vspace{2mm}\n')
-
-
- def depart_admonition(self):
- self.body.append('}}\n') # end parbox fbox
- self.body.append('\\end{sffamily}\n\\end{center}\n');
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- #self.pdebug('%% [(visit_author) node: %s]\n' % str(node))
- self.visit_docinfo_item(node, 'author')
- raise nodes.SkipNode
-
- def depart_author(self, node):
- self.depart_docinfo_item(node)
-
- def visit_authors(self, node):
- # ignore. visit_author is called for each one
- # self.visit_docinfo_item(node, 'author')
- pass
-
- def depart_authors(self, node):
- # self.depart_docinfo_item(node)
- pass
-
- def visit_block_quote(self, node):
- # If the block quote contains a single object and that object
- # is a list, then generate a list not a block quote.
- # This lets us indent lists.
- done = 0
- if len(node.children) == 1:
- child = node.children[0]
- if isinstance(child, nodes.bullet_list) or \
- isinstance(child, nodes.enumerated_list):
- done = 1
- if not done:
- self.body.append('\\begin{quote}\n')
-
- def depart_block_quote(self, node):
- done = 0
- if len(node.children) == 1:
- child = node.children[0]
- if isinstance(child, nodes.bullet_list) or \
- isinstance(child, nodes.enumerated_list):
- done = 1
- if not done:
- self.body.append('\\end{quote}\n')
-
- def visit_bullet_list(self, node):
- self.body.append('\\begin{itemize}\n' )
-
- def depart_bullet_list(self, node):
- self.body.append('\\end{itemize}\n' )
-
- def visit_enumerated_list(self, node):
- self.body.append('\\begin{enumerate}\n' )
-
- def depart_enumerated_list(self, node):
- self.body.append('\\end{enumerate}\n')
-
- def visit_caption(self, node):
- self.body.append('\\caption{' )
-
- def depart_caption(self, node):
- self.body.append('}')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- self.visit_footnote(node)
-
- def depart_citation(self, node):
- self.depart_footnote(node)
-
- def visit_title_reference(self, node):
- # BUG title-references are what?
- pass
-
- def depart_title_reference(self, node):
- pass
-
- def visit_citation_reference(self, node):
- pass
-
- def depart_citation_reference(self, node):
- pass
-
- def visit_classifier(self, node):
- pass
-
- def depart_classifier(self, node):
- pass
-
- def visit_colspec(self, node):
- pass
-
- def depart_colspec(self, node):
- pass
-
- def visit_comment(self, node):
- """Escape end of line by a ne comment start in comment text."""
- self.body.append('\n%% %s \n' % COMMENT_RE_SUB('\n% ', node.astext()))
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'contact')
-
- def depart_contact(self, node):
- self.depart_docinfo_item(node)
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
- raise nodes.SkipNode
-
- def depart_copyright(self, node):
- self.depart_docinfo_item(node)
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- ## self.pdebug('%% [(visit_date) node: %s]\n' % str(node))
- self.visit_docinfo_item(node, 'date')
- raise nodes.SkipNode
-
- def depart_date(self, node):
- self.depart_docinfo_item(node)
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- #self.body.append('% [(visit_definition)]\n')
- pass
-
- def depart_definition(self, node):
- self.body.append('\n')
- #self.body.append('%[(depart_definition)]\n')
-
- def visit_definition_list(self, node):
- self.body.append( '\n\\begin{description}\n' )
-
- def depart_definition_list(self, node):
- self.body.append( '\\end{description}\n' )
-
- def visit_definition_list_item(self, node):
- #self.body.append('%[(visit_definition_list_item)]\n')
- pass
-
- def depart_definition_list_item(self, node):
- #self.body.append('%[(depart_definition_list_item)]\n')
- pass
-
- def visit_description(self, node):
- self.body.append( ' ' )
-
- def depart_description(self, node):
- pass
-
- def visit_docinfo(self, node):
- self.docinfo = {}
-
- def depart_docinfo(self, node):
- pass
-
- def visit_docinfo_item(self, node, name):
- self.docinfo[name] = node.astext()
-
- def depart_docinfo_item(self, node):
- pass
-
- def visit_doctest_block(self, node):
- self.body.append('\\begin{verbatim}\n' )
- self.verbatim = 1
-
- def depart_doctest_block(self, node):
- self.body.append( '\n\\end{verbatim}\n' )
- self.verbatim = 0
-
- def visit_document(self, node):
- self.body_prefix.append('\\begin{document}\n')
-
- def depart_document(self, node):
- if self.seealso:
- self.body.append('\\end{seealso}\n')
- self.body_suffix.append('\\end{document}\n')
-
- def visit_emphasis(self, node):
- self.body.append('\\emph{')
-
- def depart_emphasis(self, node):
- self.body.append('}')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- # real output is done in siblings: _argument, _body, _name
- raise nodes.SkipNode
- pass
-
- def depart_field(self, node):
- self.body.append('\n')
- ##self.body.append('%[depart_field]\n')
-
- def visit_field_argument(self, node):
- #self.pdebug('%% [(visit_field_argument) node: %s]\n' % str(node))
- #self.pdebug('% [visit_field_argument]\n')
- pass
-
- def depart_field_argument(self, node):
- #self.pdebug('% [(depart_field_argument)]\n')
- pass
-
- def visit_field_body(self, node):
- #self.pdebug('%% [(visit_field_body) node: %s]\n' % str(node))
- # BUG by attach as text we loose references.
-## if self.docinfo and self.current_field_name:
-## self.docinfo[self.current_field_name] += '%s \\\\\n' % node.astext()
-## raise nodes.SkipNode
- pass
-
- def depart_field_body(self, node):
-## self.body.append( '\n' )
- pass
-
- def visit_field_list(self, node):
-## if not self.docinfo:
-## self.body.append('\\begin{quote}\n')
-## self.body.append('\\begin{description}\n')
- pass
-
- def depart_field_list(self, node):
-## if not self.docinfo:
-## self.body.append('\\end{description}\n')
-## self.body.append('\\end{quote}\n')
- pass
-
- def visit_field_name(self, node):
-## self.pdebug('%% [(visit_field_name) content: %s]\n' % node.astext())
-## self.pdebug('%% [(visit_field_name) node: %s\n' % str(node))
-## self.docinfo[node.astext()] = ''
-## self.current_field_name = node.astext()
- pass
-
- def depart_field_name(self, node):
- pass
-
- def visit_figure(self, node):
- self.body.append( '\\begin{figure}\n' )
-
- def depart_figure(self, node):
- self.body.append( '\\end{figure}\n' )
-
- def visit_footer(self, node):
- self.context.append(len(self.body))
-
- def depart_footer(self, node):
- start = self.context.pop()
- footer = (['\n\\begin{center}\small\n']
- + self.body[start:] + ['\n\\end{center}\n'])
- self.body_suffix[:0] = footer
- del self.body[start:]
-
- def visit_footnote(self, node):
- notename = node['id']
- self.body.append('\\begin{figure}[b]')
- self.body.append('\\hypertarget{%s}' % notename)
-
- def depart_footnote(self, node):
- self.body.append('\\end{figure}\n')
-
- def visit_footnote_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = node['refid']
- elif node.has_key('refname'):
- href = self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
- self.context.append('}')
- else: # shouldn't happen
- raise AssertionError('Illegal footnote reference format.')
- self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
-
- def depart_footnote_reference(self, node):
- self.body.append('}%s' % self.context.pop())
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- self.body.append('%% [(visit_header) node: %s\n' % str(node))
- self.context.append(len(self.body))
-
- def depart_header(self, node):
- start = self.context.pop()
- self.body_prefix.append('\n\\verb|begin_header|\n')
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('\n\\verb|end_header|\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- atts = node.attributes.copy()
- href = atts['uri']
- ##self.body.append('\\begin{center}\n')
- self.body.append('\n\\includegraphics{%s}\n' % href)
- ##self.body.append('\\end{center}\n')
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_interpreted(self, node):
- # @@@ Incomplete, pending a proper implementation on the
- # Parser/Reader end.
- self.visit_literal(node)
-
- def depart_interpreted(self, node):
- self.depart_literal(node)
-
- def visit_label(self, node):
- # footnote/citation label
- self.body.append('[')
-
- def depart_label(self, node):
- self.body.append(']')
-
- def visit_legend(self, node):
- self.body.append('{\\small ')
-
- def depart_legend(self, node):
- self.body.append('}')
-
- def visit_line_block(self, node):
- """line-block:
- * whitespace (including linebreaks) is significant
- * inline markup is supported.
- * serif typeface
- """
- self.body.append('\\begin{flushleft}\n')
- self.insert_none_breaking_blanks = 1
- self.line_block_without_mbox = 1
- if self.line_block_without_mbox:
- self.insert_newline = 1
- else:
- self.mbox_newline = 1
- self.body.append('\\mbox{')
-
- def depart_line_block(self, node):
- if self.line_block_without_mbox:
- self.insert_newline = 0
- else:
- self.body.append('}')
- self.mbox_newline = 0
- self.insert_none_breaking_blanks = 0
- self.body.append('\n\\end{flushleft}\n')
-
- def visit_list_item(self, node):
- self.body.append('\\item ')
-
- def depart_list_item(self, node):
- self.body.append('\n')
-
- def visit_literal(self, node):
- ## self.literal = 1
- content = node.astext().strip()
- if re.search('[ \t\n]', content):
- self.body.append('\\samp{%s}' % content)
- else:
- self.body.append('\\code{%s}' % content)
- raise nodes.SkipNode
-
- def depart_literal(self, node):
- pass
-
- def visit_literal_block(self, node):
- self.verbatim = 1
- self.body.append('\n\\begin{verbatim}\n')
-
- def depart_literal_block(self, node):
- self.body.append('\n\\end{verbatim}\n')
- self.verbatim = 0
-
- def visit_meta(self, node):
- self.body.append('[visit_meta]\n')
-
- def depart_meta(self, node):
- self.body.append('[depart_meta]\n')
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
-
- def visit_option(self, node):
- if self.context[-1]:
- # this is not the first option
- self.body.append(', ')
-
- def depart_option(self, node):
- # flag tha the first option is done.
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- """The delimiter betweeen an option and its argument."""
- self.body.append(node.get('delimiter', ' '))
-
- def depart_option_argument(self, node):
- pass
-
- def visit_option_group(self, node):
- self.body.append('\\item [')
- self.context.append(0)
-
- def depart_option_group(self, node):
- self.context.pop() # the flag
- self.body.append('] ')
-
- def visit_option_list(self, node):
- self.body.append('\\begin{description}\n')
-
- def depart_option_list(self, node):
- self.body.append('\\end{description}\n')
-
- def visit_option_list_item(self, node):
- pass
-
- def depart_option_list_item(self, node):
- pass
-
- def re_repl_long(self, mo):
- result = '\\longprogramopt{%s}' % mo.group(0)[2:]
- return result
-
- def visit_option_string(self, node):
- content = node.astext()
- content = re.sub(PROGRAMOPT_RE, self.re_repl_long, content)
- self.body.append(content)
- raise nodes.SkipNode
-
- def depart_option_string(self, node):
- pass
-
-
- def visit_organization(self, node):
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- self.depart_docinfo_item(node)
-
- def visit_paragraph(self, node):
- if not self.topic_class == 'contents':
- self.body.append('\n')
-
- def depart_paragraph(self, node):
- self.body.append('\n')
-
- def visit_problematic(self, node):
- self.body.append('{\\color{red}\\bfseries{}')
-
- def depart_problematic(self, node):
- self.body.append('}')
-
- def visit_raw(self, node):
- if node.has_key('format') and node['format'].lower() == 'latex':
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def cleanHref(self, href):
- href = href.replace('~', '\\~{}')
- href = href.replace('#', '\\#{}')
- return href
-
-## def visit_reference(self, node):
-## self.pdebug('%% [(visit_reference) node: %s]\n' % str(node))
-## if node.has_key('refuri'):
-## self.href = node['refuri']
-## elif node.has_key('refid'):
-## self.href = '#' + node['refid']
-## elif node.has_key('refname'):
-## self.href = '#' + self.document.nameids[node['refname']]
-## self.href = self.cleanHref(self.href)
-## if self.seealso:
-## self.body.append('\\seeurl{%s}{' % self.href)
-## else:
-## self.body.append('\\ulink{')
-##
-## def depart_reference(self, node):
-## if self.seealso:
-## self.body.append('}')
-## else:
-## self.body.append('}{%s}' % self.href)
-
- def visit_reference(self, node):
- #self.pdebug('%% [(visit_reference) node: %s]\n' % str(node))
- if self.seealso:
- if node.has_key('refuri'):
- href = node['refuri']
- href = self.cleanHref(href)
- self.body.append('\\seeurl{%s}{' % href)
- else:
- if node.has_key('refuri'):
- # External hyperlink
- self.body.append('\\ulink{')
- elif node.has_key('refid'):
- # Internal hyperlink
- href = node['refid']
- href = self.cleanHref(href)
- self.body.append('\\ref{%s}' % href)
- raise nodes.SkipNode
-
- def depart_reference(self, node):
- if self.seealso:
- self.body.append('}')
- else:
- if node.has_key('refuri'):
- # External hyperlink
- href = node['refuri']
- href = self.cleanHref(href)
- self.body.append('}{%s}' % href)
- elif node.has_key('refid'):
- # Internal hyperlink
- pass
-
- def visit_revision(self, node):
- ## self.pdebug('%% [(visit_revision) node: "%s"]\n' % str(node))
- self.visit_docinfo_item(node, 'revision')
- raise nodes.SkipNode
-
- def depart_revision(self, node):
- self.depart_docinfo_item(node)
-
- def visit_section(self, node):
- # If the document title came before the first (outer-most)
- # section, then the first section is really the first section.
- # If the document title is *in* the first section, then
- # the first section is a container that has the document title.
- # So, if the document title came before the first section,
- # then alwasy increment the section_level.
- # But, if the document title is *in* the first section, then
- # increment the section_level only on the *second* and
- # subsequent sections.
- ## self.pdebug('%% [(visit_section) node: %s]\n' % repr(node))
- if self.title_before_section or self.seen_section:
- self.section_level += 1
- self.seen_section = 1
-
- def depart_section(self, node):
- ## self.pdebug('%% [(depart_section) node: %s]\n' % repr(node))
- if self.title_before_section:
- self.section_level -= 1
-
- def visit_sidebar(self, node):
- # BUG: this is just a hack to make sidebars render something
- self.body.append('\\begin{center}\\begin{sffamily}\n')
- self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
-
- def depart_sidebar(self, node):
- self.body.append('}}}\n') # end parbox colorbox fbox
- self.body.append('\\end{sffamily}\n\\end{center}\n');
-
-
- attribution_formats = {'dash': ('---', ''),
- 'parentheses': ('(', ')'),
- 'parens': ('(', ')'),
- 'none': ('', '')}
-
- def visit_attribution(self, node):
- prefix, suffix = self.attribution_formats[self.settings.attribution]
- self.body.append('\n\\begin{flushright}\n')
- self.body.append(prefix)
- self.context.append(suffix)
-
- def depart_attribution(self, node):
- self.body.append(self.context.pop() + '\n')
- self.body.append('\\end{flushright}\n')
-
- def visit_status(self, node):
- self.visit_docinfo_item(node, 'status')
-
- def depart_status(self, node):
- self.depart_docinfo_item(node)
-
- def visit_strong(self, node):
- self.body.append('\\strong{')
-
- def depart_strong(self, node):
- self.body.append('}')
-
- def visit_substitution_definition(self, node):
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- self.title = self.title + \
- '\\\\\n\\large{%s}\n' % self.encode(node.astext())
- raise nodes.SkipNode
-
- def depart_subtitle(self, node):
- pass
-
- def visit_system_message(self, node):
- if node['level'] < self.document.reporter['writer'].report_level:
- raise nodes.SkipNode
-
-
- def depart_system_message(self, node):
- self.body.append('\n')
-
- def visit_target(self, node):
- #self.pdebug('%% [(visit_target) node: %s]\n' % str(node))
- pass
-## if not (node.has_key('refuri') or node.has_key('refid')
-## or node.has_key('refname')):
-## self.body.append('\\hypertarget{%s}{' % node['name'])
-## self.context.append('}')
-## else:
-## self.context.append('')
-
- def depart_target(self, node):
- pass
-## self.body.append(self.context.pop())
-
- def visit_table(self, node):
- self.tableSpec = TableSpec()
-
- def depart_table(self, node):
- self.tablSpec = None
-
- def visit_tgroup(self, node):
- columnCount = int(node.get('cols', 0))
- self.tableSpec.setColumnCount(columnCount)
- if columnCount == 2:
- self.body.append('\\begin{tableii}{l|l}{textrm}')
- elif columnCount == 3:
- self.body.append('\\begin{tableiii}{l|l|l}{textrm}')
- elif columnCount == 4:
- self.body.append('\\begin{tableiv}{l|l|l|l}{textrm}')
- elif columnCount == 5:
- self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}')
-
- def depart_tgroup(self, node):
- if self.tableSpec.getColumnCount() == 2:
- self.body.append('\n\\end{tableii}\n')
- elif self.tableSpec.getColumnCount() == 3:
- self.body.append('\n\\end{tableiii}\n')
- elif self.tableSpec.getColumnCount() == 4:
- self.body.append('\n\\end{tableiv}\n')
- elif self.tableSpec.getColumnCount() == 5:
- self.body.append('\n\\end{tablev}\n')
-
- def visit_thead(self, node):
- self.tableSpec.setMode(TABLE_MODE_HEAD)
-
- def depart_thead(self, node):
- self.tableSpec.setMode(TABLE_MODE_NONE)
-
- def visit_tbody(self, node):
- self.tableSpec.setMode(TABLE_MODE_BODY)
-
- def depart_tbody(self, node):
- self.tableSpec.setMode(TABLE_MODE_NONE)
-
- def visit_row(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- pass
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- if self.tableSpec.getColumnCount() == 2:
- self.body.append('\n\\lineii')
- elif self.tableSpec.getColumnCount() == 3:
- self.body.append('\n\\lineiii')
- elif self.tableSpec.getColumnCount() == 4:
- self.body.append('\n\\lineiv')
- elif self.tableSpec.getColumnCount() == 5:
- self.body.append('\n\\linev')
-
- def depart_row(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- pass
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- pass
-
- def visit_entry(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- #self.body.append('%% [(visit_entry) text: +%s+]' % node.astext())
- self.body.append('{%s}' % node.astext().strip(' '))
- raise nodes.SkipNode
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- #self.body.append('%% [(visit_entry) text: +%s+]' % node.astext())
- self.body.append('{%s}' % node.astext().strip(' '))
- raise nodes.SkipNode
-
- def depart_entry(self, node):
- pass
-## if self.tableSpec.getMode() == TABLE_MODE_HEAD:
-## self.body.append('}')
-## elif self.tableSpec.getMode() == TABLE_MODE_BODY:
-## self.body.append('}')
-
- def visit_term(self, node):
- self.body.append('\\item[')
-
- def depart_term(self, node):
- # definition list term.
- self.body.append(':]\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
-## def string_to_label(self, text):
-## text = text.replace(' ', '-')
-## text = text.replace('_', '-')
-## return text
-
- def visit_title(self, node):
- #self.pdebug('%% [(visit_title) section_level: %d node.astext: "%s"]\n' % \
- # (self.section_level, node.astext()))
- #self.pdebug('%% [(visit_title) section_level: %d node.astext.encode: "%s"]\n' % \
- # (self.section_level, self.encode(node.astext())))
- if self.section_level == 0:
- self.title_before_section = 1
- if self.seealso:
- self.body.append('\\end{seealso}\n')
- self.seealso = 0
- if node.astext().lower() == 'see also':
- self.body.append('\\begin{seealso}\n')
- self.seealso = 1
- raise nodes.SkipNode
- else:
- if self.section_level == 0:
- # It's the document title before any section.
- self.title = self.encode(node.astext())
- else:
- # It's a title for a section in-side the document.
- self.body.append('\n\n')
- self.body.append('%' + '_' * 75)
- self.body.append('\n\n')
- s1 = self.encode(node.astext())
- # Remove the non-breaking space character.
- # Not needed. Using output-encoding=latin-1 fixes this.
- #s1 = s1.replace(u'\xa0', ' ')
- s2 = nodes.make_id(node.astext())
-
- #ipshell('(visit_title) Entering ipshell.\nHit Ctrl-D to exit ipshell.')
-
- if (self.section_level == 1):
- self.body.append('\\section{%s\\label{%s}}\n' % (s1, s2))
- #self.body.append(
- # '\\section{\htmladdnormallink[%s]{%s}{}}\n' % \
- # (s2, s1))
- elif (self.section_level == 2):
- self.body.append('\\subsection{%s\\label{%s}}\n' % (s1, s2))
- elif (self.section_level == 3):
- self.body.append('\\subsubsection{%s\\label{%s}}\n' % (s1, s2))
- elif (self.section_level == 4):
- self.body.append('\\paragraph{%s\\label{%s}}\n' % (s1, s2))
- else:
- self.body.append('\\subparagraph{%s\\label{%s}}\n' % (s1, s2))
- raise nodes.SkipNode
-
- def depart_title(self, node):
- pass
-
- def visit_topic(self, node):
- topic_class = node.get('class')
- if topic_class == 'abstract':
- self.docinfo['abstract'] = node.astext()[9:]
- raise nodes.SkipNode
- else:
- raise nodes.SkipNode
-
- def depart_topic(self, node):
- pass
-
- def visit_rubric(self, node):
- self.body.append('% [(visit_rubric)]\n')
-
- def depart_rubric(self, node):
- self.body.append('% [(depart_rubric)]\n')
-
- def visit_transition(self, node):
- self.body.append('\n\n')
- self.body.append('%' + '_' * 75)
- self.body.append('\n\\hrule{}\n\n')
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- self.visit_docinfo_item(node, 'version')
-
- def depart_version(self, node):
- self.depart_docinfo_item(node)
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
diff --git a/sandbox/dkuhlman/docutils/test/DocutilsTestSupport.py b/sandbox/dkuhlman/docutils/test/DocutilsTestSupport.py
deleted file mode 100644
index e40300984..000000000
--- a/sandbox/dkuhlman/docutils/test/DocutilsTestSupport.py
+++ /dev/null
@@ -1,698 +0,0 @@
-# Authors: David Goodger; Garth Kidd
-# Contact: goodger@users.sourceforge.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-Exports the following:
-
-:Modules:
- - `statemachine` is 'docutils.statemachine'
- - `nodes` is 'docutils.nodes'
- - `urischemes` is 'docutils.urischemes'
- - `utils` is 'docutils.utils'
- - `transforms` is 'docutils.transforms'
- - `states` is 'docutils.parsers.rst.states'
- - `tableparser` is 'docutils.parsers.rst.tableparser'
-
-:Classes:
- - `CustomTestSuite`
- - `CustomTestCase`
- - `TransformTestSuite`
- - `TransformTestCase`
- - `ParserTestSuite`
- - `ParserTestCase`
- - `PEPParserTestSuite`
- - `PEPParserTestCase`
- - `GridTableParserTestSuite`
- - `GridTableParserTestCase`
- - `SimpleTableParserTestSuite`
- - `SimpleTableParserTestCase`
- - 'LatexPublishTestSuite'
- - 'LatexPublishTestCase'
- - 'PythonLatexPublishTestSuite'
- - 'PythonLatexPublishTestCase'
- - `DevNull` (output sink)
-"""
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import unittest
-import difflib
-import inspect
-from pprint import pformat
-from types import UnicodeType
-import package_unittest
-import docutils
-import docutils.core
-from docutils import frontend, nodes, statemachine, urischemes, utils
-from docutils.transforms import universal
-from docutils.parsers import rst
-from docutils.parsers.rst import states, tableparser, directives, languages
-from docutils.readers import standalone, pep, python
-from docutils.statemachine import StringList, string2lines
-
-try:
- from docutils.readers.python import moduleparser
-except:
- moduleparser = None
-
-try:
- import mypdb as pdb
-except:
- import pdb
-
-
-# Hack to make repr(StringList) look like repr(list):
-StringList.__repr__ = StringList.__str__
-
-
-class DevNull:
-
- """Output sink."""
-
- def write(self, string):
- pass
-
-
-class CustomTestSuite(unittest.TestSuite):
-
- """
- A collection of custom TestCases.
-
- """
-
- id = ''
- """Identifier for the TestSuite. Prepended to the
- TestCase identifiers to make identification easier."""
-
- next_test_case_id = 0
- """The next identifier to use for non-identified test cases."""
-
- def __init__(self, tests=(), id=None):
- """
- Initialize the CustomTestSuite.
-
- Arguments:
-
- id -- identifier for the suite, prepended to test cases.
- """
- unittest.TestSuite.__init__(self, tests)
- if id is None:
- mypath = os.path.abspath(
- sys.modules[CustomTestSuite.__module__].__file__)
- outerframes = inspect.getouterframes(inspect.currentframe())
- for outerframe in outerframes[1:]:
- if outerframe[3] != '__init__':
- callerpath = outerframe[1]
- if callerpath is None:
- # It happens sometimes. Why is a mystery.
- callerpath = os.getcwd()
- callerpath = os.path.abspath(callerpath)
- break
- mydir, myname = os.path.split(mypath)
- if not mydir:
- mydir = os.curdir
- if callerpath.startswith(mydir):
- self.id = callerpath[len(mydir) + 1:] # caller's module
- else:
- self.id = callerpath
- else:
- self.id = id
-
- def addTestCase(self, test_case_class, method_name, input, expected,
- id=None, run_in_debugger=0, short_description=None,
- **kwargs):
- """
- Create a custom TestCase in the CustomTestSuite.
- Also return it, just in case.
-
- Arguments:
-
- test_case_class --
- method_name --
- input -- input to the parser.
- expected -- expected output from the parser.
- id -- unique test identifier, used by the test framework.
- run_in_debugger -- if true, run this test under the pdb debugger.
- short_description -- override to default test description.
- """
- if id is None: # generate id if required
- id = self.next_test_case_id
- self.next_test_case_id += 1
- # test identifier will become suiteid.testid
- tcid = '%s: %s' % (self.id, id)
- # generate and add test case
- tc = test_case_class(method_name, input, expected, tcid,
- run_in_debugger=run_in_debugger,
- short_description=short_description,
- **kwargs)
- self.addTest(tc)
- return tc
-
-
-class CustomTestCase(unittest.TestCase):
-
- compare = difflib.Differ().compare
- """Comparison method shared by all subclasses."""
-
- def __init__(self, method_name, input, expected, id,
- run_in_debugger=0, short_description=None):
- """
- Initialise the CustomTestCase.
-
- Arguments:
-
- method_name -- name of test method to run.
- input -- input to the parser.
- expected -- expected output from the parser.
- id -- unique test identifier, used by the test framework.
- run_in_debugger -- if true, run this test under the pdb debugger.
- short_description -- override to default test description.
- """
- self.id = id
- self.input = input
- self.expected = expected
- self.run_in_debugger = run_in_debugger
- # Ring your mother.
- unittest.TestCase.__init__(self, method_name)
-
- def __str__(self):
- """
- Return string conversion. Overridden to give test id, in addition to
- method name.
- """
- return '%s; %s' % (self.id, unittest.TestCase.__str__(self))
-
- def __repr__(self):
- return "<%s %s>" % (self.id, unittest.TestCase.__repr__(self))
-
- def compare_output(self, input, output, expected):
- """`input`, `output`, and `expected` should all be strings."""
- if type(input) == UnicodeType:
- input = input.encode('raw_unicode_escape')
- if type(output) == UnicodeType:
- output = output.encode('raw_unicode_escape')
- if type(expected) == UnicodeType:
- expected = expected.encode('raw_unicode_escape')
- try:
- self.assertEquals('\n' + output, '\n' + expected)
- except AssertionError:
- print >>sys.stderr, '\n%s\ninput:' % (self,)
- print >>sys.stderr, input
- print >>sys.stderr, '-: expected\n+: output'
- print >>sys.stderr, ''.join(self.compare(expected.splitlines(1),
- output.splitlines(1)))
- raise
-
- def skip_test(self):
- print >>sys.stderr, '%s: Test skipped' % self
-
-
-class TransformTestSuite(CustomTestSuite):
-
- """
- A collection of TransformTestCases.
-
- A TransformTestSuite instance manufactures TransformTestCases,
- keeps track of them, and provides a shared test fixture (a-la
- setUp and tearDown).
- """
-
- def __init__(self, parser):
- self.parser = parser
- """Parser shared by all test cases."""
-
- CustomTestSuite.__init__(self)
-
- def generateTests(self, dict, dictname='totest',
- testmethod='test_transforms'):
- """
- Stock the suite with test cases generated from a test data dictionary.
-
- Each dictionary key (test type's name) maps to a list of transform
- classes and list of tests. Each test is a list: input, expected
- output, optional modifier. The optional third entry, a behavior
- modifier, can be 0 (temporarily disable this test) or 1 (run this test
- under the pdb debugger). Tests should be self-documenting and not
- require external comments.
- """
- for name, (transforms, cases) in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case)==3:
- if case[2]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(
- TransformTestCase, testmethod,
- transforms=transforms, parser=self.parser,
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-class TransformTestCase(CustomTestCase):
-
- """
- Output checker for the transform.
-
- Should probably be called TransformOutputChecker, but I can deal with
- that later when/if someone comes up with a category of transform test
- cases that have nothing to do with the input and output of the transform.
- """
-
- option_parser = frontend.OptionParser(components=(rst.Parser,))
- settings = option_parser.get_default_values()
- settings.report_level = 1
- settings.halt_level = 5
- settings.debug = package_unittest.debug
- settings.warning_stream = DevNull()
-
- def __init__(self, *args, **kwargs):
- self.transforms = kwargs['transforms']
- """List of transforms to perform for this test case."""
-
- self.parser = kwargs['parser']
- """Input parser for this test case."""
-
- del kwargs['transforms'], kwargs['parser'] # only wanted here
- CustomTestCase.__init__(self, *args, **kwargs)
-
- def supports(self, format):
- return 1
-
- def test_transforms(self):
- if self.run_in_debugger:
- pdb.set_trace()
- document = utils.new_document('test data', self.settings)
- self.parser.parse(self.input, document)
- # Don't do a ``populate_from_components()`` because that would
- # enable the Transformer's default transforms.
- document.transformer.add_transforms(self.transforms)
- document.transformer.add_transform(universal.TestMessages)
- document.transformer.components['writer'] = self
- document.transformer.apply_transforms()
- output = document.pformat()
- self.compare_output(self.input, output, self.expected)
-
- def test_transforms_verbosely(self):
- if self.run_in_debugger:
- pdb.set_trace()
- print '\n', self.id
- print '-' * 70
- print self.input
- document = utils.new_document('test data', self.settings)
- self.parser.parse(self.input, document)
- print '-' * 70
- print document.pformat()
- for transformClass in self.transforms:
- transformClass(document).apply()
- output = document.pformat()
- print '-' * 70
- print output
- self.compare_output(self.input, output, self.expected)
-
-
-class ParserTestCase(CustomTestCase):
-
- """
- Output checker for the parser.
-
- Should probably be called ParserOutputChecker, but I can deal with
- that later when/if someone comes up with a category of parser test
- cases that have nothing to do with the input and output of the parser.
- """
-
- parser = rst.Parser()
- """Parser shared by all ParserTestCases."""
-
- option_parser = frontend.OptionParser(components=(parser,))
- settings = option_parser.get_default_values()
- settings.report_level = 5
- settings.halt_level = 5
- settings.debug = package_unittest.debug
-
- def test_parser(self):
- if self.run_in_debugger:
- pdb.set_trace()
- document = utils.new_document('test data', self.settings)
- self.parser.parse(self.input, document)
- output = document.pformat()
- self.compare_output(self.input, output, self.expected)
-
-
-class ParserTestSuite(CustomTestSuite):
-
- """
- A collection of ParserTestCases.
-
- A ParserTestSuite instance manufactures ParserTestCases,
- keeps track of them, and provides a shared test fixture (a-la
- setUp and tearDown).
- """
-
- test_case_class = ParserTestCase
-
- def generateTests(self, dict, dictname='totest'):
- """
- Stock the suite with test cases generated from a test data dictionary.
-
- Each dictionary key (test type name) maps to a list of tests. Each
- test is a list: input, expected output, optional modifier. The
- optional third entry, a behavior modifier, can be 0 (temporarily
- disable this test) or 1 (run this test under the pdb debugger). Tests
- should be self-documenting and not require external comments.
- """
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case)==3:
- if case[2]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(
- self.test_case_class, 'test_parser',
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-class PEPParserTestCase(ParserTestCase):
-
- """PEP-specific parser test case."""
-
- parser = rst.Parser(rfc2822=1, inliner=pep.Inliner())
- """Parser shared by all PEPParserTestCases."""
-
- option_parser = frontend.OptionParser(components=(parser, pep.Reader))
- settings = option_parser.get_default_values()
- settings.report_level = 5
- settings.halt_level = 5
- settings.debug = package_unittest.debug
-
-
-class PEPParserTestSuite(ParserTestSuite):
-
- """A collection of PEPParserTestCases."""
-
- test_case_class = PEPParserTestCase
-
-
-class GridTableParserTestCase(CustomTestCase):
-
- parser = tableparser.GridTableParser()
-
- def test_parse_table(self):
- self.parser.setup(StringList(string2lines(self.input), 'test data'))
- try:
- self.parser.find_head_body_sep()
- self.parser.parse_table()
- output = self.parser.cells
- except Exception, details:
- output = '%s: %s' % (details.__class__.__name__, details)
- self.compare_output(self.input, pformat(output) + '\n',
- pformat(self.expected) + '\n')
-
- def test_parse(self):
- try:
- output = self.parser.parse(StringList(string2lines(self.input),
- 'test data'))
- except Exception, details:
- output = '%s: %s' % (details.__class__.__name__, details)
- self.compare_output(self.input, pformat(output) + '\n',
- pformat(self.expected) + '\n')
-
-
-class GridTableParserTestSuite(CustomTestSuite):
-
- """
- A collection of GridTableParserTestCases.
-
- A GridTableParserTestSuite instance manufactures GridTableParserTestCases,
- keeps track of them, and provides a shared test fixture (a-la setUp and
- tearDown).
- """
-
- test_case_class = GridTableParserTestCase
-
- def generateTests(self, dict, dictname='totest'):
- """
- Stock the suite with test cases generated from a test data dictionary.
-
- Each dictionary key (test type name) maps to a list of tests. Each
- test is a list: an input table, expected output from parse_table(),
- expected output from parse(), optional modifier. The optional fourth
- entry, a behavior modifier, can be 0 (temporarily disable this test)
- or 1 (run this test under the pdb debugger). Tests should be
- self-documenting and not require external comments.
- """
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case) == 4:
- if case[-1]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(self.test_case_class, 'test_parse_table',
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
- self.addTestCase(self.test_case_class, 'test_parse',
- input=case[0], expected=case[2],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-class SimpleTableParserTestCase(GridTableParserTestCase):
-
- parser = tableparser.SimpleTableParser()
-
-
-class SimpleTableParserTestSuite(CustomTestSuite):
-
- """
- A collection of SimpleTableParserTestCases.
- """
-
- test_case_class = SimpleTableParserTestCase
-
- def generateTests(self, dict, dictname='totest'):
- """
- Stock the suite with test cases generated from a test data dictionary.
-
- Each dictionary key (test type name) maps to a list of tests. Each
- test is a list: an input table, expected output from parse(), optional
- modifier. The optional third entry, a behavior modifier, can be 0
- (temporarily disable this test) or 1 (run this test under the pdb
- debugger). Tests should be self-documenting and not require external
- comments.
- """
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case) == 3:
- if case[-1]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(self.test_case_class, 'test_parse',
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-class PythonModuleParserTestCase(CustomTestCase):
-
- def test_parser(self):
- if self.run_in_debugger:
- pdb.set_trace()
- module = moduleparser.parse_module(self.input, 'test data')
- output = str(module)
- self.compare_output(self.input, output, self.expected)
-
- def test_token_parser_rhs(self):
- if self.run_in_debugger:
- pdb.set_trace()
- tr = moduleparser.TokenParser(self.input)
- output = tr.rhs(1)
- self.compare_output(self.input, output, self.expected)
-
-
-class PythonModuleParserTestSuite(CustomTestSuite):
-
- """
- A collection of PythonModuleParserTestCase.
- """
-
- if moduleparser is None:
- PythonModuleParserTestCase.test_parser = CustomTestCase.skip_test
- PythonModuleParserTestCase.test_token_parser_rhs = \
- CustomTestCase.skip_test
-
- def generateTests(self, dict, dictname='totest',
- testmethod='test_parser'):
- """
- Stock the suite with test cases generated from a test data dictionary.
-
- Each dictionary key (test type's name) maps to a list of tests. Each
- test is a list: input, expected output, optional modifier. The
- optional third entry, a behavior modifier, can be 0 (temporarily
- disable this test) or 1 (run this test under the pdb debugger). Tests
- should be self-documenting and not require external comments.
- """
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case)==3:
- if case[2]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(
- PythonModuleParserTestCase, testmethod,
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-# @@@ These should be generalized to WriterPublishTestCase/Suite or
-# just PublishTestCase/Suite, as per TransformTestCase/Suite.
-class LatexPublishTestCase(CustomTestCase, docutils.SettingsSpec):
-
- """
- Test case for publish.
- """
-
- settings_default_overrides = {'_disable_config': 1}
-
- def test_publish(self):
- if self.run_in_debugger:
- pdb.set_trace()
- output = docutils.core.publish_string(
- source=self.input,
- reader_name='standalone',
- parser_name='restructuredtext',
- writer_name='latex',
- settings_spec=self)
- self.compare_output(self.input, output, self.expected)
-
-
-class LatexPublishTestSuite(CustomTestSuite):
-
- def __init__(self):
- CustomTestSuite.__init__(self)
-
- def generateTests(self, dict, dictname='totest'):
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case)==3:
- if case[2]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(
- LatexPublishTestCase, 'test_publish',
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-class PythonLatexPublishTestCase(CustomTestCase, docutils.SettingsSpec):
-
- """
- Test case for publish.
- """
-
- settings_default_overrides = {'_disable_config': 1}
-
- def test_publish(self):
- if self.run_in_debugger:
- pdb.set_trace()
- output = docutils.core.publish_string(
- source=self.input,
- reader_name='standalone',
- parser_name='restructuredtext',
- writer_name='python_latex',
- settings_spec=self)
- self.compare_output(self.input, output, self.expected)
-
- def compare_output(self, input, output, expected):
- """`input`, `output`, and `expected` should all be strings."""
- if type(input) == UnicodeType:
- input = input.encode('raw_unicode_escape')
- if type(output) == UnicodeType:
- output = output.encode('raw_unicode_escape')
- if type(expected) == UnicodeType:
- expected = expected.encode('raw_unicode_escape')
- # Remove "generated on" lines.
- output = self.remove_lines(output, ('generated on --',))
- expected = self.remove_lines(expected, ('generated on --',))
- try:
- self.assertEquals('\n' + output, '\n' + expected)
- except AssertionError:
- print >>sys.stderr, '\n%s\ninput:' % (self,)
- print >>sys.stderr, input
- print >>sys.stderr, '-: expected\n+: output'
- print >>sys.stderr, ''.join(self.compare(expected.splitlines(1),
- output.splitlines(1)))
- raise
-
- def remove_lines(self, inStr, targetList):
- inLines = inStr.splitlines()
- outLines = []
- for line in inLines:
- remove = False
- for target in targetList:
- if line.find(target) > -1:
- remove = True
- break
- if not remove:
- outLines.append(line)
- outStr = '\n'.join(outLines)
- return outStr
-
-class PythonLatexPublishTestSuite(CustomTestSuite):
-
- def __init__(self):
- CustomTestSuite.__init__(self)
-
- def generateTests(self, dict, dictname='totest'):
- for name, cases in dict.items():
- for casenum in range(len(cases)):
- case = cases[casenum]
- run_in_debugger = 0
- if len(case)==3:
- if case[2]:
- run_in_debugger = 1
- else:
- continue
- self.addTestCase(
- PythonLatexPublishTestCase, 'test_publish',
- input=case[0], expected=case[1],
- id='%s[%r][%s]' % (dictname, name, casenum),
- run_in_debugger=run_in_debugger)
-
-
-def exception_data(code):
- """
- Execute `code` and return the resulting exception, the exception arguments,
- and the formatted exception string.
- """
- try:
- exec(code)
- except Exception, detail:
- return (detail, detail.args,
- '%s: %s' % (detail.__class__.__name__, detail))
diff --git a/sandbox/dkuhlman/docutils/test/README.test_python_latex b/sandbox/dkuhlman/docutils/test/README.test_python_latex
deleted file mode 100644
index a8321744e..000000000
--- a/sandbox/dkuhlman/docutils/test/README.test_python_latex
+++ /dev/null
@@ -1,36 +0,0 @@
-
-=============================================
-Notes on Unit Test Additions for Python LaTeX
-=============================================
-
-
-DocutilsTestSupport.py
-======================
-
-Added two classes (PythonLatexPublishTestCase and
-PythonLatexPublishTestSuite) that drive the tests. These classes
-were modelled on classes LatexPublishTestCase and
-LatexPublishTestSuite respectively.
-
-Note that class PythonLatexPublishTestCase overrides method
-compare_output and adds method remove_lines. These methods remove
-the "generated on" lines from both input and output because the
-date will always differ.
-
-See file DocutilsTestSupport.patch
-
-
-test_writers/test_python_latex.py
-=================================
-
-Contains the tests.
-
-
-test_writers/Data/*
-===================
-
-Contains reST source documents (*.txt) and generated LaTeX
-documents (*.tex) that were used in the input and output strings
-in test_python_latex.py.
-
-
diff --git a/sandbox/dkuhlman/docutils/test/test_writers/test_python_latex.py b/sandbox/dkuhlman/docutils/test/test_writers/test_python_latex.py
deleted file mode 100644
index 7aa5528ce..000000000
--- a/sandbox/dkuhlman/docutils/test/test_writers/test_python_latex.py
+++ /dev/null
@@ -1,490 +0,0 @@
-#! /usr/bin/env python
-
-# Author: Dave Kuhlman
-# Contact: dkuhlman@rexx.com
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-Tests for python_latex writer.
-"""
-
-from __init__ import DocutilsTestSupport
-
-def suite():
- s = DocutilsTestSupport.PythonLatexPublishTestSuite()
- s.generateTests(totest)
- return s
-
-
-rest_head = """\
-
-==========================
-Unit Test for Python LaTeX
-==========================
-
-
-:author: Dave Kuhlman
-:address: dkuhlman@rexx.com \\\\
- http://www.rexx.com/~dkuhlman
-
-:revision: 1.0a
-:date: Aug. 4, 2003
-
-:copyright: Copyright (c) 2003 Dave Kuhlman.
- [an Open Source copyright]
-
-:abstract: This document contains input for unit tests for the
- Python LaTeX writer for Docutils.
-
-.. sectnum:: :depth: 2
-
-.. contents::
-
-
-"""
-
-latex_head = r"""\documentclass{howto}
-
-% generator -- Docutils: http://docutils.sourceforge.net/
-% writer -- documenting_python
-% generated on -- Wed Aug 13 16:08:04 2003
-
-\usepackage{html}
-\title{Unit Test for Python LaTeX}
-\release{1.0a}
-\date{Aug. 4, 2003}
-\author{Dave Kuhlman}
-\authoraddress{dkuhlman@rexx.com \
-http://www.rexx.com/\~{}dkuhlman}
-\begin{document}
-\maketitle
-\ifhtml
-\chapter*{Front Matter\label{front}}
-\fi
-
-Copyright (c) 2003 Dave Kuhlman.
-[an Open Source copyright]
-\begin{abstract}
-\noindent
-
-This document contains input for unit tests for the
-Python LaTeX writer for Docutils.
-\end{abstract}
-\tableofcontents
-
-"""
-
-totest = {}
-
-totest['section_headers'] = [
-# input
-[rest_head + r"""
-Section #1
-==========
-
-Content for section #1.
-
-Subsection #1-1
----------------
-
-Content for sub-section #1-1.
-
-Subsection #1-2
----------------
-
-Content for sub-section #1-2.
-
-Section #2
-==========
-
-Content for section #2.
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Section {\#}1\label{section-1}}
-
-Content for section {\#}1.
-
-
-%___________________________________________________________________________
-
-\subsection{1.1   Subsection {\#}1-1\label{subsection-1-1}}
-
-Content for sub-section {\#}1-1.
-
-
-%___________________________________________________________________________
-
-\subsection{1.2   Subsection {\#}1-2\label{subsection-1-2}}
-
-Content for sub-section {\#}1-2.
-
-
-%___________________________________________________________________________
-
-\section{2   Section {\#}2\label{section-2}}
-
-Content for section {\#}2.
-
-\end{document}
-"""],
-]
-
-# ==============================================================
-
-totest['enumerated_lists'] = [
-# input
-[rest_head + r"""
-Enumerated List Test Section
-============================
-
-Here is an enumerated list:
-
-1. This is an item.
-
-2. This is an item.
-
-3. This is an item.
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Enumerated List Test Section\label{enumerated-list-test-section}}
-
-Here is an enumerated list:
-\begin{enumerate}
-\item
-This is an item.
-
-\item
-This is an item.
-
-\item
-This is an item.
-
-\end{enumerate}
-
-\end{document}
-"""],
-]
-
-
-# ==============================================================
-
-totest['itemized_lists'] = [
-# input
-[rest_head + r"""
-Itemized List Test Section
-==========================
-
-Here is an itemized list:
-
-- This is an item.
-
-- This is an item.
-
-- This is an item.
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Itemized List Test Section\label{itemized-list-test-section}}
-
-Here is an itemized list:
-\begin{itemize}
-\item
-This is an item.
-
-\item
-This is an item.
-
-\item
-This is an item.
-
-\end{itemize}
-
-\end{document}
-"""],
-]
-
-# ==============================================================
-
-totest['links'] = [
-# input
-[rest_head + r"""
-Section #1
-==========
-
-Content for section #1.
-
-Subsection #1-1
----------------
-
-Content for sub-section #1-1.
-
-Subsection #1-2
----------------
-
-Content for sub-section #1-2.
-
-Section #2
-==========
-
-Content for section #2.
-
-Links Test Section
-==================
-
-Here is a link to the section which is the target of this
-internal link `Subsection #1-1`_.
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Section {\#}1\label{section-1}}
-
-Content for section {\#}1.
-
-
-%___________________________________________________________________________
-
-\subsection{1.1   Subsection {\#}1-1\label{subsection-1-1}}
-
-Content for sub-section {\#}1-1.
-
-
-%___________________________________________________________________________
-
-\subsection{1.2   Subsection {\#}1-2\label{subsection-1-2}}
-
-Content for sub-section {\#}1-2.
-
-
-%___________________________________________________________________________
-
-\section{2   Section {\#}2\label{section-2}}
-
-Content for section {\#}2.
-
-
-%___________________________________________________________________________
-
-\section{3   Links Test Section\label{links-test-section}}
-
-Here is a link to the section which is the target of this
-internal link \ref{subsection-1-1}.
-
-\end{document}
-"""],
-]
-
-# ==============================================================
-
-totest['seealso'] = [
-# input
-[rest_head + r"""
-See Also
-========
-
-`Docutils: Python Documentation Utilities`_
-
-.. _`Docutils: Python Documentation Utilities`:
- http://docutils.sourceforge.net/
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   See Also\label{see-also}}
-
-\ulink{Docutils: Python Documentation Utilities}{http://docutils.sourceforge.net/}
-
-\end{document}
-"""],
-]
-
-
-# ==============================================================
-
-totest['emphasis'] = [
-# input
-[rest_head + r"""
-Section #1
-==========
-
-This section contains *some emphaized text*.
-
-It **also has some bold text**.
-
-And ``this is sample text``, or, as it is known in reStructured
-Text, an in-line literal.
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Section {\#}1\label{section-1}}
-
-This section contains \emph{some emphaized text}.
-
-It \strong{also has some bold text}.
-
-And \samp{this is sample text}, or, as it is known in reStructured
-Text, an in-line literal.
-
-\end{document}
-"""],
-]
-
-
-# ==============================================================
-
-totest['blockquote'] = [
-# input
-[rest_head + r"""
-Block Quote Test
-================
-
-This section contains a paragraph which is followed by a block
-quote. The block quote is a simple paragraph that is indented.
-
- This is the block quoted paragraph. It has several sentences.
- These sentences have empty content because they are only a
- test. This is a test. This is a test. This is a test. This
- is a test. This is a test. This is a test.
-
-
-Python Iteractive Session Test
-==============================
-
-This section has a Python interactive session. It is a test.
-Here is the example session.
-
->>> import sys
->>> print sys.version
-2.3 (#1, Jul 31 2003, 15:26:15)
-[GCC 3.2.3 20030415 (Debian prerelease)]
->>> a = [11,22,33]
->>> for x in a:
-... print x
-...
-11
-22
-33
-
-
-Literal Block Test
-==================
-
-This section has a literal block. In Python LaTeX it will be
-formatted in a verbatim environment::
-
- def remove_lines(self, inStr, targetList):
- inLines = inStr.splitlines()
- outLines = []
- for line in inLines:
- remove = False
- for target in targetList:
- if line.find(target) > -1:
- remove = True
- if not remove:
- outLines.append(line)
- outStr = '\n'.join(outLines)
- return outStr
-
-""",
-
-# expected output
-latex_head + r"""
-%___________________________________________________________________________
-
-\section{1   Block Quote Test\label{block-quote-test}}
-
-This section contains a paragraph which is followed by a block
-quote. The block quote is a simple paragraph that is indented.
-\begin{quote}
-
-This is the block quoted paragraph. It has several sentences.
-These sentences have empty content because they are only a
-test. This is a test. This is a test. This is a test. This
-is a test. This is a test. This is a test.
-\end{quote}
-
-
-%___________________________________________________________________________
-
-\section{2   Python Iteractive Session Test\label{python-iteractive-session-test}}
-
-This section has a Python interactive session. It is a test.
-Here is the example session.
-\begin{verbatim}
->>> import sys
->>> print sys.version
-2.3 (#1, Jul 31 2003, 15:26:15)
-[GCC 3.2.3 20030415 (Debian prerelease)]
->>> a = [11,22,33]
->>> for x in a:
-... print x
-...
-11
-22
-33
-\end{verbatim}
-
-
-%___________________________________________________________________________
-
-\section{3   Literal Block Test\label{literal-block-test}}
-
-This section has a literal block. In Python LaTeX it will be
-formatted in a verbatim environment:
-
-\begin{verbatim}
-def remove_lines(self, inStr, targetList):
- inLines = inStr.splitlines()
- outLines = []
- for line in inLines:
- remove = False
- for target in targetList:
- if line.find(target) > -1:
- remove = True
- if not remove:
- outLines.append(line)
- outStr = '\n'.join(outLines)
- return outStr
-\end{verbatim}
-
-\end{document}
-"""],
-]
-
-
-# ==============================================================
-
-if __name__ == '__main__':
- import unittest
- unittest.main(defaultTest='suite')
-
-
-
-
-
diff --git a/sandbox/dkuhlman/docutils/tools/python_latex.py b/sandbox/dkuhlman/docutils/tools/python_latex.py
deleted file mode 100755
index 245f7aafa..000000000
--- a/sandbox/dkuhlman/docutils/tools/python_latex.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:Author: Dave Kuhlman
-:Contact: dkuhlman@rexx.com
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-A minimal front end to the Docutils Publisher, producing LaTeX
-that conforms to Documenting Python
-(http://www.python.org/dev/doc/devel/doc/doc.html).
-"""
-
-#import locale
-#locale.setlocale(locale.LC_ALL, '')
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates LaTeX for "Documenting Python" documents '
- 'from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='python_latex', description=description)
diff --git a/sandbox/dpriest/XSL-FO/FOP Colour Names.txt b/sandbox/dpriest/XSL-FO/FOP Colour Names.txt
deleted file mode 100644
index e9719a516..000000000
--- a/sandbox/dpriest/XSL-FO/FOP Colour Names.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-static final String[] names = {
- "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
- "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
- "burlywood", "cadetblue", "chartreuse", "chocolate", "coral",
- "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue",
- "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey",
- "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange",
- "darkorchid", "darkred", "darksalmon", "darkseagreen",
- "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise",
- "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey",
- "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia",
- "gainsboro", "lightpink", "lightsalmon", "lightseagreen",
- "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue",
- "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon",
- "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
- "mediumseagreen", "mediumslateblue", "mediumspringgreen",
- "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream",
- "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive",
- "olivedrab", "orange", "orangered", "orchid", "palegoldenrod",
- "palegreen", "paleturquoise", "palevioletred", "papayawhip",
- "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "red",
- "rosybrown", "royalblue", "saddlebrown", "salmon", "ghostwhite",
- "gold", "goldenrod", "gray", "grey", "green", "greenyellow",
- "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki",
- "lavender", "lavenderblush", "lawngreen", "lemonchiffon",
- "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow",
- "lightgray", "lightgreen", "lightgrey", "sandybrown", "seagreen",
- "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray",
- "slategrey", "snow", "springgreen", "steelblue", "tan", "teal",
- "thistle", "tomato", "turquoise", "violet", "wheat", "white",
- "whitesmoke", "yellow", "yellowgreen"
- };
diff --git a/sandbox/dpriest/XSL-FO/pdf_debug.xsl b/sandbox/dpriest/XSL-FO/pdf_debug.xsl
deleted file mode 100644
index d3ec65754..000000000
--- a/sandbox/dpriest/XSL-FO/pdf_debug.xsl
+++ /dev/null
@@ -1,2179 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Generates a PDF that includes highlighted comments, errors, and suchlike.
-Used only by documentation developers.
--->
-<!--
-Set namespace extensions. These are used as [shortname]:[tag] throughout the
-XSL-FO files.
-xsl: eXtensible Stylesheet Language (all are implemented by Saxon)
-fo: XSL Formatting Objects (almost all are implemented by XEP and FOP)
-svg: SVG (Scalable Vector Graphics - only a subset is implemented by XEP and
-FOP)
-rx: XEP extensions (RenderX XEP PDF-creation product)
-fox: FOP extensions (Apache FOP PDF-creation product, open-source)
-saxon: SAXON extensions (Saxon XSL transformation product, open-source)
-u: user extensions (indicates utility 'call-template' routines defined in
-these XSL files)
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:fox="http://xml.apache.org/fop/extensions"
- xmlns:saxon="http://icl.com/saxon"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:u="U" >
-
-<!--
-indent: indent FO output for better human readability (CAUSES SIDE EFFECTS FOR
-ALL LITERAL TEXT!)
-publish-comments: show ReST comments ('..comment').
-publish_filenotes: show ReST file notes ('..file notes').
-publish_problematics: show DocUtils-generated problematic error messages.
-system_messages: show DocUtils-generated system messages.
--->
-<xsl:output indent="yes" saxon:indent-spaces="8" />
-<xsl:variable name="publish_comments">enabled</xsl:variable>
-<xsl:variable name="publish_filenotes">xenabled</xsl:variable>
-<xsl:variable name="publish_problematics">enabled</xsl:variable>
-<xsl:variable name="system_messages">enabled</xsl:variable><!--
-All inline-level attribute are named "foo_bar"
-Most block-level attributes are named "foo_bar_block" EXCEPT when the block
-contains only a text override
-All region attributes are named "foo_region_bar"
--->
-<!--
-The size of a standard page.
-TO DO: perhaps have a selection of standard sizes, and a single variable to
-select from them.
--->
-<xsl:attribute-set name="paper_size">
- <xsl:attribute name="page-width">8.5in</xsl:attribute>
- <xsl:attribute name="page-height">11in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="page_size" use-attribute-sets="paper_size">
- <xsl:attribute name="margin-top">0.33in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0.33in</xsl:attribute>
-</xsl:attribute-set>
-<!--
-Page margins for almost all pages, with exceptions as defined below.
--->
-<xsl:attribute-set name="generic_region_body">
- <xsl:attribute name="margin-left">1.0in</xsl:attribute>
- <xsl:attribute name="margin-right">1.0in</xsl:attribute>
- <xsl:attribute name="margin-top">0.33in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0.33in</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-Page margins for some exceptional pages (Safeguards warning, Versions list,
-etc)
--->
-<xsl:attribute-set name="large_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.5in</xsl:attribute>
- <xsl:attribute name="margin-right">0.5in</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid blue</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="maximum_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-top">0in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0in</xsl:attribute>
- <xsl:attribute name="margin-left">0in</xsl:attribute>
- <xsl:attribute name="margin-right">0in</xsl:attribute>
- <xsl:attribute name="padding">0in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="chapter_flow">
- <xsl:attribute name="start-indent">1.75in</xsl:attribute>
- <xsl:attribute name="end-indent">1.75in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="generic_region_before_first">
- <xsl:attribute name="region-name">xsl-region-before</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">before</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_after_first">
- <xsl:attribute name="region-name">xsl-region-after</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">after</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_before_first" use-attribute-sets="generic_region_before_first" />
-
-<xsl:attribute-set name="chapter_region_after_first" use-attribute-sets="generic_region_after_first">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-top">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="generic_region_start_first">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_first">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="generic_region_before">
- <xsl:attribute name="region-name">xsl-region-before</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">before</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_after">
- <xsl:attribute name="region-name">xsl-region-after</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">after</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_before" use-attribute-sets="generic_region_before">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-bottom">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="chapter_region_after" use-attribute-sets="generic_region_after">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-top">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="generic_region_start">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="balanced_region_start">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">1.5in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="balanced_region_end">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1.5in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="generic_region_start_odd">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_odd">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="generic_region_start_even">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_even">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="header_text" use-attribute-sets="serif_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="footer_text" use-attribute-sets="serif_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="header_text_firstpage" use-attribute-sets="header_text" />
-
-<xsl:attribute-set name="footer_text_firstpage" use-attribute-sets="footer_text" />
-
-<xsl:attribute-set name="titlepage_region_body" use-attribute-sets="maximum_region_body" /><xsl:attribute-set name="safeguards_region_body" use-attribute-sets="large_region_body">
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-right">1.5in</xsl:attribute>
- <xsl:attribute name="column-count">2</xsl:attribute>
- <xsl:attribute name="column-gap">.25in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="simple_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-right">1.5in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="toc_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">2.0in</xsl:attribute>
- <xsl:attribute name="margin-right">1.0in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="chapter_firstpage_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.25in</xsl:attribute>
- <xsl:attribute name="margin-right">-0.75in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_body_odd" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.25in</xsl:attribute>
- <xsl:attribute name="margin-right">-0.75in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_body_even" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">-0.75in</xsl:attribute>
- <xsl:attribute name="margin-right">0.25in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="swirlie_position">
- <xsl:attribute name="absolute-position">absolute</xsl:attribute>
- <xsl:attribute name="left">0in</xsl:attribute>
- <xsl:attribute name="top">0in</xsl:attribute>
- <xsl:attribute name="overflow">visible</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="main_title_position">
- <xsl:attribute name="position">absolute</xsl:attribute>
- <xsl:attribute name="left">1.5in</xsl:attribute>
- <xsl:attribute name="top">2in</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="main_title_text" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">32pt</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sub_title_position">
- <xsl:attribute name="position">absolute</xsl:attribute>
- <xsl:attribute name="left">1.5in</xsl:attribute>
- <xsl:attribute name="top">2.5in</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sub_title_text" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">24pt</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="logo_position">
- <xsl:attribute name="absolute-position">absolute</xsl:attribute>
- <xsl:attribute name="left">6.5in</xsl:attribute>
- <xsl:attribute name="top">9.0in</xsl:attribute>
- <xsl:attribute name="overflow">visible</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="docinfo_block" use-attribute-sets="serif_face">
- <xsl:attribute name="overflow">visible</xsl:attribute>
- <xsl:attribute name="vertical-align">bottom</xsl:attribute>
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-bottom">1.0in</xsl:attribute>
-</xsl:attribute-set>
-
-
-
-
-<xsl:attribute-set name="safeguards_title" use-attribute-sets="chapter_title">
- <xsl:attribute name="span">all</xsl:attribute>
- <xsl:attribute name="margin-bottom">9pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_chapterblock">
- <xsl:attribute name="space-before">3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_chapterentry">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_sectionentry" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="margin-left">.25in</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-See Titles/Special Titles branch. Applied to copyright, colophon, doc
-versioning, etc.
--->
-<xsl:attribute-set name="chapter_title_block">
- <xsl:attribute name="color">#FFFFFF</xsl:attribute>
- <xsl:attribute name="background-color">#006400</xsl:attribute>
- <xsl:attribute name="margin-bottom">9pt</xsl:attribute>
- <xsl:attribute name="padding-left">3pt</xsl:attribute>
- <xsl:attribute name="padding-right">3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title" use-attribute-sets="titles">
- <xsl:attribute name="font-size">24pt</xsl:attribute>
- <xsl:attribute name="line-height">32pt</xsl:attribute>
- <xsl:attribute name="color">#FFFFFF</xsl:attribute>
- <xsl:attribute name="background-color">#006400</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title_left" use-attribute-sets="chapter_title">
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title_right" use-attribute-sets="chapter_title">
- <xsl:attribute name="background-color">transparent</xsl:attribute>
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter-toc" use-attribute-sets="titles">
- <xsl:attribute name="space-before">24pt</xsl:attribute>
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_toc_entry" use-attribute-sets="titles">
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_toc_pagenum" use-attribute-sets="titles">
-<xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter-rule">
- <xsl:attribute name="leader-length">100%</xsl:attribute>
- <xsl:attribute name="leader-pattern">rule</xsl:attribute>
- <xsl:attribute name="alignment-baseline">middle</xsl:attribute>
- <xsl:attribute name="space-before">18pt</xsl:attribute>
- <xsl:attribute name="rule-thickness">0.5pt</xsl:attribute>
- <xsl:attribute name="color">#006400</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="doc_version_info" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">8pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_text" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="space-before">3pt</xsl:attribute>
- <xsl:attribute name="space-after">3pt</xsl:attribute>
- <xsl:attribute name="hyphenate">true</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="serif_face">
- <xsl:attribute name="font-family">OfficinaSerif</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_bold_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_italic_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_bold_italic_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="sans_face">
- <xsl:attribute name="font-family">OfficinaSans</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_bold_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_italic_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_bold_italic_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="mono_face">
- <xsl:attribute name="font-family">monospace</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_bold_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_italic_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_bold_italic_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_block" use-attribute-sets="generic_text" />
-<xsl:attribute-set name="admonition_block">
- <xsl:attribute name="space-before">6pt</xsl:attribute>
- <xsl:attribute name="space-after">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_block_with_icon" use-attribute-sets="admonition_block">
- <xsl:attribute name="keep-together">always</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) - 0.33in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_icon_float">
- <xsl:attribute name="float">left</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_icon_block" />
-
-<xsl:attribute-set name="admonition_with_icon" use-attribute-sets="admonition_block">
- <xsl:attribute name="intrusion-displace">none</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) + 0.33in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="attention_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="danger_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="error_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="hint_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="note_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="important_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid blue</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="tip_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid green</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="caution_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid olive</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="warning_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-right">1pt solid red</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-left">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="list_block" use-attribute-sets="generic_block">
- <xsl:attribute name="provisional-label-separation">0em</xsl:attribute>
- <xsl:attribute name="provisional-distance-between-starts">1em</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="list_item_label" use-attribute-sets="sans_face" />
-
-<xsl:attribute-set name="list_item" /><xsl:attribute-set name="bulleted_list_item" use-attribute-sets="list_item">
- <xsl:attribute name="margin-left">1em</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="bulleted_list_item_1stparagraph" use-attribute-sets="bulleted_list_item">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="bulleted_list_item_label" use-attribute-sets="list_item_label">
- <xsl:attribute name="baseline-shift">6pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="enumerated_list_item" use-attribute-sets="list_item" />
-
-<xsl:attribute-set name="enumerated_list_item_1stparagraph" use-attribute-sets="enumerated_list_item">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="definition_block" use-attribute-sets="generic_block" />
-<xsl:attribute-set name="definition_item_block" use-attribute-sets="definition_block">
- <xsl:attribute name="provisional-label-separation">0.5em</xsl:attribute>
- <xsl:attribute name="provisional-distance-between-starts">1em</xsl:attribute>
- <xsl:attribute name="keep-together">always</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="definition_term" use-attribute-sets="generic_text sans_bold_face">
- <xsl:attribute name="space-after">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="definition_classifier" use-attribute-sets="generic_text" />
-
-<xsl:attribute-set name="definition_definition" use-attribute-sets="generic_text">
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) + 0.25in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="literal_block" use-attribute-sets="generic_block">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
- <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="figure_block" use-attribute-sets="generic_block">
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="footnote_block" use-attribute-sets="generic_block" />
-
-<xsl:attribute-set name="block_quote_block" use-attribute-sets="generic_block">
- <xsl:attribute name="padding">12pt</xsl:attribute>
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sidebar_block" use-attribute-sets="generic_block" >
- <xsl:attribute name="width">1.75in - 6pt - 0.5em</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) - 1.75in + 3pt</xsl:attribute>
- <xsl:attribute name="end-indent">inherited-property-value(end-indent) - 1.75in + 3pt</xsl:attribute>
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
- <xsl:attribute name="padding">3pt</xsl:attribute>
- <xsl:attribute name="background-color">#F5FFFA</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sidebar_float">
- <xsl:attribute name="float">inside</xsl:attribute>
- <xsl:attribute name="clear">none</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="topic_block" use-attribute-sets="generic_block" >
- <xsl:attribute name="border">0pt double #BEBEBE</xsl:attribute>
- <xsl:attribute name="background-color">#F5FFFA</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="line_block" use-attribute-sets="generic_block">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="image_block">
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="external_graphic">
- <xsl:attribute name="content-width">scale-to-fit</xsl:attribute>
- <xsl:attribute name="content-height">scale-to-fit</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="emphasis">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="footnote_ref" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="font-size">xx-small</xsl:attribute>
- <xsl:attribute name="baseline-shift">super</xsl:attribute>
- <xsl:attribute name="vertical-align">super</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="literal_text">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="reference" use-attribute-sets="sans_italic_face" />
-
-
-<xsl:attribute-set name="generic_matter_title" use-attribute-sets="sans_bold_face titles">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="line-height">14pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="titles" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="keep-with-next">always</xsl:attribute>
- <xsl:attribute name="space-after">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="title-level1" use-attribute-sets="titles">
- <xsl:attribute name="font-size">18pt</xsl:attribute>
- <xsl:attribute name="line-height">24pt</xsl:attribute>
- <xsl:attribute name="border-top">3pt solid #006400</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #006400</xsl:attribute>
- <xsl:attribute name="padding-right">3pt</xsl:attribute>
- <xsl:attribute name="space-before">18pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="title-level2" use-attribute-sets="titles">
- <xsl:attribute name="font-size">14pt</xsl:attribute>
- <xsl:attribute name="line-height">14pt</xsl:attribute>
- <xsl:attribute name="space-before">12pt</xsl:attribute>
-</xsl:attribute-set>
-
- <xsl:attribute-set name="title-level3" use-attribute-sets="titles">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="space-before">12pt</xsl:attribute>
- </xsl:attribute-set>
-
-<xsl:attribute-set name="title-level4up" use-attribute-sets="titles">
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="table_block" use-attribute-sets="generic_block">
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="table_head" use-attribute-sets="sans_bold_face">
- <xsl:attribute name="background-color">#DCDCDC</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="table_body" use-attribute-sets="sans_face" />
-
-<xsl:attribute-set name="table_row" />
- <!-- no FOP support for margins, padding, etc? -->
-
-<xsl:variable name="even_row-color">#F0FFF0</xsl:variable>
-<xsl:variable name="odd_row-color">#FFFFFF</xsl:variable>
-<xsl:attribute-set name="table_entry">
- <xsl:attribute name="start-indent">0pt</xsl:attribute>
- <xsl:attribute name="end-indent">0pt</xsl:attribute>
- <xsl:attribute name="padding">3pt 3pt 1.5pt 3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="table_entry_1stparagraph" use-attribute-sets="generic_text">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="marker_text">
-<!-- FOP bug requires overriding most of parent's attributes to
-prevent that style being applied when retrieved -->
-<!-- <xsl:attribute name="font-family">OfficinaSerifBook,serif</xsl:attribute>
-<xsl:attribute name="font-weight">normal</xsl:attribute>
-<xsl:attribute name="font-style">normal</xsl:attribute>
-<xsl:attribute name="font-size">10pt</xsl:attribute>
-<xsl:attribute name="line-height">0pt</xsl:attribute>
-<xsl:attribute name="space-before">0pt</xsl:attribute>
-<xsl:attribute name="space-before.precedence">3.0</xsl:attribute>
-<xsl:attribute name="space-after">0pt</xsl:attribute>
-<xsl:attribute name="space-before.precedence">3.0</xsl:attribute>
-<xsl:attribute name="margin">0pt</xsl:attribute>
-<xsl:attribute name="border">0pt</xsl:attribute>
-<xsl:attribute name="padding">0pt</xsl:attribute>
-<xsl:attribute name="color">#000000</xsl:attribute>
---> </xsl:attribute-set>
-
-<xsl:attribute-set name="internal_link" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="color">#006400</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="external_link" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="color">#191970</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="review_text">
- <xsl:attribute name="color">#00008B</xsl:attribute>
- <xsl:attribute name="margin-left">-12pt</xsl:attribute>
- <xsl:attribute name="margin-right">-12pt</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #0000FF</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #0000FF</xsl:attribute>
- <xsl:attribute name="padding-left">9pt</xsl:attribute>
- <xsl:attribute name="padding-right">9pt</xsl:attribute></xsl:attribute-set>
-
-<xsl:attribute-set name="docutil_message" use-attribute-sets="generic_text">
- <xsl:attribute name="font-family">sans-serif</xsl:attribute>
- <xsl:attribute name="color">#00008B</xsl:attribute>
- <xsl:attribute name="margin-left">-12pt</xsl:attribute>
- <xsl:attribute name="margin-right">-12pt</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #00008B</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #00008B</xsl:attribute>
- <xsl:attribute name="padding-left">9pt</xsl:attribute>
- <xsl:attribute name="padding-right">9pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="comment" use-attribute-sets="docutil_message">
- <xsl:attribute name="color">#8B0000</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #8B0000</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #8B0000</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="problem" use-attribute-sets="docutil_message" />
-
-<xsl:attribute-set name="system_message" use-attribute-sets="docutil_message">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="unknown_tag" use-attribute-sets="docutil_message">
- <xsl:attribute name="color">#FF0000</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid red</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid red</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-This branch defines the structure of the book, both at the book level (the
-sequence of sections) and the page level (start, end, before, after, and body
-regions.)
--->
-<xsl:template match="/">
- <fo:root>
- <!--
- Define the page architecture for all sections of the document.
- -->
- <fo:layout-master-set>
- <!--
- Title pages have no before/after//start/end areas so that the LCS
- "Swirlie" logo can go to the edges.
- There is currently no proper end-page
- -->
- <fo:simple-page-master master-name="Title Page" xsl:use-attribute-sets="paper_size">
- <fo:region-body xsl:use-attribute-sets="titlepage_region_body" /> <!-- No region before/after::start/end areas -->
- </fo:simple-page-master> <!--
- Safeguards uses a two-column format.
- -->
- <fo:simple-page-master master-name="Safeguards" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="safeguards_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="generic_region_after" />
- <fo:region-start xsl:use-attribute-sets="balanced_region_start" />
- <fo:region-end xsl:use-attribute-sets="balanced_region_end" />
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Simple Frontmatter" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="simple_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="generic_region_after" />
- <fo:region-start xsl:use-attribute-sets="balanced_region_start" />
- <fo:region-end xsl:use-attribute-sets="balanced_region_end" />
- </fo:simple-page-master>
-
- <!--
- Preface and other frontmatter chapters are handled as a variation
- of chapter.
- -->
- <fo:simple-page-master master-name="ToC" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="toc_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
- </fo:simple-page-master>
-
-
-
- <!--
- For our purposes, first pages *always* start on an odd page.
- -->
- <fo:simple-page-master master-name="Chapter First Page" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_firstpage_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before_first" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after_first" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
-
-
-
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Chapter Odd Pages" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_region_body_odd" /> <fo:region-before xsl:use-attribute-sets="chapter_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Chapter Even Pages" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_region_body_even" /> <fo:region-before xsl:use-attribute-sets="chapter_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_even" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_even" />
- </fo:simple-page-master>
-
- <!--
- Used by core transformations when the section type can not be
- identified.
- -->
- <fo:simple-page-master master-name="Unknown FM_EM" xsl:use-attribute-sets="page_size" >
- <fo:region-body xsl:use-attribute-sets="generic_region_body" />
- </fo:simple-page-master>
- <!--
- Sections can have varying page architecture (layout masters). Some
- macro-style definitions account for the most common section parts,
- as various combinations of first, last, in-between ("rest"), even,
- and odd pages.
- -->
- <fo:page-sequence-master master-name="Chapter">
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference master-reference="Chapter First Page" page-position="first" />
- <fo:conditional-page-master-reference master-reference="Chapter Odd Pages" page-position="rest" odd-or-even="odd" />
- <fo:conditional-page-master-reference master-reference="Chapter Even Pages" page-position="rest" odd-or-even="even" />
- <fo:conditional-page-master-reference master-reference="Chapter Even Pages" page-position="last" odd-or-even="even" />
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master> </fo:layout-master-set>
- <!--
- Define the page sequence for all sections of the document.
- -->
- <fo:page-sequence master-reference="Title Page" initial-page-number="0">
- <fo:flow flow-name="xsl-region-body">
- <fo:block>
- <!-- images applied before text are placed behind the text -->
- <xsl:apply-templates select="//document/image" mode="titlepage" />
- <xsl:apply-templates select="//document/title | //document/subtitle | //document/docinfo" mode="titlepage" />
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- <xsl:for-each select="//document/section[@class = 'specialfrontmatter']">
- <xsl:choose>
- <xsl:when test="@id='important-safeguards'">
- <fo:page-sequence master-reference="Safeguards" format="i" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="safeguards" />
- <fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" mode="safeguards" />
- <!-- the admonitions template will strip off mode="safeguards" after it has handled the title specially -->
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:when> <xsl:when test="@id='copyright-and-trademark-information'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="i" initial-page-number="auto-even">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="copyright" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:otherwise>
- <fo:page-sequence master-reference="Unknown" initial-page-number="auto-odd">
- <fo:flow flow-name="xsl-region-body">
- <fo:block xsl:use-attribute-sets="unknown_tag" border="1px solid red">
- <xsl:text> Special Frontmatter: Section </xsl:text>
- <xsl:value-of select="@id" />
- <xsl:text> (</xsl:text><xsl:value-of select="@name" /><xsl:text>) not implemented; see PDF.XSL page sequencing templates.</xsl:text>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- <!--
- The table of contents is generated on-the-fly; it is not available (or
- is ignored) in the source XML file.
- -->
- <fo:page-sequence master-reference="ToC" format="i" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <xsl:text>Contents</xsl:text>
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:call-template name="u:book_toc_title" />
- <xsl:call-template name="u:book_toc" />
- </fo:flow >
- </fo:page-sequence>
-
- <xsl:for-each select="//document/section[@class = 'frontmatter']">
- <fo:page-sequence master-reference="Chapter" format="i" initial-page-number="auto-odd">
- <!--
- First page has the version number and page number in the
- footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in header,
- chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:not_numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:for-each>
-
-
-
- <xsl:for-each select="//document/section[not(@class = 'frontmatter' or @class = 'specialfrontmatter' or @class = 'endmatter' or @class = 'specialendmatter')]">
- <xsl:choose>
- <!--
- The first chapter needs to get page 1.
- -->
- <xsl:when test="position() = 1">
- <fo:page-sequence master-reference="Chapter" format="1" initial-page-number="1">
- <!--
- First page has the version number and page number in
- the footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in
- header, chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when> <xsl:otherwise>
- <!-- not the first chapter, page numbering follows previous chapter -->
- <fo:page-sequence master-reference="Chapter" format="1" initial-page-number="auto-odd">
- <!--
- First page has the version number and page number in
- the footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in
- header, chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each> <xsl:for-each select="//document/section[@class = 'specialendmatter']">
- <xsl:choose>
- <xsl:when test="@id='colophon'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="1" initial-page-number="auto">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="colophon" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:when test="@id='documentation-versions-reference'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="1" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="versions" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- <xsl:call-template name="u:list_versions" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:otherwise>
- <fo:page-sequence master-reference="Unknown" initial-page-number="auto-odd">
- <fo:flow flow-name="xsl-region-body">
- <fo:block xsl:use-attribute-sets="unknown_tag">
- <xsl:text> Special Endmatter: Section </xsl:text>
- <xsl:value-of select="@id" />
- <xsl:text> (</xsl:text><xsl:value-of select="@name" /><xsl:text>) not implemented; see PDF.XSL page sequencing templates.</xsl:text>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- </fo:root>
-</xsl:template><!--
-This branch defines the layout of significant parts of the book.
--->
-<xsl:template name="u:book_toc_title">
- <fo:block xsl:use-attribute-sets="chapter_title">
- <xsl:text>Table of Contents</xsl:text>
- </fo:block>
-</xsl:template><xsl:template name="u:book_toc">
- <!-- don't include special front/end matter (safeguards, copyright, colophon, etc) -->
- <xsl:for-each select="//document/section[not(@class = 'specialfrontmatter' or @class = 'specialendmatter')]/title">
- <fo:block xsl:use-attribute-sets="book_toc_chapterblock">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="./text()" /></fo:marker>
- <fo:block xsl:use-attribute-sets="book_toc_chapterentry">
- <fo:basic-link internal-destination="{../@id}" xsl:use-attribute-sets="internal_link">
- <xsl:value-of select="./text()" />
- <fo:leader leader-pattern="space" /><fo:page-number-citation ref-id="{../@id}"/>
- </fo:basic-link>
- </fo:block>
- <!-- include major sections within the chapter -->
- <xsl:for-each select="../section/title">
- <fo:block xsl:use-attribute-sets="book_toc_sectionentry">
- <xsl:value-of select="./text()" />
- </fo:block>
- </xsl:for-each>
- </fo:block>
- </xsl:for-each>
-</xsl:template>
-<xsl:template name="u:not_numbered_chapter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="./title/text()" /></fo:marker>
- <fo:list-block id="{@id}" xsl:use-attribute-sets="chapter_title_block">
- <fo:list-item>
- <fo:list-item-label end-indent="label-end()" />
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_title_right">
- <xsl:value-of select="./title/text()" />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
-</xsl:template><xsl:template name="u:numbered_chapter_title">
- <!-- start of a chapter. fiddlefart around to get nice numbering -->
- <fo:marker marker-class-name="chapter"><xsl:value-of select="title/text()" /></fo:marker>
- <fo:list-block id="{@id}" xsl:use-attribute-sets="chapter_title_block">
- <fo:list-item>
- <fo:list-item-label end-indent="label-end()">
- <fo:block xsl:use-attribute-sets="chapter_title_left">
- <xsl:value-of select="count(preceding-sibling::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]) + 1" />
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_title_right">
- <xsl:value-of select="title/text()" />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
-</xsl:template><xsl:template name="u:chapter_toc">
- <xsl:for-each select="section/title">
- <fo:block>
- <fo:list-block>
- <fo:list-item>
- <fo:list-item-label end-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_toc_entry">
- <fo:basic-link internal-destination="{../@id}" xsl:use-attribute-sets="internal_link">
- <xsl:value-of select="./text()" />
- </fo:basic-link>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_toc_pagenum">
- <fo:page-number-citation ref-id="{../@id}"/>
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:block>
- </xsl:for-each>
- <fo:block>
- <fo:leader xsl:use-attribute-sets="chapter-rule" />
- </fo:block>
-</xsl:template><xsl:template name="u:list_versions">
- <xsl:for-each select="//document">
- <fo:block>
- <xsl:call-template name="u:printfilename">
- <xsl:with-param name="FName">
- <xsl:call-template name="u:docinfo-filename" />
- </xsl:with-param>
- </xsl:call-template>
- <!-- process all sections/subsections/etc of document -->
- <xsl:for-each select="//section">
- <xsl:call-template name="u:printfilename">
- <xsl:with-param name="FName">
- <xsl:call-template name="u:docinfo-filename" />
- </xsl:with-param>
- </xsl:call-template>
- </xsl:for-each>
- </fo:block>
- </xsl:for-each>
-</xsl:template>
-
-<xsl:template name="u:printfilename">
- <xsl:param name="FName">(filename not known)</xsl:param>
-
- <!-- discover filename of ancestor -->
- <xsl:variable name="ancestorFName">
- <xsl:call-template name="u:docinfo-filename" >
- <xsl:with-param name="thisNode" select="ancestor::*" />
- </xsl:call-template>
- </xsl:variable>
-
- <xsl:variable name="level">
- <xsl:value-of select="count(ancestor::section) - count(self::document) + 1" />
- </xsl:variable>
-
- <xsl:variable name="revision">
- <xsl:call-template name="u:docinfo-revision" />
- </xsl:variable>
-
- <!-- show top-level sections (chapters) AND ALSO those that are in a separate file -->
- <xsl:if test="($level &lt; 2) or ($FName != $ancestorFName)">
- <fo:block xsl:use-attribute-sets="doc_version_info">
-
- <!-- indent according to section level -->
- <xsl:attribute name="text-indent"><xsl:value-of select="$level*12" />pt</xsl:attribute>
-
- <!-- title & filename -->
- <xsl:value-of select="./title/text()" />
- <fo:leader leader-pattern="space" />
- <xsl:value-of select="$FName" />
-
- <!-- rev if different from ancestor's -->
- <xsl:if test="$FName != $ancestorFName">
- <xsl:if test="string-length($revision) != 0">
- <fo:leader leader-length="1em" />
- <xsl:text>Rev. </xsl:text>
- <xsl:value-of select="$revision" />
- </xsl:if>
- </xsl:if>
- </fo:block>
- </xsl:if>
-</xsl:template>
-
-<!--
-This branch defines the transformations applied to data that is being flowed
-into a significant sectional structure.
--->
-<!--
-DocUtils top-level (root) element
--->
-<xsl:template match="document">
- <xsl:apply-templates />
-</xsl:template>
-<!--
-<xsl:template match="/document/decoration/header" />
-<xsl:template match="/document/decoration/footer" />
---><!--
-DocUtils generates a bushel of useful document information, applicable only to
-the book as a whole.
-Some of this information is displayed on the title page. The rest is ignored.
--->
-<xsl:template match="docinfo" mode="titlepage">
- <!-- the footnote hack ensures that bottom of the docinfo block aligns to the "bottom" of the page -->
- <fo:footnote>
- <fo:inline />
- <fo:footnote-body>
- <fo:block xsl:use-attribute-sets="docinfo_block">
- <xsl:apply-templates mode="titlepage" />
- </fo:block>
- </fo:footnote-body>
- </fo:footnote>
-</xsl:template><!-- Condensed XSL follows -->
-<xsl:template match="docinfo/address" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/author" mode="titlepage">
- <fo:block><xsl:text>Author: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/authors" mode="titlepage">
- <fo:block><xsl:text>Authors: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/contact" mode="titlepage">
- <fo:block><xsl:text>Contact </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/copyright" mode="titlepage">
- <fo:block><xsl:text>Copyright </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/date" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/field" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/organization" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/revision" mode="titlepage">
- <fo:block><xsl:text>Revision </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/status" mode="titlepage">
- <fo:block><xsl:text>Status: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/version" mode="titlepage">
- <fo:block><xsl:text>Version </xsl:text><xsl:apply-templates /></fo:block></xsl:template><xsl:template match="section">
- <xsl:apply-templates />
-</xsl:template><xsl:template match="topic" >
- <fo:block xsl:use-attribute-sets="topic_block">
- <xsl:apply-templates select="title" mode="topic" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template>
-<xsl:template match="sidebar">
- <fo:float xsl:use-attribute-sets="sidebar_float">
- <fo:block-container xsl:use-attribute-sets="sidebar_block">
- <fo:block>
- <xsl:apply-templates select="title" mode="sidebar" />
- <xsl:apply-templates select="subtitle" mode="sidebar" />
- <xsl:apply-templates select="child::*[name()!='title' and name()!='subtitle']" />
- </fo:block>
- </fo:block-container>
- </fo:float>
-</xsl:template><!--
-<xsl:template match="transition" />
---><xsl:template match="*[contains(@class,'review')]">
- <xsl:choose>
- <xsl:when test="($publish_comments='enabled')">
- <fo:block xsl:use-attribute-sets="review_text">
- <xsl:text>PLEASE REVIEW:</xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates />
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="admonition" mode="safeguards">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:value-of select="title" /></fo:inline>
- <fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template><!--
-Generic admonitions have (had?) (I think) a space between the "admonition"
-class label and the hyphenated-title of the admonition.
-TO DO: Get David Goodger to revert it back to the old behaviour.
-Admonitions should be able to take a class and a title?
--->
-<xsl:template match="admonition">
- <fo:block xsl:use-attribute-sets="admonition_block">
- <fo:block xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="substring-after(@class, ' ')" />:
- <xsl:value-of select="title" />
- </fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="attention">
- <fo:block xsl:use-attribute-sets="attention_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Attention: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="danger">
- <fo:block xsl:use-attribute-sets="danger_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Danger: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="error">
- <fo:block xsl:use-attribute-sets="error_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Error: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="hint">
- <fo:block xsl:use-attribute-sets="hint_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Hint: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="note">
- <fo:block xsl:use-attribute-sets="note_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Note: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="caution">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/caution.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="caution_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Caution: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template>
-<xsl:template match="important">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/important.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="important_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Important! </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="tip">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/tip.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="tip_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Tip: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="warning">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/warning.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="warning_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Warning: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="block_quote">
- <fo:block xsl:use-attribute-sets="block_quote_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!--
-Captions are labeled as "ch#.fig#: Title" whenever possible
--->
-<xsl:template match="caption" mode="figure-pdf">
- <fo:block xsl:use-attribute-sets="generic_text">
- <xsl:text>Figure </xsl:text>
- <xsl:choose>
- <!-- If the chapter is numbered, get the chapter number -->
- <xsl:when test="ancestor::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]">
- <xsl:value-of select="count((ancestor::*[last()-1])/preceding-sibling::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]) + 1" />
- <xsl:text>.</xsl:text>
- <xsl:number level="any" count="figure[contains(@class,'pdf')]" from="/document/section" />
- </xsl:when>
- <!-- Otherwise, leave off the chapter number -->
- <xsl:otherwise>
- <xsl:number level="any" count="figure[contains(@class,'pdf')]" from="/document/section" />
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!--
-As these templates are only for FO->PDF transformation, we completely ignore
-all html figures.
--->
-<xsl:template match="figure">
- <xsl:choose>
- <xsl:when test="contains(@class,'pdf')">
- <fo:block xsl:use-attribute-sets="figure_block">
- <xsl:if test="contains(@class,'breakbefore')">
- <xsl:attribute name="break-before">page</xsl:attribute>
- </xsl:if>
- <xsl:apply-templates mode="figure-pdf" />
- </fo:block>
- </xsl:when>
- <xsl:when test="contains(@class,'html')">
- <!-- do nothing; it's not for PDF output -->
- </xsl:when>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="footnote">
- <fo:block id="{@id}" xsl:use-attribute-sets="footnote_block">
- <fo:inline xsl:use-attribute-sets="footnote_ref"><xsl:value-of select="@name" /></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!-- footnote label -->
- <xsl:template match="footnote/label" />
-<!-- footnote para -->
- <xsl:template match="footnote/paragraph">
- <xsl:apply-templates />
- </xsl:template>
-
- <xsl:template match="image" mode="figure-pdf">
- <fo:block xsl:use-attribute-sets="image_block">
- <xsl:if test="contains(@class,'fullpage')">
- <xsl:attribute name="width">8.5in - 1in</xsl:attribute>
- <xsl:attribute name="height">11in - 2in</xsl:attribute>
- <xsl:attribute name="start-indent">0.25in - inherited-property-value(margin-left)</xsl:attribute>
- <xsl:attribute name="end-indent">0.25in - inherited-property-value(margin-right)</xsl:attribute>
- </xsl:if>
- <fo:external-graphic src="url(file:{@uri})" xsl:use-attribute-sets="external_graphic">
- <xsl:if test="@width and @height and @scale">
- <xsl:attribute name="width">
- <xsl:value-of select="@width div @scale" />
- <xsl:text>in</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="height">
- <xsl:value-of select="@height div @scale" />
- <xsl:text>in</xsl:text>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="contains(@class,'fullpage')">
- <xsl:attribute name="width">100%</xsl:attribute>
- <xsl:attribute name="height">100%</xsl:attribute>
- <xsl:attribute name="display-align">center</xsl:attribute>
- </xsl:if>
- </fo:external-graphic>
- </fo:block>
-</xsl:template>
-
- <!-- html image mode, classed as html -->
- <xsl:template match="image" mode="figure-html">
- <!-- do nothing; it's not for PDF output -->
- </xsl:template>
-
- <!-- ordinary image mode, not a classed image -->
- <xsl:template match="image">
- <fo:block xsl:use-attribute-sets="image_block">
- <fo:external-graphic src="url(file:{@uri})" xsl:use-attribute-sets="external_graphic">
- <xsl:if test="@width and @height and @scale">
- <xsl:attribute name="width">
- <xsl:value-of select="@width div @scale" /><xsl:text>in</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="height">
- <xsl:value-of select="@height div @scale" /><xsl:text>in</xsl:text>
- </xsl:attribute>
- </xsl:if>
- </fo:external-graphic>
- </fo:block>
- </xsl:template><!-- The "Swirlie" -->
-<xsl:template match="//document/image[@class='spirographic-decoration']" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="swirlie_position">
- <fo:block>
- <fo:external-graphic src="url(file:{@uri})" />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-
-<!-- The Logo -->
-<xsl:template match="//document/image[@class='lcs-logo']" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="logo_position">
- <fo:block>
- <fo:external-graphic src="url(file:{//document/image[@class='lcs-logo']/@uri})" />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="line_block">
- <fo:block xsl:use-attribute-sets="line_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="bullet_list[not(contains(name(..),'list'))]">
- <!-- is not a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_block">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-
-<xsl:template match="bullet_list[contains(name(..),'list')]">
- <!-- is a list within a list -->
- <fo:list-block>
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-<xsl:template match="bullet_list/list_item">
- <xsl:variable name="bullet" select="../@bullet" />
- <fo:list-item xsl:use-attribute-sets="list_item">
- <fo:list-item-label end-indent="label-end()">
- <fo:block xsl:use-attribute-sets="bulleted_list_item_label">
- <xsl:choose>
- <xsl:when test="$bullet='-'">
- <xsl:text>&#x2022;</xsl:text>
- </xsl:when>
- <xsl:when test="$bullet='+'">
- <xsl:text>&#x2013;</xsl:text>
- </xsl:when>
- <xsl:when test="$bullet='*'">
- <xsl:text>&#x2219;</xsl:text>
- </xsl:when>
- </xsl:choose>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block>
- <xsl:apply-templates />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
-</xsl:template>
-
-
-<xsl:template match="definition_list">
- <xsl:apply-templates />
-</xsl:template>
-<xsl:template match="definition_list_item">
- <fo:block xsl:use-attribute-sets="definition_item_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="term">
- <fo:block xsl:use-attribute-sets="definition_term">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="classifier">
- <fo:block xsl:use-attribute-sets="definition_classifier">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="definition">
- <fo:block xsl:use-attribute-sets="definition_definition">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="enumerated_list[not(contains(name(..),'list'))]">
- <!-- is not a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_block">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-
-<xsl:template match="enumerated_list[(contains(name(..),'list'))]">
- <!-- is a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_item">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template><xsl:template match="enumerated_list/list_item">
- <fo:list-item xsl:use-attribute-sets="list_item">
- <fo:list-item-label end-indent="label-end()">
- <fo:block>
- <xsl:choose>
- <xsl:when test="../@enumtype = 'arabic'">
- <xsl:number format="1" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'loweralpha'">
- <xsl:number format="a" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'upperalpha'">
- <xsl:number format="A" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'lowerroman'">
- <xsl:number format="i" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'upperroman'">
- <xsl:number format="I" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>unrecognized enumtype</xsl:text>
- <xsl:number /><xsl:text>.</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block>
- <xsl:apply-templates />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
-</xsl:template><!--
-Field lists may be used by other templates for author-defined parameters; they
-are never output directly.
--->
-<xsl:template match="field_list" /><xsl:template match="field" />
-<xsl:template match="literal_block">
- <fo:block xsl:use-attribute-sets="literal_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="paragraph">
- <fo:block xsl:use-attribute-sets="generic_text">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="thead/row/entry/paragraph">
- <!-- table headers are special -->
- <fo:block xsl:use-attribute-sets="table_head">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="tbody/row/entry/paragraph[1]">
- <!-- table cells don't need the extra space above -->
- <fo:block xsl:use-attribute-sets="table_entry_1stparagraph">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<!-- BODY: table -->
-<!-- to be tweaked: base table width on sum of column widths
-<xsl:variable name="twidth">
- <xsl:value-of select="sum(. group/colspec/@colwidth)*.66" />
-</xsl:variable>
-<fo:table xsl:use-attribute-sets="table_block" width="{$twidth}em"> -->
-<xsl:template match="table">
- <fo:table xsl:use-attribute-sets="table_block">
- <xsl:apply-templates />
- </fo:table>
-</xsl:template>
-
-<xsl:template match="tgroup">
- <xsl:apply-templates />
-</xsl:template>
-
-<xsl:template match="colspec">
- <fo:table-column column-width="proportional-column-width({@colwidth})">
- <xsl:apply-templates />
- </fo:table-column>
-</xsl:template><xsl:template match="thead">
- <fo:table-header xsl:use-attribute-sets="table_head">
- <xsl:apply-templates />
- </fo:table-header>
-</xsl:template>
-
-<xsl:template match="thead/row">
- <fo:table-row xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-
-<xsl:template match="thead/row/entry">
- <fo:table-cell xsl:use-attribute-sets="table_entry">
- <xsl:apply-templates />
- </fo:table-cell>
-</xsl:template><xsl:template match="tbody">
- <fo:table-body xsl:use-attribute-sets="table_body">
- <xsl:apply-templates />
- </fo:table-body>
-</xsl:template>
-
-<xsl:template match="tbody/row[position() mod 2 = 0]">
- <fo:table-row background-color="{$even_row-color}" xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-<xsl:template match="tbody/row[position() mod 2 != 0]">
- <fo:table-row background-color="{$odd_row-color}" xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-
-<xsl:template match="entry">
- <fo:table-cell xsl:use-attribute-sets="table_entry">
- <xsl:apply-templates />
- </fo:table-cell>
-</xsl:template><!--
-TO DO: targets always target the next element; copy the target id to the
-target element
-(change the references to use "contains" when this is done)
-//target/following-sibling::*[1]
-NOTE: Won't work! Targets appearing before a section title are embedded in
-the previous section; no next sibling to copy to!
--->
-<xsl:template match="target">
- <fo:block id="{@id}">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="comment">
- <xsl:variable name="is_filenotes">
- <xsl:value-of select="contains(text(),'file notes')" />
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="($publish_filenotes = 'enabled') and ($is_filenotes = 'true')">
- <fo:block xsl:use-attribute-sets="comment">
- <xsl:text>File Notes: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="($publish_comments = 'enabled') and ($is_filenotes = 'false')">
- <fo:block xsl:use-attribute-sets="comment">
- <xsl:text>Comment: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- </xsl:choose>
-</xsl:template>
-
-<!--
-DocUtils tells us the definitions for the substitution references even though
-it actually performs the substitution, too. Throw it away!
--->
-<xsl:template match="substitution_definition" />
-
-<!--
-We make *no* use of DocUtils' self-generated title content
--->
-<xsl:template match="title/generated" />
-<!--
-Shown only for Debug-Style PDFs when 'publish_problematics' is 'enabled'
--->
-<xsl:template match="problematic">
- <xsl:if test="$publish_problematics = 'enabled'">
- <fo:block xsl:use-attribute-sets="problem">
- <xsl:text>DocUtils Problematic: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:if>
-</xsl:template>
-<xsl:template match="system_message">
- <xsl:if test="$system_messages = 'enabled'">
- <fo:block xsl:use-attribute-sets="system_message">
- <xsl:text>DocUtils Warning:</xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:if>
-</xsl:template>
-
-<xsl:template match="emphasis">
- <fo:inline xsl:use-attribute-sets="emphasis"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<!--
-The (nominally superscripted) number or symbol placed in-line to indicate a
-footnote reference
--->
-<xsl:template match="footnote_reference">
- <fo:basic-link internal-destination="{@refid}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="footnote_ref"><xsl:value-of select="@refid" /></fo:inline>
- </fo:basic-link>
-</xsl:template>
-
-<!--
-Note there are also image blocks, which are another thing entirely.
--->
-<xsl:template match="paragraph/image">
- <fo:external-graphic src="url(file:{@uri})" />
-</xsl:template>
-
-<!--
-Note there are also literal and list blocks, which are another thing entirely.
--->
-<xsl:template match="literal">
- <fo:inline xsl:use-attribute-sets="literal_text"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-
-<xsl:key name="sectionkey" match="section" use="@id" />
-<xsl:key name="targetkey" match="target" use="@id" />
-
-<!--
-Anonymous internal references do not have page numbers??
-TO DO: figure out what this was all about originally; check if DocUtils
-correctly places title targets these days
-NOTE: anonymous attribute is now missing?!?
--->
-<xsl:template match="reference[@refid and @anonymous]">
- <xsl:choose>
- <!--
- When referencing a section (chapter or chapter section), use the true
- section title itself.
- -->
- <xsl:when test="key('sectionkey', @refid)">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:when>
-
- <!--
- When the target is at the end of a section, and immediately following
- that is a new section, use that new section's title.
- This is necessary because DocUtils doesn't look ahead for a title
- -->
- <xsl:when test="((key('targetkey', @refid)/following::*)[1])[name()='section']">
- <fo:basic-link internal-destination="{(key('targetkey', @refid)/following::*[name()='section'])[1]/@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </fo:basic-link>
- </xsl:when>
- <!--
- When the target immediately follows a title, use that title's text.
- This was to allow authors to hack around the target-preceding problem
- described above.
- -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:basic-link internal-destination="{key('targetkey', @refid)/../@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </fo:basic-link>
- </xsl:when>
- <xsl:otherwise>
- <!-- use the text provided by the reference; may not actually match the target's text -->
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-<!-- not-anonymous internal reference -->
-<xsl:template match="reference[@refid and not(@anonymous)]">
- <xsl:choose>
- <!--
- When referencing a section (chapter or chapter section), use the true
- section title itself.
- -->
- <xsl:when test="key('sectionkey', @refid)">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="key('sectionkey', @refid)/title[1]" mode="xref" /></fo:inline>
- </xsl:when>
-
- <!--
- When the target is at the end of a section, and immediately following
- that is a new section, use that new section's title.
- This is necessary because DocUtils doesn't look ahead for a title
- -->
- <xsl:when test="((key('targetkey', @refid)/following::*)[1])[name()='section']">
- <fo:basic-link internal-destination="{(key('targetkey', @refid)/following::*[name()='section'])[1]/@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="(key('targetkey', @refid)/following::*[name()='section'])[1]/title[1]" mode="xref" /></fo:inline>
- </fo:basic-link>
- </xsl:when>
-
- <!--
- When the target immediately follows a title, use that title's text.
- This was to allow authors to hack around the target-preceding problem
- described above.
- -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:basic-link internal-destination="{key('targetkey', @refid)/../@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="key('targetkey', @refid)/preceding-sibling::*[name()='title']" mode="xref" /></fo:inline>
- </fo:basic-link>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- use the text provided by the reference; may not actually match the target's text -->
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text> (p. </xsl:text>
- <xsl:choose>
- <!-- use the target's title text content -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:page-number-citation ref-id="{key('targetkey', @refid)/../@id}" />
- </xsl:when>
- <xsl:otherwise>
- <fo:page-number-citation ref-id="{@refid}" />
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>)</xsl:text>
-</xsl:template>
-<xsl:template match="reference[@refuri]">
- <fo:basic-link external-destination="url({@refuri})">
- <fo:inline xsl:use-attribute-sets="external_link">
- <xsl:apply-templates />
-<!-- <xsl:call-template name="u:make-breakable">
- <xsl:with-param name="string" select="text()" />
- </xsl:call-template> -->
- </fo:inline>
- </fo:basic-link>
-</xsl:template>
-<!-- unknown reference type -->
-<xsl:template match="reference">
- <fo:inline xsl:use-attribute-sets="reference"><xsl:apply-templates /></fo:inline>
-</xsl:template><xsl:template match="strong">
- <fo:inline font-weight="bold"><xsl:apply-templates /></fo:inline>
-</xsl:template><xsl:template match="subscript">
- <fo:inline baseline-shift="sub"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="subtitle" mode="sidebar">
- <fo:block>
- <fo:inline font-weight="bold"><xsl:value-of select="text()" /></fo:inline>
- </fo:block>
-</xsl:template>
-
-
-
-<xsl:template match="subtitle" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="sub_title_position">
- <fo:block xsl:use-attribute-sets="sub_title_text">
- <xsl:apply-templates />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="superscript">
- <fo:inline baseline-shift="super"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<!--
-Never output to PDF; used only for reference links.
--->
-<xsl:template match="section/title">
- <xsl:variable name="level" select="count(ancestor::section)" />
- <xsl:choose>
- <xsl:when test="$level = 1">
- <!-- special case, handled by the chapter first-page template -->
- </xsl:when>
- <xsl:when test="$level = 2">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level1">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="$level = 3">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level2">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="$level = 4">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level3">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:otherwise>
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level4up">
- <xsl:apply-templates />
- </fo:block>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="title" mode="colophon">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="title" mode="copyright">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-<xsl:template match="title" mode="safeguards">
- <fo:block id="{../@id}" xsl:use-attribute-sets="safeguards_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template><xsl:template match="title" mode="sidebar">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-
-<xsl:template match="title" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="main_title_position">
- <fo:block xsl:use-attribute-sets="main_title_text">
- <xsl:apply-templates />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="title" mode="topic">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-
-
-<xsl:template match="title" mode="versions">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-<!--
-Used in the reference templates; a placeholder should one want to do anything
-interesting with the text used in the reference.
-Note that the actual link face formatting is handled in the reference
-template.
--->
-<xsl:template match="title" mode="xref">
- <xsl:apply-templates />
-</xsl:template>
-
-<xsl:template match="title_reference">
- <fo:inline xsl:use-attribute-sets="sans_italic_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<xsl:template match="ui_shortcut">
- <fo:inline xsl:use-attribute-sets="mono_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="ui_guilabel">
- <fo:inline xsl:use-attribute-sets="sans_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="ui_command">
- <fo:inline xsl:use-attribute-sets="sans_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template><!-- show ancestors of current node -->
-<xsl:template name="u:an">
- <xsl:variable name="full-path">
- <xsl:for-each select="ancestor-or-self::*">
- <xsl:value-of select="concat('/',name())" />
- </xsl:for-each>
- </xsl:variable>
- <xsl:message><xsl:value-of select="$full-path" /></xsl:message>
-</xsl:template>
-
-<!-- show all children of current node -->
-<xsl:template name="u:ch">
- <xsl:for-each select="descendant::*">
- <xsl:call-template name="u:ch" />
- </xsl:for-each>
- <xsl:if test="count(child::*) = 0">
- <xsl:call-template name="u:an" />
- </xsl:if>
-</xsl:template>
-
-<!-- show immediate children of current node -->
-<xsl:template name="u:ch1">
- <xsl:for-each select="*">
- <xsl:call-template name="u:an" />
- </xsl:for-each>
-</xsl:template><!-- return filename for document containing the current node -->
-<xsl:template name="u:docinfo-filename">
- <xsl:param name="thisNode" select="self::*"/>
- <xsl:variable name="fname">
- <xsl:value-of select="($thisNode/ancestor-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$RCSfile:')]/text())[last()]" />
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($fname,'RCSfile: '), ',v $'))" />
-</xsl:template>
-
-<!-- return docinfo date -->
-<xsl:template name="u:docinfo-date">
- <xsl:param name="whichNodes">self</xsl:param>
- <xsl:variable name="date">
- <xsl:choose>
- <xsl:when test="$whichNodes=self">
- <!-- just the current node's docinfo -->
- <xsl:value-of select="./field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Date:')]/text()" />
- </xsl:when>
- <xsl:otherwise>
- <!-- find the most-recent from all the children -->
- <!-- dammit, this DOES NOT WORK -->
- <xsl:for-each select="descendant-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Date:')]/text()" >
- <xsl:sort select="." data-type="number" order="descending" />
- <xsl:if test="position()=1">
- <xsl:copy-of select="." />
- </xsl:if>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($date,'Date: '), ' $'))" />
-</xsl:template>
-
-<!-- return docinfo revision -->
-<xsl:template name="u:docinfo-revision">
- <xsl:param name="whichNodes">self</xsl:param>
- <xsl:variable name="rev">
- <xsl:choose>
- <!-- just the current node's docinfo -->
- <xsl:when test="$whichNodes = 'self'">
- <xsl:value-of select="./field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Revision:')]/text()" />
- </xsl:when>
- <xsl:otherwise>
- <!-- find the most-recent from all the children -->
- <!-- dammit, this DOES NOT WORK -->
- <xsl:for-each select="descendant-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Revision:')]/text()" >
- <xsl:sort select="." data-type="number" order="descending" />
- <xsl:if test="position()=1">
- <xsl:value-of select="." />
- </xsl:if>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($rev,'Revision: '), ' $'))" />
-</xsl:template>
-
-<!-- turn slashes into line-breakable slashes -->
-<xsl:template name="u:make-breakable">
- <xsl:param name="string" />
- <xsl:variable name="breakables">
- &#x0021;&#x0022;&#x0023;&#x0024;&#x0025;&#x0026;&#x0027;
- &#x0028;&#x0029;&#x002A;&#x002B;&#x002C;&#x002D;&#x002E;
- &#x002F;&#x003A;&#x003B;&#x003C;&#x003D;&#x003E;&#x003F;
- &#x0040;&#x005B;&#x005C;&#x005D;&#x005E;&#x005F;&#x0060;
- </xsl:variable>
-
- <xsl:if test="string-length($string) &gt; 0">
- <xsl:variable name="c1" select="substring($string, 1, 1)" />
- <xsl:choose>
- <xsl:when test="contains($breakables, $c1)">
- <fo:character treat-as-word-space="true">
- <xsl:attribute name="character">
- <xsl:value-of select="$c1" />
- </xsl:attribute>
- </fo:character>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$c1" />
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:call-template name="u:make-breakable">
- <xsl:with-param name="string" select="substring($string, 2)"/>
- </xsl:call-template>
- </xsl:if>
-</xsl:template>
-<!-- A DISCARD FUNCTION -->
-<xsl:template match="*" mode="discard">
- <xsl:message>
- <xsl:text>Discarded: </xsl:text>
- <xsl:value-of select="text()" />
- </xsl:message>
-</xsl:template>
-
-<!-- REPORT UNKNOWN TAGS -->
-<xsl:template match="*">
- <xsl:message>
- <xsl:value-of select="name(.)" />
- <xsl:text> encountered</xsl:text>
- <xsl:if test="parent::*">
- <xsl:text> in </xsl:text>
- <xsl:value-of select="name(parent::*)" />
- </xsl:if>
- <xsl:text>, but no template matches.</xsl:text>
- </xsl:message>
- <!-- highlight in red in the output -->
- <fo:block >
- <xsl:text>&lt;</xsl:text>
- <xsl:value-of select="name(.)" />
- <xsl:text>&gt;</xsl:text>
- <xsl:apply-templates />
- <xsl:text>&lt;/</xsl:text>
- <xsl:value-of select="name(.)" />
- <xsl:text>&gt;</xsl:text>
- </fo:block>
-</xsl:template>
-
-</xsl:stylesheet>
-
-
diff --git a/sandbox/dpriest/XSL-FO/pdf_publication.xsl b/sandbox/dpriest/XSL-FO/pdf_publication.xsl
deleted file mode 100644
index 0d923fb24..000000000
--- a/sandbox/dpriest/XSL-FO/pdf_publication.xsl
+++ /dev/null
@@ -1,2181 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Generates a PDF that DOES NOT include highlighted comments, errors, and
-suchlike.
- Suitable for end-users.
--->
-<!--
-Set namespace extensions. These are used as [shortname]:[tag] throughout the
-XSL-FO files.
-xsl: eXtensible Stylesheet Language (all are implemented by Saxon)
-fo: XSL Formatting Objects (almost all are implemented by XEP and FOP)
-svg: SVG (Scalable Vector Graphics - only a subset is implemented by XEP and
-FOP)
-rx: XEP extensions (RenderX XEP PDF-creation product)
-fox: FOP extensions (Apache FOP PDF-creation product, open-source)
-saxon: SAXON extensions (Saxon XSL transformation product, open-source)
-u: user extensions (indicates utility 'call-template' routines defined in
-these XSL files)
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:fox="http://xml.apache.org/fop/extensions"
- xmlns:saxon="http://icl.com/saxon"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:u="U" >
-
-<!--
-indent: indent FO output for better human readability (may cause side
-effects).
-publish-comments: show ReST comments ('..comment').
-publish_filenotes: show ReST file notes ('..file notes').
-publish_problematics: show DocUtils-generated problematic error messages.
-system_messages: show DocUtils-generated system messages.
--->
-<xsl:output indent="no" saxon:indent-spaces="0" />
-<xsl:variable name="publish_comments">not-enabled</xsl:variable>
-<xsl:variable name="publish_filenotes">not-enabled</xsl:variable>
-<xsl:variable name="publish_problematics">not-enabled</xsl:variable>
-<xsl:variable name="system_messages">not-enabled</xsl:variable><!--
-All inline-level attribute are named "foo_bar"
-Most block-level attributes are named "foo_bar_block" EXCEPT when the block
-contains only a text override
-All region attributes are named "foo_region_bar"
--->
-<!--
-The size of a standard page.
-TO DO: perhaps have a selection of standard sizes, and a single variable to
-select from them.
--->
-<xsl:attribute-set name="paper_size">
- <xsl:attribute name="page-width">8.5in</xsl:attribute>
- <xsl:attribute name="page-height">11in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="page_size" use-attribute-sets="paper_size">
- <xsl:attribute name="margin-top">0.33in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0.33in</xsl:attribute>
-</xsl:attribute-set>
-<!--
-Page margins for almost all pages, with exceptions as defined below.
--->
-<xsl:attribute-set name="generic_region_body">
- <xsl:attribute name="margin-left">1.0in</xsl:attribute>
- <xsl:attribute name="margin-right">1.0in</xsl:attribute>
- <xsl:attribute name="margin-top">0.33in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0.33in</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-Page margins for some exceptional pages (Safeguards warning, Versions list,
-etc)
--->
-<xsl:attribute-set name="large_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.5in</xsl:attribute>
- <xsl:attribute name="margin-right">0.5in</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid blue</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="maximum_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-top">0in</xsl:attribute>
- <xsl:attribute name="margin-bottom">0in</xsl:attribute>
- <xsl:attribute name="margin-left">0in</xsl:attribute>
- <xsl:attribute name="margin-right">0in</xsl:attribute>
- <xsl:attribute name="padding">0in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="chapter_flow">
- <xsl:attribute name="start-indent">1.75in</xsl:attribute>
- <xsl:attribute name="end-indent">1.75in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="generic_region_before_first">
- <xsl:attribute name="region-name">xsl-region-before</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">before</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_after_first">
- <xsl:attribute name="region-name">xsl-region-after</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">after</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_before_first" use-attribute-sets="generic_region_before_first" />
-
-<xsl:attribute-set name="chapter_region_after_first" use-attribute-sets="generic_region_after_first">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-top">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="generic_region_start_first">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_first">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="generic_region_before">
- <xsl:attribute name="region-name">xsl-region-before</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">before</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_after">
- <xsl:attribute name="region-name">xsl-region-after</xsl:attribute>
- <xsl:attribute name="extent">0.25in</xsl:attribute>
- <xsl:attribute name="display-align">after</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_before" use-attribute-sets="generic_region_before">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-bottom">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="chapter_region_after" use-attribute-sets="generic_region_after">
- <xsl:attribute name="background-color">#F5F5F5</xsl:attribute>
- <xsl:attribute name="border-top">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="generic_region_start">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="balanced_region_start">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">1.5in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="balanced_region_end">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1.5in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="generic_region_start_odd">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_odd">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-
-<xsl:attribute-set name="generic_region_start_even">
- <xsl:attribute name="region-name">xsl-region-start</xsl:attribute>
- <xsl:attribute name="extent">1in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_region_end_even">
- <xsl:attribute name="region-name">xsl-region-end</xsl:attribute>
- <xsl:attribute name="extent">2in</xsl:attribute>
- <xsl:attribute name="precedence">true</xsl:attribute>
-<!-- <xsl:attribute name="border">1px solid green</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="header_text" use-attribute-sets="serif_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="footer_text" use-attribute-sets="serif_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="header_text_firstpage" use-attribute-sets="header_text" />
-
-<xsl:attribute-set name="footer_text_firstpage" use-attribute-sets="footer_text" />
-
-<xsl:attribute-set name="titlepage_region_body" use-attribute-sets="maximum_region_body" /><xsl:attribute-set name="safeguards_region_body" use-attribute-sets="large_region_body">
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-right">1.5in</xsl:attribute>
- <xsl:attribute name="column-count">2</xsl:attribute>
- <xsl:attribute name="column-gap">.25in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="simple_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-right">1.5in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="toc_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">2.0in</xsl:attribute>
- <xsl:attribute name="margin-right">1.0in</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="chapter_firstpage_region_body" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.25in</xsl:attribute>
- <xsl:attribute name="margin-right">-0.75in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_body_odd" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">0.25in</xsl:attribute>
- <xsl:attribute name="margin-right">-0.75in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_region_body_even" use-attribute-sets="generic_region_body">
- <xsl:attribute name="margin-left">-0.75in</xsl:attribute>
- <xsl:attribute name="margin-right">0.25in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="swirlie_position">
- <xsl:attribute name="absolute-position">absolute</xsl:attribute>
- <xsl:attribute name="left">0in</xsl:attribute>
- <xsl:attribute name="top">0in</xsl:attribute>
- <xsl:attribute name="overflow">visible</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="main_title_position">
- <xsl:attribute name="position">absolute</xsl:attribute>
- <xsl:attribute name="left">1.5in</xsl:attribute>
- <xsl:attribute name="top">2in</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="main_title_text" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">32pt</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sub_title_position">
- <xsl:attribute name="position">absolute</xsl:attribute>
- <xsl:attribute name="left">1.5in</xsl:attribute>
- <xsl:attribute name="top">2.5in</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sub_title_text" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">24pt</xsl:attribute>
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="logo_position">
- <xsl:attribute name="absolute-position">absolute</xsl:attribute>
- <xsl:attribute name="left">6.5in</xsl:attribute>
- <xsl:attribute name="top">9.0in</xsl:attribute>
- <xsl:attribute name="overflow">visible</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="docinfo_block" use-attribute-sets="serif_face">
- <xsl:attribute name="overflow">visible</xsl:attribute>
- <xsl:attribute name="vertical-align">bottom</xsl:attribute>
- <xsl:attribute name="margin-left">1.5in</xsl:attribute>
- <xsl:attribute name="margin-bottom">1.0in</xsl:attribute>
-</xsl:attribute-set>
-
-
-
-
-<xsl:attribute-set name="safeguards_title" use-attribute-sets="chapter_title">
- <xsl:attribute name="span">all</xsl:attribute>
- <xsl:attribute name="margin-bottom">9pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_chapterblock">
- <xsl:attribute name="space-before">3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_chapterentry">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="book_toc_sectionentry" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="margin-left">.25in</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-See Titles/Special Titles branch. Applied to copyright, colophon, doc
-versioning, etc.
--->
-<xsl:attribute-set name="chapter_title_block">
- <xsl:attribute name="color">#FFFFFF</xsl:attribute>
- <xsl:attribute name="background-color">#006400</xsl:attribute>
- <xsl:attribute name="margin-bottom">9pt</xsl:attribute>
- <xsl:attribute name="padding-left">3pt</xsl:attribute>
- <xsl:attribute name="padding-right">3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title" use-attribute-sets="titles">
- <xsl:attribute name="font-size">24pt</xsl:attribute>
- <xsl:attribute name="line-height">32pt</xsl:attribute>
- <xsl:attribute name="color">#FFFFFF</xsl:attribute>
- <xsl:attribute name="background-color">#006400</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title_left" use-attribute-sets="chapter_title">
- <xsl:attribute name="background-color">transparent</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_title_right" use-attribute-sets="chapter_title">
- <xsl:attribute name="background-color">transparent</xsl:attribute>
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter-toc" use-attribute-sets="titles">
- <xsl:attribute name="space-before">24pt</xsl:attribute>
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_toc_entry" use-attribute-sets="titles">
- <xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter_toc_pagenum" use-attribute-sets="titles">
-<xsl:attribute name="text-align">right</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="chapter-rule">
- <xsl:attribute name="leader-length">100%</xsl:attribute>
- <xsl:attribute name="leader-pattern">rule</xsl:attribute>
- <xsl:attribute name="alignment-baseline">middle</xsl:attribute>
- <xsl:attribute name="space-before">18pt</xsl:attribute>
- <xsl:attribute name="rule-thickness">0.5pt</xsl:attribute>
- <xsl:attribute name="color">#006400</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="doc_version_info" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">8pt</xsl:attribute>
- <xsl:attribute name="text-align-last">justify</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_text" use-attribute-sets="sans_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="space-before">3pt</xsl:attribute>
- <xsl:attribute name="space-after">3pt</xsl:attribute>
- <xsl:attribute name="hyphenate">true</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="serif_face">
- <xsl:attribute name="font-family">OfficinaSerif</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_bold_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_italic_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="serif_bold_italic_face" use-attribute-sets="serif_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="sans_face">
- <xsl:attribute name="font-family">OfficinaSans</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_bold_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_italic_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sans_bold_italic_face" use-attribute-sets="sans_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<!--
-See the /XEP/etc/fonts.xml file for font-family definitions.
--->
-<xsl:attribute-set name="mono_face">
- <xsl:attribute name="font-family">monospace</xsl:attribute>
- <xsl:attribute name="font-weight">normal</xsl:attribute>
- <xsl:attribute name="font-style">normal</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_bold_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_italic_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="mono_bold_italic_face" use-attribute-sets="mono_face">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-style">italic</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="generic_block" use-attribute-sets="generic_text" />
-<xsl:attribute-set name="admonition_block">
- <xsl:attribute name="space-before">6pt</xsl:attribute>
- <xsl:attribute name="space-after">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_block_with_icon" use-attribute-sets="admonition_block">
- <xsl:attribute name="keep-together">always</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) - 0.33in</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_icon_float">
- <xsl:attribute name="float">left</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="admonition_icon_block" />
-
-<xsl:attribute-set name="admonition_with_icon" use-attribute-sets="admonition_block">
- <xsl:attribute name="intrusion-displace">none</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) + 0.33in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="attention_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="danger_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="error_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="hint_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="note_block" use-attribute-sets="admonition_block" /><xsl:attribute-set name="important_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid blue</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="tip_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid green</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set><xsl:attribute-set name="caution_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-left">1pt solid olive</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-right">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="warning_block" use-attribute-sets="admonition_with_icon">
-<!-- <xsl:attribute name="border-right">1pt solid red</xsl:attribute>
- <xsl:attribute name="border-bottom">none</xsl:attribute>
- <xsl:attribute name="border-left">none</xsl:attribute>
- <xsl:attribute name="border-top">none</xsl:attribute> -->
-</xsl:attribute-set>
-<xsl:attribute-set name="list_block" use-attribute-sets="generic_block">
- <xsl:attribute name="provisional-label-separation">0em</xsl:attribute>
- <xsl:attribute name="provisional-distance-between-starts">1em</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="list_item_label" use-attribute-sets="sans_face" />
-
-<xsl:attribute-set name="list_item" /><xsl:attribute-set name="bulleted_list_item" use-attribute-sets="list_item">
- <xsl:attribute name="margin-left">1em</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="bulleted_list_item_1stparagraph" use-attribute-sets="bulleted_list_item">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="bulleted_list_item_label" use-attribute-sets="list_item_label">
- <xsl:attribute name="baseline-shift">6pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="enumerated_list_item" use-attribute-sets="list_item" />
-
-<xsl:attribute-set name="enumerated_list_item_1stparagraph" use-attribute-sets="enumerated_list_item">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="definition_block" use-attribute-sets="generic_block" />
-<xsl:attribute-set name="definition_item_block" use-attribute-sets="definition_block">
- <xsl:attribute name="provisional-label-separation">0.5em</xsl:attribute>
- <xsl:attribute name="provisional-distance-between-starts">1em</xsl:attribute>
- <xsl:attribute name="keep-together">always</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="definition_term" use-attribute-sets="generic_text sans_bold_face">
- <xsl:attribute name="space-after">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="definition_classifier" use-attribute-sets="generic_text" />
-
-<xsl:attribute-set name="definition_definition" use-attribute-sets="generic_text">
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) + 0.25in</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="literal_block" use-attribute-sets="generic_block">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
- <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="figure_block" use-attribute-sets="generic_block">
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="footnote_block" use-attribute-sets="generic_block" />
-
-<xsl:attribute-set name="block_quote_block" use-attribute-sets="generic_block">
- <xsl:attribute name="padding">12pt</xsl:attribute>
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sidebar_block" use-attribute-sets="generic_block" >
- <xsl:attribute name="width">1.75in - 6pt - 0.5em</xsl:attribute>
- <xsl:attribute name="start-indent">inherited-property-value(start-indent) - 1.75in + 3pt</xsl:attribute>
- <xsl:attribute name="end-indent">inherited-property-value(end-indent) - 1.75in + 3pt</xsl:attribute>
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
- <xsl:attribute name="padding">3pt</xsl:attribute>
- <xsl:attribute name="background-color">#F5FFFA</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="sidebar_float">
- <xsl:attribute name="float">inside</xsl:attribute>
- <xsl:attribute name="clear">none</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="topic_block" use-attribute-sets="generic_block" >
- <xsl:attribute name="border">0pt double #BEBEBE</xsl:attribute>
- <xsl:attribute name="background-color">#F5FFFA</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="line_block" use-attribute-sets="generic_block">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="image_block">
- <xsl:attribute name="space-before">6pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="external_graphic">
- <xsl:attribute name="content-width">scale-to-fit</xsl:attribute>
- <xsl:attribute name="content-height">scale-to-fit</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="emphasis">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="footnote_ref" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="font-size">xx-small</xsl:attribute>
- <xsl:attribute name="baseline-shift">super</xsl:attribute>
- <xsl:attribute name="vertical-align">super</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="literal_text">
- <xsl:attribute name="white-space-collapse">false</xsl:attribute>
- <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="reference" use-attribute-sets="sans_italic_face" />
-
-
-<xsl:attribute-set name="generic_matter_title" use-attribute-sets="sans_bold_face titles">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="line-height">14pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="titles" use-attribute-sets="serif_bold_face">
- <xsl:attribute name="font-size">10pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="keep-with-next">always</xsl:attribute>
- <xsl:attribute name="space-after">0pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="title-level1" use-attribute-sets="titles">
- <xsl:attribute name="font-size">18pt</xsl:attribute>
- <xsl:attribute name="line-height">24pt</xsl:attribute>
- <xsl:attribute name="border-top">3pt solid #006400</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #006400</xsl:attribute>
- <xsl:attribute name="padding-right">3pt</xsl:attribute>
- <xsl:attribute name="space-before">18pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="title-level2" use-attribute-sets="titles">
- <xsl:attribute name="font-size">14pt</xsl:attribute>
- <xsl:attribute name="line-height">14pt</xsl:attribute>
- <xsl:attribute name="space-before">12pt</xsl:attribute>
-</xsl:attribute-set>
-
- <xsl:attribute-set name="title-level3" use-attribute-sets="titles">
- <xsl:attribute name="font-size">12pt</xsl:attribute>
- <xsl:attribute name="line-height">12pt</xsl:attribute>
- <xsl:attribute name="space-before">12pt</xsl:attribute>
- </xsl:attribute-set>
-
-<xsl:attribute-set name="title-level4up" use-attribute-sets="titles">
-</xsl:attribute-set>
-
-
-<xsl:attribute-set name="table_block" use-attribute-sets="generic_block">
- <xsl:attribute name="border">0.5pt solid #BEBEBE</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="table_head" use-attribute-sets="sans_bold_face">
- <xsl:attribute name="background-color">#DCDCDC</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="table_body" use-attribute-sets="sans_face" />
-
-<xsl:attribute-set name="table_row" />
- <!-- no FOP support for margins, padding, etc? -->
-
-<xsl:variable name="even_row-color">#F0FFF0</xsl:variable>
-<xsl:variable name="odd_row-color">#FFFFFF</xsl:variable>
-<xsl:attribute-set name="table_entry">
- <xsl:attribute name="start-indent">0pt</xsl:attribute>
- <xsl:attribute name="end-indent">0pt</xsl:attribute>
- <xsl:attribute name="padding">3pt 3pt 1.5pt 3pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="table_entry_1stparagraph" use-attribute-sets="generic_text">
- <xsl:attribute name="space-before">0pt</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="marker_text">
-<!-- FOP bug requires overriding most of parent's attributes to
-prevent that style being applied when retrieved -->
-<!-- <xsl:attribute name="font-family">OfficinaSerifBook,serif</xsl:attribute>
-<xsl:attribute name="font-weight">normal</xsl:attribute>
-<xsl:attribute name="font-style">normal</xsl:attribute>
-<xsl:attribute name="font-size">10pt</xsl:attribute>
-<xsl:attribute name="line-height">0pt</xsl:attribute>
-<xsl:attribute name="space-before">0pt</xsl:attribute>
-<xsl:attribute name="space-before.precedence">3.0</xsl:attribute>
-<xsl:attribute name="space-after">0pt</xsl:attribute>
-<xsl:attribute name="space-before.precedence">3.0</xsl:attribute>
-<xsl:attribute name="margin">0pt</xsl:attribute>
-<xsl:attribute name="border">0pt</xsl:attribute>
-<xsl:attribute name="padding">0pt</xsl:attribute>
-<xsl:attribute name="color">#000000</xsl:attribute>
---> </xsl:attribute-set>
-
-<xsl:attribute-set name="internal_link" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="color">#006400</xsl:attribute>
-</xsl:attribute-set>
-<xsl:attribute-set name="external_link" use-attribute-sets="sans_bold_italic_face">
- <xsl:attribute name="color">#191970</xsl:attribute>
-</xsl:attribute-set><xsl:attribute-set name="review_text">
- <xsl:attribute name="color">#00008B</xsl:attribute>
- <xsl:attribute name="margin-left">-12pt</xsl:attribute>
- <xsl:attribute name="margin-right">-12pt</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #0000FF</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #0000FF</xsl:attribute>
- <xsl:attribute name="padding-left">9pt</xsl:attribute>
- <xsl:attribute name="padding-right">9pt</xsl:attribute></xsl:attribute-set>
-
-<xsl:attribute-set name="docutil_message" use-attribute-sets="generic_text">
- <xsl:attribute name="font-family">sans-serif</xsl:attribute>
- <xsl:attribute name="color">#00008B</xsl:attribute>
- <xsl:attribute name="margin-left">-12pt</xsl:attribute>
- <xsl:attribute name="margin-right">-12pt</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #00008B</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #00008B</xsl:attribute>
- <xsl:attribute name="padding-left">9pt</xsl:attribute>
- <xsl:attribute name="padding-right">9pt</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="comment" use-attribute-sets="docutil_message">
- <xsl:attribute name="color">#8B0000</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid #8B0000</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid #8B0000</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="problem" use-attribute-sets="docutil_message" />
-
-<xsl:attribute-set name="system_message" use-attribute-sets="docutil_message">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
-</xsl:attribute-set>
-
-<xsl:attribute-set name="unknown_tag" use-attribute-sets="docutil_message">
- <xsl:attribute name="color">#FF0000</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="border-left">3pt solid red</xsl:attribute>
- <xsl:attribute name="border-right">3pt solid red</xsl:attribute>
-</xsl:attribute-set>
-
-<!--
-This branch defines the structure of the book, both at the book level (the
-sequence of sections) and the page level (start, end, before, after, and body
-regions.)
--->
-<xsl:template match="/">
- <fo:root>
- <!--
- Define the page architecture for all sections of the document.
- -->
- <fo:layout-master-set>
- <!--
- Title pages have no before/after//start/end areas so that the LCS
- "Swirlie" logo can go to the edges.
- There is currently no proper end-page
- -->
- <fo:simple-page-master master-name="Title Page" xsl:use-attribute-sets="paper_size">
- <fo:region-body xsl:use-attribute-sets="titlepage_region_body" /> <!-- No region before/after::start/end areas -->
- </fo:simple-page-master> <!--
- Safeguards uses a two-column format.
- -->
- <fo:simple-page-master master-name="Safeguards" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="safeguards_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="generic_region_after" />
- <fo:region-start xsl:use-attribute-sets="balanced_region_start" />
- <fo:region-end xsl:use-attribute-sets="balanced_region_end" />
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Simple Frontmatter" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="simple_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="generic_region_after" />
- <fo:region-start xsl:use-attribute-sets="balanced_region_start" />
- <fo:region-end xsl:use-attribute-sets="balanced_region_end" />
- </fo:simple-page-master>
-
- <!--
- Preface and other frontmatter chapters are handled as a variation
- of chapter.
- -->
- <fo:simple-page-master master-name="ToC" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="toc_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
- </fo:simple-page-master>
-
-
-
- <!--
- For our purposes, first pages *always* start on an odd page.
- -->
- <fo:simple-page-master master-name="Chapter First Page" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_firstpage_region_body" />
- <fo:region-before xsl:use-attribute-sets="generic_region_before_first" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after_first" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
-
-
-
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Chapter Odd Pages" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_region_body_odd" /> <fo:region-before xsl:use-attribute-sets="chapter_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_odd" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_odd" />
- </fo:simple-page-master>
-
- <fo:simple-page-master master-name="Chapter Even Pages" xsl:use-attribute-sets="page_size">
- <fo:region-body xsl:use-attribute-sets="chapter_region_body_even" /> <fo:region-before xsl:use-attribute-sets="chapter_region_before" />
- <fo:region-after xsl:use-attribute-sets="chapter_region_after" />
- <fo:region-start xsl:use-attribute-sets="generic_region_start_even" />
- <fo:region-end xsl:use-attribute-sets="generic_region_end_even" />
- </fo:simple-page-master>
-
- <!--
- Used by core transformations when the section type can not be
- identified.
- -->
- <fo:simple-page-master master-name="Unknown FM_EM" xsl:use-attribute-sets="page_size" >
- <fo:region-body xsl:use-attribute-sets="generic_region_body" />
- </fo:simple-page-master>
- <!--
- Sections can have varying page architecture (layout masters). Some
- macro-style definitions account for the most common section parts,
- as various combinations of first, last, in-between ("rest"), even,
- and odd pages.
- -->
- <fo:page-sequence-master master-name="Chapter">
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference master-reference="Chapter First Page" page-position="first" />
- <fo:conditional-page-master-reference master-reference="Chapter Odd Pages" page-position="rest" odd-or-even="odd" />
- <fo:conditional-page-master-reference master-reference="Chapter Even Pages" page-position="rest" odd-or-even="even" />
- <fo:conditional-page-master-reference master-reference="Chapter Even Pages" page-position="last" odd-or-even="even" />
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master> </fo:layout-master-set>
- <!--
- Define the page sequence for all sections of the document.
- -->
- <fo:page-sequence master-reference="Title Page" initial-page-number="0">
- <fo:flow flow-name="xsl-region-body">
- <fo:block>
- <!-- images applied before text are placed behind the text -->
- <xsl:apply-templates select="//document/image" mode="titlepage" />
- <xsl:apply-templates select="//document/title | //document/subtitle | //document/docinfo" mode="titlepage" />
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- <xsl:for-each select="//document/section[@class = 'specialfrontmatter']">
- <xsl:choose>
- <xsl:when test="@id='important-safeguards'">
- <fo:page-sequence master-reference="Safeguards" format="i" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="safeguards" />
- <fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" mode="safeguards" />
- <!-- the admonitions template will strip off mode="safeguards" after it has handled the title specially -->
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:when> <xsl:when test="@id='copyright-and-trademark-information'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="i" initial-page-number="auto-even">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="copyright" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:otherwise>
- <fo:page-sequence master-reference="Unknown" initial-page-number="auto-odd">
- <fo:flow flow-name="xsl-region-body">
- <fo:block xsl:use-attribute-sets="unknown_tag" border="1px solid red">
- <xsl:text> Special Frontmatter: Section </xsl:text>
- <xsl:value-of select="@id" />
- <xsl:text> (</xsl:text><xsl:value-of select="@name" /><xsl:text>) not implemented; see PDF.XSL page sequencing templates.</xsl:text>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- <!--
- The table of contents is generated on-the-fly; it is not available (or
- is ignored) in the source XML file.
- -->
- <fo:page-sequence master-reference="ToC" format="i" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <xsl:text>Contents</xsl:text>
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:call-template name="u:book_toc_title" />
- <xsl:call-template name="u:book_toc" />
- </fo:flow >
- </fo:page-sequence>
-
- <xsl:for-each select="//document/section[@class = 'frontmatter']">
- <fo:page-sequence master-reference="Chapter" format="i" initial-page-number="auto-odd">
- <!--
- First page has the version number and page number in the
- footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in header,
- chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:not_numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:for-each>
-
-
-
- <xsl:for-each select="//document/section[not(@class = 'frontmatter' or @class = 'specialfrontmatter' or @class = 'endmatter' or @class = 'specialendmatter')]">
- <xsl:choose>
- <!--
- The first chapter needs to get page 1.
- -->
- <xsl:when test="position() = 1">
- <fo:page-sequence master-reference="Chapter" format="1" initial-page-number="1">
- <!--
- First page has the version number and page number in
- the footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in
- header, chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when> <xsl:otherwise>
- <!-- not the first chapter, page numbering follows previous chapter -->
- <fo:page-sequence master-reference="Chapter" format="1" initial-page-number="auto-odd">
- <!--
- First page has the version number and page number in
- the footer region.
- -->
- <fo:static-content flow-name="xsl-region-before-first">
- <fo:block xsl:use-attribute-sets="header_text_firstpage">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after-first">
- <fo:block xsl:use-attribute-sets="footer_text_firstpage">
- <xsl:text>v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content> <!--
- Remaining pages place document version number in
- header, chapter name and page number in footer
- -->
- <fo:static-content flow-name="xsl-region-before">
- <fo:block xsl:use-attribute-sets="header_text">
- <xsl:text> v</xsl:text>
- <xsl:call-template name="u:docinfo-revision" />
- </fo:block>
- </fo:static-content>
-
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="chapter_flow">
- <xsl:call-template name="u:numbered_chapter_title" />
- <xsl:call-template name="u:chapter_toc" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each> <xsl:for-each select="//document/section[@class = 'specialendmatter']">
- <xsl:choose>
- <xsl:when test="@id='colophon'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="1" initial-page-number="auto">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="colophon" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:when test="@id='documentation-versions-reference'">
- <fo:page-sequence master-reference="Simple Frontmatter" format="1" initial-page-number="auto-odd">
- <fo:static-content flow-name="xsl-region-after">
- <fo:block xsl:use-attribute-sets="footer_text">
- <fo:retrieve-marker retrieve-class-name="chapter" />
- <fo:leader leader-pattern="space" />
- <fo:page-number />
- </fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <xsl:apply-templates select="title" mode="versions" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- <xsl:call-template name="u:list_versions" />
- </fo:flow>
- </fo:page-sequence>
- </xsl:when>
- <xsl:otherwise>
- <fo:page-sequence master-reference="Unknown" initial-page-number="auto-odd">
- <fo:flow flow-name="xsl-region-body">
- <fo:block xsl:use-attribute-sets="unknown_tag">
- <xsl:text> Special Endmatter: Section </xsl:text>
- <xsl:value-of select="@id" />
- <xsl:text> (</xsl:text><xsl:value-of select="@name" /><xsl:text>) not implemented; see PDF.XSL page sequencing templates.</xsl:text>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- </fo:root>
-</xsl:template><!--
-This branch defines the layout of significant parts of the book.
--->
-<xsl:template name="u:book_toc_title">
- <fo:block xsl:use-attribute-sets="chapter_title">
- <xsl:text>Table of Contents</xsl:text>
- </fo:block>
-</xsl:template><xsl:template name="u:book_toc">
- <!-- don't include special front/end matter (safeguards, copyright, colophon, etc) -->
- <xsl:for-each select="//document/section[not(@class = 'specialfrontmatter' or @class = 'specialendmatter')]/title">
- <fo:block xsl:use-attribute-sets="book_toc_chapterblock">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="./text()" /></fo:marker>
- <fo:block xsl:use-attribute-sets="book_toc_chapterentry">
- <fo:basic-link internal-destination="{../@id}" xsl:use-attribute-sets="internal_link">
- <xsl:value-of select="./text()" />
- <fo:leader leader-pattern="space" /><fo:page-number-citation ref-id="{../@id}"/>
- </fo:basic-link>
- </fo:block>
- <!-- include major sections within the chapter -->
- <xsl:for-each select="../section/title">
- <fo:block xsl:use-attribute-sets="book_toc_sectionentry">
- <xsl:value-of select="./text()" />
- </fo:block>
- </xsl:for-each>
- </fo:block>
- </xsl:for-each>
-</xsl:template>
-<xsl:template name="u:not_numbered_chapter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="./title/text()" /></fo:marker>
- <fo:list-block id="{@id}" xsl:use-attribute-sets="chapter_title_block">
- <fo:list-item>
- <fo:list-item-label end-indent="label-end()" />
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_title_right">
- <xsl:value-of select="./title/text()" />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
-</xsl:template><xsl:template name="u:numbered_chapter_title">
- <!-- start of a chapter. fiddlefart around to get nice numbering -->
- <fo:marker marker-class-name="chapter"><xsl:value-of select="title/text()" /></fo:marker>
- <fo:list-block id="{@id}" xsl:use-attribute-sets="chapter_title_block">
- <fo:list-item>
- <fo:list-item-label end-indent="label-end()">
- <fo:block xsl:use-attribute-sets="chapter_title_left">
- <xsl:value-of select="count(preceding-sibling::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]) + 1" />
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_title_right">
- <xsl:value-of select="title/text()" />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
-</xsl:template><xsl:template name="u:chapter_toc">
- <xsl:for-each select="section/title">
- <fo:block>
- <fo:list-block>
- <fo:list-item>
- <fo:list-item-label end-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_toc_entry">
- <fo:basic-link internal-destination="{../@id}" xsl:use-attribute-sets="internal_link">
- <xsl:value-of select="./text()" />
- </fo:basic-link>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block xsl:use-attribute-sets="chapter_toc_pagenum">
- <fo:page-number-citation ref-id="{../@id}"/>
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:block>
- </xsl:for-each>
- <fo:block>
- <fo:leader xsl:use-attribute-sets="chapter-rule" />
- </fo:block>
-</xsl:template><xsl:template name="u:list_versions">
- <xsl:for-each select="//document">
- <fo:block>
- <xsl:call-template name="u:printfilename">
- <xsl:with-param name="FName">
- <xsl:call-template name="u:docinfo-filename" />
- </xsl:with-param>
- </xsl:call-template>
- <!-- process all sections/subsections/etc of document -->
- <xsl:for-each select="//section">
- <xsl:call-template name="u:printfilename">
- <xsl:with-param name="FName">
- <xsl:call-template name="u:docinfo-filename" />
- </xsl:with-param>
- </xsl:call-template>
- </xsl:for-each>
- </fo:block>
- </xsl:for-each>
-</xsl:template>
-
-<xsl:template name="u:printfilename">
- <xsl:param name="FName">(filename not known)</xsl:param>
-
- <!-- discover filename of ancestor -->
- <xsl:variable name="ancestorFName">
- <xsl:call-template name="u:docinfo-filename" >
- <xsl:with-param name="thisNode" select="ancestor::*" />
- </xsl:call-template>
- </xsl:variable>
-
- <xsl:variable name="level">
- <xsl:value-of select="count(ancestor::section) - count(self::document) + 1" />
- </xsl:variable>
-
- <xsl:variable name="revision">
- <xsl:call-template name="u:docinfo-revision" />
- </xsl:variable>
-
- <!-- show top-level sections (chapters) AND ALSO those that are in a separate file -->
- <xsl:if test="($level &lt; 2) or ($FName != $ancestorFName)">
- <fo:block xsl:use-attribute-sets="doc_version_info">
-
- <!-- indent according to section level -->
- <xsl:attribute name="text-indent"><xsl:value-of select="$level*12" />pt</xsl:attribute>
-
- <!-- title & filename -->
- <xsl:value-of select="./title/text()" />
- <fo:leader leader-pattern="space" />
- <xsl:value-of select="$FName" />
-
- <!-- rev if different from ancestor's -->
- <xsl:if test="$FName != $ancestorFName">
- <xsl:if test="string-length($revision) != 0">
- <fo:leader leader-length="1em" />
- <xsl:text>Rev. </xsl:text>
- <xsl:value-of select="$revision" />
- </xsl:if>
- </xsl:if>
- </fo:block>
- </xsl:if>
-</xsl:template>
-
-<!--
-This branch defines the transformations applied to data that is being flowed
-into a significant sectional structure.
--->
-<!--
-DocUtils top-level (root) element
--->
-<xsl:template match="document">
- <xsl:apply-templates />
-</xsl:template>
-<!--
-<xsl:template match="/document/decoration/header" />
-<xsl:template match="/document/decoration/footer" />
---><!--
-DocUtils generates a bushel of useful document information, applicable only to
-the book as a whole.
-Some of this information is displayed on the title page. The rest is ignored.
--->
-<xsl:template match="docinfo" mode="titlepage">
- <!-- the footnote hack ensures that bottom of the docinfo block aligns to the "bottom" of the page -->
- <fo:footnote>
- <fo:inline />
- <fo:footnote-body>
- <fo:block xsl:use-attribute-sets="docinfo_block">
- <xsl:apply-templates mode="titlepage" />
- </fo:block>
- </fo:footnote-body>
- </fo:footnote>
-</xsl:template><!-- Condensed XSL follows -->
-<xsl:template match="docinfo/address" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/author" mode="titlepage">
- <fo:block><xsl:text>Author: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/authors" mode="titlepage">
- <fo:block><xsl:text>Authors: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/contact" mode="titlepage">
- <fo:block><xsl:text>Contact </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/copyright" mode="titlepage">
- <fo:block><xsl:text>Copyright </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/date" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/field" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/organization" mode="titlepage">
- <fo:block><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/revision" mode="titlepage">
- <fo:block><xsl:text>Revision </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/status" mode="titlepage">
- <fo:block><xsl:text>Status: </xsl:text><xsl:apply-templates /></fo:block></xsl:template>
-<xsl:template match="docinfo/version" mode="titlepage">
- <fo:block><xsl:text>Version </xsl:text><xsl:apply-templates /></fo:block></xsl:template><xsl:template match="section">
- <xsl:apply-templates />
-</xsl:template><xsl:template match="topic" >
- <fo:block xsl:use-attribute-sets="topic_block">
- <xsl:apply-templates select="title" mode="topic" />
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template>
-<xsl:template match="sidebar">
- <fo:float xsl:use-attribute-sets="sidebar_float">
- <fo:block-container xsl:use-attribute-sets="sidebar_block">
- <fo:block>
- <xsl:apply-templates select="title" mode="sidebar" />
- <xsl:apply-templates select="subtitle" mode="sidebar" />
- <xsl:apply-templates select="child::*[name()!='title' and name()!='subtitle']" />
- </fo:block>
- </fo:block-container>
- </fo:float>
-</xsl:template><!--
-<xsl:template match="transition" />
---><xsl:template match="*[contains(@class,'review')]">
- <xsl:choose>
- <xsl:when test="($publish_comments='enabled')">
- <fo:block xsl:use-attribute-sets="review_text">
- <xsl:text>PLEASE REVIEW:</xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates />
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="admonition" mode="safeguards">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:value-of select="title" /></fo:inline>
- <fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template><!--
-Generic admonitions have (had?) (I think) a space between the "admonition"
-class label and the hyphenated-title of the admonition.
-TO DO: Get David Goodger to revert it back to the old behaviour.
-Admonitions should be able to take a class and a title?
--->
-<xsl:template match="admonition">
- <fo:block xsl:use-attribute-sets="admonition_block">
- <fo:block xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="substring-after(@class, ' ')" />:
- <xsl:value-of select="title" />
- </fo:block>
- <xsl:apply-templates select="child::*[name()!='title']" />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="attention">
- <fo:block xsl:use-attribute-sets="attention_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Attention: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="danger">
- <fo:block xsl:use-attribute-sets="danger_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Danger: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="error">
- <fo:block xsl:use-attribute-sets="error_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Error: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="hint">
- <fo:block xsl:use-attribute-sets="hint_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Hint: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="note">
- <fo:block xsl:use-attribute-sets="note_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Note: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="caution">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/caution.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="caution_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Caution: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template>
-<xsl:template match="important">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/important.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="important_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Important! </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="tip">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/tip.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="tip_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Tip: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="warning">
- <fo:block xsl:use-attribute-sets="admonition_block_with_icon">
- <fo:float xsl:use-attribute-sets="admonition_icon_float">
- <fo:block xsl:use-attribute-sets="admonition_icon_block">
- <fo:external-graphic src="url(file:../Common/warning.png)" />
- </fo:block>
- </fo:float>
- <fo:block xsl:use-attribute-sets="warning_block">
- <fo:inline xsl:use-attribute-sets="generic_matter_title"><xsl:text>Warning: </xsl:text></fo:inline>
- <xsl:apply-templates />
- </fo:block>
- </fo:block>
-</xsl:template><xsl:template match="block_quote">
- <fo:block xsl:use-attribute-sets="block_quote_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!--
-Captions are labeled as "ch#.fig#: Title" whenever possible
--->
-<xsl:template match="caption" mode="figure-pdf">
- <fo:block xsl:use-attribute-sets="generic_text">
- <xsl:text>Figure </xsl:text>
- <xsl:choose>
- <!-- If the chapter is numbered, get the chapter number -->
- <xsl:when test="ancestor::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]">
- <xsl:value-of select="count((ancestor::*[last()-1])/preceding-sibling::*[name()='section' and not(@class = 'frontmatter' or @class = 'specialfrontmatter')]) + 1" />
- <xsl:text>.</xsl:text>
- <xsl:number level="any" count="figure[contains(@class,'pdf')]" from="/document/section" />
- </xsl:when>
- <!-- Otherwise, leave off the chapter number -->
- <xsl:otherwise>
- <xsl:number level="any" count="figure[contains(@class,'pdf')]" from="/document/section" />
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!--
-As these templates are only for FO->PDF transformation, we completely ignore
-all html figures.
--->
-<xsl:template match="figure">
- <xsl:choose>
- <xsl:when test="contains(@class,'pdf')">
- <fo:block xsl:use-attribute-sets="figure_block">
- <xsl:if test="contains(@class,'breakbefore')">
- <xsl:attribute name="break-before">page</xsl:attribute>
- </xsl:if>
- <xsl:apply-templates mode="figure-pdf" />
- </fo:block>
- </xsl:when>
- <xsl:when test="contains(@class,'html')">
- <!-- do nothing; it's not for PDF output -->
- </xsl:when>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="footnote">
- <fo:block id="{@id}" xsl:use-attribute-sets="footnote_block">
- <fo:inline xsl:use-attribute-sets="footnote_ref"><xsl:value-of select="@name" /></fo:inline>
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<!-- footnote label -->
- <xsl:template match="footnote/label" />
-<!-- footnote para -->
- <xsl:template match="footnote/paragraph">
- <xsl:apply-templates />
- </xsl:template>
-
- <xsl:template match="image" mode="figure-pdf">
- <fo:block xsl:use-attribute-sets="image_block">
- <xsl:if test="contains(@class,'fullpage')">
- <xsl:attribute name="width">8.5in - 1in</xsl:attribute>
- <xsl:attribute name="height">11in - 2in</xsl:attribute>
- <xsl:attribute name="start-indent">0.25in - inherited-property-value(margin-left)</xsl:attribute>
- <xsl:attribute name="end-indent">0.25in - inherited-property-value(margin-right)</xsl:attribute>
- </xsl:if>
- <fo:external-graphic src="url(file:{@uri})" xsl:use-attribute-sets="external_graphic">
- <xsl:if test="@width and @height and @scale">
- <xsl:attribute name="width">
- <xsl:value-of select="@width div @scale" />
- <xsl:text>in</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="height">
- <xsl:value-of select="@height div @scale" />
- <xsl:text>in</xsl:text>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="contains(@class,'fullpage')">
- <xsl:attribute name="width">100%</xsl:attribute>
- <xsl:attribute name="height">100%</xsl:attribute>
- <xsl:attribute name="display-align">center</xsl:attribute>
- </xsl:if>
- </fo:external-graphic>
- </fo:block>
-</xsl:template>
-
- <!-- html image mode, classed as html -->
- <xsl:template match="image" mode="figure-html">
- <!-- do nothing; it's not for PDF output -->
- </xsl:template>
-
- <!-- ordinary image mode, not a classed image -->
- <xsl:template match="image">
- <fo:block xsl:use-attribute-sets="image_block">
- <fo:external-graphic src="url(file:{@uri})" xsl:use-attribute-sets="external_graphic">
- <xsl:if test="@width and @height and @scale">
- <xsl:attribute name="width">
- <xsl:value-of select="@width div @scale" /><xsl:text>in</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="height">
- <xsl:value-of select="@height div @scale" /><xsl:text>in</xsl:text>
- </xsl:attribute>
- </xsl:if>
- </fo:external-graphic>
- </fo:block>
- </xsl:template><!-- The "Swirlie" -->
-<xsl:template match="//document/image[@class='spirographic-decoration']" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="swirlie_position">
- <fo:block>
- <fo:external-graphic src="url(file:{@uri})" />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-
-<!-- The Logo -->
-<xsl:template match="//document/image[@class='lcs-logo']" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="logo_position">
- <fo:block>
- <fo:external-graphic src="url(file:{//document/image[@class='lcs-logo']/@uri})" />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="line_block">
- <fo:block xsl:use-attribute-sets="line_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="bullet_list[not(contains(name(..),'list'))]">
- <!-- is not a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_block">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-
-<xsl:template match="bullet_list[contains(name(..),'list')]">
- <!-- is a list within a list -->
- <fo:list-block>
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-<xsl:template match="bullet_list/list_item">
- <xsl:variable name="bullet" select="../@bullet" />
- <fo:list-item xsl:use-attribute-sets="list_item">
- <fo:list-item-label end-indent="label-end()">
- <fo:block xsl:use-attribute-sets="bulleted_list_item_label">
- <xsl:choose>
- <xsl:when test="$bullet='-'">
- <xsl:text>&#x2022;</xsl:text>
- </xsl:when>
- <xsl:when test="$bullet='+'">
- <xsl:text>&#x2013;</xsl:text>
- </xsl:when>
- <xsl:when test="$bullet='*'">
- <xsl:text>&#x2219;</xsl:text>
- </xsl:when>
- </xsl:choose>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block>
- <xsl:apply-templates />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
-</xsl:template>
-
-
-<xsl:template match="definition_list">
- <xsl:apply-templates />
-</xsl:template>
-<xsl:template match="definition_list_item">
- <fo:block xsl:use-attribute-sets="definition_item_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="term">
- <fo:block xsl:use-attribute-sets="definition_term">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template><xsl:template match="classifier">
- <fo:block xsl:use-attribute-sets="definition_classifier">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="definition">
- <fo:block xsl:use-attribute-sets="definition_definition">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="enumerated_list[not(contains(name(..),'list'))]">
- <!-- is not a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_block">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template>
-
-<xsl:template match="enumerated_list[(contains(name(..),'list'))]">
- <!-- is a list within a list -->
- <fo:list-block xsl:use-attribute-sets="list_item">
- <xsl:apply-templates />
- </fo:list-block>
-</xsl:template><xsl:template match="enumerated_list/list_item">
- <fo:list-item xsl:use-attribute-sets="list_item">
- <fo:list-item-label end-indent="label-end()">
- <fo:block>
- <xsl:choose>
- <xsl:when test="../@enumtype = 'arabic'">
- <xsl:number format="1" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'loweralpha'">
- <xsl:number format="a" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'upperalpha'">
- <xsl:number format="A" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'lowerroman'">
- <xsl:number format="i" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:when test="../@enumtype = 'upperroman'">
- <xsl:number format="I" /><xsl:text>.</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>unrecognized enumtype</xsl:text>
- <xsl:number /><xsl:text>.</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent="body-start()">
- <fo:block>
- <xsl:apply-templates />
- </fo:block>
- </fo:list-item-body>
- </fo:list-item>
-</xsl:template><!--
-Field lists may be used by other templates for author-defined parameters; they
-are never output directly.
--->
-<xsl:template match="field_list" /><xsl:template match="field" />
-<xsl:template match="literal_block">
- <fo:block xsl:use-attribute-sets="literal_block">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="paragraph">
- <fo:block xsl:use-attribute-sets="generic_text">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="thead/row/entry/paragraph">
- <!-- table headers are special -->
- <fo:block xsl:use-attribute-sets="table_head">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="tbody/row/entry/paragraph[1]">
- <!-- table cells don't need the extra space above -->
- <fo:block xsl:use-attribute-sets="table_entry_1stparagraph">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-
-<!-- BODY: table -->
-<!-- to be tweaked: base table width on sum of column widths
-<xsl:variable name="twidth">
- <xsl:value-of select="sum(. group/colspec/@colwidth)*.66" />
-</xsl:variable>
-<fo:table xsl:use-attribute-sets="table_block" width="{$twidth}em"> -->
-<xsl:template match="table">
- <fo:table xsl:use-attribute-sets="table_block">
- <xsl:apply-templates />
- </fo:table>
-</xsl:template>
-
-<xsl:template match="tgroup">
- <xsl:apply-templates />
-</xsl:template>
-
-<xsl:template match="colspec">
- <fo:table-column column-width="proportional-column-width({@colwidth})">
- <xsl:apply-templates />
- </fo:table-column>
-</xsl:template><xsl:template match="thead">
- <fo:table-header xsl:use-attribute-sets="table_head">
- <xsl:apply-templates />
- </fo:table-header>
-</xsl:template>
-
-<xsl:template match="thead/row">
- <fo:table-row xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-
-<xsl:template match="thead/row/entry">
- <fo:table-cell xsl:use-attribute-sets="table_entry">
- <xsl:apply-templates />
- </fo:table-cell>
-</xsl:template><xsl:template match="tbody">
- <fo:table-body xsl:use-attribute-sets="table_body">
- <xsl:apply-templates />
- </fo:table-body>
-</xsl:template>
-
-<xsl:template match="tbody/row[position() mod 2 = 0]">
- <fo:table-row background-color="{$even_row-color}" xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-<xsl:template match="tbody/row[position() mod 2 != 0]">
- <fo:table-row background-color="{$odd_row-color}" xsl:use-attribute-sets="table_row">
- <xsl:apply-templates />
- </fo:table-row>
-</xsl:template>
-
-<xsl:template match="entry">
- <fo:table-cell xsl:use-attribute-sets="table_entry">
- <xsl:apply-templates />
- </fo:table-cell>
-</xsl:template><!--
-TO DO: targets always target the next element; copy the target id to the
-target element
-(change the references to use "contains" when this is done)
-//target/following-sibling::*[1]
-NOTE: Won't work! Targets appearing before a section title are embedded in
-the previous section; no next sibling to copy to!
--->
-<xsl:template match="target">
- <fo:block id="{@id}">
- <xsl:apply-templates />
- </fo:block>
-</xsl:template>
-<xsl:template match="comment">
- <xsl:variable name="is_filenotes">
- <xsl:value-of select="contains(text(),'file notes')" />
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="($publish_filenotes = 'enabled') and ($is_filenotes = 'true')">
- <fo:block xsl:use-attribute-sets="comment">
- <xsl:text>File Notes: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="($publish_comments = 'enabled') and ($is_filenotes = 'false')">
- <fo:block xsl:use-attribute-sets="comment">
- <xsl:text>Comment: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- </xsl:choose>
-</xsl:template>
-
-<!--
-DocUtils tells us the definitions for the substitution references even though
-it actually performs the substitution, too. Throw it away!
--->
-<xsl:template match="substitution_definition" />
-
-<!--
-We make *no* use of DocUtils' self-generated title content
--->
-<xsl:template match="title/generated" />
-<!--
-Shown only for Debug-Style PDFs when 'publish_problematics' is 'enabled'
--->
-<xsl:template match="problematic">
- <xsl:if test="$publish_problematics = 'enabled'">
- <fo:block xsl:use-attribute-sets="problem">
- <xsl:text>DocUtils Problematic: </xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:if>
-</xsl:template>
-<xsl:template match="system_message">
- <xsl:if test="$system_messages = 'enabled'">
- <fo:block xsl:use-attribute-sets="system_message">
- <xsl:text>DocUtils Warning:</xsl:text>
- <xsl:apply-templates />
- </fo:block>
- </xsl:if>
-</xsl:template>
-
-<xsl:template match="emphasis">
- <fo:inline xsl:use-attribute-sets="emphasis"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<!--
-The (nominally superscripted) number or symbol placed in-line to indicate a
-footnote reference
--->
-<xsl:template match="footnote_reference">
- <fo:basic-link internal-destination="{@refid}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="footnote_ref"><xsl:value-of select="@refid" /></fo:inline>
- </fo:basic-link>
-</xsl:template>
-
-<!--
-Note there are also image blocks, which are another thing entirely.
--->
-<xsl:template match="paragraph/image">
- <fo:external-graphic src="url(file:{@uri})" />
-</xsl:template>
-
-<!--
-Note there are also literal and list blocks, which are another thing entirely.
--->
-<xsl:template match="literal">
- <fo:inline xsl:use-attribute-sets="literal_text"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-
-<xsl:key name="sectionkey" match="section" use="@id" />
-<xsl:key name="targetkey" match="target" use="@id" />
-
-<!--
-Anonymous internal references do not have page numbers??
-TO DO: figure out what this was all about originally; check if DocUtils
-correctly places title targets these days
-NOTE: anonymous attribute is now missing?!?
--->
-<xsl:template match="reference[@refid and @anonymous]">
- <xsl:choose>
- <!--
- When referencing a section (chapter or chapter section), use the true
- section title itself.
- -->
- <xsl:when test="key('sectionkey', @refid)">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:when>
-
- <!--
- When the target is at the end of a section, and immediately following
- that is a new section, use that new section's title.
- This is necessary because DocUtils doesn't look ahead for a title
- -->
- <xsl:when test="((key('targetkey', @refid)/following::*)[1])[name()='section']">
- <fo:basic-link internal-destination="{(key('targetkey', @refid)/following::*[name()='section'])[1]/@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </fo:basic-link>
- </xsl:when>
- <!--
- When the target immediately follows a title, use that title's text.
- This was to allow authors to hack around the target-preceding problem
- described above.
- -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:basic-link internal-destination="{key('targetkey', @refid)/../@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </fo:basic-link>
- </xsl:when>
- <xsl:otherwise>
- <!-- use the text provided by the reference; may not actually match the target's text -->
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-<!-- not-anonymous internal reference -->
-<xsl:template match="reference[@refid and not(@anonymous)]">
- <xsl:choose>
- <!--
- When referencing a section (chapter or chapter section), use the true
- section title itself.
- -->
- <xsl:when test="key('sectionkey', @refid)">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="key('sectionkey', @refid)/title[1]" mode="xref" /></fo:inline>
- </xsl:when>
-
- <!--
- When the target is at the end of a section, and immediately following
- that is a new section, use that new section's title.
- This is necessary because DocUtils doesn't look ahead for a title
- -->
- <xsl:when test="((key('targetkey', @refid)/following::*)[1])[name()='section']">
- <fo:basic-link internal-destination="{(key('targetkey', @refid)/following::*[name()='section'])[1]/@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="(key('targetkey', @refid)/following::*[name()='section'])[1]/title[1]" mode="xref" /></fo:inline>
- </fo:basic-link>
- </xsl:when>
-
- <!--
- When the target immediately follows a title, use that title's text.
- This was to allow authors to hack around the target-preceding problem
- described above.
- -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:basic-link internal-destination="{key('targetkey', @refid)/../@id}" xsl:use-attribute-sets="internal_link">
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates select="key('targetkey', @refid)/preceding-sibling::*[name()='title']" mode="xref" /></fo:inline>
- </fo:basic-link>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- use the text provided by the reference; may not actually match the target's text -->
- <fo:inline xsl:use-attribute-sets="internal_link"><xsl:apply-templates /></fo:inline>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text> (p. </xsl:text>
- <xsl:choose>
- <!-- use the target's title text content -->
- <xsl:when test="key('targetkey', @refid)/preceding-sibling::*[name()='title']">
- <fo:page-number-citation ref-id="{key('targetkey', @refid)/../@id}" />
- </xsl:when>
- <xsl:otherwise>
- <fo:page-number-citation ref-id="{@refid}" />
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>)</xsl:text>
-</xsl:template>
-<xsl:template match="reference[@refuri]">
- <fo:basic-link external-destination="url({@refuri})">
- <fo:inline xsl:use-attribute-sets="external_link">
- <xsl:apply-templates />
-<!-- <xsl:call-template name="u:make-breakable">
- <xsl:with-param name="string" select="text()" />
- </xsl:call-template> -->
- </fo:inline>
- </fo:basic-link>
-</xsl:template>
-<!-- unknown reference type -->
-<xsl:template match="reference">
- <fo:inline xsl:use-attribute-sets="reference"><xsl:apply-templates /></fo:inline>
-</xsl:template><xsl:template match="strong">
- <fo:inline font-weight="bold"><xsl:apply-templates /></fo:inline>
-</xsl:template><xsl:template match="subscript">
- <fo:inline baseline-shift="sub"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="subtitle" mode="sidebar">
- <fo:block>
- <fo:inline font-weight="bold"><xsl:value-of select="text()" /></fo:inline>
- </fo:block>
-</xsl:template>
-
-
-
-<xsl:template match="subtitle" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="sub_title_position">
- <fo:block xsl:use-attribute-sets="sub_title_text">
- <xsl:apply-templates />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="superscript">
- <fo:inline baseline-shift="super"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<!--
-Never output to PDF; used only for reference links.
--->
-<xsl:template match="section/title">
- <xsl:variable name="level" select="count(ancestor::section)" />
- <xsl:choose>
- <xsl:when test="$level = 1">
- <!-- special case, handled by the chapter first-page template -->
- </xsl:when>
- <xsl:when test="$level = 2">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level1">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="$level = 3">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level2">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:when test="$level = 4">
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level3">
- <xsl:apply-templates />
- </fo:block>
- </xsl:when>
- <xsl:otherwise>
- <fo:block id="{../@id}" xsl:use-attribute-sets="title-level4up">
- <xsl:apply-templates />
- </fo:block>
- </xsl:otherwise>
- </xsl:choose>
-</xsl:template>
-
-<xsl:template match="title" mode="colophon">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-<xsl:template match="title" mode="copyright">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-<xsl:template match="title" mode="safeguards">
- <fo:block id="{../@id}" xsl:use-attribute-sets="safeguards_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template><xsl:template match="title" mode="sidebar">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-
-<xsl:template match="title" mode="titlepage">
- <fo:block-container xsl:use-attribute-sets="main_title_position">
- <fo:block xsl:use-attribute-sets="main_title_text">
- <xsl:apply-templates />
- </fo:block>
- </fo:block-container>
-</xsl:template>
-<xsl:template match="title" mode="topic">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-
-
-
-<xsl:template match="title" mode="versions">
- <fo:block id="{../@id}" xsl:use-attribute-sets="generic_matter_title">
- <fo:marker marker-class-name="chapter"><xsl:value-of select="text()" /></fo:marker>
- <xsl:value-of select="text()" />
- </fo:block>
-</xsl:template>
-<!--
-Used in the reference templates; a placeholder should one want to do anything
-interesting with the text used in the reference.
-Note that the actual link face formatting is handled in the reference
-template.
--->
-<xsl:template match="title" mode="xref">
- <xsl:apply-templates />
-</xsl:template>
-
-<xsl:template match="title_reference">
- <fo:inline xsl:use-attribute-sets="sans_italic_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-
-<xsl:template match="ui_shortcut">
- <fo:inline xsl:use-attribute-sets="mono_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="ui_guilabel">
- <fo:inline xsl:use-attribute-sets="sans_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template>
-<xsl:template match="ui_command">
- <fo:inline xsl:use-attribute-sets="sans_bold_face"><xsl:apply-templates /></fo:inline>
-</xsl:template><!-- show ancestors of current node -->
-<xsl:template name="u:an">
- <xsl:variable name="full-path">
- <xsl:for-each select="ancestor-or-self::*">
- <xsl:value-of select="concat('/',name())" />
- </xsl:for-each>
- </xsl:variable>
- <xsl:message><xsl:value-of select="$full-path" /></xsl:message>
-</xsl:template>
-
-<!-- show all children of current node -->
-<xsl:template name="u:ch">
- <xsl:for-each select="descendant::*">
- <xsl:call-template name="u:ch" />
- </xsl:for-each>
- <xsl:if test="count(child::*) = 0">
- <xsl:call-template name="u:an" />
- </xsl:if>
-</xsl:template>
-
-<!-- show immediate children of current node -->
-<xsl:template name="u:ch1">
- <xsl:for-each select="*">
- <xsl:call-template name="u:an" />
- </xsl:for-each>
-</xsl:template><!-- return filename for document containing the current node -->
-<xsl:template name="u:docinfo-filename">
- <xsl:param name="thisNode" select="self::*"/>
- <xsl:variable name="fname">
- <xsl:value-of select="($thisNode/ancestor-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$RCSfile:')]/text())[last()]" />
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($fname,'RCSfile: '), ',v $'))" />
-</xsl:template>
-
-<!-- return docinfo date -->
-<xsl:template name="u:docinfo-date">
- <xsl:param name="whichNodes">self</xsl:param>
- <xsl:variable name="date">
- <xsl:choose>
- <xsl:when test="$whichNodes=self">
- <!-- just the current node's docinfo -->
- <xsl:value-of select="./field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Date:')]/text()" />
- </xsl:when>
- <xsl:otherwise>
- <!-- find the most-recent from all the children -->
- <!-- dammit, this DOES NOT WORK -->
- <xsl:for-each select="descendant-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Date:')]/text()" >
- <xsl:sort select="." data-type="number" order="descending" />
- <xsl:if test="position()=1">
- <xsl:copy-of select="." />
- </xsl:if>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($date,'Date: '), ' $'))" />
-</xsl:template>
-
-<!-- return docinfo revision -->
-<xsl:template name="u:docinfo-revision">
- <xsl:param name="whichNodes">self</xsl:param>
- <xsl:variable name="rev">
- <xsl:choose>
- <!-- just the current node's docinfo -->
- <xsl:when test="$whichNodes = 'self'">
- <xsl:value-of select="./field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Revision:')]/text()" />
- </xsl:when>
- <xsl:otherwise>
- <!-- find the most-recent from all the children -->
- <!-- dammit, this DOES NOT WORK -->
- <xsl:for-each select="descendant-or-self::*/field_list[@class='docinfo']/field/field_body/paragraph[contains(text(),'$Revision:')]/text()" >
- <xsl:sort select="." data-type="number" order="descending" />
- <xsl:if test="position()=1">
- <xsl:value-of select="." />
- </xsl:if>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:value-of select="normalize-space(substring-before(substring-after($rev,'Revision: '), ' $'))" />
-</xsl:template>
-
-<!-- turn slashes into line-breakable slashes -->
-<xsl:template name="u:make-breakable">
- <xsl:param name="string" />
- <xsl:variable name="breakables">
- &#x0021;&#x0022;&#x0023;&#x0024;&#x0025;&#x0026;&#x0027;
- &#x0028;&#x0029;&#x002A;&#x002B;&#x002C;&#x002D;&#x002E;
- &#x002F;&#x003A;&#x003B;&#x003C;&#x003D;&#x003E;&#x003F;
- &#x0040;&#x005B;&#x005C;&#x005D;&#x005E;&#x005F;&#x0060;
- </xsl:variable>
-
- <xsl:if test="string-length($string) &gt; 0">
- <xsl:variable name="c1" select="substring($string, 1, 1)" />
- <xsl:choose>
- <xsl:when test="contains($breakables, $c1)">
- <fo:character treat-as-word-space="true">
- <xsl:attribute name="character">
- <xsl:value-of select="$c1" />
- </xsl:attribute>
- </fo:character>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$c1" />
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:call-template name="u:make-breakable">
- <xsl:with-param name="string" select="substring($string, 2)"/>
- </xsl:call-template>
- </xsl:if>
-</xsl:template>
-<!-- A DISCARD FUNCTION -->
-<xsl:template match="*" mode="discard">
- <xsl:message>
- <xsl:text>Discarded: </xsl:text>
- <xsl:value-of select="text()" />
- </xsl:message>
-</xsl:template>
-
-<!-- REPORT UNKNOWN TAGS -->
-<xsl:template match="*">
- <xsl:message>
- <xsl:value-of select="name(.)" />
- <xsl:text> encountered</xsl:text>
- <xsl:if test="parent::*">
- <xsl:text> in </xsl:text>
- <xsl:value-of select="name(parent::*)" />
- </xsl:if>
- <xsl:text>, but no template matches.</xsl:text>
- </xsl:message>
- <!-- highlight in red in the output -->
- <fo:block >
- <xsl:text>&lt;</xsl:text>
- <xsl:value-of select="name(.)" />
- <xsl:text>&gt;</xsl:text>
- <xsl:apply-templates />
- <xsl:text>&lt;/</xsl:text>
- <xsl:value-of select="name(.)" />
- <xsl:text>&gt;</xsl:text>
- </fo:block>
-</xsl:template>
-
-</xsl:stylesheet>
-
-
-
diff --git a/sandbox/dpriest/csvtable/csv-directive_test-external_table.txt b/sandbox/dpriest/csvtable/csv-directive_test-external_table.txt
deleted file mode 100644
index 3669c4a16..000000000
--- a/sandbox/dpriest/csvtable/csv-directive_test-external_table.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-"Header row, column 1", "Header 2", "Header 3", "Header 4"
-"Body row 1, column 1", "Column 2", "Column 3", "Column 4"
-"Body row 2", "Cells may span columns.", ,
-"Body row 3", "Cells may span rows.", "- Table cells - contain - body elements.",
-"Body row 4",,,
diff --git a/sandbox/dpriest/csvtable/csv-directive_test.txt b/sandbox/dpriest/csvtable/csv-directive_test.txt
deleted file mode 100644
index c0077ef00..000000000
--- a/sandbox/dpriest/csvtable/csv-directive_test.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Headline
-========
-
-.. table:: Standard table
-
- +--------------------------+------------+----------+----------+
- | Header row, column 1 | Header 2 | Header 3 | Header 4 |
- +==========================+============+==========+==========+
- | body *row* 1, column 1 | column 2 | column 3 | column 4 |
- +--------------------------+------------+----------+----------+
- | body row 2 | Cells may span columns. |
- +--------------------------+------------+---------------------+
- | body row 3 | Cells may | - Table cells |
- +--------------------------+ span rows. | - contain |
- | body row 4 | | - body elements. |
- +--------------------------+------------+---------------------+
-
-
-.. csvtable:: Inline CSV table
- :header-rows: 1
- :widths: 24, 10, 10, 12
-
- "Header row, column 1", "Header 2", "Header 3", "Header 4"
- "Body *row* 1, column 1", "Column 2", "Column 3", "Column 4"
- "Body row 2", "Cells may span columns.",,
- "Body row 3", "Cells may span rows.", "- Table cells - contain - body elements.",
- "Body row 4", , ,
-
-
-.. csvtable:: Included CSV table
- :file: csv-directive_test-external_table.txt
diff --git a/sandbox/dpriest/csvtable/csvpublish.py b/sandbox/dpriest/csvtable/csvpublish.py
deleted file mode 100755
index b101adf63..000000000
--- a/sandbox/dpriest/csvtable/csvpublish.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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.
-
-"""
-A minimal front end to the Docutils Publisher, producing pseudo-XML.
-"""
-
-try:
- import locale
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-import csvtable
-
-
-description = ('Generates pseudo-XML from standalone reStructuredText '
- 'sources (for testing purposes). ' + default_description)
-
-publish_cmdline(description=description)
diff --git a/sandbox/dpriest/csvtable/csvtable.py b/sandbox/dpriest/csvtable/csvtable.py
deleted file mode 100644
index 7b69a9d54..000000000
--- a/sandbox/dpriest/csvtable/csvtable.py
+++ /dev/null
@@ -1,257 +0,0 @@
-# Author: David Priest & David Goodger
-# Contact: priest@sfu.ca
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directive for CSV (comma-separated values) Tables.
-"""
-
-import csv
-import os.path
-import operator
-from docutils import nodes, statemachine, utils
-from docutils.utils import SystemMessagePropagation
-from docutils.transforms import references
-from docutils.parsers.rst import directives
-
-try:
- import urllib2
-except ImportError:
- urllib2 = None
-
-try:
- True
-except NameError: # Python 2.2 & 2.1 compatibility
- True = not 0
- False = not 1
-
-
-class DocutilsDialect(csv.Dialect):
-
- delimiter = ','
- quotechar = '"'
- doublequote = True
- skipinitialspace = True
- lineterminator = '\n'
- quoting = csv.QUOTE_MINIMAL
-
- def __init__(self, options):
- if options.has_key('delim'):
- self.delimiter = str(options['delim'])
- if options.has_key('quote'):
- self.quotechar = str(options['quote'])
- if options.has_key('escape'):
- self.doublequote = False
- self.escapechar = str(options['escape'])
- csv.Dialect.__init__(self)
-
-
-class HeaderDialect(csv.Dialect):
-
- """CSV dialect to use for the "header" option data."""
-
- delimiter = ','
- quotechar = '"'
- escapechar = '\\'
- doublequote = False
- skipinitialspace = True
- lineterminator = '\n'
- quoting = csv.QUOTE_MINIMAL
-
-
-def csv_table(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
-
- title, messages = make_title(arguments, state, lineno)
- try:
- csv_data, source = get_csv_data(
- name, options, content, lineno, block_text, state, state_machine)
- table_head, max_header_cols = process_header_option(
- options, state_machine, lineno)
- rows, max_cols = parse_csv_data_into_rows(
- csv_data, DocutilsDialect(options), source, options)
- max_cols = max(max_cols, max_header_cols)
- header_rows = options.get('header-rows', 0) # default 0
- table_head.extend(rows[:header_rows])
- table_body = rows[header_rows:]
- if not table_body:
- error = state_machine.reporter.error(
- '"%s" directive requires table body content.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- col_widths = get_col_widths(
- max_cols, name, options, lineno, block_text, state_machine)
- extend_short_rows_with_empty_cells(max_cols, (table_head, table_body))
- except SystemMessagePropagation, detail:
- return [detail.args[0]]
- except csv.Error, detail:
- error = state_machine.reporter.error(
- 'Error with CSV data in "%s" directive:\n%s' % (name, detail),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- table = (col_widths, table_head, table_body)
- table_node = state.build_table(table, content_offset)
- if options.has_key('class'):
- table_node.set_class(options['class'])
- if title:
- table_node.insert(0, title)
- return [table_node] + messages
-
-def make_title(arguments, state, lineno):
- if arguments:
- title_text = arguments[0]
- text_nodes, messages = state.inline_text(title_text, lineno)
- title = nodes.title(title_text, '', *text_nodes)
- else:
- title = None
- messages = []
- return title, messages
-
-def get_csv_data(name, options, content, lineno, block_text,
- state, state_machine):
- if content: # CSV data is from directive content
- if options.has_key('file') or options.has_key('url'):
- error = state_machine.reporter.error(
- '"%s" directive may not both specify an external file and '
- 'have content.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(error)
- source = content.source(0)
- csv_data = content
- elif options.has_key('file'): # CSV data is from an external file
- if options.has_key('url'):
- error = state_machine.reporter.error(
- 'The "file" and "url" options may not be simultaneously '
- 'specified for the "%s" directive.' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(error)
- source_dir = os.path.dirname(
- os.path.abspath(state.document.current_source))
- source = os.path.normpath(os.path.join(source_dir, options['file']))
- source = utils.relative_path(None, source)
- try:
- csv_file = open(source, 'rb')
- try:
- csv_data = csv_file.read().splitlines()
- finally:
- csv_file.close()
- except IOError, error:
- severe = state_machine.reporter.severe(
- 'Problems with "%s" directive path:\n%s.' % (name, error),
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(severe)
- elif options.has_key('url'): # CSV data is from a URL
- if not urllib2:
- severe = state_machine.reporter.severe(
- 'Problems with the "%s" directive and its "url" option: '
- 'unable to access the required functionality (from the '
- '"urllib2" module).' % name,
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(severe)
- source = options['url']
- try:
- csv_data = urllib2.urlopen(source).read().splitlines()
- except (urllib2.URLError, IOError, OSError, ValueError), error:
- severe = state_machine.reporter.severe(
- 'Problems with "%s" directive URL "%s":\n%s.'
- % (name, options['url'], error),
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(severe)
- else:
- error = state_machine.reporter.warning(
- 'The "%s" directive requires content; none supplied.' % (name),
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(error)
- return csv_data, source
-
-def process_header_option(options, state_machine, lineno):
- source = state_machine.get_source(lineno - 1)
- table_head = []
- max_header_cols = 0
- if options.has_key('header'): # separate table header in option
- rows, max_header_cols = parse_csv_data_into_rows(
- options['header'].split('\n'), HeaderDialect(), source, options)
- table_head.extend(rows)
- return table_head, max_header_cols
-
-def parse_csv_data_into_rows(csv_data, dialect, source, options):
- csv_reader = csv.reader(csv_data, dialect=dialect)
- rows = []
- max_cols = 0
- for row in csv_reader:
- row_data = []
- for cell in row:
- cell_data = (0, 0, 0, statemachine.StringList(cell.splitlines(),
- source=source))
- row_data.append(cell_data)
- rows.append(row_data)
- max_cols = max(max_cols, len(row))
- return rows, max_cols
-
-def get_col_widths(max_cols, name, options, lineno, block_text,
- state_machine):
- if options.has_key('widths'):
- col_widths = options['widths']
- if len(col_widths) != max_cols:
- error = state_machine.reporter.error(
- '"%s" widths do not match the number of columns in table (%s).'
- % (name, max_cols),
- nodes.literal_block(block_text, block_text), line=lineno)
- raise SystemMessagePropagation(error)
- else:
- col_widths = [100 / max_cols] * max_cols
- return col_widths
-
-def extend_short_rows_with_empty_cells(columns, parts):
- for part in parts:
- for row in part:
- if len(row) < columns:
- row.extend([(0, 0, 0, [])] * (columns - len(row)))
-
-def single_char_or_unicode(argument):
- char = directives.unicode_code(argument)
- if len(char) > 1:
- raise ValueError('%r invalid; must be a single character or '
- 'a Unicode code' % char)
- return char
-
-def single_char_or_whitespace_or_unicode(argument):
- if argument == 'tab':
- char = '\t'
- elif argument == 'space':
- char = ' '
- else:
- char = single_char_or_unicode(argument)
- return char
-
-def positive_int(argument):
- value = int(argument)
- if value < 1:
- raise ValueError('negative or zero value; must be positive')
- return value
-
-def positive_int_list(argument):
- if ',' in argument:
- entries = argument.split(',')
- else:
- entries = argument.split()
- return [positive_int(entry) for entry in entries]
-
-csv_table.arguments = (0, 1, 1)
-csv_table.options = {'header-rows': directives.nonnegative_int,
- 'header': directives.unchanged,
- 'widths': positive_int_list,
- 'file': directives.path,
- 'url': directives.path,
- 'class': directives.class_option,
- # field delimiter char
- 'delim': single_char_or_whitespace_or_unicode,
- # text field quote/unquote char:
- 'quote': single_char_or_unicode,
- # char used to escape delim & quote as-needed:
- 'escape': single_char_or_unicode,}
-csv_table.content = 1
-
-directives.register_directive('csvtable', csv_table)
diff --git a/sandbox/dpriest/csvtable/csvtable.txt b/sandbox/dpriest/csvtable/csvtable.txt
deleted file mode 100644
index 11c3d0f6b..000000000
--- a/sandbox/dpriest/csvtable/csvtable.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-.. _csvtable:
-
-CSV Table
-=========
-
-:Directive Type: "csvtable"
-:Doctree Element: table
-:Directive Arguments: 1, optional (table title).
-:Directive Options: Possible.
-:Directive Content: A CSV (comma-separated values) table.
-
-The "csvtable" directive is used to create a table from CSV
-(comma-separated values) data. CSV is a common data format generated
-by spreadsheet applications and commercial databases.
-
-Example::
-
- .. csvtable:: Frozen Delights!
- :headers: "Treat", "Quantity", "Description"
- :widths: 15, 10, 30
-
- "Albatross", 2.99, "On a stick!"
- "Crunchy Frog", 1.49, "If we took the bones out, it wouldn't be
- crunchy, now would it?"
- "Gannet Ripple", 1.99, "On a stick!"
-
-Block markup and inline markup within cells is supported. Line ends
-are recognized within cells.
-
-Working Limitations::
-
-* Whitespace delimiters are supported only for external CSV files.
-
-* There is no support for checking that the number of columns in each
- row is the same. However, this directive supports CSV generators
- that do not insert "empty" entries at the end of short rows, by
- automatically adding empty entries.
-
- .. Add "strict" option to verify input?
-
-* Due to limitations of the CSV parser, this directive is not Unicode
- compatible. It may also have problems with ASCII NUL characters.
- Accordingly, CSV tables should be ASCII-printable safe.
-
- .. Test with Unicode; see if that's really so. "encoding" option?
-
-The following options are recognized:
-
-``class`` : text
- Set a "class" attribute value on the table element. See the
- class_ directive below.
-
-``widths`` : integer [, integer...]
- A comma-separated list of relative column widths. The default is
- equal-width columns (100%/#columns).
-
-``header-rows`` : integer
- The number of rows of CSV data to use in the table header.
- Defaults to 0.
-
-``header`` : CSV data
- Supplemental data for the table header, added independently of and
- before any ``header-rows`` from the main CSV data. Must use the
- same CSV format as the main CSV data.
-
-``file`` | ``url`` : path
- Path or URL to CSV file.
-
-``delim`` : char | "tab" | "space"
- A one-character string used to separate fields. Defaults to ``,``
- (comma). May be specified as a Unicode code point; see the
- unicode_ directive for syntax details.
-
-``quote`` : char
- A one-character string used to quote elements containing the
- delimiter or which start with the quote character. Defaults to
- ``"`` (quote). May be specified as a Unicode code point; see the
- unicode_ directive for syntax details.
-
-``keepspace`` : flag
- Treat whitespace immediately following the delimiter as
- significant. The default is to ignore such whitespace.
-
-``escape`` : char
- A one-character string used to escape the delimiter or quote
- characters. May be specified as a Unicode code point; see the
- unicode_ directive for syntax details. Used when the delimiter is
- used in an unquoted field, or when quote characters are used
- within a field. The default is to double-up the character,
- e.g. "He said, ""Hi!"""
-
- .. Add another possible value, "double", to explicitly indicate
- the default case?
diff --git a/sandbox/dreamcatcher/ChangeLog b/sandbox/dreamcatcher/ChangeLog
deleted file mode 100644
index aa1f76093..000000000
--- a/sandbox/dreamcatcher/ChangeLog
+++ /dev/null
@@ -1,13 +0,0 @@
-2003-05-03 Sidnei da Silva <sidnei@x3ng.com>
-
- * rlpdf/rlpdf.py: Added some options to the Writer. Added
- footnotes, backrefs, topic. Works with docutils/tools/test.txt,
- but the output needs work on the stylesheet.
-
-2003-05-02 Sidnei da Silva <sidnei@x3ng.com>
-
- * rlpdf/rlpdf.py (Writer.translate): use StringIO as output for
- Reportlab and set the output to the writer output.
- (PDFTranslator.visit_title): Fix weird logic. node.parent['id']
- didn't always existed.
-
diff --git a/sandbox/dreamcatcher/reportlabs.diff b/sandbox/dreamcatcher/reportlabs.diff
deleted file mode 100644
index ba2c07e8a..000000000
--- a/sandbox/dreamcatcher/reportlabs.diff
+++ /dev/null
@@ -1,1258 +0,0 @@
-Index: lib/rparsexml.py
-===================================================================
-RCS file: /cvsroot/reportlab/reportlab/lib/rparsexml.py,v
-retrieving revision 1.2
-diff -u -r1.2 rparsexml.py
---- lib/rparsexml.py 4 Nov 2002 00:11:48 -0000 1.2
-+++ lib/rparsexml.py 28 May 2003 19:45:52 -0000
-@@ -168,15 +168,15 @@
- # raise ValueError, "I don't handle ampersands yet!!!"
- docontents = 1
- if firstbracket<0:
-- # no tags
-- #if verbose: print "no tags"
-- if toplevel is not None:
-- #D = {NAMEKEY: NONAME, CONTENTSKEY: [xmltext[cursor:]]}
-- ContentList = [xmltext[cursor:]]
-- ContentList = unEscapeContentList(ContentList)
-- return (NameString, AttDict, ContentList, ExtraStuff)
-- else:
-- raise ValueError, "no tags at non-toplevel %s" % `xmltext[cursor:cursor+20]`
-+ # no tags
-+ #if verbose: print "no tags"
-+ if toplevel is not None:
-+ #D = {NAMEKEY: NONAME, CONTENTSKEY: [xmltext[cursor:]]}
-+ ContentList = [xmltext[cursor:]]
-+ ContentList = unEscapeContentList(ContentList)
-+ return ((NameString, AttDict, ContentList, ExtraStuff), cursor)
-+ else:
-+ raise ValueError, "no tags at non-toplevel %s" % `xmltext[cursor:cursor+20]`
- #D = {}
- L = []
- # look for start tag
-Index: pdfgen/canvas.py
-===================================================================
-RCS file: /cvsroot/reportlab/reportlab/pdfgen/canvas.py,v
-retrieving revision 1.111
-diff -u -r1.111 canvas.py
---- pdfgen/canvas.py 10 Apr 2003 00:01:17 -0000 1.111
-+++ pdfgen/canvas.py 28 May 2003 19:45:54 -0000
-@@ -429,13 +429,13 @@
- is to keep the user's current zoom settings. the last
- arguments may or may not be needed depending on the
- choice of 'fitType'.
--
-+
- Fit types and the other arguments they use are:
- /XYZ left top zoom - fine grained control. null
- or zero for any of the parameters means 'leave
- as is', so "0,0,0" will keep the reader's settings.
- NB. Adobe Reader appears to prefer "null" to 0's.
--
-+
- /Fit - entire page fits in window
-
- /FitH top - top coord at top of window, width scaled
-@@ -443,7 +443,7 @@
-
- /FitV left - left coord at left of window, height
- scaled to fit
--
-+
- /FitR left bottom right top - scale window to fit
- the specified rectangle
-
-@@ -464,7 +464,7 @@
- right = "null"
- if zoom is None:
- zoom = "null"
--
-+
- if fitType == "XYZ":
- dest.xyz(left,top,zoom)
- elif fitType == "Fit":
-@@ -483,7 +483,7 @@
- elif fitType == "FitBV":
- dest.fitbv(left)
- else:
-- raise "Unknown Fit type %s" % (fitType,)
-+ raise "Unknown Fit type %s" % (fitType,)
-
- dest.setPage(pageref)
- return dest
-@@ -498,7 +498,7 @@
- the page."""
- #This method should probably be deprecated since it is just a sub-set of bookmarkPage
- return self.bookmarkPage(key,fitType="FitH",top=yhorizontal)
--
-+
- def bookmarkHorizontal(self, key, relativeX, relativeY):
- """w.r.t. the current transformation, bookmark this horizontal."""
- (xt, yt) = self.absolutePosition(relativeX,relativeY)
-@@ -829,7 +829,7 @@
- assert rot % 90.0 == 0.0, "Rotation must be a multiple of 90 degrees"
- self._pageRotation = rot
-
--
-+
- def addLiteral(self, s, escaped=1):
- """introduce the literal text of PDF operations s into the current stream.
- Only use this if you are an expert in the PDF file format."""
-Index: platypus/para.py
-===================================================================
-RCS file: /cvsroot/reportlab/reportlab/platypus/para.py,v
-retrieving revision 1.6
-diff -u -r1.6 para.py
---- platypus/para.py 9 Apr 2003 22:58:37 -0000 1.6
-+++ platypus/para.py 28 May 2003 19:45:55 -0000
-@@ -63,7 +63,8 @@
- from reportlab.platypus.flowables import Flowable
- from reportlab.lib import colors
-
--import string
-+from types import StringType, UnicodeType, InstanceType, TupleType, ListType, FloatType
-+from string import letters as LETTERS, whitespace as WHITESPACE
-
- # SET THIS TO CAUSE A VIEWING BUG WITH ACROREAD 3 (for at least one input)
- # CAUSEERROR = 0
-@@ -91,7 +92,6 @@
- program = []
- self.lineOpHandlers = [] # for handling underlining and hyperlinking, etc
- self.program = program
-- #self.
- self.indent = self.rightIndent = 0.0
- self.baseindent = 0.0 # adjust this to add more indentation for bullets, eg
- self.fontName = "Helvetica"
-@@ -102,10 +102,12 @@
- from reportlab.lib.enums import TA_LEFT
- self.alignment = TA_LEFT
- self.textStateStack = []
-+
- TEXT_STATE_VARIABLES = ("indent", "rightIndent", "fontName", "fontSize",
- "leading", "fontColor", "lineOpHandlers", "rise",
- "alignment")
- #"textStateStack")
-+
- def pushTextState(self):
- state = []
- for var in self.TEXT_STATE_VARIABLES:
-@@ -116,6 +118,7 @@
- #print "push", self.textStateStack
- #print "push", len(self.textStateStack), state
- return state
-+
- def popTextState(self):
- state = self.textStateStack[-1]
- self.textStateStack = self.textStateStack[:-1]
-@@ -136,7 +139,6 @@
- remainder = program[:]
- #program1 = remainder[:] # debug only
- lineprogram = []
-- from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY
- #if maxheight<TOOSMALLSPACE:
- # raise ValueError, "attempt to format inside too small a height! "+repr(maxheight)
- heightremaining = maxheight-leading
-@@ -150,9 +152,11 @@
- linewidth = maxwidth - indent - rightIndent
- beforelinestate = self.__dict__.copy()
- if linewidth<TOOSMALLSPACE:
-- raise ValueError, "indents %s %s too wide for space %s" % (self.indent, self.rightIndent, maxwidth)
-+ raise ValueError, "indents %s %s too wide for space %s" % (self.indent, self.rightIndent, \
-+ maxwidth)
- try:
-- (lineIsFull, line, cursor, currentLength, usedIndent, maxLength, justStrings) = self.fitLine(remainder, maxwidth)
-+ (lineIsFull, line, cursor, currentLength, \
-+ usedIndent, maxLength, justStrings) = self.fitLine(remainder, maxwidth)
- except:
- ## print "failed to fit line near", cursorcount # debug
- ## for i in program1[max(0,cursorcount-10): cursorcount]:
-@@ -235,20 +239,23 @@
- self.__dict__.update(startstate)
- heightused = maxheight - heightremaining
- return (lineprogram, remainder, laststate, heightused)
-+
- def getState(self):
- # inlined
- return self.__dict__.copy()
-+
- def resetState(self, state):
- # primarily inlined
- self.__dict__.update(state)
-+
- ## def sizeOfWord(self, word):
- ## inlineThisFunctionForEfficiency
- ## return float(stringWidth(word, self.fontName, self.fontSize))
-+
- def fitLine(self, program, totalLength):
- "fit words (and other things) onto a line"
- # assuming word lengths and spaces have not been yet added
- # fit words onto a line up to maxlength, adding spaces and respecting extra space
-- from types import StringType, TupleType, InstanceType, FloatType
- from reportlab.pdfbase.pdfmetrics import stringWidth
- usedIndent = self.indent
- maxLength = totalLength - usedIndent - self.rightIndent
-@@ -269,7 +276,7 @@
- opcode = program[cursor]
- #if debug: print "opcode", cursor, opcode
- topcode = type(opcode)
-- if topcode is StringType or topcode is InstanceType:
-+ if topcode in (StringType, UnicodeType, InstanceType):
- lastneedspace = needspace
- needspace = 0
- if topcode is InstanceType:
-@@ -278,7 +285,7 @@
- needspace = 0
- else:
- saveopcode = opcode
-- opcode = opcode.strip() #string.strip(opcode)
-+ opcode = opcode.strip()
- if opcode:
- width = stringWidth(opcode, fontName, fontSize)
- else:
-@@ -342,7 +349,7 @@
- oldcolor = self.fontColor
- (i, colorname) = opcode
- #print "opcode", opcode
-- if type(colorname) is StringType:
-+ if type(colorname) in (StringType, UnicodeType):
- color = self.fontColor = getattr(colors, colorname)
- else:
- color = self.fontColor = colorname # assume its something sensible :)
-@@ -357,7 +364,7 @@
- # change font size
- (i, fontsize) = opcode
- size = abs(float(fontsize))
-- if type(fontsize) is StringType:
-+ if type(fontsize) in (StringType, UnicodeType):
- if fontsize[:1]=="+":
- fontSize = self.fontSize = self.fontSize + size
- elif fontsize[:1]=="-":
-@@ -457,41 +464,43 @@
- line.append( ("nextLine", 0) )
- #print "fitline", line
- return (lineIsFull, line, cursor, currentLength, usedIndent, maxLength, justStrings)
-+
- def centerAlign(self, line, lineLength, maxLength):
- diff = maxLength-lineLength
- shift = diff/2.0
- if shift>TOOSMALLSPACE:
- return self.insertShift(line, shift)
- return line
-+
- def rightAlign(self, line, lineLength, maxLength):
- shift = maxLength-lineLength
- #die
- if shift>TOOSMALLSPACE:
- return self.insertShift(line, shift)
- return line
-+
- def insertShift(self, line, shift):
- # insert shift just before first visible element in line
-- from types import StringType, InstanceType
- result = []
- first = 1
- for e in line:
- te = type(e)
-- if first and (te is StringType or te is InstanceType):
-+ if first and (te in (StringType, UnicodeType, InstanceType)):
- result.append(shift)
- first = 0
- result.append(e)
- return result
-+
- def justifyAlign(self, line, lineLength, maxLength):
- diff = maxLength-lineLength
- # count EXPANDABLE SPACES AFTER THE FIRST VISIBLE
-- from types import InstanceType, StringType, TupleType, FloatType
- spacecount = 0
- visible = 0
- for e in line:
- te = type(e)
- if te is FloatType and e>TOOSMALLSPACE and visible:
- spacecount = spacecount+1
-- elif te is StringType or te is InstanceType:
-+ elif te in (StringType, UnicodeType, InstanceType):
- visible = 1
- #if debug: print "diff is", diff, "wordcount", wordcount #; die
- if spacecount<1:
-@@ -509,7 +518,7 @@
- e = line[cursor]
- te = type(e)
- result.append(e)
-- if (te is InstanceType or te is StringType):
-+ if (te in (StringType, UnicodeType, InstanceType)):
- visible = 1
- elif te is FloatType and e>TOOSMALLSPACE and visible:
- expanded = e+shift
-@@ -545,25 +554,23 @@
- ## first = 0
- ## cursor = cursor+1
- ## return result
-+
- def shrinkWrap(self, line):
- # for non justified text, collapse adjacent text/shift's into single operations
-- #return line # for testing
- result = []
- index = 0
- maxindex = len(line)
-- from types import FloatType, StringType, InstanceType
-- from string import join
- while index<maxindex:
- e = line[index]
- te = type(e)
-- if te is StringType and index<maxindex-1:
-+ if te in (StringType, UnicodeType) and index<maxindex-1:
- # collect strings and floats
- thestrings = [e]
- thefloats = 0.0
- index = index+1
- nexte = line[index]
- tnexte = type(nexte)
-- while index<maxindex and (tnexte is FloatType or tnexte is StringType):
-+ while index<maxindex and (tnexte in (FloatType, StringType, UnicodeType)):
- # switch to expandable space if appropriate
- if tnexte is FloatType:
- if thefloats<0 and nexte>0:
-@@ -571,14 +578,14 @@
- if nexte<0 and thefloats>0:
- nexte = -nexte
- thefloats = thefloats + nexte
-- elif tnexte is StringType:
-+ elif tnexte in (StringType, UnicodeType):
- thestrings.append(nexte)
- index = index+1
- if index<maxindex:
- nexte = line[index]
- tnexte = type(nexte)
- # wrap up the result
-- s = string.join(thestrings)
-+ s = ' '.join(thestrings)
- result.append(s)
- result.append(float(thefloats))
- # back up for unhandled element
-@@ -588,12 +595,12 @@
- index = index+1
-
- return result
-+
- def cleanProgram(self, line):
- "collapse adjacent spacings"
- #return line # for debugging
- result = []
- last = 0
-- from types import FloatType, TupleType, StringType, InstanceType
- for e in line:
- if type(e) is FloatType:
- # switch to expandable space if appropriate
-@@ -634,7 +641,9 @@
- tthis = type(this)
- tnext = type(next)
- # don't swap visibles
-- if tthis is StringType or tnext is StringType or this is InstanceType or tnext is InstanceType:
-+ if tthis in (StringType, UnicodeType) or \
-+ tnext in (StringType, UnicodeType) or \
-+ this is InstanceType or tnext is InstanceType:
- doswap = 0
- # only swap two tuples if the second one is an end operation and the first is something else
- elif tthis is TupleType:
-@@ -654,10 +663,10 @@
- result[nextindex] = this
- change = 1
- return result
-+
- def runOpCodes(self, program, canvas, textobject):
- "render the line(s)"
-- #import types
-- from types import StringType, TupleType, InstanceType, FloatType
-+
- escape = canvas._escape
- code = textobject._code
- startstate = self.__dict__.copy()
-@@ -672,7 +681,7 @@
- indented = 0
- for opcode in program:
- topcode = type(opcode)
-- if topcode is StringType or topcode is InstanceType:
-+ if topcode in (StringType, UnicodeType, InstanceType):
- if not indented:
- if abs(thislineindent)>TOOSMALLSPACE:
- #if debug: print "INDENTING", thislineindent
-@@ -688,7 +697,7 @@
- font = self.fontName
- size = self.fontSize
- textobject.setFont(font, size)
-- if topcode is StringType:
-+ if topcode in (StringType, UnicodeType):
- #textobject.textOut(opcode)
- text = escape(opcode)
- code.append('(%s) Tj' % text)
-@@ -723,7 +732,7 @@
- oldcolor = self.fontColor
- (i, colorname) = opcode
- #print "opcode", opcode
-- if type(colorname) is StringType:
-+ if type(colorname) in (StringType, UnicodeType):
- color = self.fontColor = getattr(colors, colorname)
- else:
- color = self.fontColor = colorname # assume its something sensible :)
-@@ -744,7 +753,7 @@
- # change font size
- (i, fontsize) = opcode
- size = abs(float(fontsize))
-- if type(fontsize) is StringType:
-+ if type(fontsize) in (StringType, UnicodeType):
- if fontsize[:1]=="+":
- fontSize = self.fontSize = self.fontSize + size
- elif fontsize[:1]=="-":
-@@ -834,12 +843,12 @@
-
- def stringLine(line, length):
- "simple case: line with just strings and spacings which can be ignored"
-+
- strings = []
-- from types import StringType
- for x in line:
-- if type(x) is StringType:
-+ if type(x) in (StringType, UnicodeType):
- strings.append(x)
-- text = string.join(strings)
-+ text = ' '.join(strings)
- result = [text, float(length)]
- nextlinemark = ("nextLine", 0)
- if line and line[-1]==nextlinemark:
-@@ -848,14 +857,14 @@
-
- def simpleJustifyAlign(line, currentLength, maxLength):
- "simple justification with only strings"
-+
- strings = []
-- from types import StringType
- for x in line[:-1]:
-- if type(x) is StringType:
-+ if type(x) in (StringType, UnicodeType):
- strings.append(x)
- nspaces = len(strings)-1
- slack = maxLength-currentLength
-- text = string.join(strings)
-+ text = ' '.join(strings)
- if nspaces>0 and slack>0:
- wordspacing = slack/float(nspaces)
- result = [("wordSpacing", wordspacing), text, maxLength, ("wordSpacing", 0)]
-@@ -869,16 +878,15 @@
- from reportlab.lib.colors import black
-
- def readBool(text):
-- if string.upper(text) in ("Y", "YES", "TRUE", "1"):
-+ if text.upper() in ("Y", "YES", "TRUE", "1"):
- return 1
-- elif string.upper(text) in ("N", "NO", "FALSE", "0"):
-+ elif text.upper() in ("N", "NO", "FALSE", "0"):
- return 0
- else:
- raise RMLError, "true/false attribute has illegal value '%s'" % text
-
- def readAlignment(text):
-- from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY
-- up = string.upper(text)
-+ up = text.upper()
- if up == 'LEFT':
- return TA_LEFT
- elif up == 'RIGHT':
-@@ -891,13 +899,13 @@
- def readLength(text):
- """Read a dimension measurement: accept "3in", "5cm",
- "72 pt" and so on."""
-- text = string.strip(text)
-+ text = text.strip()
- try:
- return float(text)
- except ValueError:
-- text = string.lower(text)
-+ text = text.lower()
- numberText, units = text[:-2],text[-2:]
-- numberText = string.strip(numberText)
-+ numberText = numberText.strip()
- try:
- number = float(numberText)
- except ValueError:
-@@ -916,13 +924,12 @@
-
- def lengthSequence(s, converter=readLength):
- """from "(2, 1)" or "2,1" return [2,1], for example"""
-- from string import split, strip
-- s = strip(s)
-+ s = s.strip()
- if s[:1]=="(" and s[-1:]==")":
- s = s[1:-1]
-- sl = split(s, ",")
-- sl = map(strip, sl)
-- sl = map(converter, sl)
-+ sl = s.split(',')
-+ sl = [s.strip() for s in sl]
-+ sl = [converter(s) for s in sl]
- return sl
-
-
-@@ -931,7 +938,7 @@
- if not text:
- return None
- from reportlab.lib import colors
-- if text[0] in string.letters:
-+ if text[0] in LETTERS:
- return colors.__dict__[text]
- tup = lengthSequence(text)
-
-@@ -978,6 +985,7 @@
- bulletIndent=0
- textColor=black
- backColor=None
-+
- def __init__(self, name, parent=None, **kw):
- mydict = self.__dict__
- if parent:
-@@ -985,6 +993,7 @@
- mydict[a]=b
- for (a,b) in kw.items():
- mydict[a] = b
-+
- def addAttributes(self, dictionary):
- for key in dictionary.keys():
- value = dictionary[key]
-@@ -999,14 +1008,21 @@
- "h1.defaultStyle": "Heading1",
- "h2.defaultStyle": "Heading2",
- "h3.defaultStyle": "Heading3",
-+ "h4.defaultStyle": "Heading4",
-+ "h5.defaultStyle": "Heading5",
-+ "h6.defaultStyle": "Heading6",
- "title.defaultStyle": "Title",
-+ "subtitle.defaultStyle": "SubTitle",
- "para.defaultStyle": "Normal",
- "pre.defaultStyle": "Code",
-- "li.defaultStyle": "Definition"
-+ "ul.defaultStyle": "Definition",
-+ "ol.defaultStyle": "Definition",
-+ "li.defaultStyle": "Definition",
- }
-
- class FastPara(Flowable):
- "paragraph with no special features (not even a single ampersand!)"
-+
- def __init__(self, style, simpletext):
- #if debug:
- # print "FAST", id(self)
-@@ -1015,6 +1031,7 @@
- self.style = style
- self.simpletext = simpletext
- self.lines = None
-+
- def wrap(self, availableWidth, availableHeight):
- simpletext = self.simpletext
- self.availableWidth = availableWidth
-@@ -1027,7 +1044,7 @@
- size = style.fontSize
- firstindent = style.firstLineIndent
- #textcolor = style.textColor
-- words = string.split(simpletext)
-+ words = simpletext.split()
- lines = []
- from reportlab.pdfbase.pdfmetrics import stringWidth
- spacewidth = stringWidth(" ", font, size)
-@@ -1062,18 +1079,18 @@
- #print "currentline", currentline
- else:
- # emit the line
-- lines.append( (string.join(currentline), currentlength, len(currentline)) )
-+ lines.append( (' '.join(currentline), currentlength, len(currentline)) )
- currentline = []
- currentlength = 0
- heightused = heightused+leading
- if heightused+leading>availableHeight:
- done = 1
- if currentlength and not done:
-- lines.append( (string.join(currentline), currentlength, len(currentline) ))
-+ lines.append( (' '.join(currentline), currentlength, len(currentline) ))
- heightused = heightused+leading
- self.lines = lines
- self.height = heightused
-- remainder = self.remainder = string.join(words[cursor:])
-+ remainder = self.remainder = ' '.join(words[cursor:])
- #print "lines", lines
- #print "remainder is", remainder
- else:
-@@ -1086,6 +1103,7 @@
- result = (availableWidth, heightused)
- #if debug: print "wrap is", (availableWidth, availableHeight), result, len(lines)
- return result
-+
- def split(self, availableWidth, availableHeight):
- style = self.style
- leading = style.leading
-@@ -1102,7 +1120,6 @@
- return [self]
-
- def draw(self):
-- from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY
- style = self.style
- lines = self.lines
- rightIndent = style.rightIndent
-@@ -1158,10 +1175,12 @@
- #textobject.textOut(text)
- y = y-leading
- c.drawText(textobject)
-+
- def getSpaceBefore(self):
- #if debug:
- # print "got space before", self.spaceBefore
- return self.style.spaceBefore
-+
- def getSpaceAfter(self):
- #print "got space after", self.spaceAfter
- return self.style.spaceAfter
-@@ -1174,15 +1193,39 @@
- result[stylenamekey] = styles[stylenamevalue]
- return result
-
-+def buildContext(stylesheet=None):
-+ result = {}
-+ from reportlab.lib.styles import getSampleStyleSheet
-+ from reportlab.lib.styles import StyleSheet1
-+ if stylesheet is not None:
-+ if isinstance(stylesheet, StyleSheet1):
-+ result.update(stylesheet.byName.copy())
-+ result.update(stylesheet.byAlias.copy())
-+ else:
-+ if hasattr(stylesheet, 'copy'):
-+ result.update(stylesheet.copy())
-+ else:
-+ stylesheet = {}
-+ styles = getSampleStyleSheet()
-+ for (stylenamekey, stylenamevalue) in DEFAULT_ALIASES.items():
-+ # Copy styles with the same name as aliases
-+ if stylesheet.has_key(stylenamevalue):
-+ result[stylenamekey] = stylesheet[stylenamevalue]
-+ # Then, fill in defaults if they were not filled yet.
-+ if not result.has_key(stylenamekey) and styles.has_key(stylenamevalue):
-+ result[stylenamekey] = styles[stylenamevalue]
-+
-+ return result
-+
- class Para(Flowable):
-+
- spaceBefore = 0
- spaceAfter = 0
-+
- def __init__(self, style, parsedText=None, bulletText=None, state=None, context=None, baseindent=0):
- #print id(self), "para", parsedText
- self.baseindent = baseindent
-- if context is None:
-- context = defaultContext()
-- self.context = context
-+ self.context = buildContext(context)
- self.parsedText = parsedText
- self.bulletText = bulletText
- self.style1 = style # make sure Flowable doesn't use this unless wanted! call it style1 NOT style
-@@ -1199,15 +1242,18 @@
- # print "spaceBefore is", self.spaceBefore, self.parsedText
- self.bold = 0
- self.italic = 0
-- self.face = "times"
-- self.size = 10
-+ self.face = style.fontName
-+ self.size = style.fontSize
-+
- def getSpaceBefore(self):
- #if debug:
- # print "got space before", self.spaceBefore
- return self.spaceBefore
-+
- def getSpaceAfter(self):
- #print "got space after", self.spaceAfter
- return self.spaceAfter
-+
- def wrap(self, availableWidth, availableHeight):
- if debug:
- print "WRAPPING", id(self), availableWidth, availableHeight
-@@ -1242,7 +1288,8 @@
- if not program:
- self.program = program = self.compileProgram(parsedText)
- if not self.formattedProgram:
-- (formattedProgram, remainder, laststate, heightused) = p.format(availableWidth, availableHeight, program, leading)
-+ (formattedProgram, remainder, \
-+ laststate, heightused) = p.format(availableWidth, availableHeight, program, leading)
- self.formattedProgram = formattedProgram
- self.height = heightused
- self.laststate = laststate
-@@ -1259,7 +1306,8 @@
- height = availableHeight + 1
- #print "laststate is", laststate
- #print "saving remainder", remainder
-- self.remainder = Para(self.style1, parsedText=None, bulletText=None, state=laststate)
-+ self.remainder = Para(self.style1, parsedText=None, bulletText=None, \
-+ state=laststate, context=self.context)
- self.remainder.program = remainder
- self.remainder.spaceAfter = self.spaceAfter
- self.spaceAfter = 0
-@@ -1277,6 +1325,7 @@
- print "exact match???" + repr(availableHeight, h)
- print "wrap is", (availableWidth, availableHeight), result
- return result
-+
- def split(self, availableWidth, availableHeight):
- #if debug:
- # print "SPLITTING", id(self), availableWidth, availableHeight
-@@ -1300,6 +1349,7 @@
- result= [self]
- #if debug: print "split is", result
- return result
-+
- def draw(self):
- p = self.myengine #paragraphEngine()
- formattedProgram = self.formattedProgram
-@@ -1362,40 +1412,15 @@
- # now look for a place where to insert the unindent after the first line
- if style.firstLineIndent:
- count = 0
-- from types import StringType, InstanceType
- for x in program:
- count = count+1
- tx = type(x)
-- if tx is StringType or tx is InstanceType:
-+ if tx in (StringType, UnicodeType, InstanceType):
- break
- program.insert( count, ("indent", -style.firstLineIndent ) ) # defaults to end if no visibles
-- #print "="*8, id(self), "program is"
-- #for x in program:
-- # print x
--## print "="*11
--## # check pushes and pops
--## stackcount = 0
--## dump = 0
--## from types import TupleType
--## for x in program:
--## if dump:
--## print "dump:", x
--## if type(x) is TupleType:
--## i = x[0]
--## if i=="push":
--## stackcount = stackcount+1
--## print " "*stackcount, "push", stackcount
--## if i=="pop":
--## stackcount = stackcount-1
--## print " "*stackcount, "pop", stackcount
--## if stackcount<0:
--## dump=1
--## print "STACK UNDERFLOW!"
--## if dump: stop
- return program
-+
- def linearize(self, program = None, parsedText=None):
-- #print "LINEARIZING", self
-- #program = self.program = []
- if parsedText is None:
- parsedText = self.parsedText
- style = self.style1
-@@ -1417,23 +1442,22 @@
- program.append( ("leading", 0) )
- program.append( ("nextLine", 0) )
- program.append( ("pop",) )
-+
- def compileComponent(self, parsedText, program):
-- import types
- ttext = type(parsedText)
-- #program = self.program
-- if ttext is types.StringType:
-+ if ttext in (StringType, UnicodeType):
- # handle special characters here...
- # short cut
- if parsedText:
-- stext = parsedText.strip() #string.strip(parsedText)
-+ stext = parsedText.strip()
- if not stext:
- program.append(" ") # contract whitespace to single space
- else:
- handleSpecialCharacters(self, parsedText, program)
-- elif ttext is types.ListType:
-+ elif ttext is ListType:
- for e in parsedText:
- self.compileComponent(e, program)
-- elif ttext is types.TupleType:
-+ elif ttext is TupleType:
- (tagname, attdict, content, extra) = parsedText
- if not attdict:
- attdict = {}
-@@ -1455,10 +1479,11 @@
- a("</%s>" % tagname)
- else:
- a("/>")
-- t = string.join(L, "")
-+ t = ''.join(L)
- handleSpecialCharacters(self, t, program)
- else:
- raise ValueError, "don't know how to handle tag " + repr(tagname)
-+
- def shiftfont(self, program, face=None, bold=None, italic=None):
- oldface = self.face
- oldbold = self.bold
-@@ -1481,26 +1506,29 @@
- # "anonymous" tag: just do the content
- for e in content:
- self.compileComponent(e, program)
-- #compile_para = compile_ # at least for now...
-+
- def compile_pageNumber(self, attdict, content, extra, program):
- program.append(PageNumberObject())
-+
- def compile_b(self, attdict, content, extra, program):
- (f,b,i) = self.shiftfont(program, bold=1)
- for e in content:
- self.compileComponent(e, program)
- self.shiftfont(program, bold=b)
-+
- def compile_i(self, attdict, content, extra, program):
- (f,b,i) = self.shiftfont(program, italic=1)
- for e in content:
- self.compileComponent(e, program)
- self.shiftfont(program, italic=i)
-+
- def compile_u(self, attdict, content, extra, program):
- # XXXX must eventually add things like alternative colors
-- #program = self.program
- program.append( ('lineOperation', UNDERLINE) )
- for e in content:
- self.compileComponent(e, program)
- program.append( ('endLineOperation', UNDERLINE) )
-+
- def compile_sub(self, attdict, content, extra, program):
- size = self.size
- self.size = newsize = size * 0.7
-@@ -1515,18 +1543,15 @@
- program.append( ('rise', rise) )
-
- def compile_ul(self, attdict, content, extra, program, tagname="ul"):
-- # by transformation
-- #print "compile", tagname, attdict
- atts = attdict.copy()
- bulletmaker = bulletMaker(tagname, atts, self.context)
- # now do each element as a separate paragraph
-- import types
- for e in content:
- te = type(e)
-- if te is types.StringType:
-- if e.strip(): #string.strip(e):
-+ if te in (StringType, UnicodeType):
-+ if e.strip():
- raise ValueError, "don't expect CDATA between list elements"
-- elif te is types.TupleType:
-+ elif te is TupleType:
- (tagname, attdict1, content1, extra) = e
- if tagname!="li":
- raise ValueError, "don't expect %s inside list" % repr(tagname)
-@@ -1534,57 +1559,59 @@
- if attdict1:
- newatts.update(attdict1)
- bulletmaker.makeBullet(newatts)
-- self.compile_para(newatts, content1, extra, program)
-+ self.compile_li(newatts, content1, extra, program)
-
- def compile_ol(self, attdict, content, extra, program):
- return self.compile_ul(attdict, content, extra, program, tagname="ol")
-
-+ def compile_li(self, attdict, content, extra, program):
-+ self.compile_para(attdict, content, extra, program)
-+
- def compile_dl(self, attdict, content, extra, program):
-- # by transformation
-- #print "compile", tagname, attdict
-- atts = attdict.copy()
-- # by transformation
-- #print "compile", tagname, attdict
- atts = attdict.copy()
- bulletmaker = bulletMaker("dl", atts, self.context)
- # now do each element as a separate paragraph
-- import types
- contentcopy = list(content) # copy for destruction
- bullet = ""
- while contentcopy:
- e = contentcopy[0]
- del contentcopy[0]
- te = type(e)
-- if te is types.StringType:
-- if e.strip(): #string.strip(e):
-+ if te in (StringType, UnicodeType):
-+ if e.strip():
- raise ValueError, "don't expect CDATA between list elements"
- elif not contentcopy:
- break # done at ending whitespace
- else:
- continue # ignore intermediate whitespace
-- elif te is types.TupleType:
-+ elif te is TupleType:
- (tagname, attdict1, content1, extra) = e
- if tagname!="dd" and tagname!="dt":
-- raise ValueError, "don't expect %s here inside list, expect 'dd' or 'dt'" % repr(tagname)
-+ raise ValueError, "don't expect %s here inside list, expect 'dd' or 'dt'" % \
-+ repr(tagname)
- if tagname=="dt":
- if bullet:
- raise ValueError, "dt will not be displayed unless followed by a dd: "+repr(bullet)
- if content1:
-- if len(content1)!=1:
-- raise ValueError, "only simple strings supported in dd content currently: "+repr(content1)
-- bullet = content1[0]
-- if type(bullet) is not types.StringType:
-- raise ValueError, "only simple strings supported in dd content currently: "+repr(content1)
-+ self.compile_dt(attdict1, content1, extra, program)
-+ # raise ValueError, \
-+ # "only simple strings supported in dd content currently: "+repr(content1)
- elif tagname=="dd":
- newatts = atts.copy()
- if attdict1:
- newatts.update(attdict1)
- bulletmaker.makeBullet(newatts, bl=bullet)
-- self.compile_para(newatts, content1, extra, program)
-+ self.compile_dd(newatts, content1, extra, program)
- bullet = "" # don't use this bullet again
- if bullet:
- raise ValueError, "dt will not be displayed unless followed by a dd"+repr(bullet)
-
-+ def compile_dt(self, attdict, content, extra, program):
-+ self.compile_para(attdict, content, extra, program)
-+
-+ def compile_dd(self, attdict, content, extra, program):
-+ self.compile_para(attdict, content, extra, program)
-+
- def compile_super(self, attdict, content, extra, program):
- size = self.size
- self.size = newsize = size * 0.7
-@@ -1597,6 +1624,7 @@
- program.append( ('size', size) )
- self.size = size
- program.append( ('rise', -rise) )
-+
- def compile_font(self, attdict, content, extra, program):
- #program = self.program
- program.append( ("push",) ) # store current data
-@@ -1618,6 +1646,7 @@
- for e in content:
- self.compileComponent(e, program)
- program.append( ("pop",) ) # restore as before
-+
- def compile_a(self, attdict, content, extra, program):
- url = attdict["href"]
- colorname = attdict.get("color", "blue")
-@@ -1632,6 +1661,7 @@
- program.append( ('endLineOperation', UNDERLINE) )
- program.append( ('endLineOperation', Link) )
- program.append( ("pop",) ) # restore as before
-+
- def compile_link(self, attdict, content, extra, program):
- dest = attdict["destination"]
- colorname = attdict.get("color", None)
-@@ -1647,6 +1677,7 @@
- program.append( ('endLineOperation', UNDERLINE) )
- program.append( ('endLineOperation', Link) )
- program.append( ("pop",) ) # restore as before
-+
- def compile_setLink(self, attdict, content, extra, program):
- dest = attdict["destination"]
- colorname = attdict.get("color", "blue")
-@@ -1664,43 +1695,55 @@
- program.append( ('endLineOperation', UNDERLINE) )
- program.append( ('endLineOperation', Link) )
- program.append( ("pop",) ) # restore as before
-+
- #def compile_p(self, attdict, content, extra, program):
- # # have to be careful about base indent here!
- # not finished
-+
- def compile_bullet(self, attdict, content, extra, program):
-- from types import StringType
- ### eventually should allow things like images and graphics in bullets too XXXX
-- if len(content)!=1 or type(content[0]) is not StringType:
-+ if len(content)!=1 or type(content[0]) not in (StringType, UnicodeType):
- raise ValueError, "content for bullet must be a single string"
- text = content[0]
- self.do_bullet(text, program)
-+
- def do_bullet(self, text, program):
- style = self.style1
-- #program = self.program
- indent = style.bulletIndent + self.baseindent
- font = style.bulletFontName
- size = style.bulletFontSize
- program.append( ("bullet", text, indent, font, size) )
-+
- def compile_tt(self, attdict, content, extra, program):
- (f,b,i) = self.shiftfont(program, face="Courier")
- for e in content:
- self.compileComponent(e, program)
- self.shiftfont(program, face=f)
-+
- def compile_greek(self, attdict, content, extra, program):
- self.compile_font({"face": "symbol"}, content, extra, program)
-+
- def compile_evalString(self, attdict, content, extra, program):
- program.append( EvalStringObject(attdict, content, extra, self.context) )
-+
- def compile_name(self, attdict, content, extra, program):
- program.append( NameObject(attdict, content, extra, self.context) )
-+
- def compile_getName(self, attdict, content, extra, program):
- program.append( GetNameObject(attdict, content, extra, self.context) )
-+
- def compile_seq(self, attdict, content, extra, program):
- program.append( SeqObject(attdict, content, extra, self.context) )
-+
- def compile_seqReset(self, attdict, content, extra, program):
- program.append( SeqResetObject(attdict, content, extra, self.context) )
-+
- def compile_seqDefault(self, attdict, content, extra, program):
- program.append( SeqDefaultObject(attdict, content, extra, self.context) )
-+
- def compile_para(self, attdict, content, extra, program, stylename = "para.defaultStyle"):
-+ if attdict is None:
-+ attdict = {}
- context = self.context
- stylename = attdict.get("style", stylename)
- style = context[stylename]
-@@ -1708,45 +1751,37 @@
- newstyle.addAttributes(attdict)
- bulletText = attdict.get("bulletText", None)
- mystyle = self.style1
-- #newstyle.bulletIndent = mystyle.leftIndent+newstyle.bulletIndent
-- #print "attdict", attdict
-- #print "leftindent, baseindent", mystyle.leftIndent
-- #print "bulletIndent", newstyle.bulletIndent
-- thepara = Para(newstyle, content, context=context, bulletText=bulletText) # possible ref loop on context, break later
-+ thepara = Para(newstyle, content, context=context, bulletText=bulletText)
-+ # possible ref loop on context, break later
- # now compile it and add it to the program
- mybaseindent = self.baseindent
- self.baseindent = thepara.baseindent = mystyle.leftIndent + self.baseindent
- thepara.linearize(program=program)
-- #print "program so far"
-- #for x in program:
-- # print x
- program.append( ("nextLine", 0) )
- self.baseindent = mybaseindent
-
--
- class bulletMaker:
-+
- def __init__(self, tagname, atts, context):
- self.tagname = tagname
-- #print "context is", context
-- style = "li.defaultStyle"
-+ self.context = context
-+ style = context.has_key(tagname) and tagname or "%s.defaultStyle" % tagname
- self.style = style = atts.get("style", style)
-- typ = {"ul": "disc", "ol": "1", "dl": None}[tagname]
-- #print tagname, "bulletmaker type is", typ
-- self.typ =typ = atts.get("type", typ)
-- #print tagname, "bulletmaker type is", typ
-+ typ = {"ul": "disc", "ol": "1"}.get(tagname, None)
-+ self.typ = typ = atts.get("type", typ)
- if not atts.has_key("leftIndent"):
- # get the style so you can choose an indent length
-- thestyle = context[style]
- from reportlab.pdfbase.pdfmetrics import stringWidth
-- size = thestyle.fontSize
-+ size = self.context[self.style].fontSize
- indent = stringWidth("XXX", "Courier", size)
- atts["leftIndent"] = str(indent)
- self.count = 0
-+
- def makeBullet(self, atts, bl=None):
- count = self.count = self.count+1
- typ = self.typ
- tagname = self.tagname
-- #print "makeBullet", tagname, typ, count
-+ if bl == 'm': raise ValueError
- # forget space before for non-first elements
- if count>1:
- atts["spaceBefore"] = "0"
-@@ -1758,7 +1793,7 @@
- else:
- raise ValueError, "unordered list type %s not implemented" % repr(typ)
- if not atts.has_key("bulletFontName"):
-- atts["bulletFontName"] = "ZapfDingbats"
-+ atts["bulletFontName"] = self.context[self.style].bulletFontName or "ZapfDingbats"
- elif tagname=="ol":
- if typ=="1": bl = repr(count)
- elif typ=="a":
-@@ -1778,7 +1813,9 @@
-
- class EvalStringObject:
- "this will only work if rml2pdf is present"
-+
- tagname = "evalString"
-+
- def __init__(self, attdict, content, extra, context):
- if not attdict:
- attdict = {}
-@@ -1786,11 +1823,13 @@
- self.content = content
- self.context = context
- self.extra = extra
-+
- def getOp(self, tuple, engine):
- from rlextra.rml2pdf.rml2pdf import Controller
- #print "tuple", tuple
- op = self.op = Controller.processTuple(tuple, self.context, {})
- return op
-+
- def width(self, engine):
- from reportlab.pdfbase.pdfmetrics import stringWidth
- content = self.content
-@@ -1803,10 +1842,12 @@
- #print self
- s = str(op)
- return stringWidth(s, engine.fontName, engine.fontSize)
-+
- def execute(self, engine, textobject, canvas):
- textobject.textOut(str(self.op))
-
- class SeqObject(EvalStringObject):
-+
- def getOp(self, tuple, engine):
- from reportlab.lib.sequencer import getSequencer
- globalsequencer = getSequencer()
-@@ -1830,6 +1871,7 @@
- pass # name doesn't produce any output
-
- class SeqDefaultObject(NameObject):
-+
- def getOp(self, tuple, engine):
- from reportlab.lib.sequencer import getSequencer
- globalsequencer = getSequencer()
-@@ -1843,6 +1885,7 @@
- return ""
-
- class SeqResetObject(NameObject):
-+
- def getOp(self, tuple, engine):
- from reportlab.lib.sequencer import getSequencer
- import math
-@@ -1864,11 +1907,14 @@
- tagname = "getName"
-
- class PageNumberObject:
-+
- def __init__(self, example="XXX"):
- self.example = example # XXX SHOULD ADD THE ABILITY TO PASS IN EXAMPLES
-+
- def width(self, engine):
- from reportlab.pdfbase.pdfmetrics import stringWidth
- return stringWidth(self.example, engine.fontName, engine.fontSize)
-+
- def execute(self, engine, textobject, canvas):
- n = canvas.getPageNumber()
- textobject.textOut(str(n))
-@@ -1890,11 +1936,10 @@
- mystyle.addAttributes(attdict)
- bulletText = attdict.get("bulletText", None)
- # can we use the fast implementation?
-- import types
- result = None
- if not bulletText and len(content)==1:
- text = content[0]
-- if type(text) is types.StringType and "&" not in text:
-+ if type(text) in (StringType, UnicodeType) and "&" not in text:
- result = FastPara(mystyle, text)
- if result is None:
- result = Para(mystyle, content, context=context, bulletText=bulletText) # possible ref loop on context, break later
-@@ -2119,7 +2164,7 @@
- for fragment in amptext:
- if not first:
- # check for special chars
-- semi = string.find(fragment, ";")
-+ semi = fragment.find(";")
- if semi>0:
- name = fragment[:semi]
- if greeks.has_key(name):
-@@ -2128,7 +2173,7 @@
- (f,b,i) = engine.shiftfont(program, face="symbol")
- program.append(greeksub)
- engine.shiftfont(program, face=f)
-- if fragment and fragment[0] in string.whitespace:
-+ if fragment and fragment[0] in WHITESPACE:
- program.append(" ") # follow the greek with a space
- else:
- # add back the &
-@@ -2143,10 +2188,10 @@
- # does the last one need a space?
- if sfragment and fragment:
- # reader 3 used to go nuts if you don't special case the last frag, but it's fixed?
-- if fragment[-1] in string.whitespace: # or fragment==lastfrag:
-+ if fragment[-1] in WHITESPACE: # or fragment==lastfrag:
- program.append( sfragment[-1]+" " )
- else:
-- last = sfragment[-1].strip() #string.strip(sfragment[-1])
-+ last = sfragment[-1].strip()
- if last:
- #print "last is", repr(last)
- program.append( last )
-@@ -2154,7 +2199,7 @@
- #print "HANDLED", program
- return program
-
--def Paragraph(text, style, bulletText=None, frags=None):
-+def Paragraph(text, style, bulletText=None, frags=None, context=None):
- """ Paragraph(text, style, bulletText=None)
- intended to be like a platypus Paragraph but better.
- """
-@@ -2165,7 +2210,7 @@
- # use the fully featured one.
- from reportlab.lib import rparsexml
- parsedpara = rparsexml.parsexmlSimple(text)
-- return Para(style, parsedText=parsedpara, bulletText=bulletText, state=None)
-+ return Para(style, parsedText=parsedpara, bulletText=bulletText, state=None, context=context)
-
- ##class Paragraph(Para):
- ## """ Paragraph(text, style, bulletText=None)
-@@ -2206,8 +2251,10 @@
- UNDERLINE = UnderLineHandler()
-
- class HotLink(UnderLineHandler):
-+
- def __init__(self, url):
- self.url = url
-+
- def end_at(self, x, y, para, canvas, textobject):
- fontsize = para.fontSize
- rect = [self.xStart, self.yStart, x,y+fontsize]
-@@ -2215,27 +2262,31 @@
- print "LINKING RECTANGLE", rect
- #canvas.rect(self.xStart, self.yStart, x-self.xStart,y+fontsize-self.yStart, stroke=1)
- self.link(rect, canvas)
-+
- def link(self, rect, canvas):
- canvas.linkURL(self.url, rect, relative=1)
-
- class InternalLink(HotLink):
-+
- def link(self, rect, canvas):
- destinationname = self.url
- contents = ""
- canvas.linkRect(contents, destinationname, rect, Border="[0 0 0]")
-
- class DefDestination(HotLink):
-+
- defined = 0
-+
- def link(self, rect, canvas):
- destinationname = self.url
- if not self.defined:
- [x, y, x1, y1] = rect
-- canvas.bookmarkHorizontal(destinationname, x,y1) # use the upper y
-+ canvas.bookmarkHorizontal(destinationname, x, y1) # use the upper y
- self.defined = 1
-
- def splitspace(text):
- # split on spacing but include spaces at element ends
-- stext = string.split(text)
-+ stext = text.split()
- result = []
- for e in stext:
- result.append(e+" ")
diff --git a/sandbox/dreamcatcher/rlpdf/README.txt b/sandbox/dreamcatcher/rlpdf/README.txt
deleted file mode 100644
index 62e31f1ef..000000000
--- a/sandbox/dreamcatcher/rlpdf/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-modules from reportlab tools
-
diff --git a/sandbox/dreamcatcher/rlpdf/__init__.py b/sandbox/dreamcatcher/rlpdf/__init__.py
deleted file mode 100644
index 274814120..000000000
--- a/sandbox/dreamcatcher/rlpdf/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# rlpdf subpackage
-
-from rlpdf import Writer
-from stylesheet import getStyleSheet
-from rltemplate import RLDocTemplate
diff --git a/sandbox/dreamcatcher/rlpdf/rllicense.txt b/sandbox/dreamcatcher/rlpdf/rllicense.txt
deleted file mode 100644
index f3825f506..000000000
--- a/sandbox/dreamcatcher/rlpdf/rllicense.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#####################################################################################
-#
-# Copyright (c) 2000-2001, ReportLab Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the company nor the names of its contributors may be
-# used to endorse or promote products derived from this software without
-# specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE OFFICERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-#####################################################################################
diff --git a/sandbox/dreamcatcher/rlpdf/rlpdf.py b/sandbox/dreamcatcher/rlpdf/rlpdf.py
deleted file mode 100644
index d0dafc02e..000000000
--- a/sandbox/dreamcatcher/rlpdf/rlpdf.py
+++ /dev/null
@@ -1,789 +0,0 @@
-#! /usr/bin/env python
-
-"""
-:Author: Engelbert Gruber
-:Contact: goodger@users.sourceforge.net
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-Simple pdf writer.
-
-The output uses reportlabs module.
-
-Some stylesheet is needed.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import time
-from types import ListType, TupleType, UnicodeType
-from docutils import writers, nodes, languages
-
-from stylesheet import getStyleSheet
-from rltemplate import RLDocTemplate
-
-from reportlab.lib.styles import ParagraphStyle
-from reportlab.lib.enums import *
-from reportlab.lib.pagesizes import A4
-from reportlab.platypus import *
-from reportlab.platypus.para import Paragraph
-from reportlab.lib import colors
-from reportlab.lib.units import inch
-from StringIO import StringIO
-
-class Writer(writers.Writer):
-
- supported = ('pdf','rlpdf')
- """Formats this writer supports."""
-
- settings_spec = (
- 'PDF-Specific Options',
- None,
- (('Format for footnote references: one of "superscript" or '
- '"brackets". Default is "brackets".',
- ['--footnote-references'],
- {'choices': ['superscript', 'brackets'], 'default': 'brackets',
- 'metavar': '<FORMAT>'}),))
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = PDFTranslator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.story = visitor.as_what()
- self.output = self.record()
-
- def record(self):
- from reportlab.platypus import SimpleDocTemplate
- out = StringIO()
- doc = SimpleDocTemplate(out, pagesize=A4)
- doc.build(self.story)
- return out.getvalue()
-
- def lower(self):
- return 'pdf'
-
-class PDFTranslator(nodes.NodeVisitor):
-
- def __init__(self, doctree):
- self.settings = settings = doctree.settings
- self.styleSheet = getStyleSheet()
- nodes.NodeVisitor.__init__(self, doctree)
- self.language = languages.get_language(doctree.settings.language_code)
- self.in_docinfo = None
- self.head = []
- self.body = []
- self.foot = []
- self.sectionlevel = 0
- self.context = []
- self.topic_class = ''
- self.story = []
- self.bulletText = '\267' # maybe move this into stylesheet.
- self.bulletlevel = 0
-
- def as_what(self):
- return self.story
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- if type(text) is UnicodeType:
- text = text.replace(u'\u2020', u' ')
- text = text.replace(u'\xa0', u' ')
- text = text.encode('utf-8')
- #text = text.replace("&", "&amp;")
- #text = text.replace("<", '"')
- #text = text.replace('"', "(quot)")
- #text = text.replace(">", '"')
- # footnotes have character values above 128 ?
- return text
-
- def append_para(self, text, in_style='Normal', bulletText=None):
- if type(text) in (ListType, TupleType):
- text = ''.join([self.encode(t) for t in text])
- style = self.styleSheet[in_style]
- self.story.append(Paragraph(self.encode(text), style, \
- bulletText=bulletText, context=self.styleSheet))
-
- def starttag(self, node, tagname, suffix='\n', **attributes):
- atts = {}
- for (name, value) in attributes.items():
- atts[name.lower()] = value
- for att in ('class',): # append to node attribute
- if node.has_key(att):
- if atts.has_key(att):
- atts[att] = node[att] + ' ' + atts[att]
- for att in ('id',): # node attribute overrides
- if node.has_key(att):
- atts[att] = node[att]
- attlist = atts.items()
- attlist.sort()
- parts = [tagname]
- for name, value in attlist:
- if value is None: # boolean attribute
- parts.append(name.lower())
- elif isinstance(value, ListType):
- values = [str(v) for v in value]
- parts.append('%s="%s"' % (name.lower(),
- self.encode(' '.join(values))))
- else:
- parts.append('%s="%s"' % (name.lower(),
- self.encode(str(value))))
- return '<%s>%s' % (' '.join(parts), suffix)
-
- def visit_Text(self, node):
- self.context.append('#text')
- self.body.append(node.astext())
-
- def depart_Text(self, node):
- self.context.pop()
-
- def visit_admonition(self, node, name):
- pass
-
- def depart_admonition(self):
- pass
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_address(self, node):
- self.visit_docinfo_item(node, 'address')
-
- def depart_address(self, node):
- self.depart_docinfo_item()
-
- def visit_version(self, node):
- self.visit_docinfo_item(node, 'version')
-
- def depart_version(self, node):
- self.depart_docinfo_item()
-
- def visit_system_message(self, node):
- pass
-
- def depart_system_message(self, node):
- pass
-
- def visit_term(self, node):
- self.context.append('dt')
- self.body.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- # Closes on visit_definition
- self.context.pop()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- pass
-
- def depart_block_quote(self, node):
- pass
-
- def visit_bullet_list(self, node):
- self.context.append(len(self.body))
- self.context.append('ul')
- self.body.append('<ul bulletText="%s">' % self.bulletText)
-
- def depart_bullet_list(self, node):
- self.context.pop()
- self.body.append('</ul>')
- start = self.context.pop()
- if not 'ul' in self.context:
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_caption(self, node):
- pass
-
- def depart_caption(self, node):
- pass
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- pass
-
- def depart_citation(self, node):
- pass
-
- def visit_citation_reference(self, node):
- pass
-
- def depart_citation_reference(self, node):
- pass
-
- def visit_classifier(self, node):
- pass
-
- def depart_classifier(self, node):
- pass
-
- def visit_colspec(self, node):
- pass
-
- def depart_colspec(self, node):
- pass
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'contact')
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_definition(self, node):
- self.body.append('</dt>')
- self.context.append('dd')
- self.body.append(self.starttag(node, 'dd'))
-
- def depart_definition(self, node):
- self.context.pop()
- self.body.append('</dd>')
-
- def visit_definition_list(self, node):
- self.context.append(len(self.body))
- self.context.append('dl')
- self.body.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- self.context.pop()
- self.body.append('</dl>')
- start = self.context.pop()
- if not 'dl' in self.context:
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- pass
-
- def depart_description(self, node):
- pass
-
- def visit_docinfo(self, node):
- self.context.append(len(self.body))
- self.in_docinfo = 1
-
- def depart_docinfo(self, node):
- start = self.context.pop()
- docinfo = self.body[start:]
- self.body = self.body[:start]
- self.append_para(docinfo)
- self.in_docinfo = None
-
- def visit_docinfo_item(self, node, name):
- self.body.append('<para style="DocInfo"><b>%s: </b>' % self.language.labels[name])
-
- def depart_docinfo_item(self):
- self.body.append('</para>')
-
- def visit_doctest_block(self, node):
- self.visit_literal_block(node)
-
- def depart_doctest_block(self, node):
- self.depart_literal_block(node)
-
- def visit_line_block(self, node):
- self.visit_literal_block(node)
-
- def depart_line_block(self, node):
- self.depart_literal_block(node)
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.context.append('i')
- self.body.append('<i>')
-
- def depart_emphasis(self, node):
- self.context.pop()
- self.body.append('</i>')
-
- def visit_entry(self, node):
- pass
-
- def depart_entry(self, node):
- pass
-
- def visit_enumerated_list(self, node):
- self.context.append(len(self.body))
- self.context.append('ol')
- self.body.append('<ol>')
-
- def depart_enumerated_list(self, node):
- self.context.pop()
- self.body.append('</ol>')
- start = self.context.pop()
- if not 'ol' in self.context:
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- self.body.append('<para>')
-
- def depart_field(self, node):
- self.body.append('</para>')
-
- def visit_field_argument(self, node):
- pass
-
- def depart_field_argument(self, node):
- pass
-
- def visit_field_list(self, node):
- self.context.append(len(self.body))
- self.body.append('<para>')
-
- def depart_field_list(self, node):
- start = self.context.pop()
- self.body.append('</para>')
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_field_name(self, node):
- self.body.append('<b>')
-
- def depart_field_name(self, node):
- self.body.append(': </b>')
-
- def visit_field_body(self, node):
- pass
-
- def depart_field_body(self, node):
- pass
-
- def visit_footnote(self, node):
- self.context.append('footnotes')
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- self.context.append("%s%s" % (self.starttag({}, 'setLink', '', destination=node['id']), \
- '</setLink>'))
- self.context.append("%s%s" % (self.starttag({}, 'link', '', destination=backrefs[0]), \
- '</link>'))
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append("%s%s%s" % (self.starttag({}, 'link', '', destination=backref),
- i,
- '</link>'))
- i += 1
- self.context.append(' <i>(%s)</i> ' % ', '.join(backlinks))
- self.context.append("%s%s" % (self.starttag({}, 'setLink', '', destination=node['id']), \
- '</setLink>'))
- else:
- self.context.append("%s%s" % (self.starttag({}, 'setLink', '', destination=node['id']), \
- '</setLink>'))
- self.context.append('')
-
- def footnote_backrefs_depart(self, node):
- if not self.context and self.body:
- self.append_para(self.body)
- self.body = []
-
- def depart_footnote(self, node):
- self.context.pop()
- self.footnote_backrefs_depart(node)
-
- def visit_footnote_reference(self, node):
- # for backrefs
- if self.settings.footnote_backlinks and node.has_key('id'):
- self.body.append(self.starttag(node, 'setLink', '', destination=node['id']))
- self.context.append('</setLink>')
- else:
- self.context.append('')
-
- href = ''
- if node.has_key('refid'):
- href = node['refid']
- elif node.has_key('refname'):
- href = self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '<super>'
- self.context.append('</super>')
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.body.append(self.starttag(node, 'link', suffix, destination=href))
-
- def depart_footnote_reference(self, node):
- self.body.append(self.context.pop())
- self.body.append('</link>')
- self.body.append(self.context.pop())
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- pass
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_interpreted(self, node):
- pass
-
- def depart_interpreted(self, node):
- pass
-
- def visit_label(self, node):
- if 'footnotes' in self.context:
- self.body.append('[')
-
- def depart_label(self, node):
- if 'footnotes' in self.context:
- self.body.append(']')
- self.body.append(self.context.pop())
- self.body.append(self.context.pop())
- self.body.append(' ')
-
- def visit_legend(self, node):
- pass
-
- def depart_legend(self, node):
- pass
-
- def visit_list_item(self, node):
- self.context.append('li')
- self.body.append('<li>')
-
- def depart_list_item(self, node):
- self.context.pop()
- self.body.append('</li>')
-
- def visit_literal(self, node):
- self.context.append('literal')
-
- def depart_literal(self, node):
- self.context.pop()
-
- def visit_literal_block(self, node):
- self.story.append(Preformatted(node.astext(), self.styleSheet['Code']))
- raise nodes.SkipNode
-
- def depart_literal_block(self, node):
- pass
-
- def visit_meta(self, node):
- self.head.append(self.starttag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- pass
-
- def depart_option(self, node):
- pass
-
- def visit_option_argument(self, node):
- pass
-
- def depart_option_argument(self, node):
- pass
-
- def visit_option_group(self, node):
- pass
-
- def depart_option_group(self, node):
- pass
-
- def visit_option_list(self, node):
- self.context.append(len(self.body))
- self.context.append('option_list')
-
- def depart_option_list(self, node):
- self.context.pop()
- start = self.context.pop()
- if not 'option_list' in self.context:
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_option_list_item(self, node):
- pass
-
- def depart_option_list_item(self, node):
- pass
-
- def visit_option_string(self, node):
- pass
-
- def depart_option_string(self, node):
- pass
-
- def visit_organization(self, node):
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- self.context.append(len(self.body))
- self.context.append('p')
-
- def depart_paragraph(self, node):
- self.context.pop()
- start = self.context.pop()
- if not self.context and self.body:
- self.append_para(self.body[start:])
- self.body = self.body[:start]
-
- def visit_problematic(self, node):
- pass
-
- def depart_problematic(self, node):
- pass
-
- def visit_raw(self, node):
- if node.has_key('format') and node['format'] == 'html':
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def visit_target(self, node):
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- href = ''
- if node.has_key('id'):
- href = node['id']
- elif node.has_key('name'):
- href = node['name']
- self.body.append("%s%s" % (self.starttag(node, 'setLink', '', destination=href), \
- '</setLink>'))
- raise nodes.SkipNode
-
- def depart_target(self, node):
- pass
-
- def visit_reference(self, node):
- self.context.append('a')
- if node.has_key('refuri'):
- href = node['refuri']
- self.body.append(self.starttag(node, 'a', '', href=href))
- self.context.append('</a>')
- else:
- if node.has_key('id'):
- self.body.append(self.starttag({}, 'setLink', '', destination=node['id']))
- self.context.append('</setLink>')
- if node.has_key('refid'):
- href = node['refid']
- elif node.has_key('refname'):
- href = self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'link', '', destination=href))
- self.context.append('</link>')
-
- def depart_reference(self, node):
- if node.has_key('id') and \
- not node.has_key('refuri'):
- self.body.append(self.context.pop())
- self.body.append(self.context.pop())
- self.context.pop()
-
- def visit_revision(self, node):
- self.visit_docinfo_item(node, 'revision')
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- pass
-
- def depart_row(self, node):
- pass
-
- def visit_section(self, node):
- self.sectionlevel += 1
-
- def depart_section(self, node):
- self.sectionlevel -= 1
-
- def visit_status(self, node):
- self.visit_docinfo_item(node, 'status')
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- self.context.append('b')
- self.body.append('<b>')
-
- def depart_strong(self, node):
- self.context.pop()
- self.body.append('</b>')
-
- def visit_subtitle(self, node):
- self.context.append(len(self.body))
- self.context.append('subtitle')
-
- def depart_subtitle(self, node):
- style = self.context.pop()
- start = self.context.pop()
- self.append_para(self.body[start:], style)
- self.body = self.body[:start]
-
- def visit_title(self, node):
- atts = {}
- self.context.append(len(self.body))
- self.context.append('title')
- if isinstance(node.parent, nodes.topic):
- self.context.append('')
- self.topic_class = 'topic-title'
- elif self.sectionlevel == 0:
- self.context.append('title')
- else:
- self.context.append("h%s" % self.sectionlevel)
-
- if self.context[-1] != 'title':
- if node.parent.hasattr('id'):
- self.context.append('</setLink>')
- self.body.append(self.starttag({}, 'setLink', '', destination=node.parent['id']))
- if node.hasattr('refid'):
- self.context.append('</link>')
- self.body.append(self.starttag({}, 'link', '', destination=node['refid']))
- else:
- self.context.append('')
-
- def depart_title(self, node):
- if node.hasattr('refid'):
- self.body.append(self.context.pop())
- if node.parent.hasattr('id'):
- self.body.append(self.context.pop())
- style = self.context.pop()
- self.context.pop()
- if isinstance(node.parent, nodes.topic):
- style = self.topic_class
- start = self.context.pop()
- self.append_para(self.body[start:], style)
- self.body = self.body[:start]
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
- def visit_topic(self, node):
- if node.hasattr('id'):
- self.context.append('</setLink>')
- self.body.append(self.starttag({}, 'setLink', '', destination=node['id']))
-
- def depart_topic(self, node):
- if node.hasattr('id'):
- self.body.append(self.context.pop())
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def invisible_visit(self, node):
- """Invisible nodes should be ignored."""
- pass
-
- def visit_comment(self, node):
- raise nodes.SkipNode
-
- depart_comment = invisible_visit
- visit_substitution_definition = visit_comment
- depart_substitution_definition = depart_comment
- visit_figure = visit_comment
- depart_figure = depart_comment
-
- visit_sidebar = invisible_visit
- visit_warning = invisible_visit
- visit_tip = invisible_visit
- visit_tbody = invisible_visit
- visit_thead = invisible_visit
- visit_tgroup = invisible_visit
- visit_table = invisible_visit
- visit_title_reference = invisible_visit
- visit_transition = invisible_visit
- visit_pending = invisible_visit
- depart_pending = invisible_visit
- depart_transition = invisible_visit
- depart_title_reference = invisible_visit
- depart_table = invisible_visit
- depart_tgroup = invisible_visit
- depart_thead = invisible_visit
- depart_tbody = invisible_visit
- depart_tip = invisible_visit
- depart_warning = invisible_visit
- depart_sidebar = invisible_visit
diff --git a/sandbox/dreamcatcher/rlpdf/rltemplate.py b/sandbox/dreamcatcher/rlpdf/rltemplate.py
deleted file mode 100644
index 16b453b73..000000000
--- a/sandbox/dreamcatcher/rlpdf/rltemplate.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#copyright ReportLab Inc. 2000
-#see rllicense.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/tools/rltemplate.py?cvsroot=reportlab
-#$Header$
-# doc template for RL manuals. Currently YAML is hard-coded
-#to use this, which is wrong.
-
-
-from reportlab.platypus import PageTemplate, \
- BaseDocTemplate, SimpleDocTemplate, Frame, Paragraph
-from reportlab.lib.units import inch, cm
-from reportlab.rl_config import defaultPageSize
-
-
-class FrontCoverTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- frame1 = Frame(inch,
- 3*inch,
- self.pageWidth - 2*inch,
- self.pageHeight - 518, id='cover')
- PageTemplate.__init__(self, id, [frame1]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- canvas.saveState()
- #canvas.drawImage('../images/replogo.gif',2*inch, 8*inch)
-
-
- canvas.setFont('Times-Roman', 10)
- canvas.line(inch, 120, self.pageWidth - inch, 120)
-
- #canvas.drawString(inch, 100, 'Lombard Business Park')
- #canvas.drawString(inch, 88, '8 Lombard Road')
- #canvas.drawString(inch, 76, 'Wimbledon')
- #canvas.drawString(inch, 64, 'London, ENGLAND SW19 3TZ')
-
- #canvas.drawRightString(self.pageWidth - inch, 100, '103 Bayard Street')
- #canvas.drawRightString(self.pageWidth - inch, 88, 'New Brunswick')
- #canvas.drawRightString(self.pageWidth - inch, 76, 'New Jersey, 08904)')
- #canvas.drawRightString(self.pageWidth - inch, 64, 'USA')
-
- canvas.restoreState()
-
-
-class OneColumnTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- frame1 = Frame(inch,
- inch,
- self.pageWidth - 2*inch,
- self.pageHeight - 2*inch,
- id='normal')
- PageTemplate.__init__(self, id, [frame1]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- y = self.pageHeight - 50
- canvas.saveState()
- canvas.setFont('Times-Roman', 10)
- canvas.drawString(inch, y+8, doc.title)
- canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter)
- canvas.line(inch, y, self.pageWidth - inch, y)
- canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber())
- canvas.restoreState()
-
-class TwoColumnTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- colWidth = 0.5 * (self.pageWidth - 2.25*inch)
- frame1 = Frame(inch,
- inch,
- colWidth,
- self.pageHeight - 2*inch,
- id='leftCol')
- frame2 = Frame(0.5 * self.pageWidth + 0.125,
- inch,
- colWidth,
- self.pageHeight - 2*inch,
- id='rightCol')
- PageTemplate.__init__(self, id, [frame1, frame2]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- y = self.pageHeight - 50
- canvas.saveState()
- canvas.setFont('Times-Roman', 10)
- canvas.drawString(inch, y+8, doc.title)
- canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter)
- canvas.line(inch, y, self.pageWidth - inch, y*inch)
- canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber())
- canvas.restoreState()
-
-
-# class RLDocTemplate(BaseDocTemplate):
-class RLDocTemplate(SimpleDocTemplate):
- def afterInit(self):
- self.addPageTemplates(FrontCoverTemplate('Cover', self.pagesize))
- self.addPageTemplates(OneColumnTemplate('Normal', self.pagesize))
- self.addPageTemplates(TwoColumnTemplate('TwoColumn', self.pagesize))
- self.addPageTemplates(OneColumnTemplate('Cover', self.pagesize))
-
- #just playing
- self.title = "(Document Title Goes Here)"
- self.chapter = "(No chapter yet)"
- self.chapterNo = 1 #unique keys
- self.sectionNo = 1 # unique keys
-
-## # AR hack
-## self.counter = 1
- def beforeDocument(self):
- self.canv.showOutline()
-
- def afterFlowable(self, flowable):
- """Detect Level 1 and 2 headings, build outline,
- and track chapter title."""
- if isinstance(flowable, Paragraph):
- style = flowable.style.name
-
-## #AR debug text
-## try:
-## print '%d: %s...' % (self.counter, flowable.getPlainText()[0:40])
-## except AttributeError:
-## print '%d: (something with ABag)' % self.counter
-## self.counter = self.counter + 1
-
- if style == 'Title':
- self.title = flowable.getPlainText()
- elif style == 'Heading1':
- self.chapter = flowable.getPlainText()
- key = 'ch%d' % self.chapterNo
- self.canv.bookmarkPage(key)
- self.canv.addOutlineEntry(flowable.getPlainText(),
- key, 0, 0)
- self.chapterNo = self.chapterNo + 1
- self.sectionNo = 1
- elif style == 'Heading2':
- self.section = flowable.text
- key = 'ch%ds%d' % (self.chapterNo, self.sectionNo)
- self.canv.bookmarkPage(key)
- self.canv.addOutlineEntry(flowable.getPlainText(),
- key, 1, 0)
- self.sectionNo = self.sectionNo + 1
diff --git a/sandbox/dreamcatcher/rlpdf/stylesheet.py b/sandbox/dreamcatcher/rlpdf/stylesheet.py
deleted file mode 100644
index ed2c21233..000000000
--- a/sandbox/dreamcatcher/rlpdf/stylesheet.py
+++ /dev/null
@@ -1,212 +0,0 @@
-#copyright ReportLab Inc. 2000
-#see rllicense.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/tools/stylesheet.py?cvsroot=reportlab
-#$Header$
-#standard stylesheet for our manuals
-from reportlab.lib.styles import StyleSheet1, ParagraphStyle
-from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
-from reportlab.lib import colors
-
-
-def getStyleSheet():
- """Returns a stylesheet object"""
- stylesheet = StyleSheet1()
-
- stylesheet.add(ParagraphStyle(name='Normal',
- fontName='Times-Roman',
- fontSize=10,
- leading=12,
- spaceBefore=4,
- spaceAfter=4)
- )
-
- stylesheet.add(ParagraphStyle(name='DocInfo',
- parent=stylesheet['Normal'],
- leading=12,
- spaceBefore=0,
- spaceAfter=0)
- )
-
- stylesheet.add(ParagraphStyle(name='Comment',
- fontName='Times-Italic')
- )
-
- stylesheet.add(ParagraphStyle(name='Indent1',
- leftIndent=36,
- firstLineIndent=0)
- )
-
- stylesheet.add(ParagraphStyle(name='BodyText',
- parent=stylesheet['Normal'],
- spaceBefore=6)
- )
- stylesheet.add(ParagraphStyle(name='Italic',
- parent=stylesheet['BodyText'],
- fontName = 'Times-Italic')
- )
-
- stylesheet.add(ParagraphStyle(name='Heading1',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=20,
- leading=20,
- spaceBefore=10,
- spaceAfter=6),
- alias='h1')
-
- stylesheet.add(ParagraphStyle(name='Heading2',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=18,
- leading=18,
- spaceBefore=10,
- spaceAfter=6),
- alias='h2')
-
- stylesheet.add(ParagraphStyle(name='Heading3',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- fontSize=16,
- leading=16,
- spaceBefore=10,
- spaceAfter=6),
- alias='h3')
-
- stylesheet.add(ParagraphStyle(name='Heading4',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- fontsize=14,
- leading=14,
- spaceBefore=8,
- spaceAfter=4),
- alias='h4')
-
- stylesheet.add(ParagraphStyle(name='Heading5',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- fontsize=13,
- leading=13,
- spaceBefore=8,
- spaceAfter=4),
- alias='h5')
-
- stylesheet.add(ParagraphStyle(name='Heading6',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- fontsize=12,
- leading=12,
- spaceBefore=8,
- spaceAfter=4),
- alias='h6')
-
- stylesheet.add(ParagraphStyle(name='Title',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=22,
- leading=22,
- spaceAfter=8,
- alignment=TA_CENTER
- ),
- alias='title')
-
- stylesheet.add(ParagraphStyle(name='Subtitle',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=20,
- leading=20,
- spaceAfter=6,
- alignment=TA_CENTER
- ),
- alias='subtitle')
-
- stylesheet.add(ParagraphStyle(name='TopicTitle',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=18,
- leading=14,
- spaceAfter=6,
- ),
- alias='topic-title')
-
- for i in range(0, 15):
- indent = 18*i
- stylesheet.add(ParagraphStyle(name='TopicItem%s' % i,
- parent=stylesheet['Normal'],
- fontName = 'Times-Roman',
- fontSize=12,
- leftIndent=indent,
- spaceBefore=0,
- spaceAfter=0,
- ),
- alias='topic-item-%s' % i)
-
- stylesheet.add(ParagraphStyle(name='UnorderedList',
- parent=stylesheet['Normal'],
- firstLineIndent=0,
- leftIndent=18,
- bulletIndent=9,
- spaceBefore=0,
- bulletFontName='Symbol'),
- alias='ul')
-
- stylesheet.add(ParagraphStyle(name='Definition',
- parent=stylesheet['Normal'],
- firstLineIndent=0,
- leftIndent=36,
- bulletIndent=0,
- spaceAfter=2,
- spaceBefore=2,
- bulletFontName='Times-BoldItalic'),
- alias='dl')
-
- stylesheet.add(ParagraphStyle(name='OrderedList',
- parent=stylesheet['Definition']),
- alias='ol')
-
- stylesheet.add(ParagraphStyle(name='Code',
- parent=stylesheet['Normal'],
- fontName='Courier',
- textColor=colors.navy,
- fontSize=8,
- leading=8.8,
- leftIndent=36,
- firstLineIndent=0))
-
- stylesheet.add(ParagraphStyle(name='FunctionHeader',
- parent=stylesheet['Normal'],
- fontName='Courier-Bold',
- fontSize=8,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='DocString',
- parent=stylesheet['Normal'],
- fontName='Courier',
- fontSize=8,
- leftIndent=18,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='DocStringIndent',
- parent=stylesheet['Normal'],
- fontName='Courier',
- fontSize=8,
- leftIndent=36,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='URL',
- parent=stylesheet['Normal'],
- fontName='Courier',
- textColor=colors.navy,
- alignment=TA_CENTER),
- alias='u')
-
- stylesheet.add(ParagraphStyle(name='Centred',
- parent=stylesheet['Normal'],
- alignment=TA_CENTER
- ))
-
- stylesheet.add(ParagraphStyle(name='Caption',
- parent=stylesheet['Centred'],
- fontName='Times-Italic'
- ))
-
- return stylesheet
diff --git a/sandbox/dreamcatcher/tools/pdf.py b/sandbox/dreamcatcher/tools/pdf.py
deleted file mode 100755
index de89e44d5..000000000
--- a/sandbox/dreamcatcher/tools/pdf.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:Author: Engelbert Gruber
-:Contact: grubert@users.sourceforge.net
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-A minimal front-end to the Docutils Publisher, producing PDF via ReportLabs.
-"""
-
-from docutils.core import publish_cmdline
-try:
- from docutils.writers.rlpdf import Writer
-except ImportError:
- from rlpdf import Writer
-
-
-usage = 'usage:\n %prog [options] [source [destination]]'
-
-publish_cmdline(writer=Writer(), usage=usage)
diff --git a/sandbox/edloper/docpy/asyncore.rst b/sandbox/edloper/docpy/asyncore.rst
deleted file mode 100644
index 2eda1647c..000000000
--- a/sandbox/edloper/docpy/asyncore.rst
+++ /dev/null
@@ -1,295 +0,0 @@
-==========
- asyncore
-==========
-
------------------------------
- Asynchronous socket handler
------------------------------
-
-Literal block::
- Synopsis: A base class for developing asynchronous socket
- handling services.
- Type: module builtin
- Module-Author: Sam Rushing <rushing@nightmare.com>
- Author: Christopher Petrilli <petrilli@amber.org>
- Author: Steve Holden <sholden@holdenweb.com>
-
-.. Type: ... builtin, standard, various others: any specific usages required?
-..
-.. Heavily adapted from original documentation by Sam Rushing.
-..
-.. ............................................
-.. This is the (first) RFC822-reader strawman
-.. ............................................
-.. Presumes a custom reader appropriate to docpy
-.. RFC822 continuation IS allowed (see Synopsis)
-.. Needtocheck: RFC822-readers and multiple entities? (Author lines)
-.. Dunno about implication of \section in the original
-.. Dunno about comments (#?); "Credit: Sam Rushing?"
-.. Note in passing: names of new roles and directives made similar to
-.. the existing docpy macros on purpose (for existing corpus & community)
-..
-.. Markups needed, used, and existing in rst:
-.. *emphasis*
-..
-.. Markups needed, used, and modified by this strawman:
-.. ``code``
-..
-.. Roles needed below by this strawman:
-.. :cfunction:``
-.. :module:``
-.. :refmodule:``
-.. :class:``
-.. :function:``
-.. :var:``
-.. :label:``
-..
-.. Directives needed below by this strawman:
-.. .. funcdesc::
-.. need to parse for optional argumnents shown as [...]
-.. .. classdesc::
-.. .. datadesc::
-..
-.. TBS - formals, e.g., funcdesc - several alternatives proposed
-.. below (see funcdesc) in this draft
-.. the one shown first seems on track for consensus 04.3.20
-.. (the directive will parse brackets, etc. - easier to use!)
-
-This module provides the basic infrastructure for writing asynchronous
-socket service clients and servers.
-
-There are only two ways to have a program on a single processor do
-"more than one thing at a time." Multi-threaded programming is the
-simplest and most popular way to do it, but there is another very
-different technique, that lets you have nearly all the advantages of
-multi-threading, without actually using multiple threads. It's really
-only practical if your program is largely I/O bound. If your program
-is processor bound, then pre-emptive scheduled threads are probably what
-you really need. Network servers are rarely processor bound, however.
-
-If your operating system supports the :cfunction:`select()` system call
-in its I/O library (and nearly all do), then you can use it to juggle
-multiple communication channels at once; doing other work while your
-I/O is taking place in the "background." Although this strategy can
-seem strange and complex, especially at first, it is in many ways
-easier to understand and control than multi-threaded programming.
-The :module:`asyncore` module solves many of the difficult problems for
-you, making the task of building sophisticated high-performance
-network servers and clients a snap. For "conversational" applications
-and protocols the companion :refmodule:`asynchat` module is invaluable.
-
-The basic idea behind both modules is to create one or more network
-*channels*, instances of class :class:`asyncore.dispatcher` and
-:class:`asynchat.async_chat`. Creating the channels adds them to a global
-map, used by the :function:`loop()` function if you do not provide it
-with your own :var:`map`.
-
-Once the initial channel(s) is(are) created, calling the :function:`loop()`
-function activates channel service, which continues until the last
-channel (including any that have been added to the map during asynchronous
-service) is closed.
-
-.. funcdesc:: loop([timeout [, use_poll [, map]]])
-
- Enter a polling loop that only terminates after all open channels
- have been closed. All arguments are optional. The :var:`timeout`
- argument sets the timeout parameter for the appropriate
- :function:`select()` or :function:`poll()` call, measured in seconds;
- the default is 30 seconds. The :var:`use_poll` parameter, if true,
- indicates that :function:`poll()` should be used in preference to
- :function:`select()` (the default is ``False``). The :var:`map` parameter
- is a dictionary whose items are the channels to watch. As channels
- are closed they are deleted from their map. If :var:`map` is
- omitted, a global map is used (this map is updated by the default
- class :method:`__init__()`
- -- make sure you extend, rather than override, :method:`__init__()`
- if you want to retain this behavior).
-
- Channels (instances of :class:`asyncore.dispatcher`, :class:`asynchat.async_chat`
- and subclasses thereof) can freely be mixed in the map.
-
-.. classdesc:: dispatcher()
-
- The :class:`dispatcher` class is a thin wrapper around a low-level socket object.
- To make it more useful, it has a few methods for event-handling which are called
- from the asynchronous loop.
- Otherwise, it can be treated as a normal non-blocking socket object.
-
- Two class attributes can be modified, to improve performance,
- or possibly even to conserve memory.
-
- .. datadesc:: ac_in_buffer_size
-
- The asynchronous input buffer size (default ``4096``).
-
- .. datadesc:: ac_out_buffer_size
-
- The asynchronous output buffer size (default ``4096``).
-
- The firing of low-level events at certain times or in certain connection
- states tells the asynchronous loop that certain higher-level events have
- taken place. For example, if we have asked for a socket to connect to
- another host, we know that the connection has been made when the socket
- becomes writable for the first time (at this point you know that you may
- write to it with the expectation of success). The implied higher-level
- events are:
-
- ===================== ===============================================
- ``Event`` Description
- --------------------- -----------------------------------------------
- ``handle_connect()`` Implied by the first write event
- ``handle_close()`` Implied by a read event with no data available
- ``handle_accept()`` Implied by a read event on a listening socket
- ===================== ===============================================
-
-
- During asynchronous processing, each mapped channel's :method:`readable()`
- and :method:`writable()` methods are used to determine whether the channel's
- socket should be added to the list of channels :cfunction:`select()`\ ed or
- :cfunction:`poll()`\ ed for read and write events.
-
-Thus, the set of channel events is larger than the basic socket events.
-The full set of methods that can be overridden in your subclass follows:
-
-.. methoddesc:: handle_read()
-
- Called when the asynchronous loop detects that a :method:`read()`
- call on the channel's socket will succeed.
-
-.. methoddesc:: handle_write()
-
- Called when the asynchronous loop detects that a writable socket
- can be written.
- Often this method will implement the necessary buffering for
- performance. For example::
-
-
- def handle_write(self):
- sent = self.send(self.buffer)
- self.buffer = self.buffer[sent:]
-
-.. methoddesc:: handle_expt()
-
- Called when there is out of band (OOB) data for a socket
- connection. This will almost never happen, as OOB is
- tenuously supported and rarely used.
-
-.. methoddesc:: handle_connect()
-
- Called when the active opener's socket actually makes a connection.
- Might send a "welcome" banner, or initiate a protocol
- negotiation with the remote endpoint, for example.
-
-.. methoddesc:: handle_close()
-
- Called when the socket is closed.
-
-.. methoddesc:: handle_error()
-
- Called when an exception is raised and not otherwise handled. The default
- version prints a condensed traceback.
-
-.. methoddesc:: handle_accept()
-
- Called on listening channels (passive openers) when a
- connection can be established with a new remote endpoint that
- has issued a :method:`connect()` call for the local endpoint.
-
-.. methoddesc:: readable()
-
- Called each time around the asynchronous loop to determine whether a
- channel's socket should be added to the list on which read events can
- occur. The default method simply returns ``True``,
- indicating that by default, all channels will be interested in
- read events.
-
-.. methoddesc:: writable()
-
- Called each time around the asynchronous loop to determine whether a
- channel's socket should be added to the list on which write events can
- occur. The default method simply returns ``True``,
- indicating that by default, all channels will be interested in
- write events.
-
-In addition, each channel delegates or extends many of the socket methods.
-Most of these are nearly identical to their socket partners.
-
-.. methoddesc:: create_socket(family, type)
-
- This is identical to the creation of a normal socket, and
- will use the same options for creation. Refer to the
- :refmodule:`socket` documentation for information on creating
- sockets.
-
-.. methoddesc:: connect(address)
-
- As with the normal socket object, :var:`address` is a
- tuple with the first element the host to connect to, and the
- second the port number.
-
-.. methoddesc:: send(data)
-
- Send :var:`data` to the remote end-point of the socket.
-
-.. methoddesc:: recv(buffer_size)
-
- Read at most :var:`buffer_size` bytes from the socket's remote end-point.
- An empty string implies that the channel has been closed from the other
- end.
-
-.. methoddesc:: listen(backlog)
-
- Listen for connections made to the socket. The :var:`backlog`
- argument specifies the maximum number of queued connections
- and should be at least 1; the maximum value is
- system-dependent (usually 5).
-
-.. methoddesc:: bind(address)
-
- Bind the socket to :var:`address`. The socket must not already
- be bound. (The format of :var:`address` depends on the address
- family --- see above.)
-
-.. methoddesc:: accept()
-
- Accept a connection. The socket must be bound to an address
- and listening for connections. The return value is a pair
- ``(conn , address)`` where :var:`conn` is a
- *new* socket object usable to send and receive data on
- the connection, and :var:`address` is the address bound to the
- socket on the other end of the connection.
-
-.. methoddesc:: close()
-
- Close the socket. All future operations on the socket object
- will fail. The remote end-point will receive no more data (after
- queued data is flushed). Sockets are automatically closed
- when they are garbage-collected.
-
-
-asyncore Example basic HTTP client :label:`asyncore-example`
-------------------------------------------------------------
-As a basic example, below is a very basic HTTP client that uses the
-:class:`dispatcher` class to implement its socket handling::
-
- class http_client(asyncore.dispatcher):
- def __init__(self, host,path):
- asyncore.dispatcher.__init__(self)
- self.path = path
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.connect( (host, 80) )
- self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % self.path
-
- def handle_connect(self):
- pass
-
- def handle_read(self):
- data = self.recv(8192)
- print data
-
- def writable(self):
- return (len(self.buffer) > 0)
-
- def handle_write(self):
- sent = self.send(self.buffer)
- self.buffer = self.buffer[sent:]
diff --git a/sandbox/edloper/docpy/docpy.py b/sandbox/edloper/docpy/docpy.py
deleted file mode 100755
index 450a9b735..000000000
--- a/sandbox/edloper/docpy/docpy.py
+++ /dev/null
@@ -1,323 +0,0 @@
-#!/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.
-
-"""
-:todo: role-labeled inline text
-:todo: generate output (subclass LaTeXTransformer)
-:todo later: macros (susbtitution refs)
-"""
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.directives import admonitions
-from docutils.parsers.rst import states
-from docutils.writers import latex2e
-import re, tokenize
-
-######################################################################
-# New nodes
-######################################################################
-
-class funcdesc(nodes.Admonition, nodes.Element): pass
-class classdesc(nodes.Admonition, nodes.Element): pass
-class methoddesc(nodes.Admonition, nodes.Element): pass
-class datadesc(nodes.Admonition, nodes.Element): pass
-class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
-
-# We might use pynodes instead.
-class func_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class func_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class func_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class func_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class func_optional(nodes.Part, nodes.Inline, nodes.TextElement): pass
-
-# These are the inline things.
-class docpy_function(nodes.Inline, nodes.TextElement): pass
-class docpy_manpage(nodes.Inline, nodes.TextElement): pass
-class docpy_regexp(nodes.Inline, nodes.TextElement): pass
-class docpy_file(nodes.Inline, nodes.TextElement): pass
-class docpy_label(nodes.Inline, nodes.TextElement): pass
-class docpy_class(nodes.Inline, nodes.TextElement): pass
-class docpy_method(nodes.Inline, nodes.TextElement): pass
-class docpy_cfunction(nodes.Inline, nodes.TextElement): pass
-class docpy_refmodule(nodes.Inline, nodes.TextElement): pass
-class docpy_module(nodes.Inline, nodes.TextElement): pass
-class docpy_var(nodes.Inline, nodes.TextElement): pass
-inline_docpy_elements = { # Maps roles to entitites
- 'function':docpy_function,
- 'manpage':docpy_manpage,
- 'regexp':docpy_regexp,
- 'file':docpy_file,
- 'label': docpy_label,
- 'class': docpy_class,
- 'method': docpy_method,
- 'cfunction': docpy_cfunction,
- 'refmodule': docpy_refmodule,
- 'module': docpy_module,
- 'var': docpy_var,
- }
-
-for (role, element) in inline_docpy_elements.items():
- states.register_inliner_role(role, element)
-
-
-######################################################################
-# Directives
-######################################################################
-
-# Transform a python signature into RST.
-def parse_signature(s):
- """
- A straw-man implementation. (Might be sufficient)
- """
- s = s.strip()
- m = re.match(r'^(\w+)\s*\((.*)\)$', s)
- if m is None: raise ValueError(`s`)
- name, arglist = m.groups()
-
- sig = func_signature(s,'')
-
- sig.append(func_name(name,name))
- sig.append(func_parameterlist())
-
- stack = [sig[-1]]
- for token in re.split(r'(\*{0,2}\w+|[\[\],])', arglist):
- #print `token`, stack
- if token == '[':
- opt = func_optional()
- stack[-1].append(opt)
- stack.append(opt)
- elif token == ']':
- stack.pop()
- elif token == ',':
- pass
- elif re.match(r'^\s*$', token):
- pass
- elif re.match(r'^\*{0,2}\w+$', token):
- stack[-1].append(func_parameter(token,token))
- else:
- raise ValueError(s)
- if len(stack) != 1: raise ValueError(s)
- return sig
-
-def funcdesc_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- rv = admonitions.make_admonition(funcdesc, name, [], options, content,
- lineno, content_offset, block_text,
- state, state_machine)
- rv[0].insert(0, parse_signature(arguments[0]))
- return rv
-funcdesc_directive.content = 1
-funcdesc_directive.arguments = (1,0,1) # 1 required arg with spaces.
-
-def methoddesc_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- rv = admonitions.make_admonition(methoddesc, name, [], options, content,
- lineno, content_offset, block_text,
- state, state_machine)
- rv[0].insert(0, parse_signature(arguments[0]))
- return rv
-methoddesc_directive.content = 1
-methoddesc_directive.arguments = (1,0,1) # 1 required arg with spaces.
-
-def classdesc_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- rv = admonitions.make_admonition(classdesc, name, [], options, content,
- lineno, content_offset, block_text,
- state, state_machine)
- rv[0].insert(0, parse_signature(arguments[0]))
- return rv
-classdesc_directive.content = 1
-classdesc_directive.arguments = (1,0,1) # 1 required arg with spaces.
-
-def datadesc_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- rv = admonitions.make_admonition(datadesc, name, [], options, content,
- lineno, content_offset, block_text,
- state, state_machine)
- rv[0].insert(0, desc_name(arguments[0], arguments[0]))
- return rv
-datadesc_directive.content = 1
-datadesc_directive.arguments = (1,0,1) # 1 required arg with spaces.
-
-# Register the directives
-directives.register_directive('funcdesc', funcdesc_directive)
-directives.register_directive('methoddesc', methoddesc_directive)
-directives.register_directive('classdesc', classdesc_directive)
-directives.register_directive('datadesc', datadesc_directive)
-
-######################################################################
-# Writer
-######################################################################
-
-class DocpyWriter(latex2e.Writer):
- def translate(self):
- visitor = DocpyTranslator(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- self.head_prefix = visitor.head_prefix
- self.head = visitor.head
- self.body_prefix = visitor.body_prefix
- self.body = visitor.body
- self.body_suffix = visitor.body_suffix
-
-class DocpyTranslator(latex2e.LaTeXTranslator):
- """
- Incompatibilities:
- - latex docs uses \subsection, we generate \subsection*
- (e.g., \subsection{asyncore Exampe ...})
- - we generate header & footer info that we don't need
- - we don't handle RFC822 stuff & generate a top-level \section
- - in a function signature, we escape underscores but latex docs
- don't. e.g., funcdesc (line 46 of asyncore).
- - in role-labeled text, we escape underscore but latex docs
- don't.
- - table rendering is completely different.
- """
-
- def __init__(self, *args):
- latex2e.LaTeXTranslator.__init__(self, *args)
- self.section_level = 1
- self.first_paramter_visited = 0
-
-
- #------------------------------------------------------------
- # Directives
- #------------------------------------------------------------
- def visit_funcdesc(self, node):
- self.body.append('\n'+r'\begin{funcdesc}')
- def depart_funcdesc(self, node):
- self.body.append(r'\end{funcdesc}'+'\n')
-
- def visit_methoddesc(self, node):
- self.body.append('\n'+r'\begin{methoddesc}')
- def depart_methoddesc(self, node):
- self.body.append(r'\end{methoddesc}'+'\n')
-
- def visit_classdesc(self, node):
- self.body.append('\n'+r'\begin{classdesc}')
- def depart_classdesc(self, node):
- self.body.append(r'\end{classdesc}'+'\n')
-
- def visit_datadesc(self, node):
- self.body.append('\n'+r'\begin{datadesc}')
- def depart_datadesc(self, node):
- self.body.append(r'\end{datadesc}'+'\n')
-
- def visit_desc_name(self, node):
- self.body.append('{')
- def depart_desc_name(self, node):
- self.body.append('}')
-
- def visit_func_name(self, node):
- self.body.append('{')
- def depart_func_name(self, node):
- self.body.append('}')
-
- def visit_func_signature(self, node): pass
- def depart_func_signature(self, node): pass
-
- def visit_func_parameterlist(self, node):
- self.body.append('{')
- self.first_parameter_visited = 0
- def depart_func_parameterlist(self, node):
- self.body.append('}')
-
- def visit_func_parameter(self, node):
- if self.first_parameter_visited:
- self.body.append(', ')
- self.first_parameter_visited = 1
- def depart_func_parameter(self, node): pass
-
- def visit_func_optional(self, node):
- self.body.append(r'\optional{')
- if self.first_paramter_visited:
- self.body.append(',')
- def depart_func_optional(self, node):
- self.body.append('}')
-
-
- #------------------------------------------------------------
- # Inline Roles
- #------------------------------------------------------------
- def visit_docpy_function(self, node):
- self.body.append(r'\function{')
- def depart_docpy_function(self, node):
- self.body.append(r'}')
-
- def visit_docpy_manpage(self, node):
- self.body.append(r'\manpage{')
- def depart_docpy_manpage(self, node):
- self.body.append(r'}')
-
- def visit_docpy_regexp(self, node):
- self.body.append(r'\regexp{')
- def depart_docpy_regexp(self, node):
- self.body.append(r'}')
-
- def visit_docpy_file(self, node):
- self.body.append(r'\file{')
- def depart_docpy_file(self, node):
- self.body.append(r'}')
-
- def visit_docpy_label(self, node):
- self.body.append(r'\label{')
- def depart_docpy_label(self, node):
- self.body.append(r'}')
-
- def visit_docpy_class(self, node):
- self.body.append(r'\class{')
- def depart_docpy_class(self, node):
- self.body.append(r'}')
-
- def visit_docpy_method(self, node):
- self.body.append(r'\method{')
- def depart_docpy_method(self, node):
- self.body.append(r'}')
-
- def visit_docpy_cfunction(self, node):
- self.body.append(r'\cfunction{')
- def depart_docpy_cfunction(self, node):
- self.body.append(r'}')
-
- def visit_docpy_refmodule(self, node):
- self.body.append(r'\refmodule{')
- def depart_docpy_refmodule(self, node):
- self.body.append(r'}')
-
- def visit_docpy_module(self, node):
- self.body.append(r'\module{')
- def depart_docpy_module(self, node):
- self.body.append(r'}')
-
- def visit_docpy_var(self, node):
- self.body.append(r'\var{')
- def depart_docpy_var(self, node):
- self.body.append(r'}')
-
- #------------------------------------------------------------
- # Etc.
- #------------------------------------------------------------
- def visit_literal(self, node):
- self.literal = 1
- self.body.append('\\code{')
-
-######################################################################
-# Front-end code
-######################################################################
-if __name__ == '__main__':
- import locale
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- pass
-
- from docutils.core import publish_cmdline, default_description
- description = default_description
- publish_cmdline(writer=DocpyWriter(), description=description)
- #publish_cmdline(writer_name='pseudoxml', description=description)
-
diff --git a/sandbox/edloper/epytext/epytext.py b/sandbox/edloper/epytext/epytext.py
deleted file mode 100644
index 52071542a..000000000
--- a/sandbox/edloper/epytext/epytext.py
+++ /dev/null
@@ -1,95 +0,0 @@
-
-import epydoc.markup.epytext as epytext
-import xml.dom.minidom as minidom
-import docutils.nodes as nodes
-import docutils.parsers
-
-class Parser(docutils.parsers.Parser):
- """The epytext parser."""
-
- supported = ('epytext')
-
- settings_spec = (
- 'epytext Parser Options',
- None,
- ())
-
- def __init__(self):
- pass
-
- def parse(self, inputstring, document):
- errors = []
- epytext_tree = epytext.parse(inputstring)
-
- self.setup_parse(inputstring, document)
- for child in self._parse(epytext_tree):
- self.document.append(child)
- self.finish_parse()
-
- def _parse(self, tree):
- if isinstance(tree, minidom.Document):
- return self._parse(tree.childNodes[0])
- if isinstance(tree, minidom.Text):
- return nodes.Text(tree.data)
-
- # Get children.
- children = [self._parse(c) for c in tree.childNodes]
-
- if tree.tagName == 'epytext':
- return children
- if tree.tagName == 'para':
- return nodes.paragraph('','', *children)
- if tree.tagName == 'section':
- return nodes.section('', *children)
- if tree.tagName == 'heading':
- return nodes.title('','', *children)
- if tree.tagName == 'fieldlist':
- return nodes.field_list('', *children)
- if tree.tagName == 'field':
- return nodes.field('', *self._parse_field(tree, children))
- if tree.tagName == 'literalblock':
- return nodes.literal_block('','', *children)
- if tree.tagName == 'doctestblock':
- return nodes.doctest_block('','', *children)
- if tree.tagName == 'ulist':
- return nodes.bullet_list('', *children)
- if tree.tagName == 'olist':
- return nodes.enumerated_list('', *children)
- if tree.tagName == 'li':
- return nodes.list_item('', *children)
- if tree.tagName == 'link':
- # [XX] discards link target.
- name, target = children
- return nodes.title_reference('','', name)
- if tree.tagName == 'uri':
- name, target = children
- return nodes.reference('','', name, refuid=target.astext())
- if tree.tagName == 'code':
- return nodes.literal('','', *children)
- if tree.tagName == 'math':
- return nodes.emphasis('','', *children)
- if tree.tagName == 'italic':
- return nodes.emphasis('','', *children)
- if tree.tagName == 'bold':
- return nodes.strong('','', *children)
- if tree.tagName == 'indexed':
- # [XX] doesn't mark the fact that it's indexedd
- return nodes.emphasis('','', *children)
- if tree.tagName == 'symbol':
- # use substitutions.
- # [XX] this needs to be fixed!
- return nodes.Text(children[0])
- elif tree.tagName in ('tag', 'arg', 'name', 'target'):
- return children[0]
- else:
- raise ValueError, ('unknown %s' % tree.tagName)
-
- def _parse_field(self, tree, children):
- numargs = 0
- while tree.childNodes[numargs+1].tagName == 'arg': numargs += 1
- tag = children[0]
- args = children[1:1+numargs]
- body = children[1+numargs:]
- name = nodes.field_name('','', *children[:1+numargs])
- body = nodes.field_body('', *children[1+numargs:])
- return (name, body)
diff --git a/sandbox/edloper/epytext/epytext.test b/sandbox/edloper/epytext/epytext.test
deleted file mode 100644
index 4d23f3dbd..000000000
--- a/sandbox/edloper/epytext/epytext.test
+++ /dev/null
@@ -1,26 +0,0 @@
-This is a
-paragraph.
-
-
-Heading
-=======
- A new section
- - A bulleted list
- 1. An enumerated list
-
- A B{paragraph} I{with} C{various} X{inline} M{formatting}
-
- Symbols are not supported yet: S{alpha}
-
- A literal block::
-
- A /
- / B
-
- A doctest block:
-
- >>> print 1
- 1
-
- @field: this is a field
- @field arg: this is another field.
diff --git a/sandbox/edloper/epytext/publish_epytext.py b/sandbox/edloper/epytext/publish_epytext.py
deleted file mode 100755
index ce4b7fa40..000000000
--- a/sandbox/edloper/epytext/publish_epytext.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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.
-
-"""
-A minimal front end to the Docutils Publisher, producing pseudo-XML.
-"""
-
-import epytext
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates pseudo-XML from standalone reStructuredText '
- 'sources (for testing purposes). ' + default_description)
-
-publish_cmdline(parser=epytext.Parser(), description=description)
diff --git a/sandbox/edloper/roles/README.txt b/sandbox/edloper/roles/README.txt
deleted file mode 100644
index 79fdb6cd3..000000000
--- a/sandbox/edloper/roles/README.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-==========================================
-reStructuredText Interpreted Role Registry
-==========================================
-
-This directory contains my implementation of an extensible interpreted
-role registry, based largely on the existing directive registry. It
-contains two modules: `states.py` and `roles.py`. Both are intended
-to go in `docutils/docutils/parsers/rst/`. (`roles.py` is a new
-module; `states.py` is a replacement module).
-
-Defining Roles
-~~~~~~~~~~~~~~
-Interpreted roles are implemented as functions with the following
-signature::
-
- def role_fn(name, rawtext, text, lineno, inliner):
- """
- Given an interpreted text construct, return a tuple of two lists:
- document tree nodes, and system messages (may be empty).
-
- :Parameters:
- - `name`: The canonical name of the interpreted role.
- - `rawtext`: A string containing the enitre interpreted
- text input (including the role). This should be
- included as the content of a system message if a
- problem is encountered.
- - `text`: The interpreted text content.
- - `lineno`: The line number where the interpreted text begins.
- - `inliner`: The inliner object that called role_fn. This
- can be used for error reporting & nested parsing.
- """
-
-See the module docstring in roles.py for more information.
-
-Registering Roles
-~~~~~~~~~~~~~~~~~
-To register a new role, use docutils.parsers.rst.roles.register_role().
-Roles should be registered using canonial names; non-canonical names
-can be specified via the language submodule.
-
-Default Role
-~~~~~~~~~~~~
-The default interpreted role is defined by the DEFAULT_INTERPRETED_ROLE
-variable in docutils.parsers.rst.roles. It should contain a canonical
-role name.
-
-Differences from Directive System
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-There are some design differences between the roles system and the
-directives system:
-
-- All roles are registered via register_role(); there is no
- equivalant to _directive_registry, which contains a centralized
- list of directives to register.
-
-- Instead, each directive is registered immediately following
- its definition.
-
-- All standard roles are registered at import time; there is no
- mechanism for delaying imports until roles are actually used.
-
-Changes to states.py
-~~~~~~~~~~~~~~~~~~~~
-A diff on the old states.py (revision 1.69) and my revised version will
-show that I mostly removed code (the old role handling system) from
-inside the Inliner class. The only new code in states.py is the new
-Inliner.interpreted(), and some simplifying changes to the part of
-Inliner.interpreted_or_phrase_ref() that calls Inliner.interpreted().
-
-Future Work
-~~~~~~~~~~~
-- It would be nice to add a directive to create new roles, based on
- existing ones. Given that roles are implemented as functions,
- this would probably involve creating a wrapper function that:
-
- - calls the base role_fn function
- - modifies its output
- - returns the modified output
-
- It seems difficult to do this in a general way, though, since
- role functions are free to return any number of nodes, of any
- type. So we might need to limit the extension mechanism to
- specific base role_fn's.
diff --git a/sandbox/edloper/roles/roles.py b/sandbox/edloper/roles/roles.py
deleted file mode 100644
index 32f697333..000000000
--- a/sandbox/edloper/roles/roles.py
+++ /dev/null
@@ -1,296 +0,0 @@
-# Author: Edward Loper
-# Contact: edloper@gradient.cis.upenn.edu
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-This module defines standard interpreted text role functions, a registry for
-interpreted text roles, and an API for adding to and retrieving from the
-registry.
-
-The interface for interpreted role functions is as follows::
-
- def role_fn(name, rawtext, text, lineno, inliner, attributes={}):
- code...
-
-Parameters:
-
-- ``name`` is the local name of the interpreted text role, the role name
- actually used in the document.
-
-- ``rawtext`` is a string containing the entire interpreted text construct.
- Include it as a literal block in a system message if there is a problem.
-
-- ``text`` is the interpreted text content.
-
-- ``lineno`` is the line number where the interpreted text beings.
-
-- ``inliner`` is the Inliner object that called the role function.
- It defines the following useful attributes: ``reporter``,
- ``problematic``, ``memo``, ``parent``, ``document``.
-
-- ``attributes``: A dictionary of additional attributes for the generated
- elements, used for customization.
-
-Interpreted role functions return a tuple of two values:
-
-- A list of nodes which will be inserted into the document tree at the
- point where the interpreted role was encountered (can be an empty
- list).
-
-- A list of system messages, which will be inserted into the document tree
- immediately after the end of the current inline block (can also be empty).
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-from docutils import nodes
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-DEFAULT_INTERPRETED_ROLE = 'title-reference'
-"""
-The canonical name of the default interpreted role. This role is used
-when no role is specified for a piece of interpreted text.
-"""
-
-_role_registry = {}
-"""Mapping of canonical role names to role functions. Language-dependent role
-names are defined in the ``language`` subpackage."""
-
-_roles = {}
-"""Mapping of local or language-dependent interpreted text role names to role
-functions."""
-
-def role(role_name, language_module, lineno, inliner):
- """
- Locate and return a role function from its language-dependent name, along
- with a list of system messages. If the role is not found in the current
- language, check English. Return None if the named role cannot be found.
- """
- normname = role_name.lower()
- messages = []
- msg_text = []
-
- if _roles.has_key(normname):
- return _roles[normname], messages
-
- if role_name:
- canonicalname = None
- try:
- canonicalname = language_module.roles[normname]
- except AttributeError, error:
- msg_text.append('Problem retrieving role entry from language '
- 'module %r: %s.' % (language_module, error))
- except KeyError:
- msg_text.append('No role entry for "%s" in module "%s".'
- % (role_name, language_module.__name__))
- else:
- canonicalname = DEFAULT_INTERPRETED_ROLE
-
- # If we didn't find it, try English as a fallback.
- if not canonicalname:
- try:
- canonicalname = _fallback_language_module.roles[normname]
- msg_text.append('Using English fallback for role "%s".'
- % role_name)
- except KeyError:
- msg_text.append('Trying "%s" as canonical role name.'
- % role_name)
- # The canonical name should be an English name, but just in case:
- canonicalname = normname
-
- # Collect any messages that we generated.
- if msg_text:
- message = inliner.reporter.info('\n'.join(msg_text), line=lineno)
- messages.append(message)
-
- # Look the role up in the registry, and return it.
- if _role_registry.has_key(canonicalname):
- role_fn = _role_registry[canonicalname]
- register_local_role(normname, role_fn)
- return role_fn, messages
- else:
- return None, messages # Error message will be generated by caller.
-
-def register_canonical_role(name, role_fn):
- """
- Register an interpreted text role by its canonical name.
-
- :Parameters:
- - `name`: The canonical name of the interpreted role.
- - `role_fn`: The role function. See the module docstring.
- """
- _role_registry[name] = role_fn
-
-def register_local_role(name, role_fn):
- """
- Register an interpreted text role by its local or language-dependent name.
-
- :Parameters:
- - `name`: The local or language-dependent name of the interpreted role.
- - `role_fn`: The role function. See the module docstring.
- """
- _roles[name] = role_fn
-
-def register_generic_role(canonical_name, node_class):
- """For roles which simply wrap a given `node_class` around the text."""
- # Dynamically define a role function:
- def role_fn(role, rawtext, text, lineno, inliner, nc=node_class):
- return generic_role_helper(nc, role, rawtext, text, lineno, inliner)
- # Register the role:
- register_canonical_role(canonical_name, role_fn)
-
-def generic_role_helper(node_class, role, rawtext, text, lineno, inliner,
- attributes={}):
- # If we wanted to, we could recursively call inliner.nested_parse
- # to interpret the text contents here (after appropriately
- # refactoring Inliner.parse).
- return [node_class(rawtext, text, **attributes)], []
-
-def register_custom_role(local_name, attributes):
- """For roles defined in a document."""
- def role_fn(role, rawtext, text, lineno, inliner, atts=attributes):
- return generic_role_helper(
- nodes.inline, role, rawtext, text, lineno, inliner, attributes=atts)
- register_local_role(local_name, role_fn)
-
-######################################################################
-# Define and register the standard roles:
-######################################################################
-
-register_generic_role('abbreviation', nodes.abbreviation)
-register_generic_role('acronym', nodes.acronym)
-register_generic_role('emphasis', nodes.emphasis)
-register_generic_role('literal', nodes.literal)
-register_generic_role('strong', nodes.strong)
-register_generic_role('subscript', nodes.subscript)
-register_generic_role('superscript', nodes.superscript)
-register_generic_role('title-reference', nodes.title_reference)
-
-class URIReferenceRole:
- """
- An Abstract base class for specialized URI reference roles. A URI
- reference role is an interpreted text role that creates a single
- referencenode, whose `label` and `refuri` are based on the
- contents of the interpreted text.
-
- Each subclass should override `label` and `uri`, which map the
- intepreted text into a label and a uri, respectively. If the
- subclass needs to check the validity of the interpreted text, then
- it should also override `verify`, which raises a ValueError if the
- interpreted text is badly formatted.
- """
- def __call__(self, role, rawtext, text, lineno, inliner):
- try:
- self.verify(text)
- except ValueError, e:
- msg = inliner.reporter.error(str(e), line=lineno)
- prb = inliner.problematic(text, text, msg)
- return [prb], [msg]
- label = self.label(text)
- uri = self.uri(text)
- return [nodes.reference(rawtext, label, refuri=uri)], []
-
- def verify(self, text):
- """
- Check that `text` contains valid interpreted text for this uri
- reference role. If `text` is invalid, then raise a ValueError
- whose text describes the problem. If the text is valid, then
- return.
- """
- return
-
- def label(self, text):
- """Return the reference label corresponding to `text`"""
- raise NotImplementedError
-
- def uri(self, text):
- """Return the reference target corresponding to `text`"""
- raise NotImplementedError
-
-class PEPReferenceRole(URIReferenceRole):
- """An interpreted text role for referencing PEPs."""
- def __init__(self, base_url):
- """
- :Parameters:
- - `base_url`: The URL of the directory where PEPs are
- stored.
- """
- if base_url == '' or base_url.endswith('/'):
- self.pep_url = base_url+'pep-%04d.html'
- else:
- self.pep_url = base_url+'/pep-%04d.html'
-
- _PEP_RE = re.compile(r'\d{1,4}')
- def verify(self, text):
- if not self._PEP_RE.match(text):
- raise ValueError('PEP number must be a number from 0 '+
- 'to 9999; "%s" is invalid.' % text)
-
- def label(self, text):
- return 'PEP %s' % text
-
- def uri(self, text):
- return self.pep_url % int(text)
-
-# Define both remote & local versions, to make it easier for the
-# user to swap the other in (with register_canonical_role). Use
-# the remote version by default.
-pep_reference_role = PEPReferenceRole('http://www.python.org/peps/')
-local_pep_reference_role = PEPReferenceRole('')
-register_canonical_role('pep-reference', pep_reference_role)
-
-class RFCReferenceRole(URIReferenceRole):
- """An interpreted text role for referencing RFCs."""
- def __init__(self, base_url):
- """
- :Parameters:
- - `base_url`: The URL of the directory where RFCs are
- stored.
- """
- if base_url == '' or base_url.endswith('/'):
- self.rfc_url = base_url+'rfc%d.html'
- else:
- self.rfc_url = base_url+'/rfc%d.html'
-
- _RFC_RE = re.compile(r'[1-9]\d*')
- def verify(self, text):
- if not self._RFC_RE.match(text):
- raise ValueError('RFC number must be a number greater than '
- 'or equal to 1; "%s" is invalid.' % text)
-
- def label(self, text):
- return 'RFC %s' % text
-
- def uri(self, text):
- return self.rfc_url % int(text)
-
-# Define both remote & local versions, to make it easier for the
-# user to swap the other in (with register_canonical_role). Use
-# the remote version by default.
-rfc_reference_role = RFCReferenceRole('http://www.faqs.org/rfcs/')
-local_rfc_reference_role = RFCReferenceRole('')
-register_canonical_role('rfc-reference', rfc_reference_role)
-
-######################################################################
-# Register roles that are currently unimplemented.
-######################################################################
-
-def unimplemented_role(role, rawtext, text, lineno, inliner):
- msg = inliner.reporter.error(
- 'Interpreted text role "%s" not implemented.' % role, line=lineno)
- prb = inliner.problematic(rawtext, rawtext, msg)
- return [prb], [msg]
-
-register_canonical_role('index', unimplemented_role)
-register_canonical_role('named-reference', unimplemented_role)
-register_canonical_role('anonymous-reference', unimplemented_role)
-register_canonical_role('uri-reference', unimplemented_role)
-register_canonical_role('footnote-reference', unimplemented_role)
-register_canonical_role('citation-reference', unimplemented_role)
-register_canonical_role('substitution-reference', unimplemented_role)
-register_canonical_role('target', unimplemented_role)
-# This one should remain unimplemented, for testing purposes:
-register_canonical_role('restructuredtext-unimplemented-role', unimplemented_role)
diff --git a/sandbox/edloper/roles/states.py b/sandbox/edloper/roles/states.py
deleted file mode 100644
index 80512f4ca..000000000
--- a/sandbox/edloper/roles/states.py
+++ /dev/null
@@ -1,2840 +0,0 @@
-# Author: David Goodger
-# Contact: goodger@users.sourceforge.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is the ``docutils.parsers.restructuredtext.states`` module, the core of
-the reStructuredText parser. It defines the following:
-
-:Classes:
- - `RSTStateMachine`: reStructuredText parser's entry point.
- - `NestedStateMachine`: recursive StateMachine.
- - `RSTState`: reStructuredText State superclass.
- - `Inliner`: For parsing inline markup.
- - `Body`: Generic classifier of the first line of a block.
- - `SpecializedBody`: Superclass for compound element members.
- - `BulletList`: Second and subsequent bullet_list list_items
- - `DefinitionList`: Second+ definition_list_items.
- - `EnumeratedList`: Second+ enumerated_list list_items.
- - `FieldList`: Second+ fields.
- - `OptionList`: Second+ option_list_items.
- - `RFC2822List`: Second+ RFC2822-style fields.
- - `ExtensionOptions`: Parses directive option fields.
- - `Explicit`: Second+ explicit markup constructs.
- - `SubstitutionDef`: For embedded directives in substitution definitions.
- - `Text`: Classifier of second line of a text block.
- - `SpecializedText`: Superclass for continuation lines of Text-variants.
- - `Definition`: Second line of potential definition_list_item.
- - `Line`: Second line of overlined section title or transition marker.
- - `Struct`: An auxiliary collection class.
-
-:Exception classes:
- - `MarkupError`
- - `ParserError`
- - `MarkupMismatch`
-
-:Functions:
- - `escape2null()`: Return a string, escape-backslashes converted to nulls.
- - `unescape()`: Return a string, nulls removed or restored to backslashes.
-
-:Attributes:
- - `state_classes`: set of State classes used with `RSTStateMachine`.
-
-Parser Overview
-===============
-
-The reStructuredText parser is implemented as a recursive state machine,
-examining its input one line at a time. To understand how the parser works,
-please first become familiar with the `docutils.statemachine` module. In the
-description below, references are made to classes defined in this module;
-please see the individual classes for details.
-
-Parsing proceeds as follows:
-
-1. The state machine examines each line of input, checking each of the
- transition patterns of the state `Body`, in order, looking for a match.
- The implicit transitions (blank lines and indentation) are checked before
- any others. The 'text' transition is a catch-all (matches anything).
-
-2. The method associated with the matched transition pattern is called.
-
- A. Some transition methods are self-contained, appending elements to the
- document tree (`Body.doctest` parses a doctest block). The parser's
- current line index is advanced to the end of the element, and parsing
- continues with step 1.
-
- B. Other transition methods trigger the creation of a nested state machine,
- whose job is to parse a compound construct ('indent' does a block quote,
- 'bullet' does a bullet list, 'overline' does a section [first checking
- for a valid section header], etc.).
-
- - In the case of lists and explicit markup, a one-off state machine is
- created and run to parse contents of the first item.
-
- - A new state machine is created and its initial state is set to the
- appropriate specialized state (`BulletList` in the case of the
- 'bullet' transition; see `SpecializedBody` for more detail). This
- state machine is run to parse the compound element (or series of
- explicit markup elements), and returns as soon as a non-member element
- is encountered. For example, the `BulletList` state machine ends as
- soon as it encounters an element which is not a list item of that
- bullet list. The optional omission of inter-element blank lines is
- enabled by this nested state machine.
-
- - The current line index is advanced to the end of the elements parsed,
- and parsing continues with step 1.
-
- C. The result of the 'text' transition depends on the next line of text.
- The current state is changed to `Text`, under which the second line is
- examined. If the second line is:
-
- - Indented: The element is a definition list item, and parsing proceeds
- similarly to step 2.B, using the `DefinitionList` state.
-
- - A line of uniform punctuation characters: The element is a section
- header; again, parsing proceeds as in step 2.B, and `Body` is still
- used.
-
- - Anything else: The element is a paragraph, which is examined for
- inline markup and appended to the parent element. Processing
- continues with step 1.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import re
-import roman
-from types import TupleType
-from docutils import nodes, statemachine, utils, urischemes
-from docutils import ApplicationError, DataError
-from docutils.statemachine import StateMachineWS, StateWS
-from docutils.nodes import fully_normalize_name as normalize_name
-from docutils.nodes import whitespace_normalize_name
-from docutils.parsers.rst import directives, languages, tableparser, roles
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-
-class MarkupError(DataError): pass
-class UnknownInterpretedRoleError(DataError): pass
-class InterpretedRoleNotImplementedError(DataError): pass
-class ParserError(ApplicationError): pass
-class MarkupMismatch(Exception): pass
-
-
-class Struct:
-
- """Stores data attributes for dotted-attribute access."""
-
- def __init__(self, **keywordargs):
- self.__dict__.update(keywordargs)
-
-
-class RSTStateMachine(StateMachineWS):
-
- """
- reStructuredText's master StateMachine.
-
- The entry point to reStructuredText parsing is the `run()` method.
- """
-
- def run(self, input_lines, document, input_offset=0, match_titles=1,
- inliner=None):
- """
- Parse `input_lines` and return a `docutils.nodes.document` instance.
-
- Extend `StateMachineWS.run()`: set up parse-global data, run the
- StateMachine, and return the resulting
- document.
- """
- self.language = languages.get_language(
- document.settings.language_code)
- self.match_titles = match_titles
- if inliner is None:
- inliner = Inliner()
- inliner.init_customizations(document.settings)
- self.memo = Struct(document=document,
- reporter=document.reporter,
- language=self.language,
- title_styles=[],
- section_level=0,
- section_bubble_up_kludge=0,
- inliner=inliner)
- self.document = document
- self.attach_observer(document.note_source)
- self.reporter = self.memo.reporter
- self.node = document
- results = StateMachineWS.run(self, input_lines, input_offset,
- input_source=document['source'])
- assert results == [], 'RSTStateMachine.run() results should be empty!'
- self.check_document()
- self.node = self.memo = None # remove unneeded references
-
- def check_document(self):
- """Check for illegal structure: empty document."""
- if len(self.document) == 0:
- error = self.reporter.error(
- 'Document empty; must have contents.', line=0)
- self.document += error
-
-
-class NestedStateMachine(StateMachineWS):
-
- """
- StateMachine run from within other StateMachine runs, to parse nested
- document structures.
- """
-
- def run(self, input_lines, input_offset, memo, node, match_titles=1):
- """
- Parse `input_lines` and populate a `docutils.nodes.document` instance.
-
- Extend `StateMachineWS.run()`: set up document-wide data.
- """
- self.match_titles = match_titles
- self.memo = memo
- self.document = memo.document
- self.attach_observer(self.document.note_source)
- self.reporter = memo.reporter
- self.node = node
- results = StateMachineWS.run(self, input_lines, input_offset)
- assert results == [], ('NestedStateMachine.run() results should be '
- 'empty!')
- return results
-
-
-class RSTState(StateWS):
-
- """
- reStructuredText State superclass.
-
- Contains methods used by all State subclasses.
- """
-
- nested_sm = NestedStateMachine
-
- def __init__(self, state_machine, debug=0):
- self.nested_sm_kwargs = {'state_classes': state_classes,
- 'initial_state': 'Body'}
- StateWS.__init__(self, state_machine, debug)
-
- def runtime_init(self):
- StateWS.runtime_init(self)
- memo = self.state_machine.memo
- self.memo = memo
- self.reporter = memo.reporter
- self.inliner = memo.inliner
- self.document = memo.document
- self.parent = self.state_machine.node
-
- def goto_line(self, abs_line_offset):
- """
- Jump to input line `abs_line_offset`, ignoring jumps past the end.
- """
- try:
- self.state_machine.goto_line(abs_line_offset)
- except EOFError:
- pass
-
- def no_match(self, context, transitions):
- """
- Override `StateWS.no_match` to generate a system message.
-
- This code should never be run.
- """
- self.reporter.severe(
- 'Internal error: no transition pattern match. State: "%s"; '
- 'transitions: %s; context: %s; current line: %r.'
- % (self.__class__.__name__, transitions, context,
- self.state_machine.line),
- line=self.state_machine.abs_line_number())
- return context, None, []
-
- def bof(self, context):
- """Called at beginning of file."""
- return [], []
-
- def nested_parse(self, block, input_offset, node, match_titles=0,
- state_machine_class=None, state_machine_kwargs=None):
- """
- Create a new StateMachine rooted at `node` and run it over the input
- `block`.
- """
- if state_machine_class is None:
- state_machine_class = self.nested_sm
- if state_machine_kwargs is None:
- state_machine_kwargs = self.nested_sm_kwargs
- block_length = len(block)
- state_machine = state_machine_class(debug=self.debug,
- **state_machine_kwargs)
- state_machine.run(block, input_offset, memo=self.memo,
- node=node, match_titles=match_titles)
- state_machine.unlink()
- new_offset = state_machine.abs_line_offset()
- # No `block.parent` implies disconnected -- lines aren't in sync:
- if block.parent and (len(block) - block_length) != 0:
- # Adjustment for block if modified in nested parse:
- self.state_machine.next_line(len(block) - block_length)
- return new_offset
-
- def nested_list_parse(self, block, input_offset, node, initial_state,
- blank_finish,
- blank_finish_state=None,
- extra_settings={},
- match_titles=0,
- state_machine_class=None,
- state_machine_kwargs=None):
- """
- Create a new StateMachine rooted at `node` and run it over the input
- `block`. Also keep track of optional intermdediate blank lines and the
- required final one.
- """
- if state_machine_class is None:
- state_machine_class = self.nested_sm
- if state_machine_kwargs is None:
- state_machine_kwargs = self.nested_sm_kwargs.copy()
- state_machine_kwargs['initial_state'] = initial_state
- state_machine = state_machine_class(debug=self.debug,
- **state_machine_kwargs)
- if blank_finish_state is None:
- blank_finish_state = initial_state
- state_machine.states[blank_finish_state].blank_finish = blank_finish
- for key, value in extra_settings.items():
- setattr(state_machine.states[initial_state], key, value)
- state_machine.run(block, input_offset, memo=self.memo,
- node=node, match_titles=match_titles)
- blank_finish = state_machine.states[blank_finish_state].blank_finish
- state_machine.unlink()
- return state_machine.abs_line_offset(), blank_finish
-
- def section(self, title, source, style, lineno, messages):
- """Check for a valid subsection and create one if it checks out."""
- if self.check_subsection(source, style, lineno):
- self.new_subsection(title, lineno, messages)
-
- def check_subsection(self, source, style, lineno):
- """
- Check for a valid subsection header. Return 1 (true) or None (false).
-
- When a new section is reached that isn't a subsection of the current
- section, back up the line count (use ``previous_line(-x)``), then
- ``raise EOFError``. The current StateMachine will finish, then the
- calling StateMachine can re-examine the title. This will work its way
- back up the calling chain until the correct section level isreached.
-
- @@@ Alternative: Evaluate the title, store the title info & level, and
- back up the chain until that level is reached. Store in memo? Or
- return in results?
-
- :Exception: `EOFError` when a sibling or supersection encountered.
- """
- memo = self.memo
- title_styles = memo.title_styles
- mylevel = memo.section_level
- try: # check for existing title style
- level = title_styles.index(style) + 1
- except ValueError: # new title style
- if len(title_styles) == memo.section_level: # new subsection
- title_styles.append(style)
- return 1
- else: # not at lowest level
- self.parent += self.title_inconsistent(source, lineno)
- return None
- if level <= mylevel: # sibling or supersection
- memo.section_level = level # bubble up to parent section
- if len(style) == 2:
- memo.section_bubble_up_kludge = 1
- # back up 2 lines for underline title, 3 for overline title
- self.state_machine.previous_line(len(style) + 1)
- raise EOFError # let parent section re-evaluate
- if level == mylevel + 1: # immediate subsection
- return 1
- else: # invalid subsection
- self.parent += self.title_inconsistent(source, lineno)
- return None
-
- def title_inconsistent(self, sourcetext, lineno):
- error = self.reporter.severe(
- 'Title level inconsistent:', nodes.literal_block('', sourcetext),
- line=lineno)
- return error
-
- def new_subsection(self, title, lineno, messages):
- """Append new subsection to document tree. On return, check level."""
- memo = self.memo
- mylevel = memo.section_level
- memo.section_level += 1
- section_node = nodes.section()
- self.parent += section_node
- textnodes, title_messages = self.inline_text(title, lineno)
- titlenode = nodes.title(title, '', *textnodes)
- name = normalize_name(titlenode.astext())
- section_node['name'] = name
- section_node += titlenode
- section_node += messages
- section_node += title_messages
- self.document.note_implicit_target(section_node, section_node)
- offset = self.state_machine.line_offset + 1
- absoffset = self.state_machine.abs_line_offset() + 1
- newabsoffset = self.nested_parse(
- self.state_machine.input_lines[offset:], input_offset=absoffset,
- node=section_node, match_titles=1)
- self.goto_line(newabsoffset)
- self.check_section(section_node)
- if memo.section_level <= mylevel: # can't handle next section?
- raise EOFError # bubble up to supersection
- # reset section_level; next pass will detect it properly
- memo.section_level = mylevel
-
- def check_section(self, section):
- """
- Check for illegal structure: empty section, misplaced transitions.
- """
- lineno = section.line
- if len(section) <= 1:
- error = self.reporter.error(
- 'Section empty; must have contents.', line=lineno)
- section += error
- return
- if not isinstance(section[0], nodes.title): # shouldn't ever happen
- error = self.reporter.error(
- 'First element of section must be a title.', line=lineno)
- section.insert(0, error)
- if isinstance(section[1], nodes.transition):
- error = self.reporter.error(
- 'Section may not begin with a transition.',
- line=section[1].line)
- section.insert(1, error)
- if len(section) > 2 and isinstance(section[-1], nodes.transition):
- error = self.reporter.error(
- 'Section may not end with a transition.',
- line=section[-1].line)
- section += error
-
- def paragraph(self, lines, lineno):
- """
- Return a list (paragraph & messages) & a boolean: literal_block next?
- """
- data = '\n'.join(lines).rstrip()
- if data[-2:] == '::':
- if len(data) == 2:
- return [], 1
- elif data[-3] in ' \n':
- text = data[:-3].rstrip()
- else:
- text = data[:-1]
- literalnext = 1
- else:
- text = data
- literalnext = 0
- textnodes, messages = self.inline_text(text, lineno)
- p = nodes.paragraph(data, '', *textnodes)
- p.line = lineno
- return [p] + messages, literalnext
-
- def inline_text(self, text, lineno):
- """
- Return 2 lists: nodes (text and inline elements), and system_messages.
- """
- return self.inliner.parse(text, lineno, self.memo, self.parent)
-
- def unindent_warning(self, node_name):
- return self.reporter.warning(
- '%s ends without a blank line; unexpected unindent.' % node_name,
- line=(self.state_machine.abs_line_number() + 1))
-
-
-def build_regexp(definition, compile=1):
- """
- Build, compile and return a regular expression based on `definition`.
-
- :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
- where "parts" is a list of regular expressions and/or regular
- expression definitions to be joined into an or-group.
- """
- name, prefix, suffix, parts = definition
- part_strings = []
- for part in parts:
- if type(part) is TupleType:
- part_strings.append(build_regexp(part, None))
- else:
- part_strings.append(part)
- or_group = '|'.join(part_strings)
- regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
- if compile:
- return re.compile(regexp, re.UNICODE)
- else:
- return regexp
-
-
-class Inliner:
-
- """
- Parse inline markup; call the `parse()` method.
- """
-
- def __init__(self, roles=None):
- """
- `roles` is a mapping of canonical role name to role function or bound
- method, which enables additional interpreted text roles.
- """
-
- self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
- """List of (pattern, bound method) tuples, used by
- `self.implicit_inline`."""
-
- def init_customizations(self, settings):
- """Setting-based customizations; run when parsing begins."""
- if settings.pep_references:
- self.implicit_dispatch.append((self.patterns.pep,
- self.pep_reference))
- if settings.rfc_references:
- self.implicit_dispatch.append((self.patterns.rfc,
- self.rfc_reference))
-
- def parse(self, text, lineno, memo, parent):
- """
- Return 2 lists: nodes (text and inline elements), and system_messages.
-
- Using `self.patterns.initial`, a pattern which matches start-strings
- (emphasis, strong, interpreted, phrase reference, literal,
- substitution reference, and inline target) and complete constructs
- (simple reference, footnote reference), search for a candidate. When
- one is found, check for validity (e.g., not a quoted '*' character).
- If valid, search for the corresponding end string if applicable, and
- check it for validity. If not found or invalid, generate a warning
- and ignore the start-string. Implicit inline markup (e.g. standalone
- URIs) is found last.
- """
- self.reporter = memo.reporter
- self.document = memo.document
- self.language = memo.language
- self.parent = parent
- pattern_search = self.patterns.initial.search
- dispatch = self.dispatch
- remaining = escape2null(text)
- processed = []
- unprocessed = []
- messages = []
- while remaining:
- match = pattern_search(remaining)
- if match:
- groups = match.groupdict()
- method = dispatch[groups['start'] or groups['backquote']
- or groups['refend'] or groups['fnend']]
- before, inlines, remaining, sysmessages = method(self, match,
- lineno)
- unprocessed.append(before)
- messages += sysmessages
- if inlines:
- processed += self.implicit_inline(''.join(unprocessed),
- lineno)
- processed += inlines
- unprocessed = []
- else:
- break
- remaining = ''.join(unprocessed) + remaining
- if remaining:
- processed += self.implicit_inline(remaining, lineno)
- return processed, messages
-
- openers = '\'"([{<'
- closers = '\'")]}>'
- start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
- end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
- % re.escape(closers))
- non_whitespace_before = r'(?<![ \n])'
- non_whitespace_escape_before = r'(?<![ \n\x00])'
- non_whitespace_after = r'(?![ \n])'
- # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
- simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
- # Valid URI characters (see RFC 2396 & RFC 2732);
- # final \x00 allows backslash escapes in URIs:
- uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
- # Last URI character; same as uric but no punctuation:
- urilast = r"""[_~/a-zA-Z0-9]"""
- emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
- email_pattern = r"""
- %(emailc)s+(?:\.%(emailc)s+)* # name
- @ # at
- %(emailc)s+(?:\.%(emailc)s*)* # host
- %(urilast)s # final URI char
- """
- parts = ('initial_inline', start_string_prefix, '',
- [('start', '', non_whitespace_after, # simple start-strings
- [r'\*\*', # strong
- r'\*(?!\*)', # emphasis but not strong
- r'``', # literal
- r'_`', # inline internal target
- r'\|(?!\|)'] # substitution reference
- ),
- ('whole', '', end_string_suffix, # whole constructs
- [# reference name & end-string
- r'(?P<refname>%s)(?P<refend>__?)' % simplename,
- ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
- [r'[0-9]+', # manually numbered
- r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
- r'\*', # auto-symbol
- r'(?P<citationlabel>%s)' % simplename] # citation reference
- )
- ]
- ),
- ('backquote', # interpreted text or phrase reference
- '(?P<role>(:%s:)?)' % simplename, # optional role
- non_whitespace_after,
- ['`(?!`)'] # but not literal
- )
- ]
- )
- patterns = Struct(
- initial=build_regexp(parts),
- emphasis=re.compile(non_whitespace_escape_before
- + r'(\*)' + end_string_suffix),
- strong=re.compile(non_whitespace_escape_before
- + r'(\*\*)' + end_string_suffix),
- interpreted_or_phrase_ref=re.compile(
- r"""
- %(non_whitespace_escape_before)s
- (
- `
- (?P<suffix>
- (?P<role>:%(simplename)s:)?
- (?P<refend>__?)?
- )
- )
- %(end_string_suffix)s
- """ % locals(), re.VERBOSE | re.UNICODE),
- embedded_uri=re.compile(
- r"""
- (
- (?:[ \n]+|^) # spaces or beginning of line/string
- < # open bracket
- %(non_whitespace_after)s
- ([^<>\x00]+) # anything but angle brackets & nulls
- %(non_whitespace_before)s
- > # close bracket w/o whitespace before
- )
- $ # end of string
- """ % locals(), re.VERBOSE),
- literal=re.compile(non_whitespace_before + '(``)'
- + end_string_suffix),
- target=re.compile(non_whitespace_escape_before
- + r'(`)' + end_string_suffix),
- substitution_ref=re.compile(non_whitespace_escape_before
- + r'(\|_{0,2})'
- + end_string_suffix),
- email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
- uri=re.compile(
- (r"""
- %(start_string_prefix)s
- (?P<whole>
- (?P<absolute> # absolute URI
- (?P<scheme> # scheme (http, ftp, mailto)
- [a-zA-Z][a-zA-Z0-9.+-]*
- )
- :
- (
- ( # either:
- (//?)? # hierarchical URI
- %(uric)s* # URI characters
- %(urilast)s # final URI char
- )
- ( # optional query
- \?%(uric)s*
- %(urilast)s
- )?
- ( # optional fragment
- \#%(uric)s*
- %(urilast)s
- )?
- )
- )
- | # *OR*
- (?P<email> # email address
- """ + email_pattern + r"""
- )
- )
- %(end_string_suffix)s
- """) % locals(), re.VERBOSE),
- pep=re.compile(
- r"""
- %(start_string_prefix)s
- (
- (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
- |
- (PEP\s+(?P<pepnum2>\d+)) # reference by name
- )
- %(end_string_suffix)s""" % locals(), re.VERBOSE),
- rfc=re.compile(
- r"""
- %(start_string_prefix)s
- (RFC(-|\s+)?(?P<rfcnum>\d+))
- %(end_string_suffix)s""" % locals(), re.VERBOSE))
-
- def quoted_start(self, match):
- """Return 1 if inline markup start-string is 'quoted', 0 if not."""
- string = match.string
- start = match.start()
- end = match.end()
- if start == 0: # start-string at beginning of text
- return 0
- prestart = string[start - 1]
- try:
- poststart = string[end]
- if self.openers.index(prestart) \
- == self.closers.index(poststart): # quoted
- return 1
- except IndexError: # start-string at end of text
- return 1
- except ValueError: # not quoted
- pass
- return 0
-
- def inline_obj(self, match, lineno, end_pattern, nodeclass,
- restore_backslashes=0):
- string = match.string
- matchstart = match.start('start')
- matchend = match.end('start')
- if self.quoted_start(match):
- return (string[:matchend], [], string[matchend:], [], '')
- endmatch = end_pattern.search(string[matchend:])
- if endmatch and endmatch.start(1): # 1 or more chars
- text = unescape(endmatch.string[:endmatch.start(1)],
- restore_backslashes)
- textend = matchend + endmatch.end(1)
- rawsource = unescape(string[matchstart:textend], 1)
- return (string[:matchstart], [nodeclass(rawsource, text)],
- string[textend:], [], endmatch.group(1))
- msg = self.reporter.warning(
- 'Inline %s start-string without end-string.'
- % nodeclass.__name__, line=lineno)
- text = unescape(string[matchstart:matchend], 1)
- rawsource = unescape(string[matchstart:matchend], 1)
- prb = self.problematic(text, rawsource, msg)
- return string[:matchstart], [prb], string[matchend:], [msg], ''
-
- def problematic(self, text, rawsource, message):
- msgid = self.document.set_id(message, self.parent)
- problematic = nodes.problematic(rawsource, text, refid=msgid)
- prbid = self.document.set_id(problematic)
- message.add_backref(prbid)
- return problematic
-
- def emphasis(self, match, lineno):
- before, inlines, remaining, sysmessages, endstring = self.inline_obj(
- match, lineno, self.patterns.emphasis, nodes.emphasis)
- return before, inlines, remaining, sysmessages
-
- def strong(self, match, lineno):
- before, inlines, remaining, sysmessages, endstring = self.inline_obj(
- match, lineno, self.patterns.strong, nodes.strong)
- return before, inlines, remaining, sysmessages
-
- def interpreted_or_phrase_ref(self, match, lineno):
- end_pattern = self.patterns.interpreted_or_phrase_ref
- string = match.string
- matchstart = match.start('backquote')
- matchend = match.end('backquote')
- rolestart = match.start('role')
- role = match.group('role')
- position = ''
- if role:
- role = role[1:-1]
- position = 'prefix'
- elif self.quoted_start(match):
- return (string[:matchend], [], string[matchend:], [])
- endmatch = end_pattern.search(string[matchend:])
- if endmatch and endmatch.start(1): # 1 or more chars
- textend = matchend + endmatch.end()
- if endmatch.group('role'):
- if role:
- msg = self.reporter.warning(
- 'Multiple roles in interpreted text (both '
- 'prefix and suffix present; only one allowed).',
- line=lineno)
- text = unescape(string[rolestart:textend], 1)
- prb = self.problematic(text, text, msg)
- return string[:rolestart], [prb], string[textend:], [msg]
- role = endmatch.group('suffix')[1:-1]
- position = 'suffix'
- escaped = endmatch.string[:endmatch.start(1)]
- text = unescape(escaped, 0)
- rawsource = unescape(string[matchstart:textend], 1)
- if rawsource[-1:] == '_':
- if role:
- msg = self.reporter.warning(
- 'Mismatch: both interpreted text role %s and '
- 'reference suffix.' % position, line=lineno)
- text = unescape(string[rolestart:textend], 1)
- prb = self.problematic(text, text, msg)
- return string[:rolestart], [prb], string[textend:], [msg]
- return self.phrase_ref(string[:matchstart], string[textend:],
- rawsource, escaped, text)
- else:
- rawsource = unescape(string[rolestart:textend], 1)
- nodelist, messages = self.interpreted(rawsource, text, role,
- lineno)
- return (string[:rolestart], nodelist,
- string[textend:], messages)
- msg = self.reporter.warning(
- 'Inline interpreted text or phrase reference start-string '
- 'without end-string.', line=lineno)
- text = unescape(string[matchstart:matchend], 1)
- prb = self.problematic(text, text, msg)
- return string[:matchstart], [prb], string[matchend:], [msg]
-
- def phrase_ref(self, before, after, rawsource, escaped, text):
- match = self.patterns.embedded_uri.search(escaped)
- if match:
- text = unescape(escaped[:match.start(0)])
- uri_text = match.group(2)
- uri = ''.join(uri_text.split())
- uri = self.adjust_uri(uri)
- if uri:
- target = nodes.target(match.group(1), refuri=uri)
- else:
- raise ApplicationError('problem with URI: %r' % uri_text)
- if not text:
- text = uri
- else:
- target = None
- refname = normalize_name(text)
- reference = nodes.reference(rawsource, text,
- name=whitespace_normalize_name(text))
- node_list = [reference]
- if rawsource[-2:] == '__':
- if target:
- reference['refuri'] = uri
- else:
- reference['anonymous'] = 1
- self.document.note_anonymous_ref(reference)
- else:
- if target:
- reference['refuri'] = uri
- target['name'] = refname
- self.document.note_external_target(target)
- self.document.note_explicit_target(target, self.parent)
- node_list.append(target)
- else:
- reference['refname'] = refname
- self.document.note_refname(reference)
- return before, node_list, after, []
-
- def adjust_uri(self, uri):
- match = self.patterns.email.match(uri)
- if match:
- return 'mailto:' + uri
- else:
- return uri
-
- def interpreted(self, rawsource, text, role, lineno):
- role_fn, messages = roles.role(role, self.language, lineno, self)
- if role_fn:
- nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
- return nodes, messages + messages2
- else:
- msg = self.reporter.error(
- 'Unknown interpreted text role "%s".' % role,
- line=lineno)
- return ([self.problematic(rawsource, rawsource, msg)],
- messages + [msg])
-
- def literal(self, match, lineno):
- before, inlines, remaining, sysmessages, endstring = self.inline_obj(
- match, lineno, self.patterns.literal, nodes.literal,
- restore_backslashes=1)
- return before, inlines, remaining, sysmessages
-
- def inline_internal_target(self, match, lineno):
- before, inlines, remaining, sysmessages, endstring = self.inline_obj(
- match, lineno, self.patterns.target, nodes.target)
- if inlines and isinstance(inlines[0], nodes.target):
- assert len(inlines) == 1
- target = inlines[0]
- name = normalize_name(target.astext())
- target['name'] = name
- self.document.note_explicit_target(target, self.parent)
- return before, inlines, remaining, sysmessages
-
- def substitution_reference(self, match, lineno):
- before, inlines, remaining, sysmessages, endstring = self.inline_obj(
- match, lineno, self.patterns.substitution_ref,
- nodes.substitution_reference)
- if len(inlines) == 1:
- subref_node = inlines[0]
- if isinstance(subref_node, nodes.substitution_reference):
- subref_text = subref_node.astext()
- self.document.note_substitution_ref(subref_node, subref_text)
- if endstring[-1:] == '_':
- reference_node = nodes.reference(
- '|%s%s' % (subref_text, endstring), '')
- if endstring[-2:] == '__':
- reference_node['anonymous'] = 1
- self.document.note_anonymous_ref(
- reference_node)
- else:
- reference_node['refname'] = normalize_name(subref_text)
- self.document.note_refname(reference_node)
- reference_node += subref_node
- inlines = [reference_node]
- return before, inlines, remaining, sysmessages
-
- def footnote_reference(self, match, lineno):
- """
- Handles `nodes.footnote_reference` and `nodes.citation_reference`
- elements.
- """
- label = match.group('footnotelabel')
- refname = normalize_name(label)
- string = match.string
- before = string[:match.start('whole')]
- remaining = string[match.end('whole'):]
- if match.group('citationlabel'):
- refnode = nodes.citation_reference('[%s]_' % label,
- refname=refname)
- refnode += nodes.Text(label)
- self.document.note_citation_ref(refnode)
- else:
- refnode = nodes.footnote_reference('[%s]_' % label)
- if refname[0] == '#':
- refname = refname[1:]
- refnode['auto'] = 1
- self.document.note_autofootnote_ref(refnode)
- elif refname == '*':
- refname = ''
- refnode['auto'] = '*'
- self.document.note_symbol_footnote_ref(
- refnode)
- else:
- refnode += nodes.Text(label)
- if refname:
- refnode['refname'] = refname
- self.document.note_footnote_ref(refnode)
- if self.document.settings.trim_footnote_reference_space:
- before = before.rstrip()
- return (before, [refnode], remaining, [])
-
- def reference(self, match, lineno, anonymous=None):
- referencename = match.group('refname')
- refname = normalize_name(referencename)
- referencenode = nodes.reference(
- referencename + match.group('refend'), referencename,
- name=whitespace_normalize_name(referencename))
- if anonymous:
- referencenode['anonymous'] = 1
- self.document.note_anonymous_ref(referencenode)
- else:
- referencenode['refname'] = refname
- self.document.note_refname(referencenode)
- string = match.string
- matchstart = match.start('whole')
- matchend = match.end('whole')
- return (string[:matchstart], [referencenode], string[matchend:], [])
-
- def anonymous_reference(self, match, lineno):
- return self.reference(match, lineno, anonymous=1)
-
- def standalone_uri(self, match, lineno):
- if not match.group('scheme') or urischemes.schemes.has_key(
- match.group('scheme').lower()):
- if match.group('email'):
- addscheme = 'mailto:'
- else:
- addscheme = ''
- text = match.group('whole')
- unescaped = unescape(text, 0)
- return [nodes.reference(unescape(text, 1), unescaped,
- refuri=addscheme + unescaped)]
- else: # not a valid scheme
- raise MarkupMismatch
-
- def implicit_inline(self, text, lineno):
- """
- Check each of the patterns in `self.implicit_dispatch` for a match,
- and dispatch to the stored method for the pattern. Recursively check
- the text before and after the match. Return a list of `nodes.Text`
- and inline element nodes.
- """
- if not text:
- return []
- for pattern, method in self.implicit_dispatch:
- match = pattern.search(text)
- if match:
- try:
- # Must recurse on strings before *and* after the match;
- # there may be multiple patterns.
- return (self.implicit_inline(text[:match.start()], lineno)
- + method(match, lineno) +
- self.implicit_inline(text[match.end():], lineno))
- except MarkupMismatch:
- pass
- return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
-
- dispatch = {'*': emphasis,
- '**': strong,
- '`': interpreted_or_phrase_ref,
- '``': literal,
- '_`': inline_internal_target,
- ']_': footnote_reference,
- '|': substitution_reference,
- '_': reference,
- '__': anonymous_reference}
-
-
-class Body(RSTState):
-
- """
- Generic classifier of the first line of a block.
- """
-
- enum = Struct()
- """Enumerated list parsing information."""
-
- enum.formatinfo = {
- 'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
- 'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
- 'period': Struct(prefix='', suffix='.', start=0, end=-1)}
- enum.formats = enum.formatinfo.keys()
- enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
- 'lowerroman', 'upperroman'] # ORDERED!
- enum.sequencepats = {'arabic': '[0-9]+',
- 'loweralpha': '[a-z]',
- 'upperalpha': '[A-Z]',
- 'lowerroman': '[ivxlcdm]+',
- 'upperroman': '[IVXLCDM]+',}
- enum.converters = {'arabic': int,
- 'loweralpha':
- lambda s, zero=(ord('a')-1): ord(s) - zero,
- 'upperalpha':
- lambda s, zero=(ord('A')-1): ord(s) - zero,
- 'lowerroman':
- lambda s: roman.fromRoman(s.upper()),
- 'upperroman': roman.fromRoman}
-
- enum.sequenceregexps = {}
- for sequence in enum.sequences:
- enum.sequenceregexps[sequence] = re.compile(
- enum.sequencepats[sequence] + '$')
-
- grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
- """Matches the top (& bottom) of a full table)."""
-
- simple_table_top_pat = re.compile('=+( +=+)+ *$')
- """Matches the top of a simple table."""
-
- simple_table_border_pat = re.compile('=+[ =]*$')
- """Matches the bottom & header bottom of a simple table."""
-
- pats = {}
- """Fragments of patterns used by transitions."""
-
- pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
- pats['alpha'] = '[a-zA-Z]'
- pats['alphanum'] = '[a-zA-Z0-9]'
- pats['alphanumplus'] = '[a-zA-Z0-9_-]'
- pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
- '|%(upperroman)s)' % enum.sequencepats)
- pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
- # @@@ Loosen up the pattern? Allow Unicode?
- pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<%(alphanum)s[^ <>]+>)' % pats
- pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
- pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
- pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
-
- for format in enum.formats:
- pats[format] = '(?P<%s>%s%s%s)' % (
- format, re.escape(enum.formatinfo[format].prefix),
- pats['enum'], re.escape(enum.formatinfo[format].suffix))
-
- patterns = {
- 'bullet': r'[-+*]( +|$)',
- 'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
- 'field_marker': r':[^: ]([^:]*[^: ])?:( +|$)',
- 'option_marker': r'%(option)s(, %(option)s)*( +| ?$)' % pats,
- 'doctest': r'>>>( +|$)',
- 'grid_table_top': grid_table_top_pat,
- 'simple_table_top': simple_table_top_pat,
- 'explicit_markup': r'\.\.( +|$)',
- 'anonymous': r'__( +|$)',
- 'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
- 'text': r''}
- initial_transitions = (
- 'bullet',
- 'enumerator',
- 'field_marker',
- 'option_marker',
- 'doctest',
- 'grid_table_top',
- 'simple_table_top',
- 'explicit_markup',
- 'anonymous',
- 'line',
- 'text')
-
- def indent(self, match, context, next_state):
- """Block quote."""
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_indented()
- blockquote, messages = self.block_quote(indented, line_offset)
- self.parent += blockquote
- self.parent += messages
- if not blank_finish:
- self.parent += self.unindent_warning('Block quote')
- return context, next_state, []
-
- def block_quote(self, indented, line_offset):
- blockquote_lines, attribution_lines, attribution_offset = \
- self.check_attribution(indented, line_offset)
- blockquote = nodes.block_quote()
- self.nested_parse(blockquote_lines, line_offset, blockquote)
- messages = []
- if attribution_lines:
- attribution, messages = self.parse_attribution(attribution_lines,
- attribution_offset)
- blockquote += attribution
- return blockquote, messages
-
- # u'\u2014' is an em-dash:
- attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
-
- def check_attribution(self, indented, line_offset):
- """
- Check for an attribution in the last contiguous block of `indented`.
-
- * First line after last blank line must begin with "--" (etc.).
- * Every line after that must have consistent indentation.
-
- Return a 3-tuple: (block quote lines, attribution lines,
- attribution offset).
- """
- blank = None
- nonblank_seen = None
- indent = 0
- for i in range(len(indented) - 1, 0, -1): # don't check first line
- this_line_blank = not indented[i].strip()
- if nonblank_seen and this_line_blank:
- match = self.attribution_pattern.match(indented[i + 1])
- if match:
- blank = i
- break
- elif not this_line_blank:
- nonblank_seen = 1
- if blank and len(indented) - blank > 2: # multi-line attribution
- indent = (len(indented[blank + 2])
- - len(indented[blank + 2].lstrip()))
- for j in range(blank + 3, len(indented)):
- if indent != (len(indented[j])
- - len(indented[j].lstrip())): # bad shape
- blank = None
- break
- if blank:
- a_lines = indented[blank + 1:]
- a_lines.trim_left(match.end(), end=1)
- a_lines.trim_left(indent, start=1)
- return (indented[:blank], a_lines, line_offset + blank + 1)
- else:
- return (indented, None, None)
-
- def parse_attribution(self, indented, line_offset):
- text = '\n'.join(indented).rstrip()
- lineno = self.state_machine.abs_line_number() + line_offset
- textnodes, messages = self.inline_text(text, lineno)
- node = nodes.attribution(text, '', *textnodes)
- node.line = lineno
- return node, messages
-
- def bullet(self, match, context, next_state):
- """Bullet list item."""
- bulletlist = nodes.bullet_list()
- self.parent += bulletlist
- bulletlist['bullet'] = match.string[0]
- i, blank_finish = self.list_item(match.end())
- bulletlist += i
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=bulletlist, initial_state='BulletList',
- blank_finish=blank_finish)
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Bullet list')
- return [], next_state, []
-
- def list_item(self, indent):
- indented, line_offset, blank_finish = \
- self.state_machine.get_known_indented(indent)
- listitem = nodes.list_item('\n'.join(indented))
- if indented:
- self.nested_parse(indented, input_offset=line_offset,
- node=listitem)
- return listitem, blank_finish
-
- def enumerator(self, match, context, next_state):
- """Enumerated List Item"""
- format, sequence, text, ordinal = self.parse_enumerator(match)
- if not self.is_enumerated_list_item(ordinal, sequence, format):
- raise statemachine.TransitionCorrection('text')
- if ordinal != 1:
- msg = self.reporter.info(
- 'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
- % (text, ordinal), line=self.state_machine.abs_line_number())
- self.parent += msg
- enumlist = nodes.enumerated_list()
- self.parent += enumlist
- enumlist['enumtype'] = sequence
- if ordinal != 1:
- enumlist['start'] = ordinal
- enumlist['prefix'] = self.enum.formatinfo[format].prefix
- enumlist['suffix'] = self.enum.formatinfo[format].suffix
- listitem, blank_finish = self.list_item(match.end())
- enumlist += listitem
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=enumlist, initial_state='EnumeratedList',
- blank_finish=blank_finish,
- extra_settings={'lastordinal': ordinal, 'format': format})
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Enumerated list')
- return [], next_state, []
-
- def parse_enumerator(self, match, expected_sequence=None):
- """
- Analyze an enumerator and return the results.
-
- :Return:
- - the enumerator format ('period', 'parens', or 'rparen'),
- - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
- - the text of the enumerator, stripped of formatting, and
- - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
- ``None`` is returned for invalid enumerator text).
-
- The enumerator format has already been determined by the regular
- expression match. If `expected_sequence` is given, that sequence is
- tried first. If not, we check for Roman numeral 1. This way,
- single-character Roman numerals (which are also alphabetical) can be
- matched. If no sequence has been matched, all sequences are checked in
- order.
- """
- groupdict = match.groupdict()
- sequence = ''
- for format in self.enum.formats:
- if groupdict[format]: # was this the format matched?
- break # yes; keep `format`
- else: # shouldn't happen
- raise ParserError('enumerator format not matched')
- text = groupdict[format][self.enum.formatinfo[format].start
- :self.enum.formatinfo[format].end]
- if expected_sequence:
- try:
- if self.enum.sequenceregexps[expected_sequence].match(text):
- sequence = expected_sequence
- except KeyError: # shouldn't happen
- raise ParserError('unknown enumerator sequence: %s'
- % sequence)
- elif text == 'i':
- sequence = 'lowerroman'
- elif text == 'I':
- sequence = 'upperroman'
- if not sequence:
- for sequence in self.enum.sequences:
- if self.enum.sequenceregexps[sequence].match(text):
- break
- else: # shouldn't happen
- raise ParserError('enumerator sequence not matched')
- try:
- ordinal = self.enum.converters[sequence](text)
- except roman.InvalidRomanNumeralError:
- ordinal = None
- return format, sequence, text, ordinal
-
- def is_enumerated_list_item(self, ordinal, sequence, format):
- """
- Check validity based on the ordinal value and the second line.
-
- Return true iff the ordinal is valid and the second line is blank,
- indented, or starts with the next enumerator.
- """
- if ordinal is None:
- return None
- try:
- next_line = self.state_machine.next_line()
- except EOFError: # end of input lines
- self.state_machine.previous_line()
- return 1
- else:
- self.state_machine.previous_line()
- if not next_line[:1].strip(): # blank or indented
- return 1
- next_enumerator = self.make_enumerator(ordinal + 1, sequence, format)
- try:
- if next_line.startswith(next_enumerator):
- return 1
- except TypeError:
- pass
- return None
-
- def make_enumerator(self, ordinal, sequence, format):
- """
- Construct and return an enumerated list item marker.
-
- Return ``None`` for invalid (out of range) ordinals.
- """
- if sequence == 'arabic':
- enumerator = str(ordinal)
- else:
- if sequence.endswith('alpha'):
- if ordinal > 26:
- return None
- enumerator = chr(ordinal + ord('a') - 1)
- elif sequence.endswith('roman'):
- try:
- enumerator = roman.toRoman(ordinal)
- except roman.RomanError:
- return None
- else: # shouldn't happen
- raise ParserError('unknown enumerator sequence: "%s"'
- % sequence)
- if sequence.startswith('lower'):
- enumerator = enumerator.lower()
- elif sequence.startswith('upper'):
- enumerator = enumerator.upper()
- else: # shouldn't happen
- raise ParserError('unknown enumerator sequence: "%s"'
- % sequence)
- formatinfo = self.enum.formatinfo[format]
- return formatinfo.prefix + enumerator + formatinfo.suffix + ' '
-
- def field_marker(self, match, context, next_state):
- """Field list item."""
- field_list = nodes.field_list()
- self.parent += field_list
- field, blank_finish = self.field(match)
- field_list += field
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=field_list, initial_state='FieldList',
- blank_finish=blank_finish)
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Field list')
- return [], next_state, []
-
- def field(self, match):
- name = self.parse_field_marker(match)
- lineno = self.state_machine.abs_line_number()
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- field_node = nodes.field()
- field_node.line = lineno
- name_nodes, name_messages = self.inline_text(name, lineno)
- field_node += nodes.field_name(name, '', *name_nodes)
- field_body = nodes.field_body('\n'.join(indented), *name_messages)
- field_node += field_body
- if indented:
- self.parse_field_body(indented, line_offset, field_body)
- return field_node, blank_finish
-
- def parse_field_marker(self, match):
- """Extract & return field name from a field marker match."""
- field = match.string[1:] # strip off leading ':'
- field = field[:field.find(':')] # strip off trailing ':' etc.
- return field
-
- def parse_field_body(self, indented, offset, node):
- self.nested_parse(indented, input_offset=offset, node=node)
-
- def option_marker(self, match, context, next_state):
- """Option list item."""
- optionlist = nodes.option_list()
- try:
- listitem, blank_finish = self.option_list_item(match)
- except MarkupError, (message, lineno):
- # This shouldn't happen; pattern won't match.
- msg = self.reporter.error(
- 'Invalid option list marker: %s' % message, line=lineno)
- self.parent += msg
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- blockquote, messages = self.block_quote(indented, line_offset)
- self.parent += blockquote
- self.parent += messages
- if not blank_finish:
- self.parent += self.unindent_warning('Option list')
- return [], next_state, []
- self.parent += optionlist
- optionlist += listitem
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=optionlist, initial_state='OptionList',
- blank_finish=blank_finish)
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Option list')
- return [], next_state, []
-
- def option_list_item(self, match):
- offset = self.state_machine.abs_line_offset()
- options = self.parse_option_marker(match)
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- if not indented: # not an option list item
- self.goto_line(offset)
- raise statemachine.TransitionCorrection('text')
- option_group = nodes.option_group('', *options)
- description = nodes.description('\n'.join(indented))
- option_list_item = nodes.option_list_item('', option_group,
- description)
- if indented:
- self.nested_parse(indented, input_offset=line_offset,
- node=description)
- return option_list_item, blank_finish
-
- def parse_option_marker(self, match):
- """
- Return a list of `node.option` and `node.option_argument` objects,
- parsed from an option marker match.
-
- :Exception: `MarkupError` for invalid option markers.
- """
- optlist = []
- optionstrings = match.group().rstrip().split(', ')
- for optionstring in optionstrings:
- tokens = optionstring.split()
- delimiter = ' '
- firstopt = tokens[0].split('=')
- if len(firstopt) > 1:
- tokens[:1] = firstopt
- delimiter = '='
- elif (len(tokens[0]) > 2
- and ((tokens[0].startswith('-')
- and not tokens[0].startswith('--'))
- or tokens[0].startswith('+'))):
- tokens[:1] = [tokens[0][:2], tokens[0][2:]]
- delimiter = ''
- if 0 < len(tokens) <= 2:
- option = nodes.option(optionstring)
- option += nodes.option_string(tokens[0], tokens[0])
- if len(tokens) > 1:
- option += nodes.option_argument(tokens[1], tokens[1],
- delimiter=delimiter)
- optlist.append(option)
- else:
- raise MarkupError(
- 'wrong numer of option tokens (=%s), should be 1 or 2: '
- '"%s"' % (len(tokens), optionstring),
- self.state_machine.abs_line_number() + 1)
- return optlist
-
- def doctest(self, match, context, next_state):
- data = '\n'.join(self.state_machine.get_text_block())
- self.parent += nodes.doctest_block(data, data)
- return [], next_state, []
-
- def grid_table_top(self, match, context, next_state):
- """Top border of a full table."""
- return self.table_top(match, context, next_state,
- self.isolate_grid_table,
- tableparser.GridTableParser)
-
- def simple_table_top(self, match, context, next_state):
- """Top border of a simple table."""
- return self.table_top(match, context, next_state,
- self.isolate_simple_table,
- tableparser.SimpleTableParser)
-
- def table_top(self, match, context, next_state,
- isolate_function, parser_class):
- """Top border of a generic table."""
- nodelist, blank_finish = self.table(isolate_function, parser_class)
- self.parent += nodelist
- if not blank_finish:
- msg = self.reporter.warning(
- 'Blank line required after table.',
- line=self.state_machine.abs_line_number() + 1)
- self.parent += msg
- return [], next_state, []
-
- def table(self, isolate_function, parser_class):
- """Parse a table."""
- block, messages, blank_finish = isolate_function()
- if block:
- try:
- parser = parser_class()
- tabledata = parser.parse(block)
- tableline = (self.state_machine.abs_line_number() - len(block)
- + 1)
- table = self.build_table(tabledata, tableline)
- nodelist = [table] + messages
- except tableparser.TableMarkupError, detail:
- nodelist = self.malformed_table(block, str(detail)) + messages
- else:
- nodelist = messages
- return nodelist, blank_finish
-
- def isolate_grid_table(self):
- messages = []
- blank_finish = 1
- try:
- block = self.state_machine.get_text_block(flush_left=1)
- except statemachine.UnexpectedIndentationError, instance:
- block, source, lineno = instance.args
- messages.append(self.reporter.error('Unexpected indentation.',
- source=source, line=lineno))
- blank_finish = 0
- block.disconnect()
- width = len(block[0].strip())
- for i in range(len(block)):
- block[i] = block[i].strip()
- if block[i][0] not in '+|': # check left edge
- blank_finish = 0
- self.state_machine.previous_line(len(block) - i)
- del block[i:]
- break
- if not self.grid_table_top_pat.match(block[-1]): # find bottom
- blank_finish = 0
- # from second-last to third line of table:
- for i in range(len(block) - 2, 1, -1):
- if self.grid_table_top_pat.match(block[i]):
- self.state_machine.previous_line(len(block) - i + 1)
- del block[i+1:]
- break
- else:
- messages.extend(self.malformed_table(block))
- return [], messages, blank_finish
- for i in range(len(block)): # check right edge
- if len(block[i]) != width or block[i][-1] not in '+|':
- messages.extend(self.malformed_table(block))
- return [], messages, blank_finish
- return block, messages, blank_finish
-
- def isolate_simple_table(self):
- start = self.state_machine.line_offset
- lines = self.state_machine.input_lines
- limit = len(lines) - 1
- toplen = len(lines[start].strip())
- pattern_match = self.simple_table_border_pat.match
- found = 0
- found_at = None
- i = start + 1
- while i <= limit:
- line = lines[i]
- match = pattern_match(line)
- if match:
- if len(line.strip()) != toplen:
- self.state_machine.next_line(i - start)
- messages = self.malformed_table(
- lines[start:i+1], 'Bottom/header table border does '
- 'not match top border.')
- return [], messages, i == limit or not lines[i+1].strip()
- found += 1
- found_at = i
- if found == 2 or i == limit or not lines[i+1].strip():
- end = i
- break
- i += 1
- else: # reached end of input_lines
- if found:
- extra = ' or no blank line after table bottom'
- self.state_machine.next_line(found_at - start)
- block = lines[start:found_at+1]
- else:
- extra = ''
- self.state_machine.next_line(i - start - 1)
- block = lines[start:]
- messages = self.malformed_table(
- block, 'No bottom table border found%s.' % extra)
- return [], messages, not extra
- self.state_machine.next_line(end - start)
- block = lines[start:end+1]
- return block, [], end == limit or not lines[end+1].strip()
-
- def malformed_table(self, block, detail=''):
- data = '\n'.join(block)
- message = 'Malformed table.'
- lineno = self.state_machine.abs_line_number() - len(block) + 1
- if detail:
- message += '\n' + detail
- error = self.reporter.error(message, nodes.literal_block(data, data),
- line=lineno)
- return [error]
-
- def build_table(self, tabledata, tableline):
- colspecs, headrows, bodyrows = tabledata
- table = nodes.table()
- tgroup = nodes.tgroup(cols=len(colspecs))
- table += tgroup
- for colspec in colspecs:
- tgroup += nodes.colspec(colwidth=colspec)
- if headrows:
- thead = nodes.thead()
- tgroup += thead
- for row in headrows:
- thead += self.build_table_row(row, tableline)
- tbody = nodes.tbody()
- tgroup += tbody
- for row in bodyrows:
- tbody += self.build_table_row(row, tableline)
- return table
-
- def build_table_row(self, rowdata, tableline):
- row = nodes.row()
- for cell in rowdata:
- if cell is None:
- continue
- morerows, morecols, offset, cellblock = cell
- attributes = {}
- if morerows:
- attributes['morerows'] = morerows
- if morecols:
- attributes['morecols'] = morecols
- entry = nodes.entry(**attributes)
- row += entry
- if ''.join(cellblock):
- self.nested_parse(cellblock, input_offset=tableline+offset,
- node=entry)
- return row
-
-
- explicit = Struct()
- """Patterns and constants used for explicit markup recognition."""
-
- explicit.patterns = Struct(
- target=re.compile(r"""
- (
- _ # anonymous target
- | # *OR*
- (?P<quote>`?) # optional open quote
- (?![ `]) # first char. not space or
- # backquote
- (?P<name> # reference name
- .+?
- )
- %(non_whitespace_escape_before)s
- (?P=quote) # close quote if open quote used
- )
- %(non_whitespace_escape_before)s
- [ ]? # optional space
- : # end of reference name
- ([ ]+|$) # followed by whitespace
- """ % vars(Inliner), re.VERBOSE),
- reference=re.compile(r"""
- (
- (?P<simple>%(simplename)s)_
- | # *OR*
- ` # open backquote
- (?![ ]) # not space
- (?P<phrase>.+?) # hyperlink phrase
- %(non_whitespace_escape_before)s
- `_ # close backquote,
- # reference mark
- )
- $ # end of string
- """ % vars(Inliner), re.VERBOSE | re.UNICODE),
- substitution=re.compile(r"""
- (
- (?![ ]) # first char. not space
- (?P<name>.+?) # substitution text
- %(non_whitespace_escape_before)s
- \| # close delimiter
- )
- ([ ]+|$) # followed by whitespace
- """ % vars(Inliner), re.VERBOSE),)
-
- def footnote(self, match):
- lineno = self.state_machine.abs_line_number()
- indented, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- label = match.group(1)
- name = normalize_name(label)
- footnote = nodes.footnote('\n'.join(indented))
- footnote.line = lineno
- if name[0] == '#': # auto-numbered
- name = name[1:] # autonumber label
- footnote['auto'] = 1
- if name:
- footnote['name'] = name
- self.document.note_autofootnote(footnote)
- elif name == '*': # auto-symbol
- name = ''
- footnote['auto'] = '*'
- self.document.note_symbol_footnote(footnote)
- else: # manually numbered
- footnote += nodes.label('', label)
- footnote['name'] = name
- self.document.note_footnote(footnote)
- if name:
- self.document.note_explicit_target(footnote, footnote)
- else:
- self.document.set_id(footnote, footnote)
- if indented:
- self.nested_parse(indented, input_offset=offset, node=footnote)
- return [footnote], blank_finish
-
- def citation(self, match):
- lineno = self.state_machine.abs_line_number()
- indented, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- label = match.group(1)
- name = normalize_name(label)
- citation = nodes.citation('\n'.join(indented))
- citation.line = lineno
- citation += nodes.label('', label)
- citation['name'] = name
- self.document.note_citation(citation)
- self.document.note_explicit_target(citation, citation)
- if indented:
- self.nested_parse(indented, input_offset=offset, node=citation)
- return [citation], blank_finish
-
- def hyperlink_target(self, match):
- pattern = self.explicit.patterns.target
- lineno = self.state_machine.abs_line_number()
- block, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(
- match.end(), until_blank=1, strip_indent=0)
- blocktext = match.string[:match.end()] + '\n'.join(block)
- block = [escape2null(line) for line in block]
- escaped = block[0]
- blockindex = 0
- while 1:
- targetmatch = pattern.match(escaped)
- if targetmatch:
- break
- blockindex += 1
- try:
- escaped += block[blockindex]
- except IndexError:
- raise MarkupError('malformed hyperlink target.', lineno)
- del block[:blockindex]
- block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
- target = self.make_target(block, blocktext, lineno,
- targetmatch.group('name'))
- return [target], blank_finish
-
- def make_target(self, block, block_text, lineno, target_name):
- target_type, data = self.parse_target(block, block_text, lineno)
- if target_type == 'refname':
- target = nodes.target(block_text, '', refname=normalize_name(data))
- target.indirect_reference_name = data
- self.add_target(target_name, '', target, lineno)
- self.document.note_indirect_target(target)
- return target
- elif target_type == 'refuri':
- target = nodes.target(block_text, '')
- self.add_target(target_name, data, target, lineno)
- return target
- else:
- return data
-
- def parse_target(self, block, block_text, lineno):
- """
- Determine the type of reference of a target.
-
- :Return: A 2-tuple, one of:
-
- - 'refname' and the indirect reference name
- - 'refuri' and the URI
- - 'malformed' and a system_message node
- """
- if block and block[-1].strip()[-1:] == '_': # possible indirect target
- reference = ' '.join([line.strip() for line in block])
- refname = self.is_reference(reference)
- if refname:
- return 'refname', refname
- reference = ''.join([line.strip() for line in block])
- if reference.find(' ') == -1:
- return 'refuri', unescape(reference)
- else:
- warning = self.reporter.warning(
- 'Hyperlink target contains whitespace. Perhaps a footnote '
- 'was intended?',
- nodes.literal_block(block_text, block_text), line=lineno)
- return 'malformed', warning
-
- def is_reference(self, reference):
- match = self.explicit.patterns.reference.match(
- whitespace_normalize_name(reference))
- if not match:
- return None
- return unescape(match.group('simple') or match.group('phrase'))
-
- def add_target(self, targetname, refuri, target, lineno):
- target.line = lineno
- if targetname:
- name = normalize_name(unescape(targetname))
- target['name'] = name
- if refuri:
- uri = self.inliner.adjust_uri(refuri)
- if uri:
- target['refuri'] = uri
- self.document.note_external_target(target)
- else:
- raise ApplicationError('problem with URI: %r' % refuri)
- else:
- self.document.note_internal_target(target)
- self.document.note_explicit_target(target, self.parent)
- else: # anonymous target
- if refuri:
- target['refuri'] = refuri
- target['anonymous'] = 1
- self.document.note_anonymous_target(target)
-
- def substitution_def(self, match):
- pattern = self.explicit.patterns.substitution
- lineno = self.state_machine.abs_line_number()
- block, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end(),
- strip_indent=0)
- blocktext = (match.string[:match.end()] + '\n'.join(block))
- block.disconnect()
- escaped = escape2null(block[0].rstrip())
- blockindex = 0
- while 1:
- subdefmatch = pattern.match(escaped)
- if subdefmatch:
- break
- blockindex += 1
- try:
- escaped = escaped + ' ' + escape2null(block[blockindex].strip())
- except IndexError:
- raise MarkupError('malformed substitution definition.',
- lineno)
- del block[:blockindex] # strip out the substitution marker
- block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
- if not block[0]:
- del block[0]
- offset += 1
- while block and not block[-1].strip():
- block.pop()
- subname = subdefmatch.group('name')
- substitution_node = nodes.substitution_definition(blocktext)
- substitution_node.line = lineno
- self.document.note_substitution_def(
- substitution_node,subname, self.parent)
- if block:
- block[0] = block[0].strip()
- new_abs_offset, blank_finish = self.nested_list_parse(
- block, input_offset=offset, node=substitution_node,
- initial_state='SubstitutionDef', blank_finish=blank_finish)
- i = 0
- for node in substitution_node[:]:
- if not (isinstance(node, nodes.Inline) or
- isinstance(node, nodes.Text)):
- self.parent += substitution_node[i]
- del substitution_node[i]
- else:
- i += 1
- if len(substitution_node) == 0:
- msg = self.reporter.warning(
- 'Substitution definition "%s" empty or invalid.'
- % subname,
- nodes.literal_block(blocktext, blocktext), line=lineno)
- return [msg], blank_finish
- else:
- return [substitution_node], blank_finish
- else:
- msg = self.reporter.warning(
- 'Substitution definition "%s" missing contents.' % subname,
- nodes.literal_block(blocktext, blocktext), line=lineno)
- return [msg], blank_finish
-
- def directive(self, match, **option_presets):
- type_name = match.group(1)
- directive_function, messages = directives.directive(
- type_name, self.memo.language, self.document)
- self.parent += messages
- if directive_function:
- return self.parse_directive(
- directive_function, match, type_name, option_presets)
- else:
- return self.unknown_directive(type_name)
-
- def parse_directive(self, directive_fn, match, type_name, option_presets):
- """
- Parse a directive then run its directive function.
-
- Parameters:
-
- - `directive_fn`: The function implementing the directive. Uses
- function attributes ``arguments``, ``options``, and/or ``content``
- if present.
-
- - `match`: A regular expression match object which matched the first
- line of the directive.
-
- - `type_name`: The directive name, as used in the source text.
-
- - `option_presets`: A dictionary of preset options, defaults for the
- directive options. Currently, only an "alt" option is passed by
- substitution definitions (value: the substitution name), which may
- be used by an embedded image directive.
-
- Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
- """
- arguments = []
- options = {}
- argument_spec = getattr(directive_fn, 'arguments', None)
- if argument_spec and argument_spec[:2] == (0, 0):
- argument_spec = None
- option_spec = getattr(directive_fn, 'options', None)
- content_spec = getattr(directive_fn, 'content', None)
- lineno = self.state_machine.abs_line_number()
- initial_line_offset = self.state_machine.line_offset
- indented, indent, line_offset, blank_finish \
- = self.state_machine.get_first_known_indented(match.end(),
- strip_top=0)
- block_text = '\n'.join(self.state_machine.input_lines[
- initial_line_offset : self.state_machine.line_offset + 1])
- if indented and not indented[0].strip():
- indented.trim_start()
- line_offset += 1
- while indented and not indented[-1].strip():
- indented.trim_end()
- if indented and (argument_spec or option_spec):
- for i in range(len(indented)):
- if not indented[i].strip():
- break
- else:
- i += 1
- arg_block = indented[:i]
- content = indented[i+1:]
- content_offset = line_offset + i + 1
- else:
- content = indented
- content_offset = line_offset
- arg_block = []
- while content and not content[0].strip():
- content.trim_start()
- content_offset += 1
- try:
- if option_spec:
- options, arg_block = self.parse_directive_options(
- option_presets, option_spec, arg_block)
- if argument_spec:
- arguments = self.parse_directive_arguments(argument_spec,
- arg_block)
- if content and not content_spec:
- raise MarkupError('no content permitted')
- except MarkupError, detail:
- error = self.reporter.error(
- 'Error in "%s" directive:\n%s.' % (type_name, detail),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error], blank_finish
- result = directive_fn(
- type_name, arguments, options, content, lineno, content_offset,
- block_text, self, self.state_machine)
- return result, blank_finish or self.state_machine.is_next_line_blank()
-
- def parse_directive_options(self, option_presets, option_spec, arg_block):
- options = option_presets.copy()
- for i in range(len(arg_block)):
- if arg_block[i][:1] == ':':
- opt_block = arg_block[i:]
- arg_block = arg_block[:i]
- break
- else:
- opt_block = []
- if opt_block:
- success, data = self.parse_extension_options(option_spec,
- opt_block)
- if success: # data is a dict of options
- options.update(data)
- else: # data is an error string
- raise MarkupError(data)
- return options, arg_block
-
- def parse_directive_arguments(self, argument_spec, arg_block):
- required, optional, last_whitespace = argument_spec
- arg_text = '\n'.join(arg_block)
- arguments = arg_text.split()
- if len(arguments) < required:
- raise MarkupError('%s argument(s) required, %s supplied'
- % (required, len(arguments)))
- elif len(arguments) > required + optional:
- if last_whitespace:
- arguments = arg_text.split(None, required + optional - 1)
- else:
- raise MarkupError(
- 'maximum %s argument(s) allowed, %s supplied'
- % (required + optional, len(arguments)))
- return arguments
-
- def parse_extension_options(self, option_spec, datalines):
- """
- Parse `datalines` for a field list containing extension options
- matching `option_spec`.
-
- :Parameters:
- - `option_spec`: a mapping of option name to conversion
- function, which should raise an exception on bad input.
- - `datalines`: a list of input strings.
-
- :Return:
- - Success value, 1 or 0.
- - An option dictionary on success, an error string on failure.
- """
- node = nodes.field_list()
- newline_offset, blank_finish = self.nested_list_parse(
- datalines, 0, node, initial_state='ExtensionOptions',
- blank_finish=1)
- if newline_offset != len(datalines): # incomplete parse of block
- return 0, 'invalid option block'
- try:
- options = utils.extract_extension_options(node, option_spec)
- except KeyError, detail:
- return 0, ('unknown option: "%s"' % detail.args[0])
- except (ValueError, TypeError), detail:
- return 0, ('invalid option value: %s' % detail)
- except utils.ExtensionOptionError, detail:
- return 0, ('invalid option data: %s' % detail)
- if blank_finish:
- return 1, options
- else:
- return 0, 'option data incompletely parsed'
-
- def unknown_directive(self, type_name):
- lineno = self.state_machine.abs_line_number()
- indented, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(0, strip_indent=0)
- text = '\n'.join(indented)
- error = self.reporter.error(
- 'Unknown directive type "%s".' % type_name,
- nodes.literal_block(text, text), line=lineno)
- return [error], blank_finish
-
- def comment(self, match):
- if not match.string[match.end():].strip() \
- and self.state_machine.is_next_line_blank(): # an empty comment?
- return [nodes.comment()], 1 # "A tiny but practical wart."
- indented, indent, offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end())
- while indented and not indented[-1].strip():
- indented.trim_end()
- text = '\n'.join(indented)
- return [nodes.comment(text, text)], blank_finish
-
- explicit.constructs = [
- (footnote,
- re.compile(r"""
- \.\.[ ]+ # explicit markup start
- \[
- ( # footnote label:
- [0-9]+ # manually numbered footnote
- | # *OR*
- \# # anonymous auto-numbered footnote
- | # *OR*
- \#%s # auto-number ed?) footnote label
- | # *OR*
- \* # auto-symbol footnote
- )
- \]
- ([ ]+|$) # whitespace or end of line
- """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
- (citation,
- re.compile(r"""
- \.\.[ ]+ # explicit markup start
- \[(%s)\] # citation label
- ([ ]+|$) # whitespace or end of line
- """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
- (hyperlink_target,
- re.compile(r"""
- \.\.[ ]+ # explicit markup start
- _ # target indicator
- (?![ ]) # first char. not space
- """, re.VERBOSE)),
- (substitution_def,
- re.compile(r"""
- \.\.[ ]+ # explicit markup start
- \| # substitution indicator
- (?![ ]) # first char. not space
- """, re.VERBOSE)),
- (directive,
- re.compile(r"""
- \.\.[ ]+ # explicit markup start
- (%s) # directive name
- [ ]? # optional space
- :: # directive delimiter
- ([ ]+|$) # whitespace or end of line
- """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
-
- def explicit_markup(self, match, context, next_state):
- """Footnotes, hyperlink targets, directives, comments."""
- nodelist, blank_finish = self.explicit_construct(match)
- self.parent += nodelist
- self.explicit_list(blank_finish)
- return [], next_state, []
-
- def explicit_construct(self, match):
- """Determine which explicit construct this is, parse & return it."""
- errors = []
- for method, pattern in self.explicit.constructs:
- expmatch = pattern.match(match.string)
- if expmatch:
- try:
- return method(self, expmatch)
- except MarkupError, (message, lineno): # never reached?
- errors.append(self.reporter.warning(message, line=lineno))
- break
- nodelist, blank_finish = self.comment(match)
- return nodelist + errors, blank_finish
-
- def explicit_list(self, blank_finish):
- """
- Create a nested state machine for a series of explicit markup
- constructs (including anonymous hyperlink targets).
- """
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=self.parent, initial_state='Explicit',
- blank_finish=blank_finish,
- match_titles=self.state_machine.match_titles)
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Explicit markup')
-
- def anonymous(self, match, context, next_state):
- """Anonymous hyperlink targets."""
- nodelist, blank_finish = self.anonymous_target(match)
- self.parent += nodelist
- self.explicit_list(blank_finish)
- return [], next_state, []
-
- def anonymous_target(self, match):
- lineno = self.state_machine.abs_line_number()
- block, indent, offset, blank_finish \
- = self.state_machine.get_first_known_indented(match.end(),
- until_blank=1)
- blocktext = match.string[:match.end()] + '\n'.join(block)
- block = [escape2null(line) for line in block]
- target = self.make_target(block, blocktext, lineno, '')
- return [target], blank_finish
-
- def line(self, match, context, next_state):
- """Section title overline or transition marker."""
- if self.state_machine.match_titles:
- return [match.string], 'Line', []
- elif match.string.strip() == '::':
- raise statemachine.TransitionCorrection('text')
- elif len(match.string.strip()) < 4:
- msg = self.reporter.info(
- 'Unexpected possible title overline or transition.\n'
- "Treating it as ordinary text because it's so short.",
- line=self.state_machine.abs_line_number())
- self.parent += msg
- raise statemachine.TransitionCorrection('text')
- else:
- blocktext = self.state_machine.line
- msg = self.reporter.severe(
- 'Unexpected section title or transition.',
- nodes.literal_block(blocktext, blocktext),
- line=self.state_machine.abs_line_number())
- self.parent += msg
- return [], next_state, []
-
- def text(self, match, context, next_state):
- """Titles, definition lists, paragraphs."""
- return [match.string], 'Text', []
-
-
-class RFC2822Body(Body):
-
- """
- RFC2822 headers are only valid as the first constructs in documents. As
- soon as anything else appears, the `Body` state should take over.
- """
-
- patterns = Body.patterns.copy() # can't modify the original
- patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
- initial_transitions = [(name, 'Body')
- for name in Body.initial_transitions]
- initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
-
- def rfc2822(self, match, context, next_state):
- """RFC2822-style field list item."""
- fieldlist = nodes.field_list(CLASS='rfc2822')
- self.parent += fieldlist
- field, blank_finish = self.rfc2822_field(match)
- fieldlist += field
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=fieldlist, initial_state='RFC2822List',
- blank_finish=blank_finish)
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning(
- 'RFC2822-style field list')
- return [], next_state, []
-
- def rfc2822_field(self, match):
- name = match.string[:match.string.find(':')]
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_first_known_indented(match.end(),
- until_blank=1)
- fieldnode = nodes.field()
- fieldnode += nodes.field_name(name, name)
- fieldbody = nodes.field_body('\n'.join(indented))
- fieldnode += fieldbody
- if indented:
- self.nested_parse(indented, input_offset=line_offset,
- node=fieldbody)
- return fieldnode, blank_finish
-
-
-class SpecializedBody(Body):
-
- """
- Superclass for second and subsequent compound element members. Compound
- elements are lists and list-like constructs.
-
- All transition methods are disabled (redefined as `invalid_input`).
- Override individual methods in subclasses to re-enable.
-
- For example, once an initial bullet list item, say, is recognized, the
- `BulletList` subclass takes over, with a "bullet_list" node as its
- container. Upon encountering the initial bullet list item, `Body.bullet`
- calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
- starts up a nested parsing session with `BulletList` as the initial state.
- Only the ``bullet`` transition method is enabled in `BulletList`; as long
- as only bullet list items are encountered, they are parsed and inserted
- into the container. The first construct which is *not* a bullet list item
- triggers the `invalid_input` method, which ends the nested parse and
- closes the container. `BulletList` needs to recognize input that is
- invalid in the context of a bullet list, which means everything *other
- than* bullet list items, so it inherits the transition list created in
- `Body`.
- """
-
- def invalid_input(self, match=None, context=None, next_state=None):
- """Not a compound element member. Abort this state machine."""
- self.state_machine.previous_line() # back up so parent SM can reassess
- raise EOFError
-
- indent = invalid_input
- bullet = invalid_input
- enumerator = invalid_input
- field_marker = invalid_input
- option_marker = invalid_input
- doctest = invalid_input
- grid_table_top = invalid_input
- simple_table_top = invalid_input
- explicit_markup = invalid_input
- anonymous = invalid_input
- line = invalid_input
- text = invalid_input
-
-
-class BulletList(SpecializedBody):
-
- """Second and subsequent bullet_list list_items."""
-
- def bullet(self, match, context, next_state):
- """Bullet list item."""
- if match.string[0] != self.parent['bullet']:
- # different bullet: new list
- self.invalid_input()
- listitem, blank_finish = self.list_item(match.end())
- self.parent += listitem
- self.blank_finish = blank_finish
- return [], next_state, []
-
-
-class DefinitionList(SpecializedBody):
-
- """Second and subsequent definition_list_items."""
-
- def text(self, match, context, next_state):
- """Definition lists."""
- return [match.string], 'Definition', []
-
-
-class EnumeratedList(SpecializedBody):
-
- """Second and subsequent enumerated_list list_items."""
-
- def enumerator(self, match, context, next_state):
- """Enumerated list item."""
- format, sequence, text, ordinal = self.parse_enumerator(
- match, self.parent['enumtype'])
- if (sequence != self.parent['enumtype'] or
- format != self.format or
- ordinal != (self.lastordinal + 1) or
- not self.is_enumerated_list_item(ordinal, sequence, format)):
- # different enumeration: new list
- self.invalid_input()
- listitem, blank_finish = self.list_item(match.end())
- self.parent += listitem
- self.blank_finish = blank_finish
- self.lastordinal = ordinal
- return [], next_state, []
-
-
-class FieldList(SpecializedBody):
-
- """Second and subsequent field_list fields."""
-
- def field_marker(self, match, context, next_state):
- """Field list field."""
- field, blank_finish = self.field(match)
- self.parent += field
- self.blank_finish = blank_finish
- return [], next_state, []
-
-
-class OptionList(SpecializedBody):
-
- """Second and subsequent option_list option_list_items."""
-
- def option_marker(self, match, context, next_state):
- """Option list item."""
- try:
- option_list_item, blank_finish = self.option_list_item(match)
- except MarkupError, (message, lineno):
- self.invalid_input()
- self.parent += option_list_item
- self.blank_finish = blank_finish
- return [], next_state, []
-
-
-class RFC2822List(SpecializedBody, RFC2822Body):
-
- """Second and subsequent RFC2822-style field_list fields."""
-
- patterns = RFC2822Body.patterns
- initial_transitions = RFC2822Body.initial_transitions
-
- def rfc2822(self, match, context, next_state):
- """RFC2822-style field list item."""
- field, blank_finish = self.rfc2822_field(match)
- self.parent += field
- self.blank_finish = blank_finish
- return [], 'RFC2822List', []
-
- blank = SpecializedBody.invalid_input
-
-
-class ExtensionOptions(FieldList):
-
- """
- Parse field_list fields for extension options.
-
- No nested parsing is done (including inline markup parsing).
- """
-
- def parse_field_body(self, indented, offset, node):
- """Override `Body.parse_field_body` for simpler parsing."""
- lines = []
- for line in list(indented) + ['']:
- if line.strip():
- lines.append(line)
- elif lines:
- text = '\n'.join(lines)
- node += nodes.paragraph(text, text)
- lines = []
-
-
-class Explicit(SpecializedBody):
-
- """Second and subsequent explicit markup construct."""
-
- def explicit_markup(self, match, context, next_state):
- """Footnotes, hyperlink targets, directives, comments."""
- nodelist, blank_finish = self.explicit_construct(match)
- self.parent += nodelist
- self.blank_finish = blank_finish
- return [], next_state, []
-
- def anonymous(self, match, context, next_state):
- """Anonymous hyperlink targets."""
- nodelist, blank_finish = self.anonymous_target(match)
- self.parent += nodelist
- self.blank_finish = blank_finish
- return [], next_state, []
-
- blank = SpecializedBody.invalid_input
-
-
-class SubstitutionDef(Body):
-
- """
- Parser for the contents of a substitution_definition element.
- """
-
- patterns = {
- 'embedded_directive': re.compile(r'(%s)::( +|$)'
- % Inliner.simplename, re.UNICODE),
- 'text': r''}
- initial_transitions = ['embedded_directive', 'text']
-
- def embedded_directive(self, match, context, next_state):
- nodelist, blank_finish = self.directive(match,
- alt=self.parent['name'])
- self.parent += nodelist
- if not self.state_machine.at_eof():
- self.blank_finish = blank_finish
- raise EOFError
-
- def text(self, match, context, next_state):
- if not self.state_machine.at_eof():
- self.blank_finish = self.state_machine.is_next_line_blank()
- raise EOFError
-
-
-class Text(RSTState):
-
- """
- Classifier of second line of a text block.
-
- Could be a paragraph, a definition list item, or a title.
- """
-
- patterns = {'underline': Body.patterns['line'],
- 'text': r''}
- initial_transitions = [('underline', 'Body'), ('text', 'Body')]
-
- def blank(self, match, context, next_state):
- """End of paragraph."""
- paragraph, literalnext = self.paragraph(
- context, self.state_machine.abs_line_number() - 1)
- self.parent += paragraph
- if literalnext:
- self.parent += self.literal_block()
- return [], 'Body', []
-
- def eof(self, context):
- if context:
- self.blank(None, context, None)
- return []
-
- def indent(self, match, context, next_state):
- """Definition list item."""
- definitionlist = nodes.definition_list()
- definitionlistitem, blank_finish = self.definition_list_item(context)
- definitionlist += definitionlistitem
- self.parent += definitionlist
- offset = self.state_machine.line_offset + 1 # next line
- newline_offset, blank_finish = self.nested_list_parse(
- self.state_machine.input_lines[offset:],
- input_offset=self.state_machine.abs_line_offset() + 1,
- node=definitionlist, initial_state='DefinitionList',
- blank_finish=blank_finish, blank_finish_state='Definition')
- self.goto_line(newline_offset)
- if not blank_finish:
- self.parent += self.unindent_warning('Definition list')
- return [], 'Body', []
-
- def underline(self, match, context, next_state):
- """Section title."""
- lineno = self.state_machine.abs_line_number()
- title = context[0].rstrip()
- underline = match.string.rstrip()
- source = title + '\n' + underline
- messages = []
- if len(title) > len(underline):
- if len(underline) < 4:
- if self.state_machine.match_titles:
- msg = self.reporter.info(
- 'Possible title underline, too short for the title.\n'
- "Treating it as ordinary text because it's so short.",
- line=lineno)
- self.parent += msg
- raise statemachine.TransitionCorrection('text')
- else:
- blocktext = context[0] + '\n' + self.state_machine.line
- msg = self.reporter.warning(
- 'Title underline too short.',
- nodes.literal_block(blocktext, blocktext), line=lineno)
- messages.append(msg)
- if not self.state_machine.match_titles:
- blocktext = context[0] + '\n' + self.state_machine.line
- msg = self.reporter.severe(
- 'Unexpected section title.',
- nodes.literal_block(blocktext, blocktext), line=lineno)
- self.parent += messages
- self.parent += msg
- return [], next_state, []
- style = underline[0]
- context[:] = []
- self.section(title, source, style, lineno - 1, messages)
- return [], next_state, []
-
- def text(self, match, context, next_state):
- """Paragraph."""
- startline = self.state_machine.abs_line_number() - 1
- msg = None
- try:
- block = self.state_machine.get_text_block(flush_left=1)
- except statemachine.UnexpectedIndentationError, instance:
- block, source, lineno = instance.args
- msg = self.reporter.error('Unexpected indentation.',
- source=source, line=lineno)
- lines = context + list(block)
- paragraph, literalnext = self.paragraph(lines, startline)
- self.parent += paragraph
- self.parent += msg
- if literalnext:
- try:
- self.state_machine.next_line()
- except EOFError:
- pass
- self.parent += self.literal_block()
- return [], next_state, []
-
- def literal_block(self):
- """Return a list of nodes."""
- indented, indent, offset, blank_finish = \
- self.state_machine.get_indented()
- while indented and not indented[-1].strip():
- indented.trim_end()
- if not indented:
- return self.quoted_literal_block()
- nodelist = []
- data = '\n'.join(indented)
- nodelist.append(nodes.literal_block(data, data))
- if not blank_finish:
- nodelist.append(self.unindent_warning('Literal block'))
- return nodelist
-
- def quoted_literal_block(self):
- abs_line_offset = self.state_machine.abs_line_offset()
- offset = self.state_machine.line_offset
- parent_node = nodes.Element()
- new_abs_offset = self.nested_parse(
- self.state_machine.input_lines[offset:],
- input_offset=abs_line_offset, node=parent_node, match_titles=0,
- state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
- 'initial_state': 'QuotedLiteralBlock'})
- self.goto_line(new_abs_offset)
- return parent_node.children
-
- def definition_list_item(self, termline):
- indented, indent, line_offset, blank_finish = \
- self.state_machine.get_indented()
- definitionlistitem = nodes.definition_list_item(
- '\n'.join(termline + list(indented)))
- lineno = self.state_machine.abs_line_number() - 1
- definitionlistitem.line = lineno
- termlist, messages = self.term(termline, lineno)
- definitionlistitem += termlist
- definition = nodes.definition('', *messages)
- definitionlistitem += definition
- if termline[0][-2:] == '::':
- definition += self.reporter.info(
- 'Blank line missing before literal block (after the "::")? '
- 'Interpreted as a definition list item.', line=line_offset+1)
- self.nested_parse(indented, input_offset=line_offset, node=definition)
- return definitionlistitem, blank_finish
-
- def term(self, lines, lineno):
- """Return a definition_list's term and optional classifier."""
- assert len(lines) == 1
- text_nodes, messages = self.inline_text(lines[0], lineno)
- term_node = nodes.term()
- node_list = [term_node]
- for i in range(len(text_nodes)):
- node = text_nodes[i]
- if isinstance(node, nodes.Text):
- parts = node.rawsource.split(' : ', 1)
- if len(parts) == 1:
- term_node += node
- else:
- term_node += nodes.Text(parts[0].rstrip())
- classifier_node = nodes.classifier('', parts[1])
- classifier_node += text_nodes[i+1:]
- node_list.append(classifier_node)
- break
- else:
- term_node += node
- return node_list, messages
-
-
-class SpecializedText(Text):
-
- """
- Superclass for second and subsequent lines of Text-variants.
-
- All transition methods are disabled. Override individual methods in
- subclasses to re-enable.
- """
-
- def eof(self, context):
- """Incomplete construct."""
- return []
-
- def invalid_input(self, match=None, context=None, next_state=None):
- """Not a compound element member. Abort this state machine."""
- raise EOFError
-
- blank = invalid_input
- indent = invalid_input
- underline = invalid_input
- text = invalid_input
-
-
-class Definition(SpecializedText):
-
- """Second line of potential definition_list_item."""
-
- def eof(self, context):
- """Not a definition."""
- self.state_machine.previous_line(2) # so parent SM can reassess
- return []
-
- def indent(self, match, context, next_state):
- """Definition list item."""
- definitionlistitem, blank_finish = self.definition_list_item(context)
- self.parent += definitionlistitem
- self.blank_finish = blank_finish
- return [], 'DefinitionList', []
-
-
-class Line(SpecializedText):
-
- """
- Second line of over- & underlined section title or transition marker.
- """
-
- eofcheck = 1 # @@@ ???
- """Set to 0 while parsing sections, so that we don't catch the EOF."""
-
- def eof(self, context):
- """Transition marker at end of section or document."""
- marker = context[0].strip()
- if self.memo.section_bubble_up_kludge:
- self.memo.section_bubble_up_kludge = 0
- elif len(marker) < 4:
- self.state_correction(context)
- if self.eofcheck: # ignore EOFError with sections
- lineno = self.state_machine.abs_line_number() - 1
- transition = nodes.transition(context[0])
- transition.line = lineno
- self.parent += transition
- msg = self.reporter.error(
- 'Document or section may not end with a transition.',
- line=lineno)
- self.parent += msg
- self.eofcheck = 1
- return []
-
- def blank(self, match, context, next_state):
- """Transition marker."""
- lineno = self.state_machine.abs_line_number() - 1
- marker = context[0].strip()
- if len(marker) < 4:
- self.state_correction(context)
- transition = nodes.transition(marker)
- transition.line = lineno
- if len(self.parent) == 0:
- msg = self.reporter.error(
- 'Document or section may not begin with a transition.',
- line=lineno)
- self.parent += msg
- elif isinstance(self.parent[-1], nodes.transition):
- msg = self.reporter.error(
- 'At least one body element must separate transitions; '
- 'adjacent transitions not allowed.',
- line=lineno)
- self.parent += msg
- self.parent += transition
- return [], 'Body', []
-
- def text(self, match, context, next_state):
- """Potential over- & underlined title."""
- lineno = self.state_machine.abs_line_number() - 1
- overline = context[0]
- title = match.string
- underline = ''
- try:
- underline = self.state_machine.next_line()
- except EOFError:
- blocktext = overline + '\n' + title
- if len(overline.rstrip()) < 4:
- self.short_overline(context, blocktext, lineno, 2)
- else:
- msg = self.reporter.severe(
- 'Incomplete section title.',
- nodes.literal_block(blocktext, blocktext), line=lineno)
- self.parent += msg
- return [], 'Body', []
- source = '%s\n%s\n%s' % (overline, title, underline)
- overline = overline.rstrip()
- underline = underline.rstrip()
- if not self.transitions['underline'][0].match(underline):
- blocktext = overline + '\n' + title + '\n' + underline
- if len(overline.rstrip()) < 4:
- self.short_overline(context, blocktext, lineno, 2)
- else:
- msg = self.reporter.severe(
- 'Missing matching underline for section title overline.',
- nodes.literal_block(source, source), line=lineno)
- self.parent += msg
- return [], 'Body', []
- elif overline != underline:
- blocktext = overline + '\n' + title + '\n' + underline
- if len(overline.rstrip()) < 4:
- self.short_overline(context, blocktext, lineno, 2)
- else:
- msg = self.reporter.severe(
- 'Title overline & underline mismatch.',
- nodes.literal_block(source, source), line=lineno)
- self.parent += msg
- return [], 'Body', []
- title = title.rstrip()
- messages = []
- if len(title) > len(overline):
- blocktext = overline + '\n' + title + '\n' + underline
- if len(overline.rstrip()) < 4:
- self.short_overline(context, blocktext, lineno, 2)
- else:
- msg = self.reporter.warning(
- 'Title overline too short.',
- nodes.literal_block(source, source), line=lineno)
- messages.append(msg)
- style = (overline[0], underline[0])
- self.eofcheck = 0 # @@@ not sure this is correct
- self.section(title.lstrip(), source, style, lineno + 1, messages)
- self.eofcheck = 1
- return [], 'Body', []
-
- indent = text # indented title
-
- def underline(self, match, context, next_state):
- overline = context[0]
- blocktext = overline + '\n' + self.state_machine.line
- lineno = self.state_machine.abs_line_number() - 1
- if len(overline.rstrip()) < 4:
- self.short_overline(context, blocktext, lineno, 1)
- msg = self.reporter.error(
- 'Invalid section title or transition marker.',
- nodes.literal_block(blocktext, blocktext), line=lineno)
- self.parent += msg
- return [], 'Body', []
-
- def short_overline(self, context, blocktext, lineno, lines=1):
- msg = self.reporter.info(
- 'Possible incomplete section title.\nTreating the overline as '
- "ordinary text because it's so short.", line=lineno)
- self.parent += msg
- self.state_correction(context, lines)
-
- def state_correction(self, context, lines=1):
- self.state_machine.previous_line(lines)
- context[:] = []
- raise statemachine.StateCorrection('Body', 'text')
-
-
-class QuotedLiteralBlock(RSTState):
-
- """
- Nested parse handler for quoted (unindented) literal blocks.
-
- Special-purpose. Not for inclusion in `state_classes`.
- """
-
- patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
- 'text': r''}
- initial_transitions = ('initial_quoted', 'text')
-
- def __init__(self, state_machine, debug=0):
- RSTState.__init__(self, state_machine, debug)
- self.messages = []
- self.initial_lineno = None
-
- def blank(self, match, context, next_state):
- if context:
- raise EOFError
- else:
- return context, next_state, []
-
- def eof(self, context):
- if context:
- text = '\n'.join(context)
- literal_block = nodes.literal_block(text, text)
- literal_block.line = self.initial_lineno
- self.parent += literal_block
- else:
- self.parent += self.reporter.warning(
- 'Literal block expected; none found.',
- line=self.state_machine.abs_line_number())
- self.state_machine.previous_line()
- self.parent += self.messages
- return []
-
- def indent(self, match, context, next_state):
- assert context, ('QuotedLiteralBlock.indent: context should not '
- 'be empty!')
- self.messages.append(
- self.reporter.error('Unexpected indentation.',
- line=self.state_machine.abs_line_number()))
- self.state_machine.previous_line()
- raise EOFError
-
- def initial_quoted(self, match, context, next_state):
- """Match arbitrary quote character on the first line only."""
- self.remove_transition('initial_quoted')
- quote = match.string[0]
- pattern = re.compile(re.escape(quote))
- # New transition matches consistent quotes only:
- self.add_transition('quoted',
- (pattern, self.quoted, self.__class__.__name__))
- self.initial_lineno = self.state_machine.abs_line_number()
- return [match.string], next_state, []
-
- def quoted(self, match, context, next_state):
- """Match consistent quotes on subsequent lines."""
- context.append(match.string)
- return context, next_state, []
-
- def text(self, match, context, next_state):
- if context:
- self.messages.append(
- self.reporter.error('Inconsistent literal block quoting.',
- line=self.state_machine.abs_line_number()))
- self.state_machine.previous_line()
- raise EOFError
-
-
-state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
- OptionList, ExtensionOptions, Explicit, Text, Definition,
- Line, SubstitutionDef, RFC2822Body, RFC2822List)
-"""Standard set of State classes used to start `RSTStateMachine`."""
-
-
-def escape2null(text):
- """Return a string with escape-backslashes converted to nulls."""
- parts = []
- start = 0
- while 1:
- found = text.find('\\', start)
- if found == -1:
- parts.append(text[start:])
- return ''.join(parts)
- parts.append(text[start:found])
- parts.append('\x00' + text[found+1:found+2])
- start = found + 2 # skip character after escape
-
-def unescape(text, restore_backslashes=0):
- """
- Return a string with nulls removed or restored to backslashes.
- Backslash-escaped spaces are also removed.
- """
- if restore_backslashes:
- return text.replace('\x00', '\\')
- else:
- for sep in ['\x00 ', '\x00\n', '\x00']:
- text = ''.join(text.split(sep))
- return text
diff --git a/sandbox/fwiemann/.fsfsbackup b/sandbox/fwiemann/.fsfsbackup
deleted file mode 100644
index 89588ab02..000000000
--- a/sandbox/fwiemann/.fsfsbackup
+++ /dev/null
@@ -1,4 +0,0 @@
-BACKUPDIR=~/remote-backup/docutils
-HOST=svn.berlios.de
-REMOTEDIR=/svnroot/repos/docutils
-do_backup
diff --git a/sandbox/fwiemann/commit-email/README.txt b/sandbox/fwiemann/commit-email/README.txt
deleted file mode 100644
index 428a569d0..000000000
--- a/sandbox/fwiemann/commit-email/README.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-=========================================
- File name patch for ``commit-email.pl``
-=========================================
-
-:Author: Felix Wiemann
-:Contact: Felix.Wiemann@ososo.de
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This document has been placed in the public domain.
-
-
-`<commit-email.patch>`_ is a patch against ``commit-email.pl`` of
-Subversion 1.1.3. Note that the patch cannot be applied to newer
-versions of ``commit-email.pl``.
-
-It adds file names to the subject lines, which would otherwise only
-list directories. The Docutils Subversion repository currently uses
-this patched version of ``commit-email.pl`` to generate the check-in
-messages sent to the Docutils-checkins mailing list.
-
-The patch has been placed in the public domain.
diff --git a/sandbox/fwiemann/commit-email/commit-email.patch b/sandbox/fwiemann/commit-email/commit-email.patch
deleted file mode 100644
index ebc9a1ae4..000000000
--- a/sandbox/fwiemann/commit-email/commit-email.patch
+++ /dev/null
@@ -1,135 +0,0 @@
---- tools/hook-scripts/commit-email.pl 2004-06-14 22:29:22.000000000 +0200
-+++ tools/hook-scripts/commit-email.pl 2005-10-30 22:39:22.942246752 +0100
-@@ -222,32 +222,16 @@
- shift @svnlooklines;
- my @log = map { "$_\n" } @svnlooklines;
-
--# Figure out what directories have changed using svnlook.
--my @dirschanged = &read_from_process($svnlook, 'dirs-changed', $repos,
-- '-r', $rev);
--
--# Lose the trailing slash in the directory names if one exists, except
--# in the case of '/'.
--my $rootchanged = 0;
--for (my $i=0; $i<@dirschanged; ++$i)
-- {
-- if ($dirschanged[$i] eq '/')
-- {
-- $rootchanged = 1;
-- }
-- else
-- {
-- $dirschanged[$i] =~ s#^(.+)[/\\]$#$1#;
-- }
-- }
-
- # Figure out what files have changed using svnlook.
- @svnlooklines = &read_from_process($svnlook, 'changed', $repos, '-r', $rev);
-
- # Parse the changed nodes.
-+my @fileschanged;
- my @adds;
- my @dels;
- my @mods;
-+my $rootchanged = 0;
- foreach my $line (@svnlooklines)
- {
- my $path = '';
-@@ -261,6 +245,12 @@
- $path = $2;
- }
-
-+ push(@fileschanged, $path);
-+ if ($path eq '/')
-+ {
-+ $rootchanged = 1;
-+ }
-+
- if ($code eq 'A')
- {
- push(@adds, $path);
-@@ -288,11 +278,11 @@
- # there's no point in collapsing the directories, and only if more
- # than one directory was modified.
- my $commondir = '';
--if (!$rootchanged and @dirschanged > 1)
-+if (!$rootchanged and @fileschanged > 1)
- {
-- my $firstline = shift @dirschanged;
-+ my $firstline = shift @fileschanged;
- my @commonpieces = split('/', $firstline);
-- foreach my $line (@dirschanged)
-+ foreach my $line (@fileschanged)
- {
- my @pieces = split('/', $line);
- my $i = 0;
-@@ -306,28 +296,28 @@
- $i++;
- }
- }
-- unshift(@dirschanged, $firstline);
-+ unshift(@fileschanged, $firstline);
-
- if (@commonpieces)
- {
- $commondir = join('/', @commonpieces);
-- my @new_dirschanged;
-- foreach my $dir (@dirschanged)
-+ my @new_fileschanged;
-+ foreach my $file (@fileschanged)
- {
-- if ($dir eq $commondir)
-+ if ($file eq "$commondir/")
- {
-- $dir = '.';
-+ $file = '.';
- }
- else
- {
-- $dir =~ s#^$commondir/##;
-+ $file =~ s#^$commondir/##;
- }
-- push(@new_dirschanged, $dir);
-+ push(@new_fileschanged, $file);
- }
-- @dirschanged = @new_dirschanged;
-+ @fileschanged = @new_fileschanged;
- }
- }
--my $dirlist = join(' ', @dirschanged);
-+my $filelist = join(' ', @fileschanged);
-
- ######################################################################
- # Assembly of log message.
-@@ -367,7 +357,7 @@
- {
- my $match_re = $project->{match_re};
- my $match = 0;
-- foreach my $path (@dirschanged, @adds, @dels, @mods)
-+ foreach my $path (@adds, @dels, @mods)
- {
- if ($path =~ $match_re)
- {
-@@ -390,16 +380,20 @@
-
- if ($commondir ne '')
- {
-- $subject = "r$rev - in $commondir: $dirlist";
-+ $subject = "r$rev - in $commondir: $filelist";
- }
- else
- {
-- $subject = "r$rev - $dirlist";
-+ $subject = "r$rev - $filelist";
- }
- if ($subject_prefix =~ /\w/)
- {
- $subject = "$subject_prefix $subject";
- }
-+ if(length($subject) > 900)
-+ {
-+ $subject = substr($subject, 0, 896) . " ...";
-+ }
- my $mail_from = $author;
-
- if ($from_address =~ /\w/)
diff --git a/sandbox/fwiemann/fsfsbackup.sh b/sandbox/fwiemann/fsfsbackup.sh
deleted file mode 100755
index 32d472760..000000000
--- a/sandbox/fwiemann/fsfsbackup.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/bash
-
-# Author: Felix Wiemann
-# Contact: Felix_Wiemann@ososo.de
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This file has been placed in the public domain.
-
-# Options:
-#
-# -f Do not print feedback.
-
-set -e
-
-trap "echo; echo Exiting with error.; trap - 0; exit 1" 0 1 2 3 15
-
-test "$1" == -f && printfeedback= || printfeedback=1
-
-function feedback() {
- test "$printfeedback" && echo "$@" || true
-}
-
-function do_backup() {
- # If any of the tests fails, the script terminates silently.
- feedback "Checking that all necessary variables are set."
- test -n "$BACKUPDIR"
- test -n "$HOST"
- test -n "$REMOTEDIR"
- if test ! -d "$BACKUPDIR"; then
- feedback "Creating backup directory $BACKUPDIR."
- mkdir --parents --verbose "$BACKUPDIR"
- fi
- if test ! -f "$BACKUPDIR/db/fs-type"; then
- feedback
- echo "$BACKUPDIR/db/fs-type not found."
- echo "Please fetch the first copy of the repository database yourself."
- echo "I only assist in doing incremental backups of repository databases."
- exit 1
- fi
- feedback "Checking that repository format is FSFS."
- test "`cat "$BACKUPDIR/db/fs-type"`" == fsfs
- feedback "Changing to database directory $BACKUPDIR/db."
- cd "$BACKUPDIR/db"
- feedback "Getting local current revision number."
- LOCALREVNUM="`cat current | sed 's/ .*//'`"
- feedback "Checking that current.new doesn't exist."
- if test -f current.new; then
- feedback
- echo "Make sure that no other instance of this script"
- echo "is running and delete the following file:"
- echo "$BACKUPDIR/db/current.new"
- exit 2
- fi
- feedback "Getting remote 'current' file."
- ssh "$HOST" "cat '$REMOTEDIR/db/current'" > current.new
- feedback "Getting remote current revision number."
- REMOTEREVNUM="`cat current.new | sed 's/ .*//'`"
- feedback "Checking that we got a response from the server."
- test -n "$REMOTEREVNUM"
- if ! test "$LOCALREVNUM" -le "$REMOTEREVNUM"; then
- feedback
- echo "ERROR: Local revision number ($LOCALREVNUM) greater"
- echo " than remote revision number ($REMOTEREVNUM)."
- echo "Wrong backup directory or changed repository?"
- exit 2
- fi
- if test "$LOCALREVNUM" -eq "$REMOTEREVNUM"; then
- feedback "No backup needed; at revision $LOCALREVNUM."
- feedback "Removing 'current.new'."
- rm current.new
- feedback "Done."
- return
- fi
- LOCALREVNUM="$[$LOCALREVNUM+1]"
- feedback "Backing up from revision $LOCALREVNUM to revision $REMOTEREVNUM."
- test "$printfeedback" && verbose=-v || verbose=
- ssh "$HOST" "
- set -e;
- cd $REMOTEDIR/db/;
- nice -n 10 tar cf - \`seq -f revs/%g $LOCALREVNUM $REMOTEREVNUM\` \`seq -f revprops/%g $LOCALREVNUM $REMOTEREVNUM\` | nice -n 10 bzip2 -c" \
- | tar $verbose -xjf -
- feedback "Renaming 'current.new' to 'current'."
- mv current.new current
- feedback "Done."
-}
-
-feedback 'Reading ~/.fsfsbackup.'
-source ~/.fsfsbackup
-feedback 'Finished.'
-trap - 0 1 2 3 15
diff --git a/sandbox/fwiemann/plugins/interface.py b/sandbox/fwiemann/plugins/interface.py
deleted file mode 100644
index 17e5d0a71..000000000
--- a/sandbox/fwiemann/plugins/interface.py
+++ /dev/null
@@ -1,256 +0,0 @@
-"""
-Designing the urgently-needed plugin support...
-
-This module doesn't work, it's just there for showing the design, from
-a plugin's point of view. (Kind of test-first. The required
-interfaces will be implemented in Docutils later.)
-
-Let's implement an extension for rendering keys:
-
-reST source:
- :key:`Ctrl+C`
-Node tree:
- <KeyNode>
- Ctrl
- +
- <KeyNode>
- C
-HTML rendering:
- <html><body><span style="border: 1px solid black;">Ctrl</span>+<span style="border: 1px solid black;">C</span></body></html>
-
-That isn't a particularly challenging task, but it's probably best to
-stick to something simple first. (Later we could try to make a plugin
-out of a math patch, but that will to require more code.)
-
-Things not (yet) covered here:
-
-* Adding a Component (this may require a generic frontend).
-* Adding a directive (will require more complicated code than for
- roles, because of arguments and options).
-* Extending the parser by modifying a parser instance. (Do we *want*
- to support that? It's powerful, but a little bit hackish.)
-* Adding a transform. (Do we need that?)
-* Writing a test case for an extension.
-"""
-
-
-class KeyNode(nodes.Inline, nodes.TextElement):
-
- """
- This is the node which stores the key texts (like "Ctrl" or "C").
- """
-
- def __init__(self, key):
- self += nodes.Text(key, key)
-
-
-def html_visit_keynode(visitor, node):
- """
- This is a visit_ method which looks like any normal Visitor
- method.
-
- It is referenced from the writer support class below.
- """
- if visitor.settings['key_html_tt']:
- # Now insert a string into the writer's data stream. There is
- # visitor.body.append(...) for the HTML visitor, but why not
- # just return the string? That's much easier. The visitor
- # should know where to put it.
- return visitor.starttag('tt',
- style='border: 1px solid black',
- CLASS='key')
- else:
- return visitor.starttag('span',
- style='border: 1px solid black',
- CLASS='key')
-
-def html_depart_keynode(visitor, node):
- """
- Now this is the depart method.
- """
- if visitor.settings['key_html_tt']:
- return '</tt>'
- else:
- return '</span>'
-
-
-class KeyNodeHTMLSupport(docutils.WriterExtension):
-
- """
- This class describes HTML writer handling for the KeyNode, i.e. it
- provides visit_ and depart_ methods. (By the way, is there any
- term for visit_/depart_ methods?)
- """
-
- extends = 'html4css1'
- """The writer this extension extends."""
-
- handlers = {'KeyNode': (html_visit_keynode, html_depart_keynode)}
- """
- Dictionary mapping node names to pairs of visit and departure
- functions.
- """
-
- name = 'DefaultKeyHTMLSupport'
- """
- Name of this extension.
-
- This is needed when there are several extensions proving support
- for the same node, because in this case the user would have to
- specify the name of the preferred extension (probably using an
- option).
-
- For convenience, maybe we shouldn't require setting a name
- attribute and have a default name of 'default' (or
- self.__class__?).
- """
-
- settings_spec = (('Render key buttons in <tt> tags in HTML.',
- ['--key-html-tt'],
- {'default': 0, 'action': 'store_true'}),
- ('Render key buttons in <span> tags in HTML.',
- ['--key-html-span'],
- {'dest': 'key_html_tt', 'action': 'store_false'},))
- """
- Sequence of settings.
- """
-
-
-class KeyNodeLaTeXSupport(docutils.WriterExtension):
-
- """Support for the LaTeX writer. See KeyNodeHTMLSupport."""
-
- extends = 'latex2e'
-
- handlers = {'KeyNode': ('\\fbox{', '}')}
- """
- Here we have strings instead of functions. They are simply
- inserted into the data stream; the visitor should know how to do
- this.
-
- This is shorter and simpler than using lambdas, e.g. ``(lambda:
- '\\fbox{', lambda: '}')``.
- """
-
- name = 'DefaultKeyLaTeXSupport'
-
-
-class KeyRole(docutils.ParserExtension):
-
- """
- This is the role implementation for the reST parser.
-
- It is only registered at the parser if the parser requests it.
-
- The reST parser, for example, issues a request when it encounters
- ".. require:: something". The request procedure might look like
- this:
-
- Let's say the reST parser encounters a ".. require:: key". Then
- it calls docutils.register_extension_by_id(self, 'key'). The
- register function determines that the first parameter (self) is a
- component instance of type Parser (so it only considers
- ParserExtensions) and that its name is 'restructuredtext' (so it
- only considers extensions whose `extends` attribute is
- 'restructuredtext').
-
- For all matching extensions, the register function then looks at
- the `id` attribute. If the second parameter ('key' in this
- example) matches `id`, the extension is registered at the
- component instance passed as first parameter.
- """
-
- extends = 'restructuredtext'
- """The component this extension extends."""
-
- id = 'key'
- """
- The id under which this extension is known.
-
- In this case, it's used for ".. require:: key" in reST.
-
- The presence of an `id` attribute means that the extension isn't
- loaded automatically but only on request. (Is that too much
- magic?)
- """
-
- type = 'role'
- """
- The type of this extension.
-
- Might also be 'directive', for example. This attribute is read by
- the reST parser.
- """
-
- # The rest of this class definition is specific to reST roles:
-
- role_name = 'key'
- """
- Name of this role.
-
- This means we can write :key:`Ctrl+C`.
-
- There is no i18n support yet, because using a dictionary like
- {'en': 'key'} seems a little bit too complex (since translations
- usually aren't necessary) and the current i18n system needs a
- redesign anyway.
- """
-
- raw = 1
- """
- If we pass pre-parsed contents to the role as proposed in
- <http://article.gmane.org/gmane.text.docutils.user/1727>, we need
- this ``raw`` attribute for the following purpose:
-
- The run() method wants to get a raw string, so we set raw to 1.
- (Backslashes aren't interpreted then, but that isn't important in
- the case of our key role.)
-
- If ``raw`` were 0, the run() method would get a list with one
- Text node. Backslashes would be interpreted, and if there
- were nested-inline-markup support, the list might contain any
- Inline elements.
-
- If the role handler processes the role contents itself as proposed
- in <http://article.gmane.org/gmane.text.docutils.user/1729>, we
- don't need the ``raw`` attribute.
- """
-
- def run(self, contents):
- """
- For the source text ":key:`Ctrl+C`", this method is called as
- keyrole_instance.run('Ctrl+C').
-
- lineno, inliner etc. aren't passed as parameters but they can
- be grabbed from instance variables if needed (like
- self.lineno). This avoids long useless copy'n'paste parameter
- lists.
-
- Return value is a tuple of a node list and a system-message
- list.
- """
-
- if (not contents or
- contents.startswith('+') or contents.endswith('+')
- or ' ' in contents):
- # Not a valid key combination.
- # Now we want to throw an error, but that isn't easy.
- # Theoretically, we could do:
- #msg = self.inliner.reporter.error(
- # 'Invalid key string: %s' % contents, lineno=self.lineno)
- #prb = self.inliner.problematic(contents, contents, msg)
- #return [prb], [msg]
- # But this causes a lot of redundancy, given that it's
- # such a common case. It would be better to have a
- # shortcut like this instead:
- raise self.parser.RoleError('Invalid key string')
- # which does the same as the three lines above.
-
- # Now comes our highly sophisticated key combination parsing
- # algorithm.
- keys = contents.split('+')
- nodes = [KeyNode(keys[0])]
- for i in keys[1:]:
- nodes.append(nodes.Text('+'))
- nodes.append(KeyNode(i))
- return [nodes], []
diff --git a/sandbox/fwiemann/release.sh b/sandbox/fwiemann/release.sh
deleted file mode 100755
index f24cbd5bd..000000000
--- a/sandbox/fwiemann/release.sh
+++ /dev/null
@@ -1,490 +0,0 @@
-#!/bin/bash
-
-# Author: Felix Wiemann
-# Contact: Felix_Wiemann@ososo.de
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This script has been placed in the public domain.
-
-set -e
-
-function print_command()
-{
- # Print "$@", quoting parameters containing spaces.
- echo -n $
- for param in "$@"; do
- echo "$param" | grep -Fq ' ' && echo -n " '$param'" || echo -n " $param"
- done
-}
-
-function run()
-{
- # Print and run "$@".
- print_command "$@"
- echo
- "$@"
-}
-
-function confirm()
-{
- # Print, let the user confirm and run "$@".
- echo 'Press enter to run (or enter anything to skip):'
- print_command "$@"
- read
- test "$REPLY" && echo Skipped. || "$@"
-}
-
-function svn_up()
-{
- if test $svn == svk; then
- confirm svk sync "$depot"
- fi
- confirm $svn up
-}
-
-function checkin()
-{
- # Parameters: log_message, file, file, file ...
- log_message="$1"
- shift
- confirm $svn diff "$@"
- confirm $svn ci -m "$log_prefix $log_message" "$@"
-}
-
-function set_ver()
-{
- # Parameters: old_version new_version
- shopt -s extglob
- echo Determining list of files to be changed...
- files="docutils/__init__.py setup.py `$svn ls test/functional/expected/ | sed 's|^|test/functional/expected/|'`"
- echo "Now I'll change the version number to $2 in the following files:"
- echo $files
- echo
- echo 'Press enter to proceed (or enter anything to skip)...'
- read
- if [ ! "$REPLY" ]; then
- echo 'Modifying files with ed...'
- old_ver_regex="`echo "$1" | sed 's/\./\\\\./g'`"
- # "ed" returns an error code if there has been no substitution, so
- # we temporarily deactivate exit-on-error.
- set +e
- for F in $files; do
- (echo ",s/$old_ver_regex/$2/g"; echo 'wq') | ed "$F"
- done
- set -e
- fi
- echo
- checkin "set version number to $2" $files
-}
-
-function usage()
-{
- echo 'Usage:'
- echo
- echo ' release.sh new_version svn_version[:branch_version] [stage]'
- echo
- echo 'The following things will be done:'
- echo
- echo '* Change version number to new_version. (stage 1)'
- echo '* SVN-export, test, and release Docutils version new_version. (stage 2)'
- echo '* Change version number to svn_version. (stage 3)'
- echo
- echo 'If stage is supplied (1, 2 or 3), only the specified stage will'
- echo 'be executed. Otherwise, it defaults to executing all stages.'
- echo
- echo 'Before doing dangerous things, you will be asked to press enter.'
- echo
- echo 'A maintenance branch called docutils-new_version will be created'
- echo 'if branch_version is given. The version number inside the'
- echo 'maintenance branch will be set to branch_version.'
- exit 1
-}
-
-function initialize()
-{
- if [ "$#" -lt 2 ]; then
- usage
- fi
- echo 'Initializing...'
- python_versions='2.1 2.2 2.3 2.4'
- for py_ver in $python_versions; do
- echo -n "Checking for Python $py_ver (python$py_ver)... "
- if ! echo 'print "OK"' | python$py_ver; then
- echo "Python $py_ver (python$py_ver) not found."
- echo Aborting.
- exit 1
- fi
- done
- echo -n 'Clearing $PYTHONPATH... '
- export PYTHONPATH=
- echo 'done'
- echo -n 'Checking whether we are in a working copy... '
- if [ -f HISTORY.txt ]; then
- echo yes
- else
- echo "no (HISTORY.txt doesn't exist)"
- echo 'Aborting.'
- echo 'Please cd to a working copy before running this script.'
- exit 1
- fi
- echo -n 'Subversion binary to use: '
- if [ -d .svn ]; then
- svn=svn
- else
- svn=svk
- fi
- echo $svn
- working_copy="`pwd -P`"
- echo "Working copy: $working_copy"
- if test $svn = svk; then
- depot_path="`svk info . | grep ^Depot\ Path: | sed 's/Depot Path: //'`"
- depot="`echo "$depot_path" | sed 's|\(//[^/]\+/[^/]\+\).*|\1|'`"
- echo "SVK depot: $depot"
- mirrored_from="`svk info . | grep ^Mirrored\ From: | sed 's/Mirrored From: //;s/, Rev\. .*//'`"
- svnurl="$mirrored_from`echo "$depot_path" | sed 's|//[^/]\+/[^/]\+||'`"
- else
- svnurl="`$svn info . | grep ^URL: | sed 's/URL: //'`"
- fi
- if test -z "$svnurl"; then
- echo 'Unable to detect Subversion URL. Aborting.'
- exit 1
- fi
- echo "Subversion URL: $svnurl"
- if ! echo "$svnurl" | grep -q 'branches\|trunk'; then
- echo 'Subversion URL contains neither "branches" nor "trunk".'
- echo 'Aborting.'
- exit 1
- fi
- svnroot="`echo "$svnurl" | sed 's/\/\(branches\|trunk\).*//'`"
- echo "Subversion root URL: $svnroot"
- if test "$svnurl" = "$svnroot"; then
- echo 'Error: Subversion URL and Subversion root URL are the same.'
- exit 1
- fi
- echo -n 'Detecting current Docutils version... '
- old_ver="`python -c 'import docutils; print docutils.__version__'`"
- echo "$old_ver"
- new_ver="$1"
- # log_prefix is for SVN logs.
- log_prefix="Release $new_ver:"
- echo "New version number (for releasing): $new_ver"
- svn_ver="$2"
- if echo "$svn_ver" | grep -q :; then
- # Split at colon: svn_ver:branch_ver
- branch_ver="${svn_ver#*:}"
- svn_ver="${svn_ver%:*}"
- else
- branch_ver=
- fi
- echo "New Subversion version number (after releasing): $svn_ver"
- echo -n 'Create maintenance branch: '
- if test "$branch_ver"; then
- echo yes
- echo "New version number on maintenance branch: $branch_ver"
- else
- echo no
- fi
- if test "$branch_ver"; then
- echo -n 'Checking that we have a full checkout... '
- if echo "$working_copy" | grep -q 'branches\|trunk'; then
- echo OK
- else
- echo 'no'
- echo 'Working copy path contains neither "branches" nor "trunk".'
- echo 'You need a full checkout in order to branch.'
- echo 'Aborting.'
- exit 1
- fi
- wcroot="`echo "$working_copy" | sed 's/\/\(branches\|trunk\).*//'`"
- echo "Working copy root: $wcroot"
- fi
- tarball=docutils-"$new_ver".tar.gz
- echo "Tarball name: $tarball"
- echo 'Initialization completed.'
- echo
-}
-
-function test_tarball()
-{
- # Assume we have the tarball in the current directory.
- # Pass test number as first parameter.
- echo 'Testing the release tarball.'
- run mkdir tarball_test/
- run cd tarball_test/
- confirm tar xzvf "../$tarball"
- echo
- run cd docutils-"$new_ver"
- echo 'Installing the distribution.'
- # Extra files, with leading comma.
- extras="`cd extras; for extrafile in *.py; do echo -n ",$extrafile{,c,o}"; done`"
- confirm su -c '
- for py_ver in '"$python_versions"'; do
- echo "Deleting and installing Docutils and its test suite on Python $py_ver."
- echo "Press enter."
- read
- site_packages="/usr/local/lib/python$py_ver/site-packages"
- if test ! -d "$site_packages"; then
- site_packages="/usr/lib/python$py_ver/site-packages"
- fi
- if test ! -d "$site_packages"; then
- echo "Error: \"$site_packages\" does not exist."
- exit 1
- fi
- if -e "$site_packages/test"; then
- echo "Error: \"$site_packages/test\" exists."
- exit 1
- fi
- rm -rfv /usr/{local,}lib/python$py_ver/site-packages/{docutils'"$extras"'}
- python$py_ver setup.py install
- echo
- cp -rv test "$site_packages/"
- echo "Press enter to continue."
- read
- done'
- echo 'Running the test suite with all Python versions.'
- echo 'Press enter (or enter anything to skip):'
- read
- if [ ! "$REPLY" ]; then
- for py_ver in $python_versions; do
- site_packages="/usr/local/lib/python$py_ver/site-packages"
- if test ! -d "$site_packages"; then
- site_packages="/usr/lib/python$py_ver/site-packages"
- fi
- if test ! -d "$site_packages"; then
- echo "Error: \"$site_packages\" does not exist."
- exit 1
- fi
- run python$py_ver -u "$site_packages/test/alltests.py"
- run find -name \*.pyc -exec rm {} \;
- done
- fi
- run cd ..
- echo "Cleaning up..."
- run rm -rf tarball_test
- confirm su -c '
- for py_ver in '"$python_versions"'; do
- rm -rfv /usr{/local,}/lib/python$py_ver/site-packages/test
- done'
- echo
-}
-
-function upload_tarball()
-{
- # Assume we have the tarball in the working area.
- run cd "$working_area"
- # You may need to adjust the command line for clients other than tnftp.
- (echo 'bin'; echo 'cd /incoming'; echo "put $tarball") | \
- ftp ftp://anonymous:none@upload.sourceforge.net/
- echo 'Upload completed.'
-}
-
-function upload_htdocs()
-{
- # Assume we have the tarball in the working area.
- run cd "$working_area"
- echo "Upload htdocs for $new_ver"
- run mkdir htdocs
- run cd htdocs
- confirm tar xzvf "../$tarball"
- run cd docutils-"$new_ver"/tools/
- confirm ./buildhtml.py ..
- run cd ..
- echo '$ find -name test -type d -prune -o -name \*.css -print0 \
- -o -name \*.html -print0 -o -name \*.txt -print0 \
- | tar -cjvf docutils-docs.tar.bz2 -T - --null'
- find -name test -type d -prune -o -name \*.css -print0 \
- -o -name \*.html -print0 -o -name \*.txt -print0 \
- | tar -cjvf docutils-docs.tar.bz2 -T - --null
- echo 'Upload the tarball to your home directory on SF.net...'
- confirm scp docutils-docs.tar.bz2 shell.sourceforge.net:
- echo
- echo 'Unpack the tarball on SF.net...'
- echo 'Press enter (or enter anything to skip).'
- read
- if [ ! "$REPLY" ]; then
- ssh shell.sourceforge.net<<-EOF
- set -x
- umask 002
- cd /home/groups/d/do/docutils/htdocs/
- mkdir -m g+rwxs $new_ver
- cd $new_ver
- tar -xjvf ~/docutils-docs.tar.bz2
- rm ~/docutils-docs.tar.bz2
-EOF
- fi
-}
-
-function create_maintenance_branch()
-{
- echo 'Creating maintenance branch.'
- branch_name="docutils-$new_ver"
- echo "Branch name: $branch_name"
- branch_url="$svnroot/branches/$branch_name"
- echo "Branch URL: $branch_url"
- confirm svn cp "$svnurl" "$branch_url" -m \
- "$log_prefix creating maintenance branch for version $new_ver"
- cd "$wcroot"
- svn_up
- cd branches/"$branch_name"
- set_ver "$new_ver" "$branch_ver"
-}
-
-function run_stage()
-{
- if [ ! "$1" ]; then
- run_stage 1
- echo
- run_stage 2
- echo
- run_stage 3
- else
- echo "Press enter to run stage $1 (or enter anything to skip this stage)."
- read
- if [ ! "$REPLY" ]; then
- cd "$working_copy"
- if [ "$1" == 1 ]; then
- stage_1
- elif [ "$1" == 2 ]; then
- stage_2
- elif [ "$1" == 3 ]; then
- stage_3
- else
- echo 'Invalid stage.'
- echo
- usage
- fi
- echo
- echo "Stage $1 completed."
- else
- echo "Skipped stage $1."
- fi
- fi
-}
-
-function stage_1()
-{
- svn_up
- echo
- # update __version_details__ string
- (echo ",s/^__version_details__ = .*\$/__version_details__ = 'release'/";
- echo wq) | ed docutils/__init__.py 2> /dev/null
- set_ver "$old_ver" "$new_ver"
- echo
- history_files='HISTORY.txt RELEASE-NOTES.txt'
- echo "Now updating the following files: $history_files"
- old_string="Changes Since [0-9.]+"
- new_string="Release $new_ver (`date --utc --iso-8601`)"
- echo 'Press enter to replace "'"$old_string"'" with "'"$new_string"\",
- echo 'or enter anything to skip.'
- read
- test "$REPLY" || python -c "for filename in '$history_files'.split():
- import re
- h = file(filename).read()
- h = re.sub('$old_string\\n=+', '$new_string\\n' + '=' * len('$new_string'), h, count=1)
- file(filename, 'w').write(h)"
- checkin 'closed "Changes Since ..." section' $history_files
-}
-
-function stage_2()
-{
- echo 'Creating working area...'
- working_area="`echo ~/tmp/docutils-release.$$`"
- run mkdir -p "$working_area"
- echo
- echo 'Getting a fresh export.'
- echo 'Press enter to proceed (or enter anything to skip)...'
- read
- if [ ! "$REPLY" ]; then
- run cd "$working_area"
- confirm svn export "$svnurl"
- echo
- echo 'Building the release tarball.'
- run cd docutils
- confirm ./setup.py sdist
- run cd ..
- echo 'Tarball built.'
- run cp docutils/dist/"$tarball" .
- confirm test_tarball
- echo "Testing documentation and uploading htdocs of version $new_ver..."
- confirm upload_htdocs
- echo "Tagging current revision..."
- confirm $svn cp "${svnurl%/trunk*}/trunk/" "${svnurl%/trunk*}/tags/docutils-$new_ver/" -m "$log_prefix tagging released revision"
- echo "Uploading $tarball to SF.net."
- confirm upload_tarball
- echo 'Now go to https://sourceforge.net/project/admin/editpackages.php?group_id=38414'
- echo 'and follow the instructions at'
- echo 'http://docutils.sf.net/docs/dev/release.html#file-release-system'
- echo
- echo 'Then press enter.'
- read
- fi
- run cd $working_area
- echo 'Downloading the tarball to verify its integrity.'
- while true; do
- confirm wget http://osdn.dl.sourceforge.net/sourceforge/docutils/"$tarball"
- echo 'Was the download successful?'
- echo 'If yes, press enter to continue, otherwise enter anything to repeat'
- echo '(it is possible that the file will show up in a few minutes).'
- read
- test "$REPLY" || break
- done
- confirm test_tarball
- echo 'Registering at PyPI...'
- echo 'Press enter to proceed (or enter anything to skip)...'
- read
- if [ ! "$REPLY" ]; then
- echo "Unpacking tarball..."
- ls -l
- pwd
- run tar xzvf "$tarball"
- run cd docutils-"$new_ver"
- confirm ./setup.py register
- fi
-}
-
-function stage_3()
-{
- svn_up
- echo
- # update __version_details__ string
- (echo ",s/^__version_details__ = .*\$/__version_details__ = 'repository'/";
- echo wq) | ed docutils/__init__.py 2> /dev/null
- checkin 'set __version_details__ to "repository"'
- echo
- history_files='HISTORY.txt RELEASE-NOTES.txt'
- echo "Now updating the following files: $history_files"
- add_string="Changes Since $new_ver"
- before="Release "
- echo 'Press enter to add "'"$add_string"'" section,'
- echo 'or enter anything to skip.'
- read
- test "$REPLY" || python -c "for filename in '$history_files'.split():
- import re
- h = file(filename).read()
- h = re.sub('$before', '$add_string\\n' + '=' * len('$add_string') +
- '\\n\\n\\n$before', h, count=1)
- file(filename, 'w').write(h)"
- checkin "added empty \"Changes Since $new_ver\" section" $history_files
- echo
- if test "$branch_ver"; then
- create_maintenance_branch
- cd "$working_copy"
- fi
- set_ver "$new_ver" "$svn_ver"
- echo
- echo 'Please update the web page now (web/index.txt).'
- echo "Press enter when you're done."
- read
- echo 'Running docutils-update on the server...'
- echo 'This may take some time.'
- confirm ssh shell.berlios.de docutils-update
-}
-
-initialize "$@"
-run_stage "$3"
-echo
-echo 'Finished.'
-
-# Local Variables:
-# indent-tabs-mode: nil
-# End:
diff --git a/sandbox/fwiemann/users.txt b/sandbox/fwiemann/users.txt
deleted file mode 100644
index d6daa8b13..000000000
--- a/sandbox/fwiemann/users.txt
+++ /dev/null
@@ -1,70 +0,0 @@
-# User names merged from SourceForge and BerliOS as of
-# $Date$.
-aahz
-agurtovoy
-aisaac0
-ajung
-akuchling
-ax-
-axk
-bbum
-bjoernp
-blais
-cben
-chodorowski
-cliechti
-daddygravity
-david_abrahams
-david_ascher
-dkuhlman
-docutilsupdate
-dreamcatcher
-ebellot
-edloper
-fdrake
-felixwiemann
-fermigier
-fffish
-goodger
-grubert
-gschwant
-gtk
-holdenweb
-i_am_the_user
-ianbicking
-injektilo
-jaffray
-jensj
-jfmeinel
-jhsh2
-ksato
-kvaml
-lalo
-lcreighton
-lele
-mezis
-mly
-mmgilbe
-mnodine
-mwh
-orutherfurd
-pefu
-pobrien
-reggie
-richard
-richieadler
-rnd0110
-sconce
-sdeibel
-sfcben
-smerten
-smurf
-sunib
-syt
-tav
-tibs
-tracyshaun
-ueli
-wilk
-yole
-zemiak
diff --git a/sandbox/fwiemann/xhtml2rest/README.txt b/sandbox/fwiemann/xhtml2rest/README.txt
deleted file mode 100644
index a5f66a89c..000000000
--- a/sandbox/fwiemann/xhtml2rest/README.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-This is xhtml2rest.
-
-It's a stop-gap solution for converting XHTML documents to
-reStructuredText.
-
-Please find the documentation inline at the beginning of the source
-file.
-
-The author is Antonios Christofides. It's in my (Felix Wiemann's)
-sandbox because he asked me to take care of it. So please direct any
-patches to Felix.Wiemann@ososo.de.
-
-Have fun!
-
-Felix Wiemann <Felix.Wiemann@ososo.de>
diff --git a/sandbox/fwiemann/xhtml2rest/xhtml2rest.py b/sandbox/fwiemann/xhtml2rest/xhtml2rest.py
deleted file mode 100755
index 8c6b366db..000000000
--- a/sandbox/fwiemann/xhtml2rest/xhtml2rest.py
+++ /dev/null
@@ -1,551 +0,0 @@
-#!/usr/bin/python
-"""
-NAME
-====
-
-xhtml2rest - Convert xhtml to reStructuredText
-
-SYNOPSIS
-========
-
-xhtml2rest *xhtmlfile* > *restfile*
-
-DESCRIPTION
-===========
-
-``xhtml2rest``, which, far from being a decent and complete program, is
-only something to begin with, hopefully processes the given UTF-8
-xhtml file and produces reStructuredText "source code" in the standard
-output. If your input is html and/or not in UTF-8, you can convert it
-to UTF-8 xhtml using ``iconv`` and ``tidy``:
-
- iconv -f *source_encoding* -t utf-8 *source_html* > *html_utf8*
-
- tidy -utf8 -asxml -o *xhtmlfile* *html_utf8*
-
- xhtml2rest *xhtmlfile* > *restfile*
-
-Interestingly, since reStructuredText is not simple markup, but has
-very strict rules with the intention that the source is perfectly
-readable, it turns out that converting html to reStructuredText is
-actually *rendering*. ``xhtml2rest`` is a small rendering engine. Since
-I had no time to study how existing rendering engines work, I had to
-reinvent the wheel. So although the code is clean (I actually wrote it
-twice), I doubt that the core logic is adequate for future extensions.
-But it's better than nothing. There is some documentation in the code,
-but feel free to email me if you need more explanations.
-
-LIMITATIONS
-===========
-
-I created ``xhtml2rest`` for a very specific job. It does that job
-correctly, but for your web page it might not work. It should not be
-very hard, however, either to improve the code, or to determine what
-it is in your web page that confuses ``xhtml2rest`` and remove it.
-
-Other than that, there are the following limitations:
-
-* No indented tables
-
-* No multi-col or -row spans in tables
-
-* No support for \<br>
-
-* Not tested in nested tables (check http://www.w3m.org/story.html)
-
-* \<th> support is quick and dirty
-
-* If the same anchor text is met twice, the anchor is ignored
-
-* No indented \<pre> elements (but I'm not sure the HTML standard
- allows them)
-
-* Images are ignored
-
-* The word HARDWIRED in the code indicates a hardwired hack which is
- specific to the job I wanted ``xhtml2rest`` to do.
-
-META
-====
-
-``xhtml2rest`` was created by Antonios Christofides,
-anthony@itia.ntua.gr, May-June 2005.
-
-Revision: $Revision$
-
-The code and this text is hereby placed in the public domain.
-"""
-
-import xml.dom.minidom
-import re
-import sys
-import textwrap
-import math
-import UserList
-import warnings
-import codecs
-
-###############################################################################
-# Global variables. I know. I'm terribly sorry. Please get rid of them.
-
-# 'unindent' is used by list items. A li list item is always indented, but its
-# first line is "unindented" and contains the number or bullet. However, it was
-# difficult for the li node to tell its #text contents (which may be deeply
-# nested) to use that. So it just places the number or bullet, which must be 4
-# characters, like " 1. ", in "unindent". The first text to be rendered uses
-# the unindent and then sets it to empty again.
-
-unindent = ''
-hyperlinks = {} # text-target pairs found in "a href" elements
-###############################################################################
-
-class Ditem:
- """A document item; usually a node, but can be a block of text
- resulting from processing adjacent inline items. If it is a node,
- it is usually the BlockDitem subclass; if it is text, it is
- normally a plain Ditem."""
- def __init__(self, text):
- self.text = text # Contained text (empty for BlockDitem)
- self.type = '' # tag for block node, empty for inline
- self.indentlevel = 0 # 0 - unindented; 1 - indented; etc.
- def __repr__(self):
- return self.__class__.__name__+'("""'+self.text+'""")'
- def propagate_indents(self):
- "Propagates indent level recursively to children"
- pass
- def maxwidth(self):
- "Width it will occupy if allowed to render on infinite width"
- self.remove_white_space()
- return len(self.text) + 4*self.indentlevel
- def minwidth(self):
- "Width it will occupy if wrapped as much as possible"
- wordlens = [len(x) for x in self.text.split()]
- if wordlens: return max(wordlens) + 4*self.indentlevel
- else: return 0
- def format(self, width):
- """Returns contents formatted so as not to exceed specified
- width, if possible"""
- global unindent
- if(self.type=='pre'): raise Exception, "What are we doing here?"
- self.remove_white_space()
- # Quick hack to fix a problem. Do we begin with '* '?
- while len(self.text)>=2 and self.text[1]==' ' and self.text[0] in '*-':
- # It may be mistaken for a bullet list. Strip it.
- self.text = self.text[2:]
- if width < self.minwidth(): width = self.minwidth()
- # The textwrap module has the nasty habit of breaking at hyphens. So
- # we'll do a nasty hack: find a character that does not exist in the
- # text, replace all hyphens with that character, ok, you get the point.
- hyphensurrogate = ''
- for c in '!@#$%^&*~':
- if self.text.find(c)<0:
- hyphensurrogate = c
- break
- if not hyphensurrogate: raise Exception, "Houston we have a problem"
- text = self.text.replace('-', hyphensurrogate)
- wrapper = textwrap.TextWrapper(
- initial_indent=((4*self.indentlevel)-len(unindent))*' '+unindent,
- subsequent_indent=4*self.indentlevel*' ',
- width=width, break_long_words = False)
- unindent = ''
- text = wrapper.fill(text)
- text = text.replace(hyphensurrogate, '-')
- return text
- def empty(self):
- "Returns true if contains nothing"
- return not self.text
- def remove_white_space(self):
- "Removes extra white space"
- self.text = re.sub('\s+', ' ', self.text).strip()
- def canmerge(self):
- "Tells whether it's possible to merge this Ditem with adjacent ones"
- return True
- def merge(self, aditem):
- """If possible, merges aditem, which should be an adjacent Ditem that
- comes after this one."""
- if not self.canmerge() or not aditem.canmerge(): return False
- if len(self.text)>0 and self.text[-1] == '_' and len(aditem.text)>0 \
- and aditem.text[0] not in """ \n\t:.,!=/|;"'?<>[]{}()""":
- # Leave space after link if not followed by punctuation
- self.text = self.text + ' ' + aditem.text
- else:
- self.text = self.text + aditem.text
- return True
-
-class BlockDitem(Ditem):
- "A Ditem which contains other Ditems"
- def __init__(self, type):
- Ditem.__init__(self, '')
- self.type = type
- self.children = [] # Contained Ditems
- def __repr__(self):
- return self.__class__.__name__+'("'+self.type+'"); children = '+repr(self.children)
- def maxwidth(self):
- childmaxwidths = [x.maxwidth() for x in self.children]
- return childmaxwidths and max(childmaxwidths) or 0
- def minwidth(self):
- childminwidths = [x.minwidth() for x in self.children]
- return childminwidths and max(childminwidths) or 0
- def propagate_indents(self):
- for x in self.children:
- x.indentlevel = self.indentlevel
- x.propagate_indents()
- def format(self, width):
- if width < self.minwidth(): width = self.minwidth()
- results = [x.format(width) for x in self.children]
- results = [x for x in results if x]
- return "\n\n".join(results)
- def empty(self):
- return not (self.children)
- def canmerge(self):
- return False
-
-class PreDitem(Ditem):
- "A Ditem representing a literal block"
- def maxwidth(self):
- return max([len(x) for x in self.text.split('\n')])
- def minwidth(self):
- return self.maxwidth() # Literal block; width's given
- def remove_white_space(self):
- pass
- def format(self, width):
- result = '::\n\n'
- for x in self.text.split('\n'):
- result = result + ' ' + x + '\n'
- result = result + '..\n\n'
- return result
- def canmerge(self):
- return False
-
-class HeadingDitem(BlockDitem):
- "A Ditem representing an h1, h2, ..., h9"
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- def minwidth(self):
- return self.maxwidth() # Headings don't wrap
- def format(self, width):
- assert(len(self.children)==1)
- text = self.children[0].format(32767)
- level = eval(self.type[1])
- underliner = "=-`'.~*+^"[level-1]
- return text + '\n' + len(text)*underliner
-
-class BlockQuoteDitem(BlockDitem):
- "A Ditem representing a blockquote"
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- def propagate_indents(self):
- self.indentlevel = self.indentlevel + 1
- BlockDitem.propagate_indents(self)
-
-class ListDitem(BlockDitem):
- "A Ditem representing an ol, ul, or dl"
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- def format(self, width):
- # First pass the list type and order to the children
- order = 1
- for x in self.children:
- if isinstance(x, ListItemDitem):
- x.listtype = self.type
- x.order = order
- order = order+1
- # And then process normally
- return BlockDitem.format(self, width)
-
-class ListItemDitem(BlockDitem):
- "A Ditem representing a li, dt, or dd"
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- self.listtype = None
- self.order = 0
- def minwidth(self):
- if self.type == 'dt': return self.maxwidth() # Don't wrap dt
- else: return BlockDitem.minwidth(self)
- def propagate_indents(self):
- if self.type in ('li', 'ol', 'dd'):
- self.indentlevel = self.indentlevel + 1
- BlockDitem.propagate_indents(self)
- def format(self, width):
- global unindent
- if self.type == 'li' and self.listtype == 'ol':
- unindent = ('%d. ' % (self.order)).ljust(4)
- elif self.type == 'li' and self.listtype == 'ul':
- unindent = '* '
- return BlockDitem.format(self, width)
-
-class RenderedColumn:
- "Width information about a column being rendered"
- def __init__(self, minwidth, maxwidth):
- self.minwidth = minwidth
- self.maxwidth = maxwidth
- self.curwidth = maxwidth
- self.fixedwidth = 0
- def logwidth(self):
- if self.maxwidth==0: return 0
- else: return math.log(self.maxwidth)
- def update(self, minwidth, maxwidth):
- "Replaces minwidth/maxwidth if greater"
- self.minwidth = minwidth>self.minwidth and minwidth or self.minwidth
- self.maxwidth = maxwidth>self.maxwidth and maxwidth or self.maxwidth
- self.curwidth = self.maxwidth
-
-class RenderedColumns(UserList.UserList):
- "A list of RenderedColumn"
- def __init__(self, alist):
- self.data = alist
- def totalWidth(self):
- "Returns total table width"
- return reduce(lambda x,y: x+y, [z.curwidth for z in self.data]) \
- + len(self.data) + 1
- def sumLogWidth(self):
- "Returns sum of logwidth for nonfixed columns"
- return reduce(lambda x,y: x+y,
- [x.logwidth()*(1-x.fixedwidth) for x in self.data])
- def distributeWidthDifference(self, width):
- "Step 4 of w3m table rendering algorithm"
- # Note: The use of math.ceil below is because I'd rather have a
- # suboptimal width (a few characters less than requested width) rather
- # than go find what to do with rounding.
- w = self.totalWidth() - width
- assert(w>0)
- repeat_distribution = 1
- while repeat_distribution:
- repeat_distribution = 0
- for x in self.data:
- if x.fixedwidth: continue
- if x.curwidth - math.ceil(w*x.logwidth()/self.sumLogWidth()) < \
- x.minwidth:
- x.curwidth = x.minwidth
- x.fixedwidth = 1
- w = self.totalWidth() - width
- repeat_distribution=1
- break
- # Now that the we finished finding which columns need to be fixed to
- # their minimum width, perform the distribution once again, without
- # checking, and actually change remaining column widths
- for x in self.data:
- if x.fixedwidth: continue
- x.curwidth = x.curwidth - math.ceil(w*x.logwidth()/self.sumLogWidth())
-
-def tablehrule(colwidths, rule='-'):
- "Returns a horizontal table separator for given column widths"
- result = '+'
- for x in colwidths:
- result = result + rule * x + '+'
- return result
-
-class TableDitem(BlockDitem):
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- def format(self, width):
- # Uses table rendering algorithm of w3m
- # (http://www.w3m.org/story.html), but ignoring width attribute
- # Step 1
- columns = RenderedColumns([RenderedColumn(x.minwidth(),
- max(x.maxwidth(), 1) # A column can't be smaller than 1 character
- ) for x in self.children[0].children])
- for x in self.children:
- for i in range(len(columns)):
- if (len(x.children)<=i): continue # Skip empty columns
- columns[i].update(x.children[i].minwidth(), x.children[i].maxwidth())
- # Step 2 (width attribute) ignored
- # Step 3 (already done - list was created with maxwidth)
- # Step 4
- if columns.totalWidth() > width: columns.distributeWidthDifference(width)
- # OK, column widths are now calculated
- colwidths = [int(x.curwidth) for x in columns]
- result = tablehrule(colwidths) + '\n'
- usedheadbodysep = False
- for tr in self.children:
- result = result + tr.format(colwidths)
- rule = '-'
- if not usedheadbodysep and tr.children[0].type == 'th' \
- and tr!=self.children[-1]:
- rule = '='
- usedheadbodysep = True
- result = result + tablehrule(colwidths, rule) + '\n'
- return result
-
-class TrDitem(BlockDitem):
- def __init__(self, type):
- BlockDitem.__init__(self, type)
- def maxwidth(self):
- return reduce(lambda x,y: x+y,
- [x.maxwidth() for x in self.children]) + len(self.children) + 1
- def minwidth(self):
- return reduce(lambda x,y: x+y,
- [x.minwidth() for x in self.children]) + len(self.children) + 1
- def format(self, colwidths):
- columns = [] # List of lists of lines
- maxlinecount = 0 # Num of lines in vertically largest column
- for i in range(len(colwidths)):
- if len(self.children)<=i: lines = [ '' ]
- else: lines = self.children[i].format(colwidths[i]).split('\n')
- lines = [x + ' ' * (colwidths[i]-len(x)) for x in lines] # Pad to col len
- maxlinecount = max(maxlinecount, len(lines))
- columns.append(lines)
- # Pad vertically
- for i in range(len(columns)):
- for j in range(maxlinecount-len(columns[i])):
- columns[i].append(' ' * colwidths[i])
- result = ''
- # Add vertical separators
- for i in range(maxlinecount):
- result = result + '|'
- for j in range(len(columns)):
- result = result + columns[j][i] + '|'
- result = result + '\n'
- return result
-
-def handleNodeList(nodelist):
- "Processes given nodes; merges them if possible; returns ditem list"
- ditems = []
- curditem = Ditem('')
- for node in nodelist:
- aditem = handleNode(node)
- if curditem.merge(aditem): continue
- ditems.append(curditem)
- curditem = aditem
- if not curditem.empty(): ditems.append(curditem)
- return ditems
-
-def handleNode(node):
- if node.nodeType == node.TEXT_NODE:
- return handleText(node)
- elif node.nodeName=='a':
- return handleAnchor(node)
- elif re.match('h\d', node.nodeName):
- return handleHeading(node)
- elif node.nodeName=='div' and node.getAttribute('class')=='cit': # HARDWIRED
- return handleBlockQuote(node)
- elif node.nodeName in ('body', 'div', 'p', 'td', 'th'):
- return handleGenericBlock(node)
- elif node.nodeName in ('em', 'i'):
- return handleEmphasis(node)
- elif node.nodeName in ('strong', 'b'):
- return handleStrong(node)
- elif node.nodeName in ('ol', 'ul', 'dl'):
- return handleList(node)
- elif node.nodeName in ('li', 'dd', 'dt'):
- return handleListItem(node)
- elif node.nodeName in ('table'):
- return handleTable(node)
- elif node.nodeName in ('tr'):
- return handleTr(node)
- elif node.nodeName in ('pre'):
- return handlePre(node)
- elif node.hasChildNodes():
- contents = handleNodeList(node.childNodes)
- if len(contents) == 1: return contents[0]
- if len(contents) == 0: return Ditem('')
- result = BlockDitem(node.nodeName)
- result.children = contents
- return result
- return Ditem('')
-
-def processChildren(node):
- if node.hasChildNodes():
- return handleNodeList(node.childNodes)
- else:
- return ()
-
-def mergeChildren(node):
- contents = processChildren(node)
- if len(contents)>1: raise Exception('Unexpected block elements')
- if contents: return contents[0]
- else: return Ditem('')
-
-def handleText(node):
- return Ditem(node.data)
-
-def handleAnchor(node):
- result = mergeChildren(node)
- result.type = node.nodeName
- result.text = result.text.strip()
- if result.text == '': return result
- target = node.getAttribute('href').strip()
- if target=="" or target[0]=='#': return result # Ignore intrnl links
- result.text = re.sub('\s+', ' ', result.text)
- key = result.text.lower()
- if hyperlinks.has_key(key) and hyperlinks[key]!=target:
- # The following try-except is a quick hack to ensure that the
- # program will not stop because of problems in the warning
- # mechanism. One such specific problem is a UnicodeEncodeError
- # when result.text contains difficult characters.
- try:
- warnings.warn("Ignoring second appearance of anchor '" + result.text +
- "' with different target")
- except:
- pass
- return result
- hyperlinks[key] = target
- result.text = '`'+result.text+'`_'
- return result
-
-def handleHeading(node):
- contents = mergeChildren(node)
- if contents.empty(): return contents
- result = HeadingDitem(node.nodeName)
- result.children.append(contents)
- return result
-
-def handleEmphasis(node):
- result = mergeChildren(node)
- result.type = node.nodeName
- if result.text:
- result.text = '*' + result.text + '*'
- return result
-
-def handleStrong(node):
- result = mergeChildren(node)
- result.type = node.nodeName
- if result.text:
- result.text = '**' + result.text + '**'
- return result
-
-def handleGenericBlock(node):
- result = BlockDitem(node.nodeName)
- result.children = processChildren(node)
- return result
-
-def handleBlockQuote(node):
- result = BlockQuoteDitem(node.nodeName)
- result.children = processChildren(node)
- return result
-
-def handleList(node):
- result = ListDitem(node.nodeName)
- result.children = processChildren(node)
- return result
-
-def handleListItem(node):
- result = ListItemDitem(node.nodeName)
- result.children = processChildren(node)
- return result
-
-def handleTable(node):
- result = TableDitem(node.nodeName)
- # Ignore table contents that are not tr
- result.children = [x
- for x in processChildren(node) if x.type=='tr']
- return result
-
-def handleTr(node):
- result = TrDitem(node.nodeName)
- # Ignore tr contents that are not th or td
- result.children = [x
- for x in processChildren(node) if x.type in ('th', 'td')]
- return result
-
-def handlePre(node):
- return PreDitem(mergeChildren(node).text)
-
-dom1 = xml.dom.minidom.parse(sys.argv[1])
-ditem = handleNode(dom1.getElementsByTagName("body")[0])
-ditem.propagate_indents()
-(utf8_encode, utf8_decode, utf8_reader, utf8_writer) = codecs.lookup('utf-8')
-outf = utf8_writer(sys.stdout)
-outf.write(ditem.format(79) + '\n')
-for h in hyperlinks.keys():
- outf.write('\n.. _`' + h + '`:\n ' + hyperlinks[h] + '\n')
diff --git a/sandbox/grubert/README.txt b/sandbox/grubert/README.txt
deleted file mode 100644
index 2808e6548..000000000
--- a/sandbox/grubert/README.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-2003-02
--------
-
-latex writer into main
-~~~~~~~~~~~~~~~~~~~~~~
-
-Done:
-
-* move latex2e.py into docutils/writers
-* move rst2latex.py into tools.
-* add latex to writers/__init__ writer_aliases.
-* documentation: tools documentation.
-
-To do:
-
-* commandline options, style.tex, ...
-
- Where to move the latex2e-README.txt.
-
-* test: writer tests might be too simple, currently publish is used.
- test/test_writers
- test that the produced latex document is the same.
-
-
-2002-12
--------
-
-pdfsamples
-~~~~~~~~~~
-
-1. reduced tools_test.txt_ multirow and multicol tablecells donot work.
-
-2. docs_tools.txt_.
-
-3. specs_pep-0256.txt_.
-
-.. _tools_test.txt: test.pdf
-.. _specs_pep-0256.txt: pep-0256.pdf
-.. _docs_tools.txt: tools.pdf
-
-
-2002-09
--------
-
-latex enhanced by julien.
-
-2002-07
--------
-
-Menu changed now try for latex writer.
-
-2002-05-11
-----------
-
-This month sandbox menu is a pdf writer using
-reportlab lib.
-
-I am unsure it it will ever work, justification might
-need hyphenation and automatic sizing of table cells
-seams to be nontrivial (considering the size of the
-usual html browsers).
-
-A better layout might be possible via the latex2e writer.
-(on next month menu).
-
-I try to approach davids structure and work and
-coding conventions but slowly as a morning sunrise.
-
-cheers
-
- grubert@users.sourceforge.net
-
diff --git a/sandbox/grubert/check b/sandbox/grubert/check
deleted file mode 100644
index bf46570f6..000000000
--- a/sandbox/grubert/check
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-EXT=tex
-REF_DIR=test
-if [ "$1" = "man" ] ;then
- REF_DIR=man.test
- EXT=man
- shift
-fi
-
-if [ "$1" = "create" ] ; then
- CREATE=1
-fi
-
-TMPF=.diff.tmp
-for F in `ls $REF_DIR/*.txt*.$EXT` ; do
- diff -s -u $F.ref $F > $TMPF
- if test $? -gt 0 ; then
- less $TMPF
- if [ "$CREATE" == "1" ] ; then
- mv $F $F.ref
- fi
- fi
-done
-rm $TMPF
diff --git a/sandbox/grubert/directory_structur b/sandbox/grubert/directory_structur
deleted file mode 100644
index 44e39d4df..000000000
--- a/sandbox/grubert/directory_structur
+++ /dev/null
@@ -1,24 +0,0 @@
-Sandbox directory structure (2002-07-05)
-
-sandbox/
- userid/
- component_name/ # A verbose name is best.
- README.txt # Please explain requirements,
- # purpose/goals, and usage.
- docs/
- ...
- component.py # The component is a single module.
- # *OR* (but *not* both)
- component/ # The component is a package.
- __init__.py # Contains the Reader/Writer class.
- other1.py # Other modules and data files used
- data.txt # by this component.
- ...
- test/ # Test suite.
- ...
- tools/ # For front-ends etc.
- ...
- setup.py # Use Distutils to install the component
- # code and tools/ files into the right
- # places in Docutils.
-
diff --git a/sandbox/grubert/docutils.sty b/sandbox/grubert/docutils.sty
deleted file mode 100644
index 7c25b3ad4..000000000
--- a/sandbox/grubert/docutils.sty
+++ /dev/null
@@ -1,54 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%% docutils.sty: A style for docutils latex output %%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% o author: Alexander Schmolck (a.schmolck@gmx.net)
-%% o created: 2002-07-07 10:50:31+00:40
-%% o last modified: $Date$
-%% o keywords:
-%% o license:
-%XXX titlesec
-%% XXX geometry
-\usepackage{graphicx}
-\usepackage{latexsym} % extra symbols
-\usepackage{url} % !!!: pay attention when using in other commands!!!
-\usepackage{verbatim} % normal verbatim has lenght-limit
-\usepackage{enumerate} % easy style choice with e.g: ``\begin{enumerate}[Ex i.]``
-\usepackage{hyperref} %href, htarget and hlink XXX: pdfauthor, pdfcreator etc.
-\usepackage{xr} %XXX do we need this?
-% need this to have ``fboxes`` in ``enviroments``, as well as ``verbatim``s
-\usepackage{fancybox}
-\usepackage{mdwtab} % better tables and arrays (fixes spacing and adds
- % vertical align and multirows (m))
-\usepackage{ltxtable} % long and autoscaling tables (use X for autoscaled
- % columns)
-\newcommand{\transition}{\vspace{2em}\par\hrule{}\par\vspace{2em}}
-\newcommand{\classifier}[1]{(\textit{#1})}
-\newenvironment{topic}[1]%
-{\begin{Sbox}%
- \begin{minipage}{.8\textwidth}%
- \protect{\large{\textbf{#1}}}\par\vspace{.5em}}%
-{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}}
-%XXX shadow box for warnings?
-\newenvironment{admonition}[1]%
-{\begin{center}%
- \begin{Sbox}%
- \begin{minipage}{.9\textwidth}%
- \protect{\textsc{#1}}\par\vspace{.2em}}%
-{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}\end{center}}
-
-\newenvironment{doctest}%
-{\VerbatimEnvironment
- \begin{Verbatim}}%
-{\end{Verbatim}}
-% {%
-% \begin{Sbox}%
-% \begin{minipage}{.8\textwidth}%
-% \protect{\large{\textsc{#1}}\par\vspace{.5em}}}%
-% {\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}}
-%{\end{minipage}\end{Sbox}\fbox{\TheSbox}}
-
-
-%% just a piece of example code
-% \newcommand{\vitem}%
-% {\SaveVerb[{\item[\UseVerb{\MyTemp}]}]{\MyTemp}}
diff --git a/sandbox/grubert/latex.py b/sandbox/grubert/latex.py
deleted file mode 100755
index a0f1a6ab8..000000000
--- a/sandbox/grubert/latex.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/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.
-
-A minimal front-end to the Docutils Publisher, producing HTML.
-"""
-
-import locale
-locale.setlocale(locale.LC_ALL, '')
-
-from docutils.core import publish_cmdline
-
-
-usage = '%prog [options] [source [destination]]'
-description = ('Generate LaTeX documents from standalone reStructuredText '
- 'sources.')
-
-publish_cmdline(writer_name='latex', usage=usage, description=description)
diff --git a/sandbox/grubert/latex/__init__.py b/sandbox/grubert/latex/__init__.py
deleted file mode 100644
index 0981bc081..000000000
--- a/sandbox/grubert/latex/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from latex2e import Writer
diff --git a/sandbox/grubert/latex2e-README.txt b/sandbox/grubert/latex2e-README.txt
deleted file mode 100644
index 8c66007d0..000000000
--- a/sandbox/grubert/latex2e-README.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-latex2e BUGS TODOS and other animals
-------------------------------------
-
-for processing tools/test.txt use pdflatex because it will handle png-images.
-
-
-:Author: engelbert gruber
-:Contact: grubert@users.sourceforge.net
-:Date: $Date$
-
-To do
-~~~~~
-
-* handle image options : height,width,class.
-
-* setting urls: french does put a spcae before ":" and "?".
-
- using ``\url`` long urls the url is typeset int tt, but hyphenates.
- using ``\href`` does typeset in normal font.
-
-* dedication is centered italic in html (test.txt).
-
-* term: html puts classifier in italic and newline after classifier,
- latex in parentheses and no newline after it (test.txt).
-
-* field lists are indented in latex (test.txt).
-
-* literal block is indented in html (test.txt).
-
-* doctest block is indented in html.
-
-* footnotes donot link back in latex.
-
-* quotes for german: {\glqq} {\grqq} {\glq} {\grq} {\dq}.
-
-* support embed-stylesheet.
-
-* the ^-sign is problematic: using mathmode wedge is usually the wrong font.
-
-* Maybe add end of line after term in definition list. see
- http://roundup.sf.net/doc-0.5/features.pdf
-
-* In tools.txt the option tables right column, there should be some more spacing
- between the description and the next paragraph "Default:".
-
- Paragraph separation in tables is hairy.
- see http://www.tex.ac.uk/cgi-bin/texfaq2html?label=struttab
-
- - The strut solution did not work.
- - setting extrarowheight added ad top of row not between paragraphs in
- a cell. ALTHOUGH i set it to 2pt because, text is too close to the topline.
- - baselineskip/stretch does not help.
-
-* two hlines after table head and on table end ?
-
-* table: multicol cells are always {l}.
-
-* pdfbookmark level 4 (and greater) does not work (might be settable but OTOH).
-
-* center subsection{Abstract} gives a latex error here.
- ``! LaTeX Error: Something's wrong--perhaps a missing \item.``
- Committed a HACK: centering by hfill
-
-* document errors are also too silent.
-
-* use optionlist for docinfo.
-
-* the title "table of contents" is centered too.
-
-* consider peter funk's hooks for TeXpert:
-
- * Define his own document preamble (including the choice to
- choose his own documentclass. That would make the ``--documentclass``
- option superfluous). I suggest to call this option ``--preamble``
-
- * Use two additional hooks to put additional stuff just behind the
- ``\begin{document}`` and just before the ``\end{document}`` macros.
- Typical uses would be ``\tableofcontents``, ``\listoffigures`` and
- ``\appendix``, ``\makeindex``, ``\makeglossary`` and some such
- for larger documents.
-
-* hyphens: co-developers should be co--developers ?
-
-* table heads and footer for longtable (firstpage lastpage ..)
-
-* longtable does not work with multirow
-
-* tabularx says "do not use any multicolmn which spans any X column.
- maybe use ltxtable instead of tabularx (Longtable combined with tabularx).
- but ltxtable disables longtable's multicolumn.
-
-* multiple author entries in docinfo (same thing as in html).
-
-* the indentional problematic error in test.txt is not referring anywhere.
-
-* table cells with multirow and multicolumn
-
-* tables have borders, and the border is missing in empty cells.
-
-* footnotes are not all on the same page (as in tools/test.txt) and do not link back
- and forth.
-
-* no link to system errors.
-
-* hyperlinks are not hyphenated this leads to bad spacing. see tools/test.txt
- 2.14 directives directives
-
-* meta keywords into pdf ?
-
-* pagestyle headings does not work, when sections are starred.
-
-* additional docinfo items: the field_body is inserted as text.
-
-ATTENTION
-~~~~~~~~~
-* put labeling inside (after the begin) environments.
-* me (e.g.) uses textwidth, julien linewidth see what is what.
-
- textwidth: is the normal width of the text on a page. It should generally
- be changed only in the preamble.
-
- linewidth: is the width of lines in the current environment. Normally equal to
- \textwidth, it may be different within an environment such as list or quote
- environments.
-
-* from http://netra.wustl.edu/links/LaTeX/LaTeX.html
-
- - Aligning Images
-
- By default, images align according to their "reference point," which is never
- what you want it to be. Put a minipage around an image to make it align
- properly (according to its center)::
-
- \usepackage{graphicx}
- \begin{minipage}{2in}
- \includegraphics[width=2in,angle=-90]{foo}
- \end{minpage}
-
- - 2-Column Images
-
- When in 2-column mode (using either \twocolumn or the multicols environment
- (package multicol)), use \begin{figure*} and \begin{table*} to create figures
- and tables that span the entire width of the page. \begin{figure} and
- \begin{table} span only one column.
-
- - LaTeX->PDF
-
- I've found that the best way to convert from LaTeX to PDF is to use "pdflatex."
- The first time that you run it, you'll find that the produced PDF file doesn't
- include any of your figures. To fix this,
-
- 1. Use "epstopdf" to convert all of your EPS images to PDF
- 2. Make sure that you are using the "graphicx" package for including images.
- 3. Remove any .eps or .ps extensions from filenames in your LaTeX file
-
- When you run LaTeX, graphicx will use the dvips driver to incorporate EPS
- files. When you run pdflatex, it will pick up the pdftex driver and incorporate
- the PDF files.
diff --git a/sandbox/grubert/ltx-test.txt b/sandbox/grubert/ltx-test.txt
deleted file mode 100644
index 134eda67e..000000000
--- a/sandbox/grubert/ltx-test.txt
+++ /dev/null
@@ -1,476 +0,0 @@
-.. This is a comment. Note how any initial comments are moved by
- transforms to after the document title, subtitle, and docinfo.
-
-================================
- reStructuredText Test Document
-================================
-
-.. Above is the document title, and below is the subtitle.
- They are transformed from section titles after parsing.
-
---------------------------------
- Examples of Syntax Constructs
---------------------------------
-
-.. bibliographic fields (which also require a transform):
-
-:Author: David Goodger
-:Address: 123 Example Street
- Example, EX Canada
- A1B 2C3
-:Contact: goodger@users.sourceforge.net
-:Authors: Me; Myself; I
-:organization: humankind
-:date: $Date$
-:status: This is a "work in progress"
-:revision: $Revision$
-:version: 1
-:copyright: This document has been placed in the public domain. You
- may do with it as you wish. You may copy, modify,
- redistribute, reattribute, sell, buy, rent, lease,
- destroy, or improve it, quote it at length, excerpt,
- incorporate, collate, fold, staple, or mutilate it, or do
- anything else to it that your or anyone else's heart
- desires.
-:field name: This is a generic bibliographic field.
-:field name 2:
- Generic bibliographic fields may contain multiple body elements.
-
- Like this.
-
-:Dedication:
-
- For Docutils users & co-developers.
-
-:abstract:
-
- This is a test document, containing at least one example of each
- reStructuredText construct.
-
-.. meta::
- :keywords: reStructuredText, test, parser
- :description lang=en: A test document, containing at least one
- example of each reStructuredText construct.
-
-.. contents:: Table of Contents
-.. section-numbering::
-
-
-Structural Elements
-===================
-
-Section Title
--------------
-
-That's it, the text just above this line.
-
-Transitions
------------
-
-Here's a transition:
-
----------
-
-It divides the section.
-
-Body Elements
-=============
-
-Paragraphs
-----------
-
-A paragraph.
-
-Inline Markup
-`````````````
-
-Paragraphs contain text and may contain inline markup: *emphasis*,
-**strong emphasis**, `interpreted text`, ``inline literals``,
-standalone hyperlinks (http://www.python.org), external hyperlinks
-(Python_), internal cross-references (example_), footnote references
-(manually numbered [1]_, anonymous auto-numbered [#]_, labeled
-auto-numbered [#label]_, or symbolic [*]_), citation references
-([CIT2002]_), substitution references (|example|), and _`inline
-hyperlink targets` (see Targets_ below for a reference back to here).
-Problems are indicated by |problematic| text (generated by processing
-errors; this one is intentional).
-
-.. DO NOT RE-WRAP THE FOLLOWING PARAGRAPH!
-
-Let's test wrapping and whitespace significance in inline literals:
-``This is an example of --inline-literal --text, --including some--
-strangely--hyphenated-words. Adjust-the-width-of-your-browser-window
-to see how the text is wrapped. -- ---- -------- Now note the
-spacing between the words of this sentence (words
-should be grouped in pairs).``
-
-If the ``--pep-references`` option was supplied, there should be a
-live link to PEP 258 here.
-
-Bullet Lists
-------------
-
-- A bullet list
-
- + Nested bullet list.
- + Nested item 2.
-
-- Item 2.
-
- Paragraph 2 of item 2.
-
- * Nested bullet list.
- * Nested item 2.
-
- - Third level.
- - Item 2.
-
- * Nested item 3.
-
-Enumerated Lists
-----------------
-
-1. Arabic numerals.
-
- a) lower alpha)
-
- (i) (lower roman)
-
- A. upper alpha.
-
- I) upper roman)
-
-2. Lists that don't start at 1:
-
- 3. Three
-
- 4. Four
-
- C. C
-
- D. D
-
- iii. iii
-
- iv. iv
-
-Definition Lists
-----------------
-
-Term
- Definition
-Term : classifier
- Definition paragraph 1.
-
- Definition paragraph 2.
-Term
- Definition
-
-Field Lists
------------
-
-:what: Field lists map field names to field bodies, like database
- records. They are often part of an extension syntax. They are
- an unambiguous variant of RFC 2822 fields.
-
-:how arg1 arg2:
-
- The field marker is a colon, the field name, and a colon.
-
- The field body may contain one or more body elements, indented
- relative to the field marker.
-
-Option Lists
-------------
-
-For listing command-line options:
-
--a command-line option "a"
--b file options can have arguments
- and long descriptions
---long options can be long also
---input=file long options can also have
- arguments
-
---very-long-option
- The description can also start on the next line.
-
- The description may contain multiple body elements,
- regardless of where it starts.
-
--x, -y, -z Multiple options are an "option group".
--v, --verbose Commonly-seen: short & long options.
--1 file, --one=file, --two file
- Multiple options with arguments.
-/V DOS/VMS-style options too
-
-There must be at least two spaces between the option and the
-description.
-
-Literal Blocks
---------------
-
-Literal blocks are indented, and indicated with a double-colon ("::")
-at the end of the preceding paragraph (right here ``-->``)::
-
- if literal_block:
- text = 'is left as-is'
- spaces_and_linebreaks = 'are preserved'
- markup_processing = None
-
-Block Quotes
-------------
-
-Block quotes consist of indented body elements:
-
- This theory, that is mine, is mine.
-
- -- Anne Elk (Miss)
-
-Doctest Blocks
---------------
-
->>> print 'Python-specific usage examples; begun with ">>>"'
-Python-specific usage examples; begun with ">>>"
->>> print '(cut and pasted from interactive Python sessions)'
-(cut and pasted from interactive Python sessions)
-
-Tables
-------
-
-Here's a grid table followed by a simple table:
-
-+------------------------+------------+----------+----------+
-| Header row, column 1 | Header 2 | Header 3 | Header 4 |
-| (header rows optional) | | | |
-+========================+============+==========+==========+
-| body row 1, column 1 | column 2 | column 3 | column 4 |
-+------------------------+------------+----------+----------+
-| body row 2 | Cells may span columns. |
-+------------------------+------------+----------+----------+
-| body row 5 | Cells may also be | |
-| | empty: ``-->`` | |
-+------------------------+-----------------------+----------+
-
-.. not for latex
- +------------------------+------------+---------------------+
- | body row 3 | Cells may | - Table cells |
- +------------------------+ span rows. | - contain |
- | body row 4 | | - body elements. |
-
-
-===== ===== ======
- Inputs Output
------------- ------
- A B A or B
-===== ===== ======
-False False False
-True False True
-False True True
-True True True
-===== ===== ======
-
-Footnotes
----------
-
-.. [1] A footnote contains body elements, consistently indented by at
- least 3 spaces.
-
- This is the footnote's second paragraph.
-
-.. [#label] Footnotes may be numbered, either manually (as in [1]_) or
- automatically using a "#"-prefixed label. This footnote has a
- label so it can be referred to from multiple places, both as a
- footnore reference ([#label]_) and as a hyperlink reference
- (label_).
-
-.. [#] This footnote is numbered automatically and anonymously using a
- label of "#" only.
-
-.. [*] Footnotes may also use symbols, specified with a "*" label.
- Here's a reference to the next footnote: [*]_.
-
-.. [*] This footnote shows the next symbol in the sequence.
-
-.. [4] Here's an unreferenced footnote, with a reference to a
- nonexistent footnote: [5]_.
-
-Citations
----------
-
-.. [CIT2002] Citations are text-labeled footnotes. They may be
- rendered separately and differently from footnotes.
-
-Here's a reference to the above, [CIT2002]_, and a [nonexistent]_
-citation.
-
-Targets
--------
-
-.. _example:
-
-This paragraph is pointed to by the explicit "example" target. A
-reference can be found under `Inline Markup`_, above. `Inline
-hyperlink targets`_ are also possible.
-
-Section headers are implicit targets, referred to by name. See
-Targets_, which is a subsection of `Body Elements`_.
-
-Explicit external targets are interpolated into references such as
-"Python_".
-
-.. _Python: http://www.python.org/
-
-Targets may be indirect and anonymous. Thus `this phrase`__ may also
-refer to the Targets_ section.
-
-__ Targets_
-
-Here's a `hyperlink reference without a target`_, which generates an
-error.
-
-Duplicate Target Names
-``````````````````````
-
-Duplicate names in section headers or other implicit targets will
-generate "info" (level-1) system messages. Duplicate names in
-explicit targets will generate "warning" (level-2) system messages.
-
-Duplicate Target Names
-``````````````````````
-
-Since there are two "Duplicate Target Names" section headers, we
-cannot uniquely refer to either of them by name. If we try to (like
-this: `Duplicate Target Names`_), an error is generated.
-
-Directives
-----------
-
-.. contents:: :local:
-
-These are just a sample of the many reStructuredText Directives. For
-others, please see http://docutils.sf.net/spec/rst/directives.html.
-
-Document Parts
-``````````````
-
-An example of the "contents" directive can be seen above this section
-(a local, untitled table of contents_) and at the beginning of the
-document (a document-wide `table of contents`_).
-
-Images
-``````
-
-An image directive:
-
-.. image:: ../docs/rst/images/title.png
-
-A figure directive:
-
-.. figure:: ../docs/rst/images/title.png
- :alt: reStructuredText, the markup syntax
-
- A figure is an image with a caption and/or a legend:
-
- +------------+-----------------------------------------------+
- | re | Revised, revisited, based on 're' module. |
- +------------+-----------------------------------------------+
- | Structured | Structure-enhanced text, structuredtext. |
- +------------+-----------------------------------------------+
- | Text | Well it is, isn't it? |
- +------------+-----------------------------------------------+
-
- This paragraph is also part of the legend.
-
-Admonitions
-```````````
-
-.. Attention:: Directives at large.
-
-.. Caution::
-
- Don't take any wooden nickels.
-
-.. DANGER:: Mad scientist at work!
-
-.. Error:: Does not compute.
-
-.. Hint:: It's bigger than a bread box.
-
-.. Important::
- - Wash behind your ears.
- - Clean up your room.
- - Call your mother.
- - Back up your data.
-
-.. Note:: This is a note.
-
-.. Tip:: 15% if the service is good.
-
-.. WARNING:: Strong prose may provoke extreme mental exertion.
- Reader discretion is strongly advised.
-
-Target Footnotes
-````````````````
-
-.. target-notes::
-
-Line Blocks
-```````````
-
-Take it away, Eric the Orchestra Leader!
-
-.. line-block::
-
- A one, two, a one two three four
-
- Half a bee, philosophically,
- must, *ipso facto*, half not be.
- But half the bee has got to be,
- *vis a vis* its entity. D'you see?
-
- But can a bee be said to be
- or not to be an entire bee,
- when half the bee is not a bee,
- due to some ancient injury?
-
- Singing...
-
-Replacement Text
-````````````````
-
-I recommend you try |Python|_.
-
-.. |Python| replace:: Python, *the* best language around
-
-Substitution Definitions
-------------------------
-
-An inline image (|example|) example:
-
-.. |EXAMPLE| image:: ../docs/rst/images/biohazard.png
-
-(Substitution definitions are not visible in the HTML source.)
-
-Comments
---------
-
-Here's one:
-
-.. Comments begin with two dots and a space. Anything may
- follow, except for the syntax of footnotes, hyperlink
- targets, directives, or substitution definitions.
-
- Double-dashes -- "--" -- must be escaped somehow in HTML output.
-
-(View the HTML source to see the comment.)
-
-Error Handling
-==============
-
-Any errors caught during processing will generate system messages.
-
-There should be five messages in the following, auto-generated
-section, "Docutils System Messages":
-
-.. section should be added by Docutils automatically
diff --git a/sandbox/grubert/making_a_writer.txt b/sandbox/grubert/making_a_writer.txt
deleted file mode 100644
index 4d76b5170..000000000
--- a/sandbox/grubert/making_a_writer.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-===============
-Making a writer
-===============
-
-:Author: engelbert gruber
-:Contact: grubert@users.sourceforge.net
-:Date: $Date$
-:Web site: http://docutils.sourceforge.net/
-
-.. contents::
-
-Introduction
-============
-
-This might become a document sometime, is now a FAQ, collected
-from docutils-develop@lists.sourceforge.net.
-
-This should give help in making a writer for the python docutils.
-Writers are backends writing to a dedicated format.
-
-General description
-===================
-
-from PEP-0258:
-
- Writers produce the final output (HTML, XML, TeX, etc.). Writers translate
- the internal document tree structure into the final data format, possibly
- running Writer-specific transforms first.
-
- Responsibilities:
-
- * Run transforms over the doctree(s).
- * Translate doctree(s) into specific output formats.
- * Transform references into format-native forms.
- * Write the translated output to the destination I/O.
-
-or in other words
-
- By the time the document gets to the Writer, it should be in
- final form. The Writer's job is simply (and only) to translate from
- the Docutils doctree structure to the target format. Some small
- transforms may be required, but they should be local and
- format-specific.
-
-
-The smallest writer
-===================
-
-Next to come. This should be a writer module where everything is done
-in unimplemented.
-
-
-Methods
-=======
-
-Empty methods
--------------
-
-It is legal and does not hint to missing functionality, when a
-method only implements pass, it just means that this calls information
-is not used, the actual content is usually produced between ``visit_*``
-and ``depart_*`` calls. e.g.::
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
-As long as there is no need for termination depart_Text is ok.
-
-Fallback methods
-----------------
-
-If derived from NodeVisitor
-
-* unknown_visit, unknown_departure
-
-Deriving from SparseNodeVisitor means everything might pass.
-
-GenericNodeVisitor adds
-
-* default_visit, default_depart.
-
-unimplemented_visit( self, node) seams to be there for both.
-
-Each might raise NotImplementedError(describe_here),
-
-General Problems
-----------------
-
-html pages are more like papyrus rolls, if one wants to go more usual
-paper formats some things are different or not.
-
-* page headings
-* page numbers
-
-
-Problems
---------
-
-In latex2e writer this looks awful to me, but as i understand this ensures
-that e.g. http addresses are not only text.
-
-Maybe this is due to the fact that self.docinfo is used, if one would remove
-it context might be unecessary.
-
-::
-
- def visit_docinfo_item (...):
- ...
- else:
- ##self.head.append('\\%s{%s}\n'
- ## % (name, self.attval(node.astext())))
- self.docinfo.append('\\textbf{%s} &\n\t' % name)
- self.context.append(' \\\\\n')
- self.context.append(self.docinfo)
- self.context.append(len(self.body))
- ##raise nodes.SkipNode
-
- def depart_docinfo_item(self, node):
- size = self.context.pop()
- dest = self.context.pop()
- tail = self.context.pop()
- tail = self.body[size:] + [tail]
- del self.body[size:]
- dest.extend(tail)
-
-
-Notes on Classes
-----------------
-
-To be completed.
diff --git a/sandbox/grubert/man.py b/sandbox/grubert/man.py
deleted file mode 100755
index f3f81b241..000000000
--- a/sandbox/grubert/man.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-
-# Author:
-# Contact: grubert@users.sf.net
-# Copyright: This module has been placed in the public domain.
-
-"""
-man.py
-======
-
-This module provides a simple command line interface that uses the
-man page writer to output from ReStructuredText source.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-from man import ManPageWriter
-
-description = ("Generates plain man. " + default_description)
-
-publish_cmdline(writer=ManPageWriter.Writer(), description=description)
diff --git a/sandbox/grubert/man/ManPageWriter.py b/sandbox/grubert/man/ManPageWriter.py
deleted file mode 100644
index 44eea3f8a..000000000
--- a/sandbox/grubert/man/ManPageWriter.py
+++ /dev/null
@@ -1,952 +0,0 @@
-# Author:
-# Contact: grubert@users.sf.net
-# Copyright: 2003 - engelbert gruber - All Rights Reserved
-# License: This module is put into the public domain.
-#
-# CVS: $Id$
-
-"""
-Man page formatting for reStructuredText.
-
-See http://www.tldp.org/HOWTO/Man-Page for a start.
-
-Man pages have no subsection only parts.
-Standard parts
- NAME ,
- SYNOPSIS ,
- DESCRIPTION ,
- OPTIONS ,
- FILES ,
- SEE ALSO ,
- BUGS ,
-and
- AUTHOR .
-
-"""
-
-# NOTE: the macros only work when at line start, so try the rule
-# start new lines in visit_ functions.
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import time
-import re
-from types import ListType
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-
-class Writer(writers.Writer):
-
- supported = ('ManPage')
- """Formats this writer supports."""
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
- """"""
-
- words_and_spaces = re.compile(r'\S+| +|\n')
- document_start = """Man page generated from reStructeredText."""
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = settings = document.settings
- lcode = settings.language_code
- self.language = languages.get_language(lcode)
- self.head = []
- self.body = []
- self.foot = []
- self.section_level = 0
- self.context = []
- self.topic_class = ''
- self.colspecs = []
- self.compact_p = 1
- self.compact_simple = None
- self.in_docinfo = None
-
- def comment_begin(self, text):
- """Return commented version of the passed text WITHOUT end of line/comment."""
- prefix = '\n.\\" '
- return prefix+prefix.join(text.split('\n'))
-
- def comment(self, text):
- """Return commented version of the passed text."""
- prefix = '\n.\\" '
- return prefix+prefix.join(text.split('\n'))+'\n'
-
- def astext(self):
- """Return the final formatted document as a string."""
- return ''.join(self.head + self.body + self.foot)
-
- def visit_Text(self, node):
- self.body.append(node.astext().replace('-','\-'))
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'address', meta=None)
-
- def depart_address(self, node):
- self.depart_docinfo_item()
-
- def visit_admonition(self, node, name):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS=name))
- self.body.append('<p class="admonition-title">'
- + self.language.labels[name] + '</p>\n')
-
- def depart_admonition(self):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- self.body.append(self.comment('visit_block_quote'))
-
- def depart_block_quote(self, node):
- self.body.append(self.comment('depart_block_quote'))
-
- def check_simple_list(self, node):
- raise NotImplementedError, node.astext()
- """Check for a simple list that can be rendered compactly."""
- visitor = SimpleListChecker(self.document)
- try:
- node.walk(visitor)
- except nodes.NodeFound:
- return None
- else:
- return 1
-
- def visit_bullet_list(self, node):
- self.body.append(self.comment('depart_bullet_list'))
-
- def depart_bullet_list(self, node):
- self.body.append(self.comment('depart_bullet_list'))
-
- def visit_caption(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</p>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<col />\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(']</a>')
-
- def visit_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(' <span class="classifier-delimiter">:</span> ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</span>')
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- raise NotImplementedError, node.astext()
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.body.append(self.emptytag(node, 'col',
- width='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node,
- sub=re.compile('-(?=-)').sub):
- raise NotImplementedError, node.astext()
- """Escape double-dashes in comment text."""
- self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'contact')
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- self.body.append(self.comment('visit_definition'))
-
- def depart_definition(self, node):
- self.body.append(self.comment('depart_definition'))
-
- def visit_definition_list(self, node):
- self.body.append(self.comment('visit_definition_list'))
-
- def depart_definition_list(self, node):
- self.body.append(self.comment('depart_definition_list'))
-
- def visit_definition_list_item(self, node):
- self.body.append(self.comment('visit_definition_list_item'))
-
- def depart_definition_list_item(self, node):
- self.body.append(self.comment('depart_definition_list_item'))
-
- def visit_description(self, node):
- self.body.append('\n')
-
- def depart_description(self, node):
- pass
-
- def visit_docinfo(self, node):
- self.body.append(self.comment('visit_docinfo'))
-
- def depart_docinfo(self, node):
- self.body.append(self.comment('depart_docinfo'))
-
- def visit_docinfo_item(self, node, name):
- self.body.append(self.comment('%s: ' % self.language.labels[name]))
- if len(node):
- if isinstance(node[0], nodes.Element):
- node[0].set_class('first')
- if isinstance(node[0], nodes.Element):
- node[-1].set_class('last')
-
- def depart_docinfo_item(self):
- pass
-
- def visit_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
- def depart_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('\n</pre>\n')
-
- def visit_document(self, node):
- self.body.append(self.comment(self.document_start))
- # BUG ad date and revision
- # BUG where do we get the name and the filemodification date.
- self.body.append('.TH FOO 1 "%s" "Linux User Manuals"\n' % time.strftime("%B %Y"))
-
- def depart_document(self, node):
- self.body.append(self.comment('Generated by docutils ManPageWriter on %s.\n'
- % (time.strftime('%Y-%m-%d %H:%M')) ) )
-
- def visit_emphasis(self, node):
- self.body.append('\n.I ')
-
- def depart_emphasis(self, node):
- self.body.append('\n')
-
- def visit_entry(self, node):
- raise NotImplementedError, node.astext()
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
- else:
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_entry(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- self.body.append(self.comment('visit_enumerated_list'))
-
- def depart_enumerated_list(self, node):
- self.body.append(self.comment('depart_enumerated_list'))
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- self.body.append(self.comment('visit_field'))
-
- def depart_field(self, node):
- self.body.append(self.comment('depart_field'))
-
- def visit_field_body(self, node):
- self.body.append(self.comment('visit_field_body'))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_field_body(self, node):
- self.body.append(self.comment('depart_field_body'))
-
- def visit_field_list(self, node):
- self.body.append(self.comment('visit_field_list'))
-
- def depart_field_list(self, node):
- self.body.append(self.comment('depart_field_list'))
-
- def visit_field_name(self, node):
- self.body.append(self.comment('visit_field_name'))
- atts = {}
- if self.in_docinfo:
- atts['class'] = 'docinfo-name'
- else:
- atts['class'] = 'field-name'
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.comment('atts'))
-
- def depart_field_name(self, node):
- self.body.append(self.comment('depart_field_name'))
-
- def visit_figure(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='figure'))
-
- def depart_figure(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_footer(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.body))
-
- def depart_footer(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- footer = (['<hr class="footer"/>\n',
- self.starttag(node, 'div', CLASS='footer')]
- + self.body[start:] + ['</div>\n'])
- self.body_suffix[:0] = footer
- del self.body[start:]
-
- def visit_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'table', CLASS='footnote',
- frame="void", rules="none"))
- self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- raise NotImplementedError, node.astext()
- if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- self.context.append('')
- self.context.append('<a class="fn-backref" href="#%s" '
- 'name="%s">' % (backrefs[0], node['id']))
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
- % (backref, i))
- i += 1
- self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
- self.context.append('<a name="%s">' % node['id'])
- else:
- self.context.append('')
- self.context.append('<a name="%s">' % node['id'])
-
- def depart_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '<sup>'
- self.context.append('</sup>')
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.body.append(self.starttag(node, 'a', suffix, href=href,
- CLASS='footnote-reference'))
-
- def depart_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop() + '</a>')
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.body))
-
- def depart_header(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('<hr />\n</div>\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- raise NotImplementedError, node.astext()
- atts = node.attributes.copy()
- atts['src'] = atts['uri']
- del atts['uri']
- if not atts.has_key('alt'):
- atts['alt'] = atts['src']
- if isinstance(node.parent, nodes.TextElement):
- self.context.append('')
- else:
- self.body.append('<p>')
- self.context.append('</p>\n')
- self.body.append(self.emptytag(node, 'img', '', **atts))
-
- def depart_image(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_label(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
- CLASS='label'))
-
- def depart_label(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(']</a></td><td>%s' % self.context.pop())
-
- def visit_legend(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_line_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'pre', CLASS='line-block'))
-
- def depart_line_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('\n</pre>\n')
-
- def visit_list_item(self, node):
- self.body.append(self.comment('visit_list_item'))
-
- def depart_list_item(self, node):
- self.body.append(self.comment('depart_list_item'))
-
- def visit_literal(self, node):
- self.body.append(self.comment('visit_literal'))
-
- def depart_literal(self, node):
- self.body.append(self.comment('depart_literal'))
-
- def visit_literal_block(self, node):
- self.body.append(self.comment('visit_literal_block'))
-
- def depart_literal_block(self, node):
- self.body.append(self.comment('depart_literal_block'))
-
- def visit_meta(self, node):
- raise NotImplementedError, node.astext()
- self.head.append(self.emptytag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option_list(self, node):
- # e.g. the list of commandline options
- pass
-
- def depart_option_list(self, node):
- pass
-
- def visit_option_list_item(self, node):
- # one item of the list
- self.body.append('\n.TP')
-
- def depart_option_list_item(self, node):
- pass
-
- def visit_option_group(self, node):
- # as one option could have several forms it is a group
- # options without parameter bold only, .B, -v
- # options with parameter bold italic, .BI, -f file
-
- # we do not know if .B or .BI
- self.context.append('.B') # blind guess
- self.context.append(len(self.body)) # to be able to insert later
- self.context.append(0) # optoin counter
-
- def depart_option_group(self, node):
- self.context.pop() # the counter
- start_position = self.context.pop()
- text = self.body[start_position:]
- del self.body[start_position:]
- self.body.append('\n%s%s' % (self.context.pop(), ''.join(text)))
-
- def visit_option(self, node):
- # each form of the option will be presented separately
- if self.context[-1]>0:
- self.body.append(' ,')
- if self.context[-3] == '.BI':
- self.body.append('\\')
- self.body.append(' ')
-
- def depart_option(self, node):
- self.context[-1] += 1
-
- def visit_option_string(self, node):
- # do not know if .B or .BI
- pass
-
- def depart_option_string(self, node):
- pass
-
- def visit_option_argument(self, node):
- self.context[-3] = '.BI'
- if self.body[len(self.body)-1].endswith('='):
- # a blank only means no blank in output
- self.body.append(' ')
- else:
- # backslash blank blank
- self.body.append('\\ ')
-
- def depart_option_argument(self, node):
- pass
-
- def visit_organization(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- raise NotImplementedError, node.astext()
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- # .PP or
- return
- self.body.append('\n')
-
- def depart_paragraph(self, node):
- # .PP or an empty line
- return
- self.body.append('>\n')
-
- def visit_problematic(self, node):
- raise NotImplementedError, node.astext()
- if node.hasattr('refid'):
- self.body.append('<a href="#%s" name="%s">' % (node['refid'],
- node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</span>')
- self.body.append(self.context.pop())
-
- def visit_raw(self, node):
- raise NotImplementedError, node.astext()
- if node.get('format') == 'html':
- self.body.append(node.astext())
- # Keep non-HTML raw text out of output:
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- """E.g. email address."""
- pass
-
- def depart_reference(self, node):
- pass
-
- def visit_revision(self, node):
- self.visit_docinfo_item(node, 'revision')
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tr>\n')
-
- def visit_section(self, node):
- self.body.append(self.comment('visit_section'))
- self.body.append('\n.SH ')
- # BUG first section = title should say NAME for whatis database.
- self.section_level += 1
-
- def depart_section(self, node):
- self.section_level -= 1
- self.body.append('\n')
- self.body.append(self.comment('depart_section'))
-
- def visit_status(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'status', meta=None)
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('<strong>')
-
- def depart_strong(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</strong>')
-
- def visit_substitution_definition(self, node):
- """Internal only."""
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
-
- def depart_subtitle(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</h2>\n')
-
- def visit_system_message(self, node):
- raise NotImplementedError, node.astext()
- if node['level'] < self.document.reporter['writer'].report_level:
- # Level is too low to display:
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'div', CLASS='system-message'))
- self.body.append('<p class="system-message-title">')
- attr = {}
- backref_text = ''
- if node.hasattr('id'):
- attr['name'] = node['id']
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- backref_text = ('; <em><a href="#%s">backlink</a></em>'
- % backrefs[0])
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a href="#%s">%s</a>' % (backref, i))
- i += 1
- backref_text = ('; <em>backlinks: %s</em>'
- % ', '.join(backlinks))
- if node.hasattr('line'):
- line = ', line %s' % node['line']
- else:
- line = ''
- if attr:
- a_start = self.starttag({}, 'a', '', **attr)
- a_end = '</a>'
- else:
- a_start = a_end = ''
- self.body.append('System Message: %s%s/%s%s (<tt>%s</tt>%s)%s</p>\n'
- % (a_start, node['type'], node['level'], a_end,
- node['source'], line, backref_text))
-
- def depart_system_message(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_table(self, node):
- self.body.append(self.comment('visit_table'))
- raise nodes.SkipNode
-
- def depart_table(self, node):
- self.body.append(self.comment('depart_table'))
-
- def visit_target(self, node):
- self.body.append(self.comment('visit_target'))
-
- def depart_target(self, node):
- self.body.append(self.comment('depart_target'))
-
- def visit_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n' or ''
- self.body.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tbody>\n')
-
- def visit_term(self, node):
- self.body.append(self.comment('visit_term'))
-
- def depart_term(self, node):
- self.body.append(self.comment('depart_term'))
-
- def visit_tgroup(self, node):
- raise NotImplementedError, node.astext()
- # Mozilla needs <colgroup>:
- self.body.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.body.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- if isinstance(node.parent, nodes.topic):
- self.body.append(self.comment('topic-title'))
- elif isinstance(node.parent, nodes.sidebar):
- self.body.append(self.comment('sidebar-title'))
- elif isinstance(node.parent, nodes.admonition):
- self.body.append(self.comment('admonition-title'))
- elif self.section_level == 0:
- # document title maybe for .TH
- # self.head.append('<title>%s</title>\n'
- # % self.encode(node.astext()))
- pass
- else:
- # self.body.append(self.comment('h%s' % self.section_level))
- pass
-
- def depart_title(self, node):
- pass
-
- def visit_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'cite', ''))
-
- def depart_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</cite>')
-
- def visit_topic(self, node):
- self.body.append(self.comment('topic: '+node.astext()))
- raise nodes.SkipNode
- ##self.topic_class = node.get('class')
-
- def depart_topic(self, node):
- ##self.topic_class = ''
- pass
-
- def visit_transition(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.emptytag(node, 'hr'))
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'version', meta=None)
-
- def depart_version(self, node):
- self.depart_docinfo_item()
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
-
-class SimpleListChecker(nodes.GenericNodeVisitor):
-
- """
- Raise `nodes.SkipNode` if non-simple list item is encountered.
-
- Here "simple" means a list item containing nothing other than a single
- paragraph, a simple list, or a paragraph followed by a simple list.
- """
-
- def default_visit(self, node):
- raise nodes.NodeFound
-
- def visit_bullet_list(self, node):
- pass
-
- def visit_enumerated_list(self, node):
- pass
-
- def visit_list_item(self, node):
- children = []
- for child in node.get_children():
- if not isinstance(child, nodes.Invisible):
- children.append(child)
- if (children and isinstance(children[0], nodes.paragraph)
- and (isinstance(children[-1], nodes.bullet_list)
- or isinstance(children[-1], nodes.enumerated_list))):
- children.pop()
- if len(children) <= 1:
- return
- else:
- raise nodes.NodeFound
-
- def invisible_visit(self, node):
- """Invisible nodes should be ignored."""
- pass
-
- visit_comment = invisible_visit
- visit_substitution_definition = invisible_visit
- visit_target = invisible_visit
- visit_pending = invisible_visit
-
-# vim: set et ts=4 ai :
diff --git a/sandbox/grubert/man/__init__.py b/sandbox/grubert/man/__init__.py
deleted file mode 100644
index c1ab26a53..000000000
--- a/sandbox/grubert/man/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# python package.
diff --git a/sandbox/grubert/pdf1 b/sandbox/grubert/pdf1
deleted file mode 100755
index db5f32d84..000000000
--- a/sandbox/grubert/pdf1
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-DOCUTILS=../..
-QWRITER=$DOCUTILS/tools/quicktest.py
-OUT=test.pdf
-TEXT=pdftest_3.txt
-
-PYTHONPATH=`pwd`:$DOCUTILS:$PYTHONPATH
-
-if [ -n "$1" -a -e "$1" ] ; then
- TEXT=$1
- shift
-fi
-
-if [ -n "$1" ] ; then
- echo "-$1-"
- if [ $1 == "t" ] ; then
- $QWRITER -p $TEXT |less
- exit
- fi
-fi
-
-./pdf.py $TEXT $OUT
-
diff --git a/sandbox/grubert/pdftest_1.txt b/sandbox/grubert/pdftest_1.txt
deleted file mode 100644
index 3c215d725..000000000
--- a/sandbox/grubert/pdftest_1.txt
+++ /dev/null
@@ -1,127 +0,0 @@
-Text
-
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-Und was ich immer schon einmal sagen wollte ...
-
-
diff --git a/sandbox/grubert/pdftest_2.txt b/sandbox/grubert/pdftest_2.txt
deleted file mode 100644
index 9ccd0bef8..000000000
--- a/sandbox/grubert/pdftest_2.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-.. This is a comment. Note how any initial comments are moved by
- transforms to after the document title, subtitle, and docinfo.
-
-================================
- reStructuredText Test Document
-================================
-
-.. Above is the document title, and below is the subtitle.
- They are transformed from section titles after parsing.
-
---------------------------------
- Examples of Syntax Constructs
---------------------------------
-
-.. bibliographic fields (which also require a transform):
-
-Structural Elements
-===================
-
-Section Title
--------------
-
-That's it, the text just above this line.
-
-Transitions
------------
-
-Here's a transition:
-
----------
-
-It divides the section.
-
-Body Elements
-=============
-
-Paragraphs
-----------
-
-A paragraph.
-
-Inline Markup
-`````````````
-
-Paragraphs contain text and may contain inline markup: *emphasis*,
-**strong emphasis**, `interpreted text`, ``inline literals``,
-standalone hyperlinks (http://www.python.org), external hyperlinks
-(Python_), internal cross-references (example_).
-
diff --git a/sandbox/grubert/rllicense.txt b/sandbox/grubert/rllicense.txt
deleted file mode 100644
index f3825f506..000000000
--- a/sandbox/grubert/rllicense.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#####################################################################################
-#
-# Copyright (c) 2000-2001, ReportLab Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the company nor the names of its contributors may be
-# used to endorse or promote products derived from this software without
-# specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE OFFICERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-#####################################################################################
diff --git a/sandbox/grubert/rlpdf/README.txt b/sandbox/grubert/rlpdf/README.txt
deleted file mode 100644
index 62e31f1ef..000000000
--- a/sandbox/grubert/rlpdf/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-modules from reportlab tools
-
diff --git a/sandbox/grubert/rlpdf/__init__.py b/sandbox/grubert/rlpdf/__init__.py
deleted file mode 100644
index 274814120..000000000
--- a/sandbox/grubert/rlpdf/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# rlpdf subpackage
-
-from rlpdf import Writer
-from stylesheet import getStyleSheet
-from rltemplate import RLDocTemplate
diff --git a/sandbox/grubert/rlpdf/rlpdf.py b/sandbox/grubert/rlpdf/rlpdf.py
deleted file mode 100644
index 781aa0e70..000000000
--- a/sandbox/grubert/rlpdf/rlpdf.py
+++ /dev/null
@@ -1,671 +0,0 @@
-#! /usr/bin/env python
-
-"""
-:Author: Engelbert Gruber
-:Contact: goodger@users.sourceforge.net
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-Simple pdf writer.
-
-The output uses reportlabs module.
-
-Some stylesheet is needed.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import time
-from types import ListType
-from docutils import writers, nodes, languages
-
-from stylesheet import getStyleSheet
-from rltemplate import RLDocTemplate
-
-from reportlab.lib.styles import ParagraphStyle
-from reportlab.lib.enums import *
-from reportlab.lib.pagesizes import A4
-from reportlab.platypus import *
-from reportlab.lib import colors
-from reportlab.lib.units import inch
-
-class Writer(writers.Writer):
-
- output = None
- """Final translated form of `document`."""
-
- def translate(self):
- visitor = PDFTranslator(self.document)
- self.document.walkabout(visitor)
- self.story = visitor.as_what()
-
- def record(self):
- doc = RLDocTemplate(self.destination, pagesize=A4)
- doc.build(self.story)
-
- def lower(self):
- return 'pdf'
-
-class PDFTranslator(nodes.NodeVisitor):
-
- def __init__(self, doctree):
- self.styleSheet = getStyleSheet()
- nodes.NodeVisitor.__init__(self, doctree)
- self.language = languages.get_language(doctree.settings.language_code)
- self.head = []
- self.body = []
- self.foot = []
- self.sectionlevel = 0
- self.context = []
- self.topic_class = ''
- self.story = []
- self.bulletText = '\xb7' # maybe move this into stylesheet.
-
- def as_what(self):
- return self.story
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- text = text.replace("&", "&amp;")
- #text = text.replace("<", "(lt)")
- #text = text.replace('"', "(quot)")
- #text = text.replace(">", "(gt)")
- # footnotes have character values above 128 ?
- for i in range(len(text)):
- if (ord(text[i])>128):
- return "ATT"
- print "warning: %d %x" % (i,ord(text[i]))
- text.replace(text[i],"?")
- return text
-
- def append_styled(self,text,in_style='Normal'):
- if self.styleSheet.has_key(in_style):
- style = self.styleSheet[in_style]
- self.story.append(Paragraph(self.encode(text), style, bulletText=None))
-
- def append_normal(self,text):
- style = self.styleSheet['Normal']
- self.story.append(Paragraph(self.encode(text), style, bulletText=None))
-
- def starttag(self, node, tagname, suffix='\n', **attributes):
- atts = {}
- for (name, value) in attributes.items():
- atts[name.lower()] = value
- for att in ('class',): # append to node attribute
- if node.has_key(att):
- if atts.has_key(att):
- atts[att] = node[att] + ' ' + atts[att]
- for att in ('id',): # node attribute overrides
- if node.has_key(att):
- atts[att] = node[att]
- attlist = atts.items()
- attlist.sort()
- parts = [tagname.upper()]
- for name, value in attlist:
- if value is None: # boolean attribute
- parts.append(name.upper())
- elif isinstance(value, ListType):
- values = [str(v) for v in value]
- parts.append('%s="%s"' % (name.upper(),
- self.encode(' '.join(values))))
- else:
- parts.append('%s="%s"' % (name.upper(),
- self.encode(str(value))))
- return '<%s>%s' % (' '.join(parts), suffix)
-
- def visit_Text(self, node):
- #self.body.append(self.encode(node.astext()))
- # Text is visited for every element ?
- #self.append_normal("Text:"+node.astext())
- pass
-
- def depart_Text(self, node):
- pass
-
- def visit_admonition(self, node, name):
- self.body.append(self.starttag(node, 'div', CLASS=name))
- self.body.append('<P CLASS="admonition-title">' + self.language.labels[name] + '</P>\n')
-
- def depart_admonition(self):
- self.body.append('</DIV>\n')
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- self.body.append(self.starttag(node, 'blockquote'))
-
- def depart_block_quote(self, node):
- self.body.append('</BLOCKQUOTE>\n')
-
- def visit_bullet_list(self, node):
- if self.topic_class == 'contents':
- self.body.append(self.starttag(node, 'ul', compact=None))
- else:
- style = self.styleSheet['Normal']
- self.story.append(Paragraph(self.encode(node.astext()),
- style, bulletText=self.bulletText))
-
- def depart_bullet_list(self, node):
- pass
-
- def visit_caption(self, node):
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- self.body.append('</P>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.body.append('<COL CLASS="label">\n'
- '<COL>\n'
- '<TBODY VALIGN="top">\n'
- '<TR><TD>\n')
-
- def depart_citation(self, node):
- self.body.append('</TD></TR>\n'
- '</TBODY>\n</TABLE>\n')
-
- def visit_citation_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.doctree.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href, #node['refid'],
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- self.body.append(']</A>')
-
- def visit_classifier(self, node):
- self.body.append(' <SPAN CLASS="classifier-delimiter">:</SPAN> ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- self.body.append('</SPAN>')
-
- def visit_colspec(self, node):
- atts = {}
- #if node.has_key('colwidth'):
- # atts['width'] = str(node['colwidth']) + '*'
- self.body.append(self.starttag(node, 'col', **atts))
-
- def depart_colspec(self, node):
- pass
-
- def visit_comment(self, node):
- self.body.append('<!-- ')
-
- def depart_comment(self, node):
- self.body.append(' -->\n')
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'contact')
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_definition(self, node):
- self.body.append('</DT>\n')
- self.body.append(self.starttag(node, 'dd'))
-
- def depart_definition(self, node):
- self.body.append('</DD>\n')
-
- def visit_definition_list(self, node):
- self.body.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- self.body.append('</DL>\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- self.body.append('<TD>\n')
-
- def depart_description(self, node):
- self.body.append('</TD>')
-
- def visit_docinfo(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='docinfo',
- frame="void", rules="none"))
- self.body.append('<COL CLASS="docinfo-name">\n'
- '<COL CLASS="docinfo-content">\n'
- '<TBODY VALIGN="top">\n')
-
- def depart_docinfo(self, node):
- self.body.append('</TBODY>\n</TABLE>\n')
-
- def visit_docinfo_item(self, node, name):
- self.head.append('<META NAME="%s" CONTENT="%s">\n'
- % (name, self.encode(node.astext())))
- self.body.append(self.starttag(node, 'tr', ''))
- self.body.append('<TD>\n'
- '<P CLASS="docinfo-name">%s:</P>\n'
- '</TD><TD>\n'
- '<P>' % self.language.labels[name])
-
- def depart_docinfo_item(self):
- self.body.append('</P>\n</TD></TR>')
-
- def visit_doctest_block(self, node):
- self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
- def depart_doctest_block(self, node):
- self.body.append('</PRE>\n')
-
- def visit_document(self, node):
- self.body.append(self.starttag(node, 'div', CLASS='document'))
-
- def depart_document(self, node):
- self.body.append('</DIV>\n')
- #self.body.append(
- # '<P CLASS="credits">HTML generated from <CODE>%s</CODE> on %s '
- # 'by <A HREF="http://docutils.sourceforge.net/">Docutils</A>.'
- # '</P>\n' % (node['source'], time.strftime('%Y-%m-%d')))
-
- def visit_emphasis(self, node):
- self.append_styled(node.astext(),'Italic')
-
- def depart_emphasis(self, node):
- pass
-
- def visit_entry(self, node):
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, **atts))
- self.context.append('</%s>' % tagname.upper())
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
-
- def depart_entry(self, node):
- self.body.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- """
- The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
- CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
- usable.
- """
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['class'] = node['enumtype']
- # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
- # single "format" attribute? Use CSS2?
- self.body.append(self.starttag(node, 'ol', **atts))
-
- def depart_enumerated_list(self, node):
- self.body.append('</OL>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- self.body.append(self.starttag(node, 'tr', CLASS='field'))
-
- def depart_field(self, node):
- self.body.append('</TR>\n')
-
- def visit_field_argument(self, node):
- self.body.append(' ')
- self.body.append(self.starttag(node, 'span', '',
- CLASS='field-argument'))
-
- def depart_field_argument(self, node):
- self.body.append('</SPAN>')
-
- def visit_field_body(self, node):
- self.body.append(':</P>\n</TD><TD>')
- self.body.append(self.starttag(node, 'div', CLASS='field-body'))
-
- def depart_field_body(self, node):
- self.body.append('</DIV></TD>\n')
-
- def visit_field_list(self, node):
- self.body.append(self.starttag(node, 'table', frame='void',
- rules='none'))
- self.body.append('<COL CLASS="field-name">\n'
- '<COL CLASS="field-body">\n'
- '<TBODY VALIGN="top">\n')
-
- def depart_field_list(self, node):
- self.body.append('</TBODY>\n</TABLE>\n')
-
- def visit_field_name(self, node):
- self.body.append('<TD>\n')
- self.body.append(self.starttag(node, 'p', '', CLASS='field-name'))
-
- def depart_field_name(self, node):
- """
- Leave the end tag to `self.visit_field_body()`, in case there are any
- field_arguments.
- """
- pass
-
- def visit_figure(self, node):
- self.body.append(self.starttag(node, 'div', CLASS='figure'))
-
- def depart_figure(self, node):
- self.body.append('</DIV>\n')
-
- def visit_footnote(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='footnote',
- frame="void", rules="none"))
- self.body.append('<COL CLASS="label">\n'
- '<COL>\n'
- '<TBODY VALIGN="top">\n'
- '<TR><TD>\n')
-
- def depart_footnote(self, node):
- self.body.append('</TD></TR>\n'
- '</TBODY>\n</TABLE>\n')
-
- def visit_footnote_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.doctree.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '', href=href, #node['refid'],
- CLASS='footnote-reference'))
-
- def depart_footnote_reference(self, node):
- self.body.append('</A>')
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- atts = node.attributes.copy()
- atts['src'] = atts['uri']
- del atts['uri']
- if not atts.has_key('alt'):
- atts['alt'] = atts['src']
- self.body.append(self.starttag(node, 'img', '', **atts))
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_interpreted(self, node):
- self.body.append('<SPAN class="interpreted">')
-
- def depart_interpreted(self, node):
- self.body.append('</SPAN>')
-
- def visit_label(self, node):
- self.body.append(self.starttag(node, 'p', '[', CLASS='label'))
-
- def depart_label(self, node):
- self.body.append(']</P>\n'
- '</TD><TD>\n')
-
- def visit_legend(self, node):
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- self.body.append('</DIV>\n')
-
- def visit_list_item(self, node):
- self.body.append(self.starttag(node, 'li'))
-
- def depart_list_item(self, node):
- self.body.append('</LI>\n')
-
- def visit_literal(self, node):
- self.body.append('<CODE>')
-
- def depart_literal(self, node):
- self.body.append('</CODE>')
-
- def visit_literal_block(self, node):
- self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
-
- def depart_literal_block(self, node):
- self.body.append('</PRE>\n')
-
- def visit_meta(self, node):
- self.head.append(self.starttag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- if self.context[-1]:
- self.body.append(', ')
-
- def depart_option(self, node):
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'span', '',
- CLASS='option-argument'))
-
- def depart_option_argument(self, node):
- self.body.append('</SPAN>')
-
- def visit_option_group(self, node):
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</TR>\n<TR><TD>&nbsp;</TD>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'td', **atts))
- self.body.append('<P><CODE>')
- self.context.append(0)
-
- def depart_option_group(self, node):
- self.context.pop()
- self.body.append('</CODE></P>\n</TD>')
- self.body.append(self.context.pop())
-
- def visit_option_list(self, node):
- self.body.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none", cellspacing=12))
- self.body.append('<COL CLASS="option">\n'
- '<COL CLASS="description">\n'
- '<TBODY VALIGN="top">\n')
-
- def depart_option_list(self, node):
- self.body.append('</TBODY>\n</TABLE>\n')
-
- def visit_option_list_item(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- self.body.append('</TR>\n')
-
- def visit_option_string(self, node):
- self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- self.body.append('</SPAN>')
-
- def visit_organization(self, node):
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- if not self.topic_class == 'contents':
- self.append_normal(node.astext())
-
- def depart_paragraph(self, node):
- if self.topic_class == 'contents':
- self.append_normal('\n')
- else:
- self.append_normal('\n')
-
- def visit_problematic(self, node):
- if node.hasattr('refid'):
- self.body.append('<A HREF="#%s">' % node['refid'])
- self.context.append('</A>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- self.body.append('</SPAN>')
- self.body.append(self.context.pop())
-
- def visit_raw(self, node):
- if node.has_key('format') and node['format'] == 'html':
- self.body.append(node.astext())
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- if node.has_key('refuri'):
- href = node['refuri']
- elif node.has_key('refid'):
- #else:
- href = '#' + node['refid']
- elif node.has_key('refname'):
- # @@@ Check for non-existent mappings. Here or in a transform?
- href = '#' + self.doctree.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '', href=href,
- CLASS='reference'))
-
- def depart_reference(self, node):
- self.body.append('</A>')
-
- def visit_revision(self, node):
- self.visit_docinfo_item(node, 'revision')
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- self.body.append('</TR>\n')
-
- def visit_section(self, node):
- self.sectionlevel += 1
- self.body.append(self.starttag(node, 'div', CLASS='section'))
-
- def depart_section(self, node):
- self.sectionlevel -= 1
- self.body.append('</DIV>\n')
-
- def visit_status(self, node):
- self.visit_docinfo_item(node, 'status')
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- self.body.append('<STRONG>')
-
- def depart_strong(self, node):
- self.body.append('</STRONG>')
-
- def visit_subtitle(self, node):
- self.append_styled(node.astext(),'h2')
-
- def depart_subtitle(self, node):
- pass
-
- def visit_title(self, node):
- """Only 6 section levels are supported by HTML."""
- if isinstance(node.parent, nodes.topic):
- self.body.append(
- self.starttag(node, 'P', '', CLASS='topic-title'))
- self.context.append('</P>\n')
- elif self.sectionlevel == 0:
- self.head.append('<TITLE>%s</TITLE>\n'
- % self.encode(node.astext()))
- self.body.append(self.starttag(node, 'H1', '', CLASS='title'))
- self.context.append('</H1>\n')
- self.append_styled(node.astext(),'h1')
- else:
- self.append_styled(node.astext(), "h%s" % self.sectionlevel )
- context = ''
- if node.hasattr('refid'):
- self.body.append('<A HREF="#%s">' % node['refid'])
- context = '</A>'
- self.context.append('%s</H%s>\n' % (context, self.sectionlevel))
-
- def depart_title(self, node):
- self.body.append(self.context.pop())
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
diff --git a/sandbox/grubert/rlpdf/rltemplate.py b/sandbox/grubert/rlpdf/rltemplate.py
deleted file mode 100644
index dc462430f..000000000
--- a/sandbox/grubert/rlpdf/rltemplate.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#copyright ReportLab Inc. 2000
-#see rllicense.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/tools/rltemplate.py?cvsroot=reportlab
-#$Header$
-# doc template for RL manuals. Currently YAML is hard-coded
-#to use this, which is wrong.
-
-
-from reportlab.platypus import PageTemplate, \
- BaseDocTemplate, SimpleDocTemplate, Frame, Paragraph
-from reportlab.lib.units import inch, cm
-from reportlab.rl_config import defaultPageSize
-
-
-class FrontCoverTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- frame1 = Frame(inch,
- 3*inch,
- self.pageWidth - 2*inch,
- self.pageHeight - 518, id='cover')
- PageTemplate.__init__(self, id, [frame1]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- canvas.saveState()
- #canvas.drawImage('../images/replogo.gif',2*inch, 8*inch)
-
-
- canvas.setFont('Times-Roman', 10)
- canvas.line(inch, 120, self.pageWidth - inch, 120)
-
- #canvas.drawString(inch, 100, 'Lombard Business Park')
- #canvas.drawString(inch, 88, '8 Lombard Road')
- #canvas.drawString(inch, 76, 'Wimbledon')
- #canvas.drawString(inch, 64, 'London, ENGLAND SW19 3TZ')
-
- #canvas.drawRightString(self.pageWidth - inch, 100, '103 Bayard Street')
- #canvas.drawRightString(self.pageWidth - inch, 88, 'New Brunswick')
- #canvas.drawRightString(self.pageWidth - inch, 76, 'New Jersey, 08904)')
- #canvas.drawRightString(self.pageWidth - inch, 64, 'USA')
-
- canvas.restoreState()
-
-
-class OneColumnTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- frame1 = Frame(inch,
- inch,
- self.pageWidth - 2*inch,
- self.pageHeight - 2*inch,
- id='normal')
- PageTemplate.__init__(self, id, [frame1]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- y = self.pageHeight - 50
- canvas.saveState()
- canvas.setFont('Times-Roman', 10)
- canvas.drawString(inch, y+8, doc.title)
- canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter)
- canvas.line(inch, y, self.pageWidth - inch, y)
- canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber())
- canvas.restoreState()
-
-class TwoColumnTemplate(PageTemplate):
- def __init__(self, id, pageSize=defaultPageSize):
- self.pageWidth = pageSize[0]
- self.pageHeight = pageSize[1]
- colWidth = 0.5 * (self.pageWidth - 2.25*inch)
- frame1 = Frame(inch,
- inch,
- colWidth,
- self.pageHeight - 2*inch,
- id='leftCol')
- frame2 = Frame(0.5 * self.pageWidth + 0.125,
- inch,
- colWidth,
- self.pageHeight - 2*inch,
- id='rightCol')
- PageTemplate.__init__(self, id, [frame1, frame2]) # note lack of onPage
-
- def afterDrawPage(self, canvas, doc):
- y = self.pageHeight - 50
- canvas.saveState()
- canvas.setFont('Times-Roman', 10)
- canvas.drawString(inch, y+8, doc.title)
- canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter)
- canvas.line(inch, y, self.pageWidth - inch, y*inch)
- canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber())
- canvas.restoreState()
-
-
-# class RLDocTemplate(BaseDocTemplate):
-class RLDocTemplate(SimpleDocTemplate):
- def afterInit(self):
- self.addPageTemplates(FrontCoverTemplate('Cover', self.pagesize))
- self.addPageTemplates(OneColumnTemplate('Normal', self.pagesize))
- self.addPageTemplates(TwoColumnTemplate('TwoColumn', self.pagesize))
- self.addPageTemplates(OneColumnTemplate('Cover', self.pagesize))
-
- #just playing
- self.title = "(Document Title Goes Here)"
- self.chapter = "(No chapter yet)"
- self.chapterNo = 1 #unique keys
- self.sectionNo = 1 # unique keys
-
-## # AR hack
-## self.counter = 1
- def beforeDocument(self):
- self.canv.showOutline()
-
- def afterFlowable(self, flowable):
- """Detect Level 1 and 2 headings, build outline,
- and track chapter title."""
- if isinstance(flowable, Paragraph):
- style = flowable.style.name
-
-## #AR debug text
-## try:
-## print '%d: %s...' % (self.counter, flowable.getPlainText()[0:40])
-## except AttributeError:
-## print '%d: (something with ABag)' % self.counter
-## self.counter = self.counter + 1
-
- if style == 'Title':
- self.title = flowable.getPlainText()
- elif style == 'Heading1':
- self.chapter = flowable.getPlainText()
- key = 'ch%d' % self.chapterNo
- self.canv.bookmarkPage(key)
- self.canv.addOutlineEntry(flowable.getPlainText(),
- key, 0, 0)
- self.chapterNo = self.chapterNo + 1
- self.sectionNo = 1
- elif style == 'Heading2':
- self.section = flowable.text
- key = 'ch%ds%d' % (self.chapterNo, self.sectionNo)
- self.canv.bookmarkPage(key)
- self.canv.addOutlineEntry(flowable.getPlainText(),
- key, 1, 0)
- self.sectionNo = self.sectionNo + 1
diff --git a/sandbox/grubert/rlpdf/stylesheet.py b/sandbox/grubert/rlpdf/stylesheet.py
deleted file mode 100644
index 3b7749935..000000000
--- a/sandbox/grubert/rlpdf/stylesheet.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#copyright ReportLab Inc. 2000
-#see rllicense.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/tools/stylesheet.py?cvsroot=reportlab
-#$Header$
-#standard stylesheet for our manuals
-from reportlab.lib.styles import StyleSheet1, ParagraphStyle
-from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
-from reportlab.lib import colors
-
-
-def getStyleSheet():
- """Returns a stylesheet object"""
- stylesheet = StyleSheet1()
-
- stylesheet.add(ParagraphStyle(name='Normal',
- fontName='Times-Roman',
- fontSize=10,
- leading=12,
- spaceBefore=6)
- )
-
- stylesheet.add(ParagraphStyle(name='Comment',
- fontName='Times-Italic')
- )
-
- stylesheet.add(ParagraphStyle(name='Indent1',
- leftIndent=36,
- firstLineIndent=0)
- )
-
- stylesheet.add(ParagraphStyle(name='BodyText',
- parent=stylesheet['Normal'],
- spaceBefore=6)
- )
- stylesheet.add(ParagraphStyle(name='Italic',
- parent=stylesheet['BodyText'],
- fontName = 'Times-Italic')
- )
-
- stylesheet.add(ParagraphStyle(name='Heading1',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- alignment=TA_CENTER,
- fontSize=18,
- leading=22,
- spaceAfter=6),
- alias='h1')
-
- stylesheet.add(ParagraphStyle(name='Heading2',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=14,
- leading=17,
- spaceBefore=12,
- spaceAfter=6),
- alias='h2')
-
- stylesheet.add(ParagraphStyle(name='Heading3',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- fontSize=12,
- leading=14,
- spaceBefore=12,
- spaceAfter=6),
- alias='h3')
-
- stylesheet.add(ParagraphStyle(name='Heading4',
- parent=stylesheet['Normal'],
- fontName = 'Times-BoldItalic',
- spaceBefore=10,
- spaceAfter=4),
- alias='h4')
-
- stylesheet.add(ParagraphStyle(name='Title',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=48,
- leading=56,
- spaceAfter=72,
- alignment=TA_CENTER
- ),
- alias='t')
-
- stylesheet.add(ParagraphStyle(name='Subtitle',
- parent=stylesheet['Normal'],
- fontName = 'Times-Bold',
- fontSize=32,
- leading=56,
- spaceAfter=72,
- alignment=TA_CENTER
- ),
- alias='subtitle')
-
- stylesheet.add(ParagraphStyle(name='Bullet',
- parent=stylesheet['Normal'],
- firstLineIndent=0,
- leftIndent=36,
- bulletIndent=18,
- spaceBefore=0,
- bulletFontName='Symbol'),
- alias='bu')
-
- stylesheet.add(ParagraphStyle(name='Definition',
- parent=stylesheet['Normal'],
- firstLineIndent=0,
- leftIndent=36,
- bulletIndent=0,
- spaceBefore=6,
- bulletFontName='Times-BoldItalic'),
- alias='df')
-
- stylesheet.add(ParagraphStyle(name='Code',
- parent=stylesheet['Normal'],
- fontName='Courier',
- textColor=colors.navy,
- fontSize=8,
- leading=8.8,
- leftIndent=36,
- firstLineIndent=0))
-
- stylesheet.add(ParagraphStyle(name='FunctionHeader',
- parent=stylesheet['Normal'],
- fontName='Courier-Bold',
- fontSize=8,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='DocString',
- parent=stylesheet['Normal'],
- fontName='Courier',
- fontSize=8,
- leftIndent=18,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='DocStringIndent',
- parent=stylesheet['Normal'],
- fontName='Courier',
- fontSize=8,
- leftIndent=36,
- leading=8.8))
-
- stylesheet.add(ParagraphStyle(name='URL',
- parent=stylesheet['Normal'],
- fontName='Courier',
- textColor=colors.navy,
- alignment=TA_CENTER),
- alias='u')
-
- stylesheet.add(ParagraphStyle(name='Centred',
- parent=stylesheet['Normal'],
- alignment=TA_CENTER
- ))
-
- stylesheet.add(ParagraphStyle(name='Caption',
- parent=stylesheet['Centred'],
- fontName='Times-Italic'
- ))
-
- return stylesheet
diff --git a/sandbox/grubert/runtest b/sandbox/grubert/runtest
deleted file mode 100755
index ad23b39a8..000000000
--- a/sandbox/grubert/runtest
+++ /dev/null
@@ -1,227 +0,0 @@
-#!/bin/sh
-
-# quick latex writer test runner
-# $Id$
-
-CHECKS=0
-FAILS=0
-FAIL_QUEUE=""
-
-function do_diff() {
- CHECKS=$((CHECKS + 1))
- diff -q -s $1 $2
- if test $? -gt 0 ; then
- FAILS=$((FAILS + 1))
- FAIL_QUEUE="$FAIL_QUEUE,$1"
- fi
-}
-
-function report() {
- echo "-------------------------------------"
- if test $FAILS -eq 0 ; then
- echo "OK: all $CHECKS tests passed"
- else
- echo "ERROR: $FAILS of $CHECKS failed"
- echo "Failed tests: $FAIL_QUEUE"
- fi
-}
-
-BASE_CMD="../../tools/rst2latex.py"
-
-CMD="../../tools/rst2latex.py"
-if [ -z "$1" ] ; then
- FM="*.txt"
-else
- FM=$1
-fi
-
-
-for INF in `ls test/$FM` ; do
- OUTF="$INF.tex"
- REFF="$OUTF.ref"
- $CMD $2 $3 $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-if [ -n "$1" -a ! "$1" == "-" ] ; then
- report
- exit
-fi
-
-INF=test/header.txt
-for GO in "" auto pdftex dvips,300dpi ; do
- OUTF="$INF-graphicx-option-$GO.tex"
- REFF="$OUTF.ref"
- $CMD --graphicx-option=$GO $2 $3 $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-# font encoding
-CMD="../../tools/rst2latex.py"
-for FONTENC in "" T1 OT1 ; do
- for INF in `ls test/characters.txt` ; do
- OUTF="$INF-$FONTENC.tex"
- REFF="$OUTF.ref"
- if [ -z $FONTENC ] ; then
- $CMD $2 $3 $INF > $OUTF
- else
- $CMD --font-encoding=$FONTENC $2 $3 $INF > $OUTF
- fi
- do_diff $REFF $OUTF
- done
-done
-
-# table-style
-CMD="../../tools/rst2latex.py"
-
-for TABSTYLE in "" standard booktabs nolines ; do
- for INF in `ls test/tables.txt` ; do
- OUTF="$INF-$TABSTYLE.tex"
- REFF="$OUTF.ref"
- if [ -z $TABSTYLE ] ; then
- $CMD $2 $3 $INF > $OUTF
- else
- $CMD --table-style=$TABSTYLE $2 $3 $INF > $OUTF
- fi
- do_diff $REFF $OUTF
- done
-done
-
-# rowspan tables
-CMD="../../tools/rst2latex.py"
-INF=test/tables-multirow.txt
-OUTF="$INF.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-# with generated footer
-CMD="../../tools/rst2latex.py -gs"
-INF=test/docinfo.txt
-OUTF="$INF-gs.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="../../tools/rst2latex.py --documentclass=book"
-INF=test/docinfo.txt
-OUTF="$INF-book.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-#CMD="../../tools/rst2latex.py --dump-settings"
-CMD="../../tools/rst2latex.py --no-doc-info"
-INF=test/docinfo.txt
-OUTF="$INF-no-info.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="../../tools/rst2latex.py --no-doc-title"
-INF=test/docinfo.txt
-OUTF="$INF-no-title.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="../../tools/rst2latex.py --no-doc-title --no-doc-info"
-INF=test/docinfo.txt
-OUTF="$INF-no-title-info.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="$BASE_CMD --use-latex-docinfo"
-for F in docinfo docinfo-2 ; do
- INF=test/$F.txt
- OUTF="$INF-use-latex-docinfo.tex"
- REFF="$OUTF.ref"
- $CMD $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-CMD="../../tools/rst2latex.py"
-# with latex toc
-for F in toc ; do
- INF=test/$F.txt
- OUTF="$INF-use-latex-toc.tex"
- REFF="$OUTF.ref"
- $CMD --use-latex-toc $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-# german
-for F in toc ; do
- INF=test/$F.txt
- OUTF="$INF-de.tex"
- REFF="$OUTF.ref"
- $CMD -l de $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-# french
-for F in toc ; do
- INF=test/$F.txt
- OUTF="$INF-fr.tex"
- REFF="$OUTF.ref"
- $CMD -l fr $INF > $OUTF
- do_diff $REFF $OUTF
-done
-
-# use latex footnotes
-CMD="../../tools/rst2latex.py --use-latex-footnotes"
-INF=test/footnotes.txt
-OUTF="$INF-use-latex-footnotes.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-# use latex citations
-CMD="../../tools/rst2latex.py --use-latex-citations"
-INF=test/footnotes.txt
-OUTF="$INF-use-latex-citations.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-# on a file without citations
-INF=test/no-citations.txt
-OUTF="$INF-use-latex-citations.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="../../tools/rst2latex.py --use-verbatim-when-possible"
-INF=test/literal.txt
-OUTF="$INF-use-verbatim-when-possible.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-report
-echo "CHECK: toc with latex toc "
-
-exit
-
-# lost test files.
-
-INF=test/kasten.txt
-OUTF="$INF-de.tex"
-REFF="$OUTF.ref"
-$CMD -l de $INF > $OUTF
-do_diff $REFF $OUTF
-
-CMD="../../tools/rst2latex.py --attribution=parens"
-INF=test/attribution.txt
-OUTF="$INF-parens-attribution.tex"
-REFF="$OUTF.ref"
-$CMD $INF > $OUTF
-do_diff $REFF $OUTF
-
-INF=test/iso-8859-15.txt
-OUTF="$INF-enc.tex"
-REFF="$OUTF.ref"
-$CMD --input-encoding=iso-8859-15 --output-encoding=iso-8859-15 $INF > $OUTF
-do_diff $REFF $OUTF
-
-
diff --git a/sandbox/grubert/split-test-txt.py b/sandbox/grubert/split-test-txt.py
deleted file mode 100644
index 81cb1fd84..000000000
--- a/sandbox/grubert/split-test-txt.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/python
-
-"""
-Author: grubert@users.sourceforge.net
-Revision: $Revision$
-
-Split docutils/tools/test.txt up to test one by one.
-"""
-
-import sys, os, os.path
-
-if len(sys.argv)>1:
- test_filename = sys.argv[1]
-else:
- # run from sandbox subdirectory.
- test_filename = "../../tools/test.txt"
-
-if not os.path.exists(test_filename):
- print "Testfile not found:", test_filename
- sys.exit()
-
-print "Using file:", test_filename
-
-class Output:
- def __init__(self,test_dir="test"):
- self._file = 0
- self._file_cnt = 0
- self._test_dir = test_dir
- self._test_file = "from_test_txt"
- def close(self):
- if self._file:
- self._file.close()
- def next_file(self):
- self.close()
- self._file_cnt += 1
- self._file = open("%s/%s-%02d.txt.new"
- %(self._test_dir,self._test_file,self._file_cnt),"w")
- def write_line(self,str):
- self._file.write(str+"\n")
- def get_count(self):
- return self._file_cnt
-
-out = Output()
-out.next_file()
-
-line_before = -1
-section_one = 1 # header plus first section into first file
-for line in open(test_filename).readlines():
- line = line.rstrip() # remove end of line
- # we split on "------" sections.
- if ((len(line)>0)and(line == "-"*(len(line)))and(len(line)==len(line_before))):
- if not section_one:
- out.next_file()
- print section_one,line_before,line
- section_one = 0
- if not (type(line_before)==type(-1)):
- # special treatment of start block
- out.write_line(line_before)
- line_before = line
-
-out.close()
diff --git a/sandbox/grubert/style.tex b/sandbox/grubert/style.tex
deleted file mode 100644
index 6b7348428..000000000
--- a/sandbox/grubert/style.tex
+++ /dev/null
@@ -1,30 +0,0 @@
-% donot indent first line.
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{5pt plus 2pt minus 1pt}
-
-% sloppy
-% ------
-% Less strict (opposite to default fussy) space size between words. Therefore
-% less hyphenation.
-\sloppy
-
-% fonts
-% -----
-% times for pdf generation, gives smaller pdf files.
-%
-% But in standard postscript fonts: courier and times/helvetica do not fit.
-% Maybe use pslatex.
-\usepackage{times}
-
-% pagestyle
-\pagestyle{headings}
-
-% change maketitle
-\renewcommand{\maketitle}{
- \begin{titlepage}
- \begin{center}
- \textsf{TITLE \@title} \\
- Date: \today
- \end{center}
- \end{titlepage}
-}
diff --git a/sandbox/grubert/test/README.txt b/sandbox/grubert/test/README.txt
deleted file mode 100644
index 4b8f93664..000000000
--- a/sandbox/grubert/test/README.txt
+++ /dev/null
@@ -1,332 +0,0 @@
-==================
- README: Docutils
-==================
-
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:Date: $Date$
-:Web site: http://docutils.sourceforge.net/
-:Copyright: This document has been placed in the public domain.
-
-.. contents::
-
-
-Thank you for downloading the Python Docutils project archive. As
-this is a work in progress, please check the project website for
-updated working files (snapshots). This project should be considered
-highly experimental; APIs are subject to change at any time.
-
-
-Quick-Start
-===========
-
-This is for those who want to get up & running quickly. Read on for
-complete details.
-
-1. Get and install the latest release of Python, available from
-
- http://www.python.org/
-
- Python 2.2 or later [#py21]_ is required; Python 2.2.2 or later is
- recommended.
-
-2. Use the latest Docutils code. Get the code from CVS or from the
- snapshot:
-
- http://docutils.sf.net/docutils-snapshot.tgz
-
- See `Releases & Snapshots`_ below for details.
-
-3. Unpack the tarball in a temporary directory (**not** directly in
- Python's ``site-packages``) and install with the standard ::
-
- python setup.py install
-
- See Installation_ below for details.
-
-4. Use a front-end tool from the "tools" subdirectory of the same
- directory as in step 3. For example::
-
- cd tools
- html.py test.txt test.html
-
- See Usage_ below for details.
-
-
-Purpose
-=======
-
-The purpose of the Docutils project is to create a set of tools for
-processing plaintext documentation into useful formats, such as HTML,
-XML, and TeX. Support for the following sources has been implemented:
-
-* Standalone files.
-
-* `PEPs (Python Enhancement Proposals)`_.
-
-Support for the following sources is planned:
-
-* Inline documentation from Python modules and packages, extracted
- with namespace context. **This is the focus of the current
- development effort.**
-
-* Email (RFC-822 headers, quoted excerpts, signatures, MIME parts).
-
-* Wikis, with global reference lookups of "wiki links".
-
-* Compound documents, such as multiple chapter files merged into a
- book.
-
-* And others as discovered.
-
-.. _PEPs (Python Enhancement Proposals):
- http://www.python.org/peps/pep-0012.html
-
-
-Releases & Snapshots
-====================
-
-Putting together an official "Release" of Docutils is a significant
-effort, so it isn't done that often. In the meantime, the CVS
-snapshots always contain the latest code and documentation, usually
-updated within an hour of changes being committed to the repository,
-and usually bug-free:
-
-* Snapshot of Docutils code, front-end tools, tests, documentation,
- and specifications: http://docutils.sf.net/docutils-snapshot.tgz
-
-* Snapshot of the Sandbox (experimental, contributed code):
- http://docutils.sf.net/docutils-sandbox-snapshot.tgz
-
-* Snapshot of web files (the files that generate the web site):
- http://docutils.sf.net/docutils-web-snapshot.tgz
-
-To keep up to date on the latest developments, download fresh copies
-of the snapshots regularly. New functionality is being added weekly,
-sometimes daily. (There's also the CVS repository, and a mailing list
-for CVS messages. See the web site [address above] or spec/notes.txt
-for details.)
-
-
-Requirements
-============
-
-To run the code, Python 2.2 or later [#py21]_ must already be
-installed. The latest release is recommended (2.2.2 as of this
-writing). Python is available from http://www.python.org/.
-
-.. [#py21] Python 2.1 may be used providing the compiler package is
- installed. The compiler package can be found in the Tools/
- directory of Python 2.1's source distribution.
-
-
-Project Files & Directories
-===========================
-
-* README.txt: You're reading it.
-
-* COPYING.txt: Public Domain Dedication and copyright details for
- non-public-domain files (most are PD).
-
-* FAQ.txt: Docutils Frequently Asked Questions.
-
-* HISTORY.txt: Release notes for the current and previous project
- releases.
-
-* setup.py: Installation script. See "Installation" below.
-
-* install.py: Quick & dirty installation script. Just run it.
-
-* docutils: The project source directory, installed as a Python
- package.
-
-* extras: Directory for third-party modules that Docutils depends on.
- These are only installed if they're not already present.
-
-* docs: The project user documentation directory. Contains the
- following documents:
-
- - docs/tools.txt: Docutils Front-End Tools
- - docs/latex.txt: Docutils LaTeX Writer
- - docs/rst/quickstart.txt: A ReStructuredText Primer
- - docs/rst/quickref.html: Quick reStructuredText (HTML only)
-
-* licenses: Directory containing copies of license files for
- non-public-domain files.
-
-* spec: The project specification directory. Contains PEPs (Python
- Enhancement Proposals), XML DTDs (document type definitions), and
- other documents. The ``spec/rst`` directory contains the
- reStructuredText specification. The ``spec/howto`` directory
- contains How-To documents for developers.
-
-* tools: Directory for Docutils front-end tools. See docs/tools.txt
- for documentation.
-
-* test: Unit tests. Not required to use the software, but very useful
- if you're planning to modify it. See `Running the Test Suite`_
- below.
-
-
-Installation
-============
-
-The first step is to expand the ``.tar.gz`` or ``.tgz`` archive in a
-temporary directory (**not** directly in Python's ``site-packages``).
-It contains a distutils setup file "setup.py". OS-specific
-installation instructions follow.
-
-
-GNU/Linux, BSDs, Unix, Mac OS X, etc.
--------------------------------------
-
-1. Open a shell.
-
-2. Go to the directory created by expanding the archive::
-
- cd <archive_directory_path>
-
-3. Install the package::
-
- python setup.py install
-
- If the python executable isn't on your path, you'll have to specify
- the complete path, such as /usr/local/bin/python. You may need
- root permissions to complete this step.
-
-You can also just run install.py; it does the same thing.
-
-
-Windows
--------
-
-1. Open a DOS box (Command Shell, MSDOS Prompt, or whatever they're
- calling it these days).
-
-2. Go to the directory created by expanding the archive::
-
- cd <archive_directory_path>
-
-3. Install the package::
-
- <path_to_python.exe>\python setup.py install
-
-If your system is set up to run Python when you double-click on .py
-files, you can run install.py to do the same as the above.
-
-
-Mac OS 8/9
-----------
-
-1. Open the folder containing the expanded archive.
-
-2. Double-click on the file "setup.py", which should be a "Python
- module" file.
-
- If the file isn't a "Python module", the line endings are probably
- also wrong, and you will need to set up your system to recognize
- ".py" file extensions as Python files. See
- http://gotools.sourceforge.net/mac/python.html for detailed
- instructions. Once set up, it's easiest to start over by expanding
- the archive again.
-
-3. The distutils options window will appear. From the "Command" popup
- list choose "install", click "Add", then click "OK".
-
-If install.py is a "Python module" (see step 2 above if it isn't), you
-can run it (double-click) instead of the above. The distutils options
-window will not appear.
-
-
-Usage
-=====
-
-After unpacking and installing the Docutils package, the following
-shell commands will generate HTML for all included documentation::
-
- cd <archive_directory_path>/tools
- buildhtml.py ../
-
-The final directory name of the ``<archive_directory_path>`` is
-"docutils" for snapshots. For official releases, the directory may be
-called "docutils-X.Y", where "X.Y" is the release version.
-Alternatively::
-
- cd <archive_directory_path>
- tools/buildhtml.py --config=tools/docutils.conf
-
-Some files may generate system messages (warnings and errors). The
-``tools/test.txt`` file (under the archive directory) contains 5
-intentional errors. (They test the error reporting mechanism!)
-
-There are many front-end tools in the unpacked "tools" subdirectory.
-You may want to begin with the "html.py" front-end tool. Most tools
-take up to two arguments, the source path and destination path, with
-STDIN and STDOUT being the defaults. Use the "--help" option to the
-front-end tools for details on options and arguments. See `Docutils
-Front-End Tools`_ (``docs/tools.txt``) for full documentation.
-
-The package modules are continually growing and evolving. The
-``docutils.statemachine`` module is usable independently. It contains
-extensive inline documentation (in reStructuredText format of course).
-
-Contributions are welcome!
-
-.. _Docutils Front-End Tools: docs/tools.html
-
-
-Running the Test Suite
-======================
-
-To run the entire test suite, after installation_ open a shell and use
-the following commands::
-
- cd <archive_directory_path>/test
- ./alltests.py
-
-You should see a long line of periods, one for each test, and then a
-summary like this::
-
- Ran 518 tests in 24.653s
-
- OK
- Elapsed time: 26.189 seconds
-
-The number of tests will grow over time, and the times reported will
-depend on the computer running the tests. The difference between the
-two times represents the time required to set up the tests (import
-modules, create data structures, etc.).
-
-If any of the tests fail, please `open a bug report`_ or `send
-email`_. Please include all relevant output, information about your
-operating system, Python version, and Docutils version. To see the
-Docutils version, use these commands::
-
- cd ../tools
- ./quicktest.py --version
-
-.. _open a bug report:
- http://sourceforge.net/tracker/?group_id=38414&atid=422030
-.. _send email: mailto:docutils-users@lists.sourceforge.net
- ?subject=Docutils%20test%20suite%20failure
-
-
-Getting Help
-============
-
-If you have questions or need assistance with Docutils or
-reStructuredText, please `post a message`_ to the `Docutils-Users
-mailing list`_.
-
-.. _post a message: mailto:docutils-users@lists.sourceforge.net
-.. _Docutils-Users mailing list:
- http://lists.sourceforge.net/lists/listinfo/docutils-users
-
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/sandbox/grubert/test/characters.txt b/sandbox/grubert/test/characters.txt
deleted file mode 100644
index 6094896b2..000000000
--- a/sandbox/grubert/test/characters.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-Character tests
-===============
-
-bracketts in lists
-------------------
-
-LaTeX has some special characters in certain cases, e.g. # is LaTeX's macro
-argument chracter.
-
-Bracketts also have some meaning in macros, but need(ed) no special treatment
-up to now.
-
-1. [Advanced] test from dave.
-
-
- 1. The bracketts don't show up.
- They are in TeX file, but they're missing in PDF and DVI.
-
- Probably because in LaTeX ::
-
- \begin{itemize}
- \item one is plain.
- \item [two] two becomes bold.
- \end{itemize}
-
- 2. Numbering [is] also missing for the "Advanced" test case above, not
- here in this line.
-
- 3. Simply escaping the []'s with a backslash in the LaTeX file puts
- "Advanced" centered emphasized on a separate line. But the "1." is
- displayed then.
-
- 4. Using LaTeX's enumerate environment instead of docutils's custom
- list environment for the list does not work too.
-
-*Fix* append "{}" to the item command, i.e. ::
-
-
-
- \item {} [Advanced]
-
-double back qoutes field list names
------------------------------------
-
-The *double back qoutes* in the follwing example are ignored, i.e.
-they are still *double back quotes* in TeX.
-
-Example
-
-
- :The ``lambda`` Operator: A metafunction which transforms a lambda
- expression into a corresponding metafunction class.
-
-This is not writer but reader specific.
-
-hash # in section title
------------------------
-
-with pdflatex.
-
-fontencodings
--------------
-
-In T1 literal text double hyphens and angle bracketts need help
-to remain two characters::
-
- << -- >>
-
-non literal "<< -- >>".
-
-
-
-
-
-
-
diff --git a/sandbox/grubert/test/docinfo-2.txt b/sandbox/grubert/test/docinfo-2.txt
deleted file mode 100644
index 2509b6bf2..000000000
--- a/sandbox/grubert/test/docinfo-2.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-==================
- README: Docutils
-==================
-
-:Authors: David, Laurel, Hardy
-:Contact: goodger@users.sourceforge.net
-:Date: $Date$
-:Web site: http://docutils.sourceforge.net/
-:Copyright: This document has been placed in the public domain.
-
-.. contents::
-
-
-Thank you for downloading the Python Docutils project archive. As
-this is a work in progress, please check the project website for
-updated working files (snapshots). This project should be considered
-highly experimental; APIs are subject to change at any time.
-
-
-Quick-Start
-===========
-
-This is for tests with docinfo and latex header settings.
-
diff --git a/sandbox/grubert/test/docinfo.txt b/sandbox/grubert/test/docinfo.txt
deleted file mode 100644
index 2d1fc2b53..000000000
--- a/sandbox/grubert/test/docinfo.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-==================
- README: Docutils
-==================
-
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:Date: $Date$
-:Web site: http://docutils.sourceforge.net/
-:Copyright: This document has been placed in the public domain.
-
-.. contents::
-
-
-Thank you for downloading the Python Docutils project archive. As
-this is a work in progress, please check the project website for
-updated working files (snapshots). This project should be considered
-highly experimental; APIs are subject to change at any time.
-
-
-Quick-Start
-===========
-
-This is for tests with docinfo and latex header settings.
-
diff --git a/sandbox/grubert/test/footnotes.txt b/sandbox/grubert/test/footnotes.txt
deleted file mode 100644
index f25bc7824..000000000
--- a/sandbox/grubert/test/footnotes.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-Footnote testing
-================
-
-
-Paragraphs contain text and may contain inline markup: *emphasis*,
-**strong emphasis**,
-footnote references (manually numbered [1]_,
-anonymous auto-numbered [#]_, labeled auto-numbered [#label]_, or
-symbolic [*]_), citation references ([CIT2002]_), and ...
-
-Footnotes
----------
-
-.. [1] A footnote contains body elements, consistently indented by at
- least 3 spaces.
-
- This is the footnote's second paragraph.
-
-.. [#label] Footnotes may be numbered, either manually (as in [1]_) or
- automatically using a "#"-prefixed label. This footnote has a
- label so it can be referred to from multiple places, both as a
- footnote reference ([#label]_) and as a hyperlink reference
- (label_).
-
-.. [#] This footnote is numbered automatically and anonymously using a
- label of "#" only.
-
-.. [*] Footnotes may also use symbols, specified with a "*" label.
- Here's a reference to the next footnote: [*]_.
-
-.. [*] This footnote shows the next symbol in the sequence.
-
-.. [4] Here's a footnote, with a reference to a footnote: [5]_.
-
-
-
-Citations
----------
-
-.. [CIT2002] Citations are text-labeled footnotes. They may be
- rendered separately and differently from footnotes.
-
-Here's a reference to the above, [CIT2002]_ citation.
-
-
-.. [5] We need a lot to trigger the "too many floats".
-
-
-Footnote with bullet list
--------------------------
-
-.. [#value_initialized] The concept of value-initialization was
- added to the C++ standard in the first "Technical Corrigendum".
-
- To value-initialize an object of type T means:
-
- - if T is a class type (clause 9) with a user-declared constructor
- (12.1), then the default constructor for T is
- called (and the initialization is ill-formed if T has no
- accessible default constructor);
-
- - if T is a non-union class type without a user-declared
- constructor, then every non-static data member
- and base-class component of T is value-initialized;
-
- - if T is an array type, then each element is value-initialized;
-
- - otherwise, the object is zero-initialized
-
diff --git a/sandbox/grubert/test/from_test_txt-01.txt b/sandbox/grubert/test/from_test_txt-01.txt
deleted file mode 100644
index ff9599d60..000000000
--- a/sandbox/grubert/test/from_test_txt-01.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-.. This is a comment. Note how any initial comments are moved by
- transforms to after the document title, subtitle, and docinfo.
-
-================================
- reStructuredText Test Document
-================================
-
-.. Above is the document title, and below is the subtitle.
- They are transformed from section titles after parsing.
-
---------------------------------
- Examples of Syntax Constructs
---------------------------------
-
-.. bibliographic fields (which also require a transform):
-
-:Author: David Goodger
-:Address: 123 Example Street
- Example, EX Canada
- A1B 2C3
-:Contact: goodger@users.sourceforge.net
-:Authors: Me; Myself; I
-:organization: humankind
-:date: $Date$
-:status: This is a "work in progress"
-:revision: $Revision$
-:version: 1
-:copyright: This document has been placed in the public domain. You
- may do with it as you wish. You may copy, modify,
- redistribute, reattribute, sell, buy, rent, lease,
- destroy, or improve it, quote it at length, excerpt,
- incorporate, collate, fold, staple, or mutilate it, or do
- anything else to it that your or anyone else's heart
- desires.
-:field name: This is a generic bibliographic field.
-:field name 2:
- Generic bibliographic fields may contain multiple body elements.
-
- Like this.
-
-:Dedication:
-
- For Docutils users & co-developers.
-
-:abstract:
-
- This is a test document, containing at least one example of each
- reStructuredText construct.
-
-.. meta::
- :keywords: reStructuredText, test, parser
- :description lang=en: A test document, containing at least one
- example of each reStructuredText construct.
-
-.. contents:: Table of Contents
-.. section-numbering::
-
-
-Structural Elements
-===================
-
-Section Title
--------------
-
-That's it, the text just above this line.
-
diff --git a/sandbox/grubert/test/from_test_txt-02.txt b/sandbox/grubert/test/from_test_txt-02.txt
deleted file mode 100644
index dcb1bccf6..000000000
--- a/sandbox/grubert/test/from_test_txt-02.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Transitions
------------
-
-Here's a transition:
-
----------
-
-It divides the section.
-
-Body Elements
-=============
-
diff --git a/sandbox/grubert/test/from_test_txt-03.txt b/sandbox/grubert/test/from_test_txt-03.txt
deleted file mode 100644
index 4b3ee3c85..000000000
--- a/sandbox/grubert/test/from_test_txt-03.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-Paragraphs
-----------
-
-A paragraph.
-
-Inline Markup
-`````````````
-
-Paragraphs contain text and may contain inline markup: *emphasis*,
-**strong emphasis**, ``inline literals``, standalone hyperlinks
-(http://www.python.org), external hyperlinks (Python_), internal
-cross-references (example_), external hyperlinks with embedded URIs
-(`Python web site <http://www.python.org>`__), footnote references
-(manually numbered [1]_, anonymous auto-numbered [#]_, labeled
-auto-numbered [#label]_, or symbolic [*]_), citation references
-([CIT2002]_), substitution references (|example|), and _`inline
-hyperlink targets` (see Targets_ below for a reference back to here).
-Character-level inline markup is also possible (although exceedingly
-ugly!) in *re*\ ``Structured``\ *Text*. Problems are indicated by
-|problematic| text (generated by processing errors; this one is
-intentional).
-
-The default role for interpreted text is `Title Reference`. Here are
-some explicit interpreted text roles: a PEP reference (:PEP:`287`); an
-RFC reference (:RFC:`2822`); a :sub:`subscript`; a :sup:`superscript`;
-and explicit roles for :emphasis:`standard` :strong:`inline`
-:literal:`markup`.
-
-.. DO NOT RE-WRAP THE FOLLOWING PARAGRAPH!
-
-Let's test wrapping and whitespace significance in inline literals:
-``This is an example of --inline-literal --text, --including some--
-strangely--hyphenated-words. Adjust-the-width-of-your-browser-window
-to see how the text is wrapped. -- ---- -------- Now note the
-spacing between the words of this sentence (words
-should be grouped in pairs).``
-
-If the ``--pep-references`` option was supplied, there should be a
-live link to PEP 258 here.
-
diff --git a/sandbox/grubert/test/from_test_txt-04.txt b/sandbox/grubert/test/from_test_txt-04.txt
deleted file mode 100644
index 0914ee8cb..000000000
--- a/sandbox/grubert/test/from_test_txt-04.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Bullet Lists
-------------
-
-- A bullet list
-
- + Nested bullet list.
- + Nested item 2.
-
-- Item 2.
-
- Paragraph 2 of item 2.
-
- * Nested bullet list.
- * Nested item 2.
-
- - Third level.
- - Item 2.
-
- * Nested item 3.
-
diff --git a/sandbox/grubert/test/from_test_txt-05.txt b/sandbox/grubert/test/from_test_txt-05.txt
deleted file mode 100644
index adefeb187..000000000
--- a/sandbox/grubert/test/from_test_txt-05.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Enumerated Lists
-----------------
-
-1. Arabic numerals.
-
- a) lower alpha)
-
- (i) (lower roman)
-
- A. upper alpha.
-
- I) upper roman)
-
-2. Lists that don't start at 1:
-
- 3. Three
-
- 4. Four
-
- C. C
-
- D. D
-
- iii. iii
-
- iv. iv
-
diff --git a/sandbox/grubert/test/from_test_txt-06.txt b/sandbox/grubert/test/from_test_txt-06.txt
deleted file mode 100644
index d36a5b6a2..000000000
--- a/sandbox/grubert/test/from_test_txt-06.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Definition Lists
-----------------
-
-Term
- Definition
-Term : classifier
- Definition paragraph 1.
-
- Definition paragraph 2.
-Term
- Definition
-
diff --git a/sandbox/grubert/test/from_test_txt-07.txt b/sandbox/grubert/test/from_test_txt-07.txt
deleted file mode 100644
index 7ac6deb36..000000000
--- a/sandbox/grubert/test/from_test_txt-07.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Field Lists
------------
-
-:what: Field lists map field names to field bodies, like database
- records. They are often part of an extension syntax. They are
- an unambiguous variant of RFC 2822 fields.
-
-:how arg1 arg2:
-
- The field marker is a colon, the field name, and a colon.
-
- The field body may contain one or more body elements, indented
- relative to the field marker.
-
diff --git a/sandbox/grubert/test/from_test_txt-08.txt b/sandbox/grubert/test/from_test_txt-08.txt
deleted file mode 100644
index 130d4307e..000000000
--- a/sandbox/grubert/test/from_test_txt-08.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Option Lists
-------------
-
-For listing command-line options:
-
--a command-line option "a"
--b file options can have arguments
- and long descriptions
---long options can be long also
---input=file long options can also have
- arguments
-
---very-long-option
- The description can also start on the next line.
-
- The description may contain multiple body elements,
- regardless of where it starts.
-
--x, -y, -z Multiple options are an "option group".
--v, --verbose Commonly-seen: short & long options.
--1 file, --one=file, --two file
- Multiple options with arguments.
-/V DOS/VMS-style options too
-
-There must be at least two spaces between the option and the
-description.
-
diff --git a/sandbox/grubert/test/from_test_txt-09.txt b/sandbox/grubert/test/from_test_txt-09.txt
deleted file mode 100644
index 4921e3a87..000000000
--- a/sandbox/grubert/test/from_test_txt-09.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Literal Blocks
---------------
-
-Literal blocks are indicated with a double-colon ("::") at the end of
-the preceding paragraph (over there ``-->``). They can be indented::
-
- if literal_block:
- text = 'is left as-is'
- spaces_and_linebreaks = 'are preserved'
- markup_processing = None
-
-Or they can be quoted without indentation::
-
->> Great idea!
->
-> Why didn't I think of that?
-
diff --git a/sandbox/grubert/test/from_test_txt-10.txt b/sandbox/grubert/test/from_test_txt-10.txt
deleted file mode 100644
index ff08006e3..000000000
--- a/sandbox/grubert/test/from_test_txt-10.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Block Quotes
-------------
-
-Block quotes consist of indented body elements:
-
- My theory by A. Elk. Brackets Miss, brackets. This theory goes
- as follows and begins now. All brontosauruses are thin at one
- end, much much thicker in the middle and then thin again at the
- far end. That is my theory, it is mine, and belongs to me and I
- own it, and what it is too.
-
- -- Anne Elk (Miss)
-
diff --git a/sandbox/grubert/test/from_test_txt-11.txt b/sandbox/grubert/test/from_test_txt-11.txt
deleted file mode 100644
index 8069fb9a2..000000000
--- a/sandbox/grubert/test/from_test_txt-11.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Doctest Blocks
---------------
-
->>> print 'Python-specific usage examples; begun with ">>>"'
-Python-specific usage examples; begun with ">>>"
->>> print '(cut and pasted from interactive Python sessions)'
-(cut and pasted from interactive Python sessions)
-
diff --git a/sandbox/grubert/test/from_test_txt-12.txt b/sandbox/grubert/test/from_test_txt-12.txt
deleted file mode 100644
index dca95c50a..000000000
--- a/sandbox/grubert/test/from_test_txt-12.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-Tables
-------
-
-Here's a grid table followed by a simple table:
-
-+------------------------+------------+----------+----------+
-| Header row, column 1 | Header 2 | Header 3 | Header 4 |
-| (header rows optional) | | | |
-+========================+============+==========+==========+
-| body row 1, column 1 | column 2 | column 3 | column 4 |
-+------------------------+------------+----------+----------+
-| body row 2 | Cells may span columns. |
-+------------------------+------------+---------------------+
-| body row 3 | Cells may | - Table cells |
-+------------------------+ span rows. | - contain |
-| body row 4 | | - body elements. |
-+------------------------+------------+----------+----------+
-| body row 5 | Cells may also be | |
-| | empty: ``-->`` | |
-+------------------------+-----------------------+----------+
-
-===== ===== ======
- Inputs Output
------------- ------
- A B A or B
-===== ===== ======
-False False False
-True False True
-False True True
-True True True
-===== ===== ======
-
diff --git a/sandbox/grubert/test/from_test_txt-13.txt b/sandbox/grubert/test/from_test_txt-13.txt
deleted file mode 100644
index e9b5f8b8d..000000000
--- a/sandbox/grubert/test/from_test_txt-13.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Footnotes
----------
-
-.. [1] A footnote contains body elements, consistently indented by at
- least 3 spaces.
-
- This is the footnote's second paragraph.
-
-.. [#label] Footnotes may be numbered, either manually (as in [1]_) or
- automatically using a "#"-prefixed label. This footnote has a
- label so it can be referred to from multiple places, both as a
- footnore reference ([#label]_) and as a hyperlink reference
- (label_).
-
-.. [#] This footnote is numbered automatically and anonymously using a
- label of "#" only.
-
-.. [*] Footnotes may also use symbols, specified with a "*" label.
- Here's a reference to the next footnote: [*]_.
-
-.. [*] This footnote shows the next symbol in the sequence.
-
-.. [4] Here's an unreferenced footnote, with a reference to a
- nonexistent footnote: [5]_.
-
diff --git a/sandbox/grubert/test/from_test_txt-14.txt b/sandbox/grubert/test/from_test_txt-14.txt
deleted file mode 100644
index 214f12b9a..000000000
--- a/sandbox/grubert/test/from_test_txt-14.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Citations
----------
-
-.. [CIT2002] Citations are text-labeled footnotes. They may be
- rendered separately and differently from footnotes.
-
-Here's a reference to the above, [CIT2002]_, and a [nonexistent]_
-citation.
-
diff --git a/sandbox/grubert/test/from_test_txt-15.txt b/sandbox/grubert/test/from_test_txt-15.txt
deleted file mode 100644
index b4dcfb1cc..000000000
--- a/sandbox/grubert/test/from_test_txt-15.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-Targets
--------
-
-.. _example:
-
-This paragraph is pointed to by the explicit "example" target. A
-reference can be found under `Inline Markup`_, above. `Inline
-hyperlink targets`_ are also possible.
-
-Section headers are implicit targets, referred to by name. See
-Targets_, which is a subsection of `Body Elements`_.
-
-Explicit external targets are interpolated into references such as
-"Python_".
-
-.. _Python: http://www.python.org/
-
-Targets may be indirect and anonymous. Thus `this phrase`__ may also
-refer to the Targets_ section.
-
-__ Targets_
-
-Here's a `hyperlink reference without a target`_, which generates an
-error.
-
-Duplicate Target Names
-``````````````````````
-
-Duplicate names in section headers or other implicit targets will
-generate "info" (level-1) system messages. Duplicate names in
-explicit targets will generate "warning" (level-2) system messages.
-
-Duplicate Target Names
-``````````````````````
-
-Since there are two "Duplicate Target Names" section headers, we
-cannot uniquely refer to either of them by name. If we try to (like
-this: `Duplicate Target Names`_), an error is generated.
-
diff --git a/sandbox/grubert/test/from_test_txt-16.txt b/sandbox/grubert/test/from_test_txt-16.txt
deleted file mode 100644
index 634e1e0fd..000000000
--- a/sandbox/grubert/test/from_test_txt-16.txt
+++ /dev/null
@@ -1,124 +0,0 @@
-Directives
-----------
-
-.. contents:: :local:
-
-These are just a sample of the many reStructuredText Directives. For
-others, please see http://docutils.sf.net/spec/rst/directives.html.
-
-Document Parts
-``````````````
-
-An example of the "contents" directive can be seen above this section
-(a local, untitled table of contents_) and at the beginning of the
-document (a document-wide `table of contents`_).
-
-Images
-``````
-
-An image directive:
-
-.. image:: images/title.png
-
-A figure directive:
-
-.. figure:: images/title.png
- :alt: reStructuredText, the markup syntax
-
- A figure is an image with a caption and/or a legend:
-
- +------------+-----------------------------------------------+
- | re | Revised, revisited, based on 're' module. |
- +------------+-----------------------------------------------+
- | Structured | Structure-enhanced text, structuredtext. |
- +------------+-----------------------------------------------+
- | Text | Well it is, isn't it? |
- +------------+-----------------------------------------------+
-
- This paragraph is also part of the legend.
-
-Admonitions
-```````````
-
-.. Attention:: Directives at large.
-
-.. Caution::
-
- Don't take any wooden nickels.
-
-.. DANGER:: Mad scientist at work!
-
-.. Error:: Does not compute.
-
-.. Hint:: It's bigger than a bread box.
-
-.. Important::
- - Wash behind your ears.
- - Clean up your room.
- - Call your mother.
- - Back up your data.
-
-.. Note:: This is a note.
-
-.. Tip:: 15% if the service is good.
-
-.. WARNING:: Strong prose may provoke extreme mental exertion.
- Reader discretion is strongly advised.
-
-.. admonition:: And, by the way...
-
- You can make up your own admonition too.
-
-Topics, Sidebars, and Rubrics
-`````````````````````````````
-
-.. sidebar:: Sidebar Title
- :subtitle: Optional Subtitle
-
- This is a sidebar. It is for text outside the flow of the main
- text.
-
- .. rubric:: This is a rubric inside a sidebar
-
- Sidebars often appears beside the main text with a border and
- background color.
-
-.. topic:: Topic Title
-
- This is a topic.
-
-.. rubric:: This is a rubric
-
-Target Footnotes
-````````````````
-
-.. target-notes::
-
-Line Blocks
-```````````
-
-Take it away, Eric the Orchestra Leader!
-
-.. line-block::
-
- A one, two, a one two three four
-
- Half a bee, philosophically,
- must, *ipso facto*, half not be.
- But half the bee has got to be,
- *vis a vis* its entity. D'you see?
-
- But can a bee be said to be
- or not to be an entire bee,
- when half the bee is not a bee,
- due to some ancient injury?
-
- Singing...
-
-Replacement Text
-````````````````
-
-I recommend you try |Python|_.
-
-.. |Python| replace:: Python, *the* best language around
-
diff --git a/sandbox/grubert/test/from_test_txt-17.txt b/sandbox/grubert/test/from_test_txt-17.txt
deleted file mode 100644
index f63901a43..000000000
--- a/sandbox/grubert/test/from_test_txt-17.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Substitution Definitions
-------------------------
-
-An inline image (|example|) example:
-
-.. |EXAMPLE| image:: ../docs/rst/images/biohazard.png
-
-(Substitution definitions are not visible in the HTML source.)
-
diff --git a/sandbox/grubert/test/from_test_txt-18.txt b/sandbox/grubert/test/from_test_txt-18.txt
deleted file mode 100644
index 974f91cb6..000000000
--- a/sandbox/grubert/test/from_test_txt-18.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Comments
---------
-
-Here's one:
-
-.. Comments begin with two dots and a space. Anything may
- follow, except for the syntax of footnotes, hyperlink
- targets, directives, or substitution definitions.
-
- Double-dashes -- "--" -- must be escaped somehow in HTML output.
-
-(View the HTML source to see the comment.)
-
-Error Handling
-==============
-
-Any errors caught during processing will generate system messages.
-
-There should be five messages in the following, auto-generated
-section, "Docutils System Messages":
-
diff --git a/sandbox/grubert/test/from_test_txt-19.txt b/sandbox/grubert/test/from_test_txt-19.txt
deleted file mode 100644
index 974f91cb6..000000000
--- a/sandbox/grubert/test/from_test_txt-19.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Comments
---------
-
-Here's one:
-
-.. Comments begin with two dots and a space. Anything may
- follow, except for the syntax of footnotes, hyperlink
- targets, directives, or substitution definitions.
-
- Double-dashes -- "--" -- must be escaped somehow in HTML output.
-
-(View the HTML source to see the comment.)
-
-Error Handling
-==============
-
-Any errors caught during processing will generate system messages.
-
-There should be five messages in the following, auto-generated
-section, "Docutils System Messages":
-
diff --git a/sandbox/grubert/test/images.txt b/sandbox/grubert/test/images.txt
deleted file mode 100644
index 050d46042..000000000
--- a/sandbox/grubert/test/images.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Testing image attributes
-------------------------
-
-the unscaled image
-
-.. image:: biohazard.png
-
-scaled 200
-
-.. image:: biohazard.png
- :scale: 200
-
-center and scale
-
-.. image:: biohazard.png
- :scale: 200
- :align: center
-
-
-an image with a web target
-
-.. image:: debian.png
- :target: http://www.debian.org
-
-
diff --git a/sandbox/grubert/test/internal_href.txt b/sandbox/grubert/test/internal_href.txt
deleted file mode 100644
index edb6793a7..000000000
--- a/sandbox/grubert/test/internal_href.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-see below__ for a bang.
-
-__ `xxx`_
-
-.. parsed-literal::
-
- see below__ for a bang from literal.
-
-__ `xxx`_
-
-.. _xxx:
-
-Bang!
-
diff --git a/sandbox/grubert/test/links.txt b/sandbox/grubert/test/links.txt
deleted file mode 100644
index 5db35c7b1..000000000
--- a/sandbox/grubert/test/links.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Link formatting
----------------
-
-especially the hash "#" character is problematic for LaTeX as it is
-used in LaTeX's macro language.
-
-Contributed by d.abrahams
-
-.. Sidebar:: ``const`` and an iterator's ``value_type``
-
- argument will be correct for all `lvalue iterators`_.
-
-.. _`lvalue iterators`: new-iter-concepts.html#lvalue-iterators-lib-lvalue-iterators
-
diff --git a/sandbox/grubert/test/literal.txt b/sandbox/grubert/test/literal.txt
deleted file mode 100644
index 2d771ac82..000000000
--- a/sandbox/grubert/test/literal.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-Literal Blocks
---------------
-
-Literal blocks are indented, and indicated with a double-colon ("::")
-at the end of the preceding paragraph (right here ``-->``)::
-
- if literal_block:
- text = 'is left as-is'
- spaces_and_linebreaks = 'are preserved'
- markup_processing = None
-
-Or some code formatting ::
-
- typedef
-
- mpl::push_back< // >----------------+
- // |
- mpl::push_back< // >--------------+ |
- // | |
- mpl::push_back< // >------------+ | |
- mpl::vector<> // | | |
- , int // | | |
- >::type // first step <-+ | |
- , long // | |
- >::type // second step <--+ |
- , double // |
- >::type // third step <-----+
-
- vec;
-
-The central makefile construct is called a *rule*, and is described
-with the following syntax:
-
-.. parsed-literal::
-
- *dependent-target* : *prerequisites*
- *commands*
-
-
-parsed literal with markup spanning lines. should produce valid LaTeX
-code, but the indentation is ragged.
-
-.. parsed-literal::
-
- Hey!
- *this is some emphasized text
- that spans two lines* and
- this is **some more bold text
- spanning two lines**
-
-
-
-a literal block with underscores and markup
-
-.. parsed-literal::
-
- mpl::push_back< // >----------------+
- // |
- mpl::push_back< // >--------------+ |
- // <- *end* ------+-+
-
-
-inline ``literal`` with double hyphen ``two hyphens: --`` and tripplets
-``three hyphens: ---``.
-
-Special characters
-------------------
-
-lele needed a patch to process the italian ZopeBook, because
-of the tilde ~ and the backquote chars.
-
-1. scaricarlo anche usando un browser web::
-
- lele:~/zope $ wget http://zope.org/Products/Zope/2.7.0/Zope-2.7.0-linux-x86.tgz
- --00:49:51-- http://zope.org/Products/Zope/2.7.0/Zope-2.7.0-linux-x86.tgz
- => `Zope-2.7.0-linux-x86.tgz'
-
-
-this works as long as the document is not italian.
-
-bracketts at line start and empty lines
-
-.. parsed-literal::
-
- with
- [
- _Container=std::map<std::string,std::string>,
- _InIt=std::list<std::string>::iterator
- ]
- *messages continue...*
-
diff --git a/sandbox/grubert/test/no-citations.txt b/sandbox/grubert/test/no-citations.txt
deleted file mode 100644
index 6e73b5c84..000000000
--- a/sandbox/grubert/test/no-citations.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-LaTeX writer test no citations
-------------------------------
-
-This file is used to verify that no bibliography is inserted
-when ``use-latex-citations`` is specified if there are no
-citations [1]_ in the document.
-
-.. [1] footnotes are allowed.
-
diff --git a/sandbox/grubert/test/tables-multirow.txt b/sandbox/grubert/test/tables-multirow.txt
deleted file mode 100644
index 40ad6906d..000000000
--- a/sandbox/grubert/test/tables-multirow.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-Multirows dont work.
-
-Attention
----------
-
-* cell spanning in multirow table is missing !
-* blank lines in multirows are not alloed
-
-.. table:: row on left side
-
- +------+-------+
- | left | right |
- | span +-------+
- | | single|
- +------+-------+
- | belo | b too |
- +------+-------+
-
-.. table:: row on right side
-
- +------+------+
- | abov | e |
- +------+------+
- | left | right|
- +------+ right|
- | left | right|
- +------+------+
-
-.. table:: row in the midle
-
- +------+------+------+
- | left | mid | right|
- +------+ mid +------+
- | left | mid | right|
- +------+------+------+
-
-.. table:: row left and right
-
- +------+------+-------+
- | left | mid | right |
- | left +------+ 2 |
- | | mid | right |
- +------+------+-------+
-
-.. table:: row on left side
-
- +------+---+-------+
- | left | 1 | right |
- | span | +-------+
- | | | secnd |
- | +---+-------+
- | | | 3rd |
- | | +-------+
- | | | single|
- +------+---+-------+
- | belo | 3 | b too |
- +------+---+-------+
-
-
-
diff --git a/sandbox/grubert/test/tables.txt b/sandbox/grubert/test/tables.txt
deleted file mode 100644
index c6e2b5ab2..000000000
--- a/sandbox/grubert/test/tables.txt
+++ /dev/null
@@ -1,159 +0,0 @@
-Tables
-------
-
-Here's a grid table followed by a simple table:
-
-+------------------------+------------+----------+----------+
-| Header row, column 1 | Header 2 | Header 3 | Header 4 |
-| (header rows optional) | | | |
-+========================+============+==========+==========+
-| body row 1, column 1 | column 2 | column 3 | column 4 |
-+------------------------+------------+----------+----------+
-| body row 2 | Cells may span columns. |
-+------------------------+------------+----------+----------+
-| body row 5 | Cells may also be | |
-| | empty: ``-->`` | |
-+------------------------+-----------------------+----------+
-
-===== ===== ======
- Inputs Output
------------- ------
- A B A or B
-===== ===== ======
-False False False
-True False True
-False True True
-True True True
-===== ===== ======
-
-a table without head
-
-.. table:: Foo
-
- +-----+-----+
- | | |
- +-----+-----+
- | | |
- +-----+-----+
-
-a narrow table
-
-=== ===
-CL1 CL2
-=== ===
-ys asd
---- ---
-sda ase
-=== ===
-
-poses problems
-
-=== ===
- A B
-=== ===
- 0 0
- 1 0
-=== ===
-
-=== === ===
- A B
-=== === ===
- 0 0 0
- 1 0 1
-=== === ===
-
-
-============================ ==================================== ===========================================
- a wide table poses other problems .
-============================ ==================================== ===========================================
- as reST assumes the the LaTeX writer assumes if the actual table is wider
- the documents being line length being 80 chars
- readable before it must be scaled down
- processing
----------------------------- ------------------------------------ -------------------------------------------
- narrow ones need a little amplification as TeX's proportional fonts seem to need more
- horizontal space.
-============================ ==================================== ===========================================
-
-+--------------------------+----------------------------+
-|:: |:: |
-| | |
-| mpl::plus<_,_> | mpl::plus<_1,_2> |
-+--------------------------+----------------------------+
-|:: |:: |
-| | |
-| boost::is_same< | boost::is_same< |
-| _ | _1 |
-| , add_pointer<_> | , add_pointer<_1> |
-| > | > |
-+--------------------------+----------------------------+
-
-a longer and complicated table thanks to dave abrahams
-
-+--------------------------+----------------------------+-------------------------+
-|Metafunction |Result `` ::type`` |Complexity |
-+==========================+============================+=========================+
-|``find<seq, T>`` |An iterator to the first |Linear |
-| |occurrence of ``T`` in | |
-| |``seq``, or | |
-| |``end<seq>::type`` if not | |
-| |found. | |
-+--------------------------+----------------------------+-------------------------+
-|``find_if<seq, T, pred>`` |An iterator to the first |Linear |
-| |element of ``seq`` that | |
-| |satisfies predicate | |
-| |``pred``, or | |
-| |``end<seq>::type`` if not | |
-| |found. | |
-+--------------------------+----------------------------+-------------------------+
-|``contains<seq, T>`` |True iff ``seq`` contains |Linear |
-| |``T``. | |
-+--------------------------+----------------------------+-------------------------+
-|``count<seq, T>`` |The number of occurences of |Linear |
-| |``T`` in ``seq``. | |
-+--------------------------+----------------------------+-------------------------+
-|``count_if<seq, pred>`` |The number of elements in |Linear |
-| |``seq`` that satisfy | |
-| |predicate ``pred``. | |
-+--------------------------+----------------------------+-------------------------+
-|``equal<seq1, seq2>`` |True iff ``seq1`` and |Linear |
-| |``seq2`` contain the same | |
-| |elements in the same order. | |
-+--------------------------+----------------------------+-------------------------+
-|:: |The earliest |Logarithmic in |
-| |order-preserving position at|invocations to |
-| lower_bound< |which ``T`` could be |``compare``. Logarithmic |
-| seq, T |inserted in a sequence |traversal of |
-| , compare = less<_,_> |``seq`` sorted according to |random-access |
-| > |comparison ``compare``. |sequences. Linear |
-| | |traversal otherwise. |
-+--------------------------+----------------------------+-------------------------+
-|:: |The latest order-preserving |Logarithmic in |
-| |position at which ``T`` |invocations to |
-| upper_bound< |could be inserted in a |``compare``. Logarithmic |
-| seq, T |sequence ``seq`` sorted |traversal of |
-| , compare = less<_,_> |according to comparison |random-access |
-| > |``compare``. |sequences. Linear |
-| | |traversal otherwise. |
-+--------------------------+----------------------------+-------------------------+
-|:: |The first position ``i`` in |Linear |
-| |``seq`` such that for all | |
-| max_element< |positions ``j``:: | |
-| seq | | |
-| , compare = less<_,_> | apply< | |
-| > | compare | |
-| | , deref<i>::type | |
-| | , deref<j>::type | |
-| | >::type::value == false | |
-+--------------------------+----------------------------+-------------------------+
-|:: |The first position ``i`` in |Linear |
-| |``seq`` such that for all | |
-| min_element< |positions ``j``:: | |
-| seq | | |
-| , compare = less<_,_> | apply< | |
-| > | compare | |
-| | , deref<j>::type | |
-| | , deref<i>::type | |
-| | >::type::value == false | |
-+--------------------------+----------------------------+-------------------------+
-
diff --git a/sandbox/grubert/test/toc.txt b/sandbox/grubert/test/toc.txt
deleted file mode 100644
index e479de52a..000000000
--- a/sandbox/grubert/test/toc.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-===================
- table of contents
-===================
-
-.. contents::
-
-Quick-Start
-===========
-
-Test latex table of contents usage.
-
-Sub section
------------
-
-Needs some content
-
-A section
-=========
-
-Subsection again
-----------------
-
-This should do it.
-
diff --git a/sandbox/grubert/tools/pdf.py b/sandbox/grubert/tools/pdf.py
deleted file mode 100755
index de89e44d5..000000000
--- a/sandbox/grubert/tools/pdf.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:Author: Engelbert Gruber
-:Contact: grubert@users.sourceforge.net
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-A minimal front-end to the Docutils Publisher, producing PDF via ReportLabs.
-"""
-
-from docutils.core import publish_cmdline
-try:
- from docutils.writers.rlpdf import Writer
-except ImportError:
- from rlpdf import Writer
-
-
-usage = 'usage:\n %prog [options] [source [destination]]'
-
-publish_cmdline(writer=Writer(), usage=usage)
diff --git a/sandbox/gschwant/docfactory/LICENSE.txt b/sandbox/gschwant/docfactory/LICENSE.txt
deleted file mode 100644
index 39bed4591..000000000
--- a/sandbox/gschwant/docfactory/LICENSE.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-DocFactory License
-==================
-
-Copyright (c) 2002 Dr. Gunnar Schwant (g.schwant@gmx.de).
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may
- be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/sandbox/gschwant/docfactory/NOTES.txt b/sandbox/gschwant/docfactory/NOTES.txt
deleted file mode 100644
index c0e7a80ae..000000000
--- a/sandbox/gschwant/docfactory/NOTES.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-===================
- DocFactory_ Notes
-===================
-
-:Date: $Date$
-:Revision: $Revision$
-
-.. _DocFactory: http://docutils.sf.net/sandbox/gschwant/docfactory/
-
-.. contents::
-
-The names of the original contributors are appended to the items,
-marked in brackets.
-
-
-To Do
-=====
-
-* Convert system message handling from stderr parsing to simply using
- the "line" attribute of system_message elements, accessible from
- ``document.parse_messages`` and ``document.transform_messages``.
- [David Goodger]
-
-* Use the docutils.conf config file mechanism. May require changes to
- the current Docutils setup. [David Goodger]
-
-* Add a dependency checking mechanism, like that in pep2html.py.
- [David Goodger]
-
-* Any variable data saved between runs should be stored in the user's
- home directory; perhaps in a ~/.docutils file. [David Goodger]
-
-
-Ideas
-=====
-
-* Should the interface be file-centric instead of project-centric? I
- think the user should be able to open a file, edit it, and process
- it, without having to create a project first. Projects should be
- optional. [David Goodger]
-
-* What is the current representation of a project? Is it best?
- [David Goodger]
-
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/sandbox/gschwant/docfactory/README.txt b/sandbox/gschwant/docfactory/README.txt
deleted file mode 100644
index a7c446d52..000000000
--- a/sandbox/gschwant/docfactory/README.txt
+++ /dev/null
@@ -1,420 +0,0 @@
-====================
- DocFactory README
-====================
-
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:date: 2004/05/07
-:copyright: Copyright (c) 2002 Dr. Gunnar Schwant (g.schwant@gmx.de).
- All rights reserved. See LICENSE.txt_ for license details.
-
-:abstract: This is a short introduction to DocFactory. Hopefully,
- more documentation will be available soon.
-
-.. contents::
-.. sectnum::
-
-What is it?
-===========
-
-DocFactory is a kind of *integrated publishing environment* for
-documentation, tied to |Docutils|. In fact, the intention of
-DocFactory is to be a GUI for Docutils. At present it can be used
-to edit a set of one or more |ReST| files simultaneously
-and publish them as HTML. Support for other markups and output
-formats is planned for future releases; see `Future Directions`_.
-
-DocFactory was built using |Docutils|, |Python| and |wxPython|.
-*Many thanks to all developers!*
-
-
-System requirements
-===================
-
-DocFactory is distributed as a subpackage of Docutils
-(``docutils.factory``). In order to run it in a Python-environment
-you'll need the following:
-
-* Python 2.3.2 or later (|http://www.python.org|).
-
-* wxPython 2.4.2.4 or later (|http://wxpython.org|). Be sure to get the
- build matching the version of Python you're using.
-
-* Docutils 0.3 or later (|http://docutils.sourceforge.net|). Use the
- CVS snapshot; improvements are being made almost daily.
-
-
-Installation
-============
-
-The first step is to expand the ``.tar.gz`` or ``.tgz`` archive. [1]_
-It contains a distutils setup file "setup.py". OS-specific
-installation instructions follow.
-
-Win32
------
-
-1. Open a DOS box (Command Shell, MSDOS Prompt, or whatever they're
- calling it these days).
-
-2. Go to the directory created by expanding the archive::
-
- cd <archive_directory_path>
-
-3. Install the package::
-
- <path_to_python.exe>\python setup.py install
-
-
-GNU/Linux, Unix, MacOS X, etc.
-------------------------------
-
-1. Open a shell.
-
-2. Go to the directory created by expanding the archive::
-
- cd <archive_directory_path>
-
-3. Install the package::
-
- python setup.py install
-
- If the python executable isn't on your path, you'll have to specify
- the complete path, such as /usr/local/bin/python. You may need
- root permissions to complete this step.
-
-.. note:: To create and browse the documentation of DocFactory please
- run the script ``createdoc.py``. This script converts all the
- ``.txt``-files of the tarball to ``.html``-files and opens
- ``doc/index.html`` with your default webbrowser.
-
-Usage
-=====
-
-How to start DocFactory
------------------------
-
-After successful installation you'll find "docfactory.py" in the
-scripts-directory of your Python environment. Run this file in the
-same way as you do it with any other Python-program on your system.
-The main window will appear.
-
-Files
------
-
-Create a new file
-~~~~~~~~~~~~~~~~~
-
-Type ``Ctrl+N`` to create a new text file. You will be asked for a
-location and title of the new file. Afterwards the file will be
-created, added to the tree on the left and loaded it into the editor.
-As you will notice the title has been inserted at the top of the
-file.
-
-Open an existing file
-~~~~~~~~~~~~~~~~~~~~~
-
-To open an already existing text file simply type ``Ctrl+O`` and
-select the file. It will be added to the tree and loaded into
-the editor. Moreover, you can open a file from the command-line
-if you specify the file as first parameter. A command like ``python
-[Scripts-directory]/docfactory.py [<file>]`` should launch DocFactory
-and open the file for editing. (Of course, this command depends on your
-system. For example::
-
- C:\>python Python22\Scripts\docfactory.py temp\test.txt
-
-works on my windows machine. In particular, the Python executable has
-to be on your path.)
-
-
-Publish a file
-~~~~~~~~~~~~~~
-
-To "publish" a file means to process the file into useful formats, such
-as HTML, XML or TeX.
-
-A file which has been loaded into the editor can be published by pressing
-``F7``. You will be asked for a docutils-writer, an output-directory and
-a filename:
-
-================= =========================================================
-Dialogue Item Description
-================= =========================================================
-Docutils-Writer The docutils-writer which will be used for publishing.
-Output-Directory The directory where the output-file will be created.
-Output-File The name of the output-file. (Existing files will be
- overwritten!)
-================= =========================================================
-
-Press "OK" to start the publisher.
-
-If you choose the HTML-writer the HTML-file will be displayed on
-DocFactory's HTML-viewer-page as soon as it is finished. Please note that
-this viewer does support stylesheets on Windows platforms only (including
-Windows 95, 98, ME, 2000, NT, XP). On any other platform you will have to
-check the final layout with a webbrowser of your choice (which hopefully
-does support stylesheets). Click on "View In Browser" to open the file
-with your system's default webbrowser.
-
-.. note:: Please note that publishing happens in a standard Docutils way
- and can be customized by setting up Docutils configuration files.
- [2]_
-
-Projects
---------
-
-If you want
-
-* to edit and publish one or more text files in the same way
-
-* to use DocFactory to edit the same files more than once *or*
-
-* to setup a Docutils configuration file easily
-
-a project may be the right choice for you.
-
-Setting up a project
-~~~~~~~~~~~~~~~~~~~~
-
-To setup a project select "Project -> New". The **Project Settings**
-dialog will appear. Within this dialog you set the *output-directory*
-and a *title* for your project. The output-directory is the default
-directory for any output-files, that will be created.
-
-If you press the "Edit docutils.conf"-button, DocFactory will display
-a dialog, which allows you to edit the docutils.conf-file, which
-resides in the output-directory. (If there is no such file in the
-output-directory, DocFactory will create one for you.) Please have a
-closer look at the Docutils documentation on configuration files, if
-you are not familiar with docutils.conf-files. [3]_
-
-Press the "OK"-buttons to finish the setup. The project appears as part
-of the tree on the left.
-
-Adding files to a project
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In order to create a new file within a project or add an existing file
-to a project simply activate the project's item in the tree on the left
-(double-click) and press ``Ctrl+N`` or ``Ctrl+O``. The behaviour is like
-this: If a project is active any file which is created and/or opened will
-be added to the active project. (If no project is active files will be
-created/opened outside of projects.)
-
-
-Editing
--------
-
-Keyboard Shortcuts
-~~~~~~~~~~~~~~~~~~
-
-For rapid development DocFactory features Windows-style keyboard
-shortcuts:
-
-============================== ===========================================
-Action Keyboard Shortcut
-============================== ===========================================
-**File Menu**
----------------------------------------------------------------------------
-New File ``Ctrl+N``
------------------------------- -------------------------------------------
-Open File ``Ctrl+O``
------------------------------- -------------------------------------------
-Save File ``Ctrl+S``
------------------------------- -------------------------------------------
-Publish File ``F7``
------------------------------- -------------------------------------------
-Exit Application ``Alt+X``
------------------------------- -------------------------------------------
-**Edit Menu**
----------------------------------------------------------------------------
-Undo ``Ctrl+Z``
------------------------------- -------------------------------------------
-Redo ``Ctrl+Y``
------------------------------- -------------------------------------------
-Cut ``Shift+Del``, ``Ctrl+X``
------------------------------- -------------------------------------------
-Copy ``Ctrl+Ins``, ``Ctrl+C``
------------------------------- -------------------------------------------
-Paste ``Shift+Ins``, ``Ctrl+V``
------------------------------- -------------------------------------------
-Select all ``Ctrl+A``
------------------------------- -------------------------------------------
-Find & Replace ``Ctrl+F``
------------------------------- -------------------------------------------
-Goto line ``Ctrl+G``
------------------------------- -------------------------------------------
-**Toolbox Menu**
----------------------------------------------------------------------------
-Open toolbox ``F8``
------------------------------- -------------------------------------------
-**Further editing commands**
----------------------------------------------------------------------------
-Cursor movement Arrow keys or mouse
------------------------------- -------------------------------------------
-Beginning of line ``Home``
------------------------------- -------------------------------------------
-End of line ``End``
------------------------------- -------------------------------------------
-Beginning of buffer ``Ctrl+Home``
------------------------------- -------------------------------------------
-End of the buffer ``Ctrl+End``
------------------------------- -------------------------------------------
-Select text Hold down ``Shift`` while moving the cursor
------------------------------- -------------------------------------------
-Zoom-In ``Ctrl+L``
------------------------------- -------------------------------------------
-Zoom-Out ``Ctrl+K``
-============================== ===========================================
-
-Right mouse-click brings up a popup-dialog with most of the above
-editor commands. Moreover, you can use the mouse to move selected
-text.
-
-
-Find & Replace
-~~~~~~~~~~~~~~
-
-The "Find & Replace"-dialog was introduced with DocFactory release 0.2
-and is special in the sense that it uses |regular expression syntax|
-for searching as defined by Python's re-module. This offers a great deal
-of flexibility in searching. For example: Searching for ``Fred|Ted`` will
-search the file for appearances of ``Fred`` as well as for appearances
-of ``Ted``. However, it also requires a certain kind of familiarity with
-Python's regular expression syntax. For example: In order to find
-appearances of ``C:\temp\test.txt`` you will have to search for
-``C:\\temp\\test.txt``.
-
-
-Toolbox
--------
-
-The Toolbox allows you to run operating system commands from within
-DocFactory. In the menu bar select "Toolbox -> Configure" to set up
-your personal toolbox. Press the "+"-button to add a new tool. You will
-be asked for a **name**, a **command** and an **initial directory**:
-
-================= =========================================================
-Dialogue Item Description
-================= =========================================================
-Name An individual name of the tool.
-Command The operating system command which will be executed
- when you run the tool.
-Initial Directory The initial working directory of the tool.
-================= =========================================================
-
-Command and initial directory of a tool may include **tool macros** which
-will be replaced on tool-execution as follows:
-
-================= =========================================================
-Tool Macro Description
-================= =========================================================
-``$[FilePath]`` The full pathname of the active file.
-``$[FileDir]`` The drive and directory of the active file.
-``$[FileName]`` The filename of the active file.
-``$[FileBase]`` The filename without the extension.
-``$[ProjectDir]`` The output-directory of the active project.
-================= =========================================================
-
-To launch a tool select "Toolbox -> Open..." or press ``F8``.
-
-Data Storage
-============
-
-DocFactory uses the Python's |ConfigParser|-module to store any information
-about projects, tools, etc. which has to be saved between runs. [4]_
-As default the data storage file is located in the package's directory. [5]_
-The default name of the file is ``docfactory.dat``.
-
-You can change the name and location of the data storage file by creating
-a file called ``conf.pth`` in the package's directory. This file should
-consist of one line only which contains the complete data storage path.
-For example: If the first line of ``conf.pth`` is
-
-::
-
- /home/fred/.docfactory
-
-DocFactory will store its data in ``/home/fred/.docfactory``.
-
-
-Future Directions
-=================
-
-Future releases of DocFactory will support any markup and output
-formats which are supported by Docutils. Some other useful things
-will be implemented as well. For example:
-
-* more stylesheets (please contribute!)
-* preferences dialog
-* [...]
-
-*Now, this should be enough for the beginning. Start playing with
-DocFactory, have fun, report bugs, contribute, ... Any kind of
-feedback is welcome.*
-
----------
-
-.. Footnotes
-
-.. [1] The latest DocFactory-tarball is available at
- http://docutils.sf.net/docfactory-snapshot.tgz.
-
-.. [2] http://docutils.sourceforge.net/docs/config.html
-
-.. [3] http://docutils.sourceforge.net/docs/config.html
-
-.. [4] The storage file has a ``[docfactory_project: <name of project>]``
- section for each project. (``<name of project>`` is replaced by the
- project's name.) Each section header is followed by two ``name=value``
- entries: One for all project files and one for the outputdirectory.
- For example: The section for a project called ``project_01`` which
- consists of two files ``C:\file1.txt``, ``C:\file2.txt`` and whose
- output-directory is ``C:\project1`` looks like this::
-
- [docfactory_project: project_01]
- files=C:\file1.txt;C:\file2.txt
- outputdirectory=C:\project1
-
-.. [5] ``os.path.dirname(docutils.factory.__file__)``
-
-.. Hyperlinks
-
-.. _LICENSE.txt: LICENSE.html
-
-.. |ReST| raw:: html
-
- <a class="reference" href="http://docutils.sourceforge.net/rst.html" target="_top">reStructuredText</a>
-
-.. |Python| raw:: html
-
- <a class="reference" href="http://www.python.org" target="_top">Python</a>
-
-.. |http://www.python.org| raw:: html
-
- <a class="reference" href="http://www.python.org" target="_top">http://www.python.org</a>
-
-.. |wxPython| raw:: html
-
- <a class="reference" href="http://wxpython.org" target="_top">wxPython</a>
-
-.. |http://wxPython.org| raw:: html
-
- <a class="reference" href="http://wxpython.org" target="_top">http://wxPython.org</a>
-
-.. |Docutils| raw:: html
-
- <a class="reference" href="http://docutils.sourceforge.net" target="_top">Docutils</a>
-
-.. |http://docutils.sourceforge.net| raw:: html
-
- <a class="reference" href="http://docutils.sourceforge.net" target="_top">http://docutils.sourceforge.net</a>
-
-.. |regular expression syntax| raw:: html
-
- <a class="reference" href="http://www.python.org/doc/current/lib/re-syntax.html" target="_top">regular expression syntax</a>
-
-.. |ConfigParser| raw:: html
-
- <a class="reference" href="http://www.python.org/doc/current/lib/module-ConfigParser.html" target="_top">ConfigParser</a>
diff --git a/sandbox/gschwant/docfactory/createdoc.py b/sandbox/gschwant/docfactory/createdoc.py
deleted file mode 100644
index 6f57dec48..000000000
--- a/sandbox/gschwant/docfactory/createdoc.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.2.1
-"""
-
-import glob, os, webbrowser
-from docutils.core import publish_cmdline
-
-def convert():
- for file in glob.glob('*.txt'):
- htmlfile = '%s.html' % os.path.splitext(file)[0]
- print '%s --> %s' % (file, htmlfile)
- publish_cmdline(writer_name='html',
- argv = [file, htmlfile])
-
-if __name__=='__main__':
- print '\nGenerating HTML ...\n'
- convert()
- os.chdir('doc')
- convert()
- print '\nOpen doc/index.html with default webbrowser ...\n'
- webbrowser.open('index.html')
diff --git a/sandbox/gschwant/docfactory/doc/FAQ.txt b/sandbox/gschwant/docfactory/doc/FAQ.txt
deleted file mode 100644
index 406ea698d..000000000
--- a/sandbox/gschwant/docfactory/doc/FAQ.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-=====================================
-DocFactory Frequently Asked Questions
-=====================================
-
-.. If you have downloaded this file as part of the
- DocFactory-tarball, please use docutils to convert
- it to HTML and open index.html with your webbrowser.
-
-.. contents:: Questions
-.. section-numbering::
-
-How can I manage accentuated characters to be processed properly?
-=================================================================
-
-On the "Docutils"-page of the "Project-Settings"-dialog be sure to set
-Docutils' output-encoding to the right value. For example: ``ISO-8859-1``
-for french or german accentuated characters. (The default setting is
-``UTF-8``.) The problem is to find out which encoding you need. There is
-a wide variety of encodings available. Many of these encodings support
-the same languages. However, they vary in individual characters. For
-example, ``ISO-8859-1`` does not support the EURO SIGN (try ``cp1252``
-if you need it). If you face problems your first attempt should be
-to try out Python's different standard encodings which can be found
-at |www.python.org|.
-
-.. |www.python.org| raw:: html
-
- <a class="reference" href="http://www.python.org/dev/doc/devel/lib/node123.html" target="_top">http://www.python.org/dev/doc/devel/lib/node123.html</a>
-
-
-Is it possible to run DocFactory on systems without a Python installation?
-==========================================================================
-
-The Docfactory-tarball contains a script called ``docfactory2exe.py``. If
-|py2exe| is installed on your machine you can use this script to convert
-``docfactory.py`` into a into an executable Windows program, which is able
-to run without requiring a Python installation. Copy ``docfactory2exe.py``
-and ``docfactory.ico`` (both part of the tarball) to the directory where
-``docfactory.py`` is located, go to the command-line and enter
-
-::
-
- python docfactory2exe.py py2exe -w -p encodings,docutils --icon docfactory.ico
-
-This will create a sub-directory ``dist\docfactory``, containing the file
-``docfactory.exe`` and several other files needed at runtime. (Visit
-|py2exe| for more details.)
-
-.. |py2exe| raw:: html
-
- <a class="reference" href="http://py2exe.sourceforge.net" target="_top">py2exe</a>
-
diff --git a/sandbox/gschwant/docfactory/doc/HISTORY.txt b/sandbox/gschwant/docfactory/doc/HISTORY.txt
deleted file mode 100644
index d905c3dc5..000000000
--- a/sandbox/gschwant/docfactory/doc/HISTORY.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-=====================
- DocFactory History
-=====================
-
-.. If you have downloaded this file as part of the
- DocFactory-tarball, please use docutils to convert
- it to HTML and open index.html with your webbrowser.
-
-DocFactory 0.3 (2004/05/07)
- * Changed the **Project Settings** dialog: The new version allows
- you to edit docutils.conf-files in a more flexible way. You can
- add/edit/remove any kind of sections/options/values by yourself.
- As more and more docutils settings become available, this seems
- to be a much better solution than the former dialog. To put it
- into a nutshell: DocFactory is prepared for the new Docutils
- configuration file format now. (I know, it's not that new
- anymore ...)
-
-DocFactory 0.2.6 (2004/04/03)
- * Fixed some bugs. Thanks for Linux-related hints to Jens Koehler
- and Bjoern Pfeiffer :-))
-
-DocFactory 0.2.5 (2004/02/13)
- * Python 2.3.2 / wxPython 2.4.2.4 / Docutils 0.3 now required
- * Fixed potential bug with Python 2.3.2 / wxPython 2.4.2.4
-
-DocFactory 0.2.4 (2003/05/01)
- * "Preferences"-menu
- * Backup option for files
-
-DocFactory 0.2.3 (2003/03/02)
- * Support of more writers (XML, PEP, LaTeX)
- * Toolbox
-
-DocFactory 0.2.2 (2003/02/16)
- * Toolbar
- * New "Insert Hyperlink"-feature
- * Enhanced "Insert Image"-feature
-
-DocFactory 0.2.1 (2003/01/11)
- * Processing of files which are not part of a project asks
- for an output-directory.
-
-DocFactory 0.2 (2003/01/08)
- * New editor features:
-
- - Change EOLs to CR/LF/CRLF
- - Find & Replace... (using |regular expression syntax| as defined
- by Python's re-module)
- - Goto line...
- - Insert image/figure/path
- - Syntax highlightening for HTML-files
-
- * New "View"-menu:
-
- - View EOL markers
- - View right edge indicator
- - View whitespace
- - Set fontsize to small/normal/big
-
- * Ability to open files from command-line.
- * Stylesheet-support of HTML-viewer on Windows platforms.
- * Automatic stylesheet-creation.
- * Animated "About"-dialog.
- * Added "docfactory2exe.py" for usage with |py2exe|.
- * Modified data storage.
-
-DocFactory 0.1.4 (2002/09/30)
- * Files can be opened without creating a project first.
- * The project settings dialog produces a docutils configuration file.
-
-DocFactory 0.1.3 (2002/09/15)
- * Initial sandbox-release.
-
-
-
-.. |py2exe| raw:: html
-
- <a class="reference" href="http://py2exe.sourceforge.net" target="_top">py2exe</a>
-
-.. |regular expression syntax| raw:: html
-
- <a class="reference" href="http://www.python.org/doc/current/lib/re-syntax.html" target="_top">regular expression syntax</a>
-
-.. _README: ../README.html
diff --git a/sandbox/gschwant/docfactory/doc/docutils.conf b/sandbox/gschwant/docfactory/doc/docutils.conf
deleted file mode 100644
index 77e9afaf2..000000000
--- a/sandbox/gschwant/docfactory/doc/docutils.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-[general]
-output_encoding = UTF-8
-footnote_backlinks = 1
-generator =
-source_link =
-toc_backlinks = top
-datestamp =
-
-[html4css1 writer]
-compact_lists = 1
-embed_stylesheet =
-stylesheet_path = stylesheets/df.css
-footnote_references = superscript
-
diff --git a/sandbox/gschwant/docfactory/doc/downloads.txt b/sandbox/gschwant/docfactory/doc/downloads.txt
deleted file mode 100644
index 38fca23f2..000000000
--- a/sandbox/gschwant/docfactory/doc/downloads.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-======================
- DocFactory Download
-======================
-
-.. If you have downloaded this file as part of the
- DocFactory-tarball, please use docutils to convert
- it to HTML and open index.html with your webbrowser.
-
-* `Latest development snapshot`_
-
-.. _`Latest development snapshot`: http://docutils.sourceforge.net/docfactory-snapshot.tgz
diff --git a/sandbox/gschwant/docfactory/doc/head.html b/sandbox/gschwant/docfactory/doc/head.html
deleted file mode 100644
index 71595aac7..000000000
--- a/sandbox/gschwant/docfactory/doc/head.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-</head>
-<body background="./pics/DF.png">
-</body>
-</html> \ No newline at end of file
diff --git a/sandbox/gschwant/docfactory/doc/index.html b/sandbox/gschwant/docfactory/doc/index.html
deleted file mode 100644
index 14a3dfdc1..000000000
--- a/sandbox/gschwant/docfactory/doc/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<html>
-<head>
- <title>DocFactory</title>
- <meta content="DocFactory" name="description">
-</head>
-
-<noscript>
-<noframes>
-<br><br><br><br>
-<blockquote><blockquote>
-Please use a browser which supports frames and JavaScript.<br>
-</blockquote></blockquote>
-</noframes>
-</noscript>
-
-<frameset rows="80,*" frameborder=0 border=0>
- <frame name="head" src="head.html" scrolling="NO" marginheight=0 marginwidth=0>
- <frameset COLS="15%,85%" frameborder=0 border=0>
- <frame src="navigation_l.html" scrolling="NO" marginheight=0 marginwidth=0>
- <frame src="start.html" scrolling="auto" marginheight=0 marginwidth=0 name="main">
- </frameset>
-</frameset>
-
-</html>
diff --git a/sandbox/gschwant/docfactory/doc/navigation_l.html b/sandbox/gschwant/docfactory/doc/navigation_l.html
deleted file mode 100644
index fde558cad..000000000
--- a/sandbox/gschwant/docfactory/doc/navigation_l.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<link rel="stylesheet" href="./stylesheets/navigation_l.css" type="text/css" />
-</head>
-<body>
-<table>
-
- <tr><td class="section">DocFactory</td></tr>
- <tr><td><a href="start.html" target="main">Home</a></td></tr>
- <tr><td><a href="../README.html" target="main">README</a></td></tr>
- <tr><td><a href="FAQ.html" target="main">FAQ</a></td></tr>
- <tr><td><a href="../README.html#system-requirements" target="main">Requirements</a></td></tr>
- <tr><td><a href="downloads.html" target="main">Download</a></td></tr>
- <tr><td><a href="screenshots.html" target="main">Screenshots</a></td></tr>
- <tr><td><a href="HISTORY.html" target="main">History</a></td></tr>
- <tr><td><br></td></tr>
-
- <tr><td class="section">Contact</td></tr>
- <tr><td><a href="mailto:g.schwant@gmx.de">g.schwant@gmx.de</a></td></tr>
- <tr><td><br></td></tr>
-
- <tr><td class="section">Links</td></tr>
- <tr><td><a href="http://docutils.sourceforge.net" target="_top">Docutils Home</a></td></tr>
- <tr><td><a href="http://docutils.sourceforge.net/FAQ.html" target="_top">Docutils FAQ</a></td></tr>
- <tr><td><a href="http://www.python.org" target="_top">www.Python.org</a></td></tr>
- <tr><td><a href="http://wxPython.org" target="_top">wxPython.org</a></td></tr>
- <tr><td><br></td></tr>
-
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
- <tr><td><br></td></tr>
-
- </table>
-</body>
diff --git a/sandbox/gschwant/docfactory/doc/pics/DF.png b/sandbox/gschwant/docfactory/doc/pics/DF.png
deleted file mode 100644
index cfb0caf0f..000000000
--- a/sandbox/gschwant/docfactory/doc/pics/DF.png
+++ /dev/null
Binary files differ
diff --git a/sandbox/gschwant/docfactory/doc/pics/screenshot1.jpg b/sandbox/gschwant/docfactory/doc/pics/screenshot1.jpg
deleted file mode 100644
index 2d7426812..000000000
--- a/sandbox/gschwant/docfactory/doc/pics/screenshot1.jpg
+++ /dev/null
Binary files differ
diff --git a/sandbox/gschwant/docfactory/doc/pics/screenshot2.jpg b/sandbox/gschwant/docfactory/doc/pics/screenshot2.jpg
deleted file mode 100644
index 3f9e6dc83..000000000
--- a/sandbox/gschwant/docfactory/doc/pics/screenshot2.jpg
+++ /dev/null
Binary files differ
diff --git a/sandbox/gschwant/docfactory/doc/screenshots.txt b/sandbox/gschwant/docfactory/doc/screenshots.txt
deleted file mode 100644
index 49154badd..000000000
--- a/sandbox/gschwant/docfactory/doc/screenshots.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-=======================
-DocFactory Screenshots
-=======================
-
-.. If you have downloaded this file as part of the
- DocFactory-tarball, please use docutils to convert
- it to HTML and open index.html with your webbrowser.
-
-.. image:: pics/screenshot1.jpg
-
-.. image:: pics/screenshot2.jpg
diff --git a/sandbox/gschwant/docfactory/doc/start.txt b/sandbox/gschwant/docfactory/doc/start.txt
deleted file mode 100644
index b5b2766be..000000000
--- a/sandbox/gschwant/docfactory/doc/start.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-=========================
- Welcome to DocFactory!
-=========================
-
-.. If you have downloaded this file as part of the
- DocFactory-tarball, please use docutils to convert
- it to HTML and open index.html with your webbrowser.
-
-DocFactory is a kind of *integrated publishing environment* for
-documentation, tied to |Docutils|. In fact, the intention of
-DocFactory is to be a GUI for |Docutils|. At present it can be used
-to edit a set of one or more |ReST| files simultaneously
-and publish them as HTML. Support for other markups and output
-formats is planned for future releases. `Read more...`__
-
-__ ../README.html
-
-.. |Docutils| raw:: html
-
- <a class="reference" href="http://docutils.sourceforge.net" target="_top">Docutils</a>
-
-.. |ReST| raw:: html
-
- <a class="reference" href="http://docutils.sourceforge.net/rst.html" target="_top">reStructuredText</a>
-
-
diff --git a/sandbox/gschwant/docfactory/doc/stylesheets/df.css b/sandbox/gschwant/docfactory/doc/stylesheets/df.css
deleted file mode 100644
index af86ec0a8..000000000
--- a/sandbox/gschwant/docfactory/doc/stylesheets/df.css
+++ /dev/null
@@ -1,411 +0,0 @@
-
-/*
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:date: $Date$
-:version: $Revision$
-:copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-*/
-
-.first {
- margin-top: 0 }
-
-.last {
- margin-bottom: 0 }
-
-a.toc-backref {
- text-decoration: none ;
- color: black }
-
-dd {
- margin-bottom: 0.5em }
-
-div.abstract {
- margin: 2em 5em }
-
-div.abstract p.topic-title {
- font-weight: bold ;
- text-align: center }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning {
- margin: 2em ;
- border: medium outset ;
- padding: 1em }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: red ;
- font-weight: bold ;
- font-family: sans-serif }
-
-div.hint p.admonition-title, div.important p.admonition-title,
-div.note p.admonition-title, div.tip p.admonition-title {
- font-weight: bold ;
- font-family: sans-serif }
-
-div.dedication {
- margin: 2em 5em ;
- text-align: center ;
- font-style: italic }
-
-div.dedication p.topic-title {
- font-weight: bold ;
- font-style: normal }
-
-div.figure {
- margin-left: 2em }
-
-div.footer, div.header {
- font-size: smaller }
-
-div.system-messages {
- margin: 5em }
-
-div.system-messages h1 {
- color: red }
-
-div.system-message {
- border: medium outset ;
- padding: 1em }
-
-div.system-message p.system-message-title {
- color: red ;
- font-weight: bold }
-
-div.topic {
- margin: 2em }
-
-hr {
- width: 75% }
-
-ol.simple, ul.simple {
- margin-bottom: 1em }
-
-ol.arabic {
- list-style: decimal }
-
-ol.loweralpha {
- list-style: lower-alpha }
-
-ol.upperalpha {
- list-style: upper-alpha }
-
-ol.lowerroman {
- list-style: lower-roman }
-
-ol.upperroman {
- list-style: upper-roman }
-
-p.caption {
- font-style: italic }
-
-p.credits {
- font-style: italic ;
- font-size: smaller }
-
-p.label {
- white-space: nowrap }
-
-p.topic-title {
- font-weight: bold }
-
-pre.address {
- margin-bottom: 0 ;
- margin-top: 0 ;
- font-family: serif ;
- font-size: 100% }
-
-pre.line-block {
- font-family: serif ;
- font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
- background-color: #eeeeee }
-
-span.classifier {
- font-family: sans-serif ;
- font-style: oblique }
-
-span.classifier-delimiter {
- font-family: sans-serif ;
- font-weight: bold }
-
-span.interpreted {
- font-family: sans-serif }
-
-span.option-argument {
- font-style: italic }
-
-span.pre {
- white-space: pre }
-
-span.problematic {
- color: red }
-
-table {
- margin-top: 0.5em ;
- margin-bottom: 0.5em }
-
-table.citation {
- border-left: solid thin gray ;
- padding-left: 0.5ex }
-
-table.docinfo {
- margin: 2em 4em }
-
-table.footnote {
- border-left: solid thin black ;
- padding-left: 0.5ex }
-
-td, th {
- padding-left: 0.5em ;
- padding-right: 0.5em ;
- vertical-align: top }
-
-th.docinfo-name, th.field-name {
- font-weight: bold ;
- text-align: left ;
- white-space: nowrap }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 100% }
-
-tt {
- background-color: #eeeeee }
-
-ul.auto-toc {
- list-style-type: none }
-
-
-/*
-Additional styles for "modern"-style of DocFactory.
-
-:Author: Gunnar Schwant
-:Contact: g.schwant@gmx.de
-*/
-
-.first {
- font-size: 10pt }
-
-.last {
- font-size: 10pt }
-
-a {
- text-decoration: none }
-
-a.reference {
- color: #00009F }
-
-a:hover {
- background-color: #00009F ;
- color: white }
-
-body {
- font-family: arial,helvetica,univers ;
- font-size: 10pt ;
- padding-top: 0.6cm ;
- margin-left:0.5cm ;
- margin-right:0.5cm ;
- margin-bottom:0.5cm }
-
-dd {
- font-size: 10pt ;
- padding-top: 0.1cm
-}
-
-dt {
- font-size: 10pt ;
- font-weight: bold ;
- background-color: #6FC7FB ;
- padding-left: 0.1cm ;
- padding-top: 0.1cm ;
- padding-bottom: 0.1cm }
-
-div.abstract {
- font-size: 10pt }
-
-div.abstract p.topic-title {
- font-size: 10pt }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning {
- font-size: 10pt }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
- margin-top: 0em ;
- font-size: 12pt ;
- font-family: arial,helvetica,univers }
-
-div.dedication {
- font-size: 10pt }
-
-div.dedication p.topic-title {
- font-size: 10pt }
-
-div.figure {
- font-size: 10pt }
-
-div.footer, div.header {
- font-size: 8pt }
-
-div.system-messages {
- font-size: 10pt }
-
-div.system-messages h1 {
- font-size: 12pt }
-
-div.system-message {
- font-size: 10pt }
-
-div.system-message p.system-message-title {
- font-size: 10pt }
-
-div.topic {
- font-size: 10pt }
-
-h1, h2, h3, h4, h5, h6 {
- padding-top: 0.5cm ;
- page-break-after: avoid ;
- font-family: arial,helvetica,univers }
-
-h1 {
- font-size: 18pt }
-
-h1.title {
- color: white ;
- background-color: #00009F ;
- padding-top: 0cm }
-
-h2 {
- font-size: 16pt }
-
-h2.subtitle {
- padding-top: 0cm }
-
-h3 {
- font-size: 14pt }
-
-h4 {
- font-size: 12pt }
-
-h5, h6 {
- font-size: 10pt }
-
-hr {
- width: 100%;
- page-break-after: always }
-
-li {
- padding-top: 1mm ;
- padding-bottom: 1mm }
-
-ol.simple, ul.simple {
- font-size: 10pt }
-
-ol.arabic {
- font-size: 10pt }
-
-ol.loweralpha {
- font-size: 10pt }
-
-ol.upperalpha {
- font-size: 10pt }
-
-ol.lowerroman {
- font-size: 10pt }
-
-ol.upperroman {
- font-size: 10pt }
-
-p.caption {
- font-size: 10pt }
-
-p.credits {
- font-style: italic ;
- font-size: 8pt }
-
-p.label {
- font-size: 10pt }
-
-p.topic-title {
- font-size: 10pt }
-
-pre.address {
- font-family: arial,helvetica,univers ;
- font-size: 10pt }
-
-pre.line-block {
- font-size: 10pt }
-
-pre.literal-block, pre.doctest-block {
- border-width: 1pt ;
- border-style: solid ;
- border-color: #999999 ;
- color: #0000C0 ;
- background-color: #ffffe0 ;
- font-size: 9pt }
-
-span.classifier {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.classifier-delimiter {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.field-argument {
- font-size: 10pt }
-
-span.interpreted {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.option-argument {
- font-size: 10pt }
-
-span.problematic {
- font-size: 10pt }
-
-table {
- font-size: 10pt ;
- border-collapse: collapse ;
- border-width: 1.5pt ;
- border-color: #003366 }
-
-table.citation {
- font-size: 10pt }
-
-table.docinfo {
- font-size: 10pt }
-
-table.footnote {
- font-size: 8pt ;
- text-align: left }
-
-table.table {
- width: 100% }
-
-th {
- border-width: 1.5pt }
-
-td {
- border-width: 1pt }
-
-td, th {
- font-size: 10pt ;
- border-style: thin ;
- border-color: #003366 }
-
-td.docinfo-name, th.field-name {
- font-size: 10pt }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 10pt }
diff --git a/sandbox/gschwant/docfactory/doc/stylesheets/navigation_l.css b/sandbox/gschwant/docfactory/doc/stylesheets/navigation_l.css
deleted file mode 100644
index 2e6d177c9..000000000
--- a/sandbox/gschwant/docfactory/doc/stylesheets/navigation_l.css
+++ /dev/null
@@ -1,38 +0,0 @@
-@import url(df.css);
-
-a {
- color: black ;
- font-size: 8pt }
-
-a:hover {
- background-color: #00009F }
-
-body {
- background-color: white ;
- font-size: 8pt ;
- padding-top: 0.6cm ;
- margin-top: 0cm ;
- margin-left: 0cm ;
- margin-right: 0.3cm ;
- margin-bottom: 1.0cm }
-
-table {
- margin-top: 0cm ;
- width: 100% ;
- border-width: 0pt ;
- border-style: thin }
-
-td {
- background-color: #6FC7FB ;
- font-size: 8pt ;
- width: 100% ;
- border-width: 0pt ;
- border-style: thin }
-
-td.section {
- background-color: #00009F ;
- font-weight: bold ;
- color: white }
-
-td.empty {
- background-color: white }
diff --git a/sandbox/gschwant/docfactory/docfactory.ico b/sandbox/gschwant/docfactory/docfactory.ico
deleted file mode 100644
index 6717dc00c..000000000
--- a/sandbox/gschwant/docfactory/docfactory.ico
+++ /dev/null
Binary files differ
diff --git a/sandbox/gschwant/docfactory/docfactory.py b/sandbox/gschwant/docfactory/docfactory.py
deleted file mode 100755
index ba3a62b53..000000000
--- a/sandbox/gschwant/docfactory/docfactory.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.2
-"""
-
-from docutils.factory import main
-main.main()
diff --git a/sandbox/gschwant/docfactory/docfactory2exe.py b/sandbox/gschwant/docfactory/docfactory2exe.py
deleted file mode 100644
index 711d49c7e..000000000
--- a/sandbox/gschwant/docfactory/docfactory2exe.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.2
-
-Usage::
-
- python docfactory2exe.py py2exe -w -p encodings,docutils --icon docfactory.ico
-
-"""
-
-from distutils.core import setup
-import py2exe
-
-setup(name="DocFactory",
- scripts=["docfactory.py"],
- )
diff --git a/sandbox/gschwant/docfactory/docutils.conf b/sandbox/gschwant/docfactory/docutils.conf
deleted file mode 100644
index 419fcfc2d..000000000
--- a/sandbox/gschwant/docfactory/docutils.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-[general]
-output_encoding = ISO-8859-1
-footnote_backlinks = 1
-generator =
-source_link =
-toc_backlinks = top
-datestamp =
-
-[html4css1 writer]
-compact_lists = 1
-embed_stylesheet =
-stylesheet_path = doc/stylesheets/df.css
-footnote_references = superscript
-
diff --git a/sandbox/gschwant/docfactory/factory/__init__.py b/sandbox/gschwant/docfactory/factory/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/sandbox/gschwant/docfactory/factory/__init__.py
+++ /dev/null
diff --git a/sandbox/gschwant/docfactory/factory/browser.py b/sandbox/gschwant/docfactory/factory/browser.py
deleted file mode 100644
index 4d37f7855..000000000
--- a/sandbox/gschwant/docfactory/factory/browser.py
+++ /dev/null
@@ -1,198 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-import sys, os, webbrowser
-
-from wxPython.wx import *
-from wxPython.html import *
-from wxPython.lib.dialogs import wxScrolledMessageDialog
-from dialogs import customMsgBox
-
-if wxPlatform == '__WXMSW__':
- from wxPython.iewin import *
-
-class HtmlWindow(wxHtmlWindow):
- def __init__(self, parent, id, log):
- wxHtmlWindow.__init__(self, parent, id)
- self.log = log
-
- def OnLinkClicked(self, linkinfo):
- self.log.WriteText('You clicked on link: %s\n' % linkinfo.GetHref())
- # Virtuals in the base class have been renamed with base_ on the front.
- self.base_OnLinkClicked(linkinfo)
-
-class HtmlPanel(wxPanel):
- def __init__(self, parent, frame, log, htmlfile=None):
- wxPanel.__init__(self, parent, -1)
- self.log = log
- self.frame = frame
- self.cwd = os.path.split(sys.argv[0])[0]
- if not self.cwd:
- self.cwd = os.getcwd()
-
- self.html = HtmlWindow(self, -1, log)
-
- self.printer = wxHtmlEasyPrinting()
-
- self.box = wxBoxSizer(wxVERTICAL)
- self.box.Add(self.html, 1, wxGROW)
-
- subbox = wxBoxSizer(wxHORIZONTAL)
-
- exitID=wxNewId()
- btn = wxButton(self, exitID, "View In Browser")
- EVT_BUTTON(self, exitID, self.OnViewInBrowser)
- subbox.Add(btn, 1, wxGROW | wxALL, 2)
-
- exitID=wxNewId()
- btn = wxButton(self, exitID, "View Source")
- EVT_BUTTON(self, exitID, self.OnViewSource)
- subbox.Add(btn, 1, wxGROW | wxALL, 2)
-
- exitID=wxNewId()
- btn = wxButton(self, exitID, "<<<")
- EVT_BUTTON(self, exitID, self.OnBack)
- subbox.Add(btn, 1, wxGROW | wxALL, 2)
-
- exitID=wxNewId()
- btn = wxButton(self, exitID, ">>>")
- EVT_BUTTON(self, exitID, self.OnForward)
- subbox.Add(btn, 1, wxGROW | wxALL, 2)
-
- exitID=wxNewId()
- btn = wxButton(self, exitID, "Print")
- EVT_BUTTON(self, exitID, self.OnPrint)
- subbox.Add(btn, 1, wxGROW | wxALL, 2)
-
- self.box.Add(subbox, 0, wxGROW)
- self.SetSizer(self.box)
- self.SetAutoLayout(true)
-
- self.html.LoadPage(htmlfile)
-
- def OnBack(self, event):
- if not self.html.HistoryBack():
- customMsgBox(self, 'No more items in history!', 'wakeup')
-
- def OnForward(self, event):
- if not self.html.HistoryForward():
- customMsgBox(self, 'No more items in history!', 'wakeup')
-
- def OnViewSource(self, event):
- source = self.html.GetParser().GetSource()
- dlg = wxScrolledMessageDialog(self, source, 'HTML Source')
- dlg.ShowModal()
- dlg.Destroy()
-
- def OnViewInBrowser(self, event):
- htmlfile = self.html.GetOpenedPage()
- try:
- webbrowser.open('file:%s' % htmlfile, autoraise=1)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def OnPrint(self, event):
- self.printer.PrintFile(self.html.GetOpenedPage())
-
-class IEHtmlPanel(wxPanel):
-
- def __init__(self, parent, frame, log, htmlfile=None):
- wxPanel.__init__(self, parent, -1)
- self.log = log
- if htmlfile != None:
- self.current = htmlfile
- else:
- self.current = "about:blank"
- self.frame = frame
- if frame:
- self.titleBase = frame.GetTitle()
-
- sizer = wxBoxSizer(wxVERTICAL)
- btnSizer = wxBoxSizer(wxHORIZONTAL)
-
- self.ie = wxIEHtmlWin(self, -1, style = wxNO_FULL_REPAINT_ON_RESIZE)
-
- btn = wxButton(self, wxNewId(), '<<<', style=wxBU_EXACTFIT)
- EVT_BUTTON(self, btn.GetId(), self.OnPrevPageButton)
- btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
-
- btn = wxButton(self, wxNewId(), '>>>', style=wxBU_EXACTFIT)
- EVT_BUTTON(self, btn.GetId(), self.OnNextPageButton)
- btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
-
- btn = wxButton(self, wxNewId(), 'Stop', style=wxBU_EXACTFIT)
- EVT_BUTTON(self, btn.GetId(), self.OnStopButton)
- btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
-
- btn = wxButton(self, wxNewId(), 'Refresh', style=wxBU_EXACTFIT)
- EVT_BUTTON(self, btn.GetId(), self.OnRefreshPageButton)
- btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
-
- txt = wxStaticText(self, -1, 'Location:')
- btnSizer.Add(txt, 0, wxCENTER|wxALL, 2)
-
- self.location = wxComboBox(self, wxNewId(), '', style=wxCB_DROPDOWN|wxPROCESS_ENTER)
- EVT_COMBOBOX(self, self.location.GetId(), self.OnLocationSelect)
- EVT_KEY_UP(self.location, self.OnLocationKey)
- EVT_CHAR(self.location, self.IgnoreReturn)
- btnSizer.Add(self.location, 1, wxEXPAND|wxALL, 2)
-
- sizer.Add(btnSizer, 0, wxEXPAND)
- sizer.Add(self.ie, 1, wxEXPAND)
-
- self.ie.Navigate(self.current)
- self.location.Append(self.current)
-
- self.SetSizer(sizer)
- self.SetAutoLayout(true)
- EVT_SIZE(self, self.OnSize)
-
- # Hook up the event handlers for the IE window
- EVT_MSHTML_NEWWINDOW2(self, -1, self.OnNewWindow2)
- EVT_MSHTML_DOCUMENTCOMPLETE(self, -1, self.OnDocumentComplete)
- EVT_MSHTML_STATUSTEXTCHANGE(self, -1, self.OnStatusTextChange)
-
- def OnSize(self, evt):
- self.Layout()
-
- def OnLocationSelect(self, evt):
- url = self.location.GetStringSelection()
- self.ie.Navigate(url)
-
- def OnLocationKey(self, evt):
- if evt.KeyCode() == WXK_RETURN:
- URL = self.location.GetValue()
- self.location.Append(URL)
- self.ie.Navigate(URL)
- else:
- evt.Skip()
-
- def IgnoreReturn(self, evt):
- if evt.GetKeyCode() != WXK_RETURN:
- evt.Skip()
-
- def OnPrevPageButton(self, event):
- self.ie.GoBack()
-
- def OnNextPageButton(self, event):
- self.ie.GoForward()
-
- def OnStopButton(self, evt):
- self.ie.Stop()
-
- def OnRefreshPageButton(self, evt):
- self.ie.Refresh(wxIEHTML_REFRESH_COMPLETELY)
-
- def OnNewWindow2(self, evt):
- evt.Veto() # don't allow it
-
- def OnDocumentComplete(self, evt):
- self.current = evt.GetText1()
- self.location.SetValue(self.current)
-
- def OnStatusTextChange(self, evt):
- if self.frame:
- self.frame.SetStatusText(evt.GetText1())
diff --git a/sandbox/gschwant/docfactory/factory/controls.py b/sandbox/gschwant/docfactory/factory/controls.py
deleted file mode 100644
index da3b3817b..000000000
--- a/sandbox/gschwant/docfactory/factory/controls.py
+++ /dev/null
@@ -1,183 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-import os, throbimages, time
-from wxPython.wx import *
-from wxPython.stc import *
-from docutilsadapter import get_rest_bibl_fields
-from docutilsadapter import get_rest_directives
-from dialogs import customMsgBox
-from shutil import copyfile
-
-if wxPlatform == '__WXMSW__':
- faces = { 'times': 'Times New Roman',
- 'mono' : 'Courier New',
- 'helv' : 'Arial',
- 'other': 'Comic Sans MS',
- 'size' : 10,
- 'size2': 8,
- }
-else:
- faces = { 'times': 'Times',
- 'mono' : 'Courier',
- 'helv' : 'Helvetica',
- 'other': 'new century schoolbook',
- 'size' : 12,
- 'size2': 10,
- }
-
-#---------------------------------------------------------------------------
-
-class CustomStyledTextCtrl(wxStyledTextCtrl):
- def __init__(self, parent, ID, log):
- wxStyledTextCtrl.__init__(self, parent, ID)
- self.log = log
-
- self.CmdKeyAssign(ord('L'), wxSTC_SCMOD_CTRL, wxSTC_CMD_ZOOMIN)
- self.CmdKeyAssign(ord('K'), wxSTC_SCMOD_CTRL, wxSTC_CMD_ZOOMOUT)
- self.SetEdgeMode(wxSTC_EDGE_LINE)
- self.SetEdgeColour(wxColour(175,255,255))
- self.SetEdgeColumn(75)
- self.SetUseTabs(0)
- self.SetIndent(2)
- self.SetEOLMode(wxSTC_EOL_LF)
-
- self.set_styles()
-
- EVT_STC_MODIFIED(self, ID, self.OnModified)
- EVT_CHAR(self, self.OnChar)
-
- # lists for autocompletion:
- self.bibliographic_fields = get_rest_bibl_fields()
- self.directives = get_rest_directives()
-
- self.IsModified = 0
-
- def set_styles(self):
-
- # general
- self.StyleSetSpec(wxSTC_STYLE_DEFAULT, 'face:%(mono)s,size:%(size)d' % faces)
- self.StyleSetSpec(1, 'face:%(mono)s,bold,fore:#0000FF,size:%(size)d' % faces)
- self.StyleSetSpec(2, 'face:%(mono)s,italic,fore:#FF0000,size:%(size)d' % faces)
- self.StyleSetSpec(3, 'face:%(mono)s,bold,size:%(size)d' % faces)
- self.StyleSetSpec(4, 'face:%(mono)s,size:%(size)d' % faces)
- self.StyleSetSpec(wxSTC_STYLE_CONTROLCHAR, 'face:%(other)s' % faces)
-
- # line numbers in the margin
- self.StyleSetSpec(wxSTC_STYLE_LINENUMBER,
- 'back:#C0C0C0,face:%(helv)s,size:%(size2)d' % faces)
- self.SetMarginType(0, wxSTC_MARGIN_NUMBER)
- self.SetMarginWidth(0, 3*faces['size']-2)
-
- # markers
- self.SetMarginType(1, wxSTC_MARGIN_SYMBOL)
- self.MarkerDefine(0, wxSTC_MARK_CIRCLE, 'RED', '#FFFF00')
- self.MarkerDefine(1, wxSTC_MARK_CIRCLE, '#FFFF00', 'RED')
-
- def OnChar(self, event):
- key = event.KeyCode()
- currpos = self.GetCurrentPos()
- currcol = self.GetColumn(currpos)
- if currcol == 0 and key == ord(':'):
- self.AddText(':')
- self.AutoCompShow(0, self.bibliographic_fields)
- elif currcol == 2 and key == ord(' '):
- if self.GetCharAt(currpos - 1) == self.GetCharAt(currpos - 2) == ord('.'):
- self.AddText(' ')
- self.AutoCompShow(0, self.directives)
- else:
- event.Skip()
- else:
- event.Skip()
-
- def OnModified(self, evt):
- self.IsModified = 1
-
- def set_lexer(self, ext):
- lexer = self.GetLexer()
- if ext == '.html' or ext == '.htm':
- if lexer != wxSTC_LEX_HTML:
- self.SetLexer(wxSTC_LEX_HTML)
- else:
- if lexer != wxSTC_LEX_NULL:
- self.SetLexer(wxSTC_LEX_NULL)
-
- def LoadFile(self, filename):
- try:
- wxBeginBusyCursor()
- try:
- f = open(filename, 'rt')
- text = f.read()
- f.close()
- ext = os.path.splitext(filename)[1]
- self.set_lexer(ext)
- self.SetText(text)
- self.EmptyUndoBuffer()
- self.IsModified = 0
- except:
- self.Clear()
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- finally:
- wxEndBusyCursor()
-
- def SaveFile(self, filename, backup=0):
- return_value = 1
- try:
- wxBeginBusyCursor()
- try:
- if backup:
- copyfile(filename, '%s.bak' % filename)
- f = open(filename, 'w')
- f.write(self.GetText())
- f.close()
- self.IsModified = 0
- except:
- return_value = 0
- customMsgBox(self, 'Error when saving "%s".\n\n%s:\n%s\n%s' \
- % (filename, sys.exc_info()[0], sys.exc_info()[1],
- sys.exc_info()[2]),
- 'error')
- finally:
- wxEndBusyCursor()
- return return_value
-
- def Clear(self):
- self.SetText('')
- self.IsModified = 0
-
-#---------------------------------------------------------------------------
-
-class CustomStatusBar(wxStatusBar):
- def __init__(self, parent):
- wxStatusBar.__init__(self, parent, -1)
- self.SetFieldsCount(2)
- self.SetStatusWidths([-1,150])
-
- self.SetStatusText('Ready', 0)
-
- # start timer
- self.timer = wxPyTimer(self.Notify)
- self.timer.Start(1000)
- self.Notify()
-
- # Time-out handler
- def Notify(self):
- t = time.localtime(time.time())
- st = time.strftime(" %d-%b-%Y %H:%M:%S", t)
- self.SetStatusText(st, 1)
-
-#---------------------------------------------------------------------------
-
-class CustomTreeCtrl(wxTreeCtrl):
-
- def OnCompareItems(self, item1, item2):
- t1 = self.GetItemText(item1)
- t2 = self.GetItemText(item2)
- #self.log.WriteText('compare: ' + t1 + ' <> ' + t2 + '\n')
- if t1 < t2: return -1
- if t1 == t2: return 0
- return 1
-
diff --git a/sandbox/gschwant/docfactory/factory/dialogs.py b/sandbox/gschwant/docfactory/factory/dialogs.py
deleted file mode 100644
index 69b9c8ee9..000000000
--- a/sandbox/gschwant/docfactory/factory/dialogs.py
+++ /dev/null
@@ -1,788 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-from wxPython.lib.throbber import Throbber
-from wxPython.wx import *
-from wxPython.help import *
-from wxPython.lib.filebrowsebutton import DirBrowseButton
-from docutils.utils import relative_path
-from urllib import quote
-from docutilsadapter import language_codes, publishers
-import images, os, string, ConfigParser, stylesheets, throbimages
-
-NAME = 'DocFactory'
-
-#---------------------------------------------------------------------------
-
-def customMsgBox(window, text, type=None):
- if type=='info':
- style=wxOK|wxICON_INFORMATION
- elif type=='error':
- style=wxOK|wxICON_ERROR
- elif type=='wakeup':
- style=wxOK|wxICON_EXCLAMATION
- else:
- style=wxOK
- dlg = wxMessageDialog(window, text, NAME, style)
- dlg.Centre()
- dlg.ShowModal()
- dlg.Destroy()
-
-#---------------------------------------------------------------------------
-
-class aboutDlg(wxDialog):
-
- def __init__(self, parent):
- wxDialog.__init__(self, parent, -1, title='About')
- self.SetBackgroundColour(wxColour(0, 0, 0))
- self.SetForegroundColour(wxColour(0, 255, 0))
- self.SetFont(wxFont(10, wxMODERN, wxNORMAL, wxNORMAL, false))
-
- bmp = images.getLogoBigBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- wxStaticBitmap(self, -1, bmp, wxPoint(42, 8))
- wxStaticBitmap(self, -1, bmp, wxPoint(274, 8))
-
- # throbber
- pics = [throbimages.catalog[i].getBitmap()
- for i in throbimages.index
- ]
-
- Throbber(self, -1, pics, pos=wxPoint(74, 11),
- size=(200, 25), frameDelay = 0.065, reverse=true).Start()
-
- #text = wxStaticText(self, -1, 'DocFactory 0.2', wxPoint(50, 8))
- #text.SetFont(wxFont(20, wxSWISS, wxNORMAL, wxBOLD, false))
-
- text = wxStaticText(self , -1,
- '>>> release: 0.3',
- wxPoint(9, 50))
- text = wxStaticText(self, -1,
- '>>> manufactured by: gunnar schwant',
- wxPoint(9, 65))
- text = wxStaticText(self, -1,
- '>>> mailto: g.schwant@gmx.de',
- wxPoint(9, 80))
- text = wxStaticText(self, -1,
- '>>> Python version: 2.3.2 (or later)',
- wxPoint(9, 95))
- text = wxStaticText(self, -1,
- '>>> wxPython version: 2.4.2.4',
- wxPoint(9, 110))
- text = wxStaticText(self, -1,
- '>>> Docutils version: 0.3 (or later)',
- wxPoint(9, 125))
- text = wxStaticText(self, -1,
- '>>> special thanks to: guido van rossum,',
- wxPoint(9, 140))
- text = wxStaticText(self, -1,
- '... robin dunn',
- wxPoint(9, 155))
- text = wxStaticText(self, -1,
- '... and david goodger',
- wxPoint(9, 170))
- text = wxStaticText(self, -1,
- '>>> visit http://docutils.sourceforge.net',
- wxPoint(9, 185))
- self.Fit()
-
-#---------------------------------------------------------------------------
-
-class projectSettingsDlg(wxDialog):
-
- def __init__(self, parent, project, invalid_names):
- wxDialog.__init__(self, parent, -1, title = 'Project Settings')
-
- self.project = project
- self.configfile = os.path.join(project.directory, 'docutils.conf')
- self.invalid_names = invalid_names
-
- # Help Button
- wxContextHelpButton(self, pos = wxPoint(370, 8),
- size = wxSize(23, 23))
-
- # Output Directory
- wxStaticText(self, -1, 'Output-Directory', wxPoint(8, 42))
- exitID = wxNewId()
- self.dirCtrl = wxTextCtrl(self, exitID,
- pos = wxPoint(96, 40),
- size = wxSize(240, 21))
- self.dirCtrl.SetHelpText('This is the default ' + \
- 'directory for output-files.')
- exitID = wxNewId()
- self.btnSelDir = wxButton(self, exitID, 'Select',
- pos = wxPoint(344, 40),
- size = wxSize(75, 23))
- EVT_BUTTON(self, exitID, self.onBtnSelDir)
-
- # Title
- wxStaticText(self, -1, 'Title', wxPoint(8, 74))
- exitID = wxNewId()
- self.nameCtrl = wxTextCtrl(self, exitID,
- pos = wxPoint(96, 72),
- size = wxSize(240, 21),
- validator = customValidator(PROJECT_NAME))
- self.nameCtrl.SetHelpText('Enter a title for your project here.')
-
-
- #--------------------------------------------------
- # Fill controls with initial values
- self.init_ctrls()
-
- #--------------------------------------------------
- # docutils.conf-, OK- and Cancel-Buttons
- du_position = wxPoint(50,110)
- ok_position = wxPoint(260,110)
- cancel_position = wxPoint(344,110)
- exitID = wxNewId()
- self.du = wxButton(self, exitID, 'Edit docutils.conf',
- pos = du_position,
- size = wxSize(-1, 23))
- EVT_BUTTON(self, exitID, self.onBtnDocutils)
- exitID = wxNewId()
- self.ok = wxButton(self, exitID, 'OK',
- pos = ok_position,
- size = wxSize(75, 23))
- EVT_BUTTON(self, exitID, self.onBtnOk)
- self.cancel = wxButton(self, wxID_CANCEL, 'Cancel',
- pos = cancel_position,
- size = wxSize(75, 23))
- self.ok.SetDefault()
-
- #--------------------------------------------------
- # Dialog Sizing
- self.Fit()
-
- def onBtnSelDir(self, event):
- dir = self.dirCtrl.GetValue()
- if not os.path.isdir(dir):
- dir = ''
- dlg = wxDirDialog(self, 'Choose a directory for output files', dir)
- if dlg.ShowModal() == wxID_OK:
- directory = dlg.GetPath()
- self.project.directory = directory
- newconfig = os.path.join(directory, 'docutils.conf')
- if newconfig != self.configfile:
- self.configfile = newconfig
- self.init_ctrls()
- dlg.Destroy()
-
- def getValues(self):
- return(self.nameCtrl.GetValue(), self.dirCtrl.GetValue())
-
- def onBtnOk(self, event):
- dir = self.dirCtrl.GetValue()
- name = self.nameCtrl.GetValue()
- if not os.path.isdir(dir):
- customMsgBox(self, 'Invalid Output-Directory.', 'wakeup')
- elif name == '':
- customMsgBox(self, 'You have to enter a Project-Title.', 'wakeup')
- elif (name in self.invalid_names):
- customMsgBox(self,
- 'Invalid Project-Title. Please try another title.',
- 'wakeup')
- else:
- self.EndModal(event.GetId())
-
- def onBtnDocutils(self, event):
- if os.path.isdir(self.dirCtrl.GetValue()):
- dlg = configEditDlg(self, self.configfile)
- dlg.ShowModal()
- else:
- customMsgBox(self, 'Invalid Output-Directory.', 'wakeup')
-
- def init_ctrls(self):
- self.nameCtrl.SetValue(self.project.name)
- self.dirCtrl.SetValue(self.project.directory)
-
-#---------------------------------------------------------------------------
-
-class hyperlinkDlg(wxDialog):
-
- def __init__(self, parent, directory, project=None):
- wxDialog.__init__(self, parent, -1, title = 'Hyperlink')
- btn_size = wxSize(75, 23)
- self.directory = directory
- self.project = project
- wxStaticText(self, -1, 'Path?', wxPoint(8, 12))
- exitID = wxNewId()
- self.pathCtrl = wxTextCtrl(self, exitID,
- pos = wxPoint(46, 10),
- size = wxSize(240, 21))
- exitID = wxNewId()
- self.btnSelPath = wxButton(self, exitID, 'Select',
- pos = wxPoint(294, 10),
- size = btn_size)
- EVT_BUTTON(self, exitID, self.onBtnSelPath)
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxPoint(185-80,40),
- size = btn_size)
- self.cancel = wxButton(self, wxID_CANCEL, 'Cancel',
- pos = wxPoint(185+5,40),
- size = btn_size)
- self.ok.SetDefault()
- self.Fit()
-
- def onBtnSelPath(self, event):
- go_ahead = 1
- dlg = wxFileDialog(self, 'Select a file',
- self.directory, '', '*.*',
- wxOPEN|wxFILE_MUST_EXIST)
- if dlg.ShowModal() == wxID_OK:
- path = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- if self.project == None:
- dlg = wxDirDialog(self, 'Calculate path relative'
- ' to which outputdirectory?',
- self.directory)
- if dlg.ShowModal() == wxID_OK:
- self.directory = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- self.pathCtrl.SetValue(
- quote(relative_path('%s%sdummy.html' % (self.directory,
- os.sep),
- path)))
-
- def GetPath(self):
- return self.pathCtrl.GetValue()
-
-#---------------------------------------------------------------------------
-
-class publishDlg(wxDialog):
-
- def __init__(self, parent, infile, project=None):
- wxDialog.__init__(self, parent, -1, title = 'Publish')
- btn_size = wxSize(75, 23)
- self.infile = infile
- self.project = project
- if self.project != None:
- self.directory = self.project.directory
- else:
- self.directory = os.path.dirname(infile)
- self.writer = 'HTML'
- # Writer
- wxStaticText(self, -1, 'Docutils-Writer:', wxPoint(8, 12))
- exitID = wxNewId()
- writers = publishers.keys()
- writers.sort()
- self.writerCtrl = wxChoice(self, exitID, (100, 10),
- choices = writers)
- self.writerCtrl.SetSelection(1)
- EVT_CHOICE(self, exitID, self.onChoiceWriter)
-
- # Output-directory
- wxStaticText(self, -1, 'Output-Directory:', wxPoint(8, 42))
- exitID = wxNewId()
- self.outdirCtrl = wxTextCtrl(self, exitID,
- pos = wxPoint(100, 40),
- size = wxSize(240, 21))
- self.outdirCtrl.SetValue(self.directory)
- exitID = wxNewId()
- self.btnSelOutdir = wxButton(self, exitID, 'Select',
- pos = wxPoint(350, 40),
- size = btn_size)
- EVT_BUTTON(self, exitID, self.onBtnOutdir)
-
- # Output-file
- wxStaticText(self, -1, 'Output-File:', wxPoint(8, 72))
- exitID = wxNewId()
- self.outfileCtrl = wxTextCtrl(self, exitID,
- pos = wxPoint(100, 70),
- size = wxSize(240, 21))
- self.outfileCtrl.SetValue(self.default_outfile())
-
- # OK and Cancel
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxPoint(235-80,100),
- size = btn_size)
- self.cancel = wxButton(self, wxID_CANCEL, 'Cancel',
- pos = wxPoint(235+5,100),
- size = btn_size)
- self.ok.SetDefault()
- self.Fit()
-
- def onBtnOutdir(self, event):
- dlg = wxDirDialog(self, 'Select output-directory:',
- self.directory)
- if dlg.ShowModal() == wxID_OK:
- self.directory = dlg.GetPath()
- self.outdirCtrl.SetValue(self.directory)
- dlg.Destroy()
-
- def onChoiceWriter(self, event):
- self.writer = event.GetString()
- self.outfileCtrl.SetValue(self.default_outfile())
-
- def GetValues(self):
- return (self.outfileCtrl.GetValue(),
- self.outdirCtrl.GetValue(),
- self.writer)
-
- def default_outfile(self):
- outfile = self.outfileCtrl.GetValue()
- if outfile == '':
- outfile = os.path.splitext(os.path.basename(self.infile))[0] + publishers[self.writer][2]
- else:
- outfile = os.path.splitext(os.path.basename(outfile))[0] + publishers[self.writer][2]
- return outfile
-
-#---------------------------------------------------------------------------
-
-class toolsDlg(wxDialog):
-
- def __init__(self, parent):
- wxDialog.__init__(self, parent, -1, title = 'Configure Toolbox')
- self.tools = parent.tools
- self.parent = parent
- self.currentItem = None
- btn_size = wxSize(75, 23)
- self.il = wxImageList(16, 16)
- bmp = images.getToolBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- self.idx1 = self.il.Add(bmp)
- exitID = wxNewId()
- self.list = wxListCtrl(self, exitID,
- wxDLG_PNT(self, 26, 10),
- wxDLG_SZE(self, 400, 120),
- wxLC_REPORT|wxSUNKEN_BORDER|wxLC_SINGLE_SEL|wxLC_HRULES|wxLC_VRULES)
- self.list.InsertColumn(0, "Tool")
- self.list.InsertColumn(1, "Name")
- self.list.InsertColumn(2, "Command")
- self.list.InsertColumn(3, "Initial Directory")
- self.list.SetImageList(self.il, wxIMAGE_LIST_SMALL)
- EVT_LIST_ITEM_SELECTED(self, exitID, self.on_item_selected)
- self.update_list()
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxDLG_PNT(self, 195, 135),
- size = btn_size)
- exitID = wxNewId()
- bmp = images.getPlusBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 10),
- wxSize(23, 23))
- b.SetToolTipString("Add tool")
- EVT_BUTTON(self, exitID, self.on_plus_btn)
- exitID = wxNewId()
- bmp = images.getPenBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 26),
- wxSize(23, 23))
- b.SetToolTipString("Edit tool")
- EVT_BUTTON(self, exitID, self.on_edit_btn)
- exitID = wxNewId()
- bmp = images.getMinusBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 42),
- wxSize(23, 23))
- b.SetToolTipString("Remove tool")
- EVT_BUTTON(self, exitID, self.on_minus_btn)
- self.ok.SetDefault()
- self.Fit()
-
- def add_tool(self, name, command, init_dir):
- if self.tools == {}:
- key = 1
- else:
- key = max(self.tools.keys())+1
- self.tools[key] = [0, name, command, init_dir]
- i = 1
- for tool in self.tools.values():
- tool[0] = i
- i = i+1
- self.update_list()
-
- def colourize_list(self):
- color = ('yellow', 'light blue')
- for i in range(self.list.GetItemCount()):
- item = self.list.GetItem(i)
- item.SetBackgroundColour(color[i%2])
- self.list.SetItem(item)
-
- def get_column_text(self, index, col):
- item = self.list.GetItem(index, col)
- return item.GetText()
-
- def get_tools(self):
- return self.tools
-
- def update_list(self):
- self.list.DeleteAllItems()
- items = self.tools.items()
- for x in range(len(items)):
- key, data = items[x]
- self.list.InsertImageStringItem(x, str(data[0]), self.idx1)
- self.list.SetStringItem(x, 1, data[1])
- self.list.SetStringItem(x, 2, data[2])
- self.list.SetStringItem(x, 3, data[3])
- self.list.SetItemData(x, key)
- for i in range(4):
- self.list.SetColumnWidth(i, wxLIST_AUTOSIZE)
- self.colourize_list()
-
- def on_edit_btn(self, event):
- go_ahead = 1
- if self.currentItem != None:
- item = self.currentItem
- else:
- go_ahead = 0
- customMsgBox(self, 'Select a tool first.', 'wakeup')
- if go_ahead:
- selected_tool = [int(self.list.GetItemText(self.currentItem)),
- self.get_column_text(self.currentItem, 1),
- self.get_column_text(self.currentItem, 2),
- self.get_column_text(self.currentItem, 3)]
- dlg = editToolDlg(self, selected_tool)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- new_values = dlg.get_values()
- else:
- go_ahead = 0
- if go_ahead:
- for key in self.tools.keys():
- if self.tools[key] == selected_tool:
- self.tools[key][1] = new_values[0]
- self.tools[key][2] = new_values[1]
- self.tools[key][3] = new_values[2]
- self.update_list()
-
- def on_item_selected(self, event):
- self.currentItem = event.m_itemIndex
-
- def on_minus_btn(self, event):
- go_ahead = 1
- if self.currentItem != None:
- item = self.currentItem
- else:
- go_ahead = 0
- customMsgBox(self, 'Select a tool first.', 'wakeup')
- if go_ahead:
- selected_tool = [int(self.list.GetItemText(self.currentItem)),
- self.get_column_text(self.currentItem, 1),
- self.get_column_text(self.currentItem, 2),
- self.get_column_text(self.currentItem, 3)]
- for key in self.tools.keys():
- if self.tools[key] == selected_tool:
- del self.tools[key]
- i = 1
- for tool in self.tools.values():
- tool[0] = i
- i = i+1
- self.update_list()
-
- def on_plus_btn(self, event):
- dlg = editToolDlg(self)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- tool = dlg.get_values()
- self.add_tool(tool[0],tool[1],tool[2])
- dlg.Destroy()
-
-#---------------------------------------------------------------------------
-
-class configEditDlg(wxDialog):
-
- def __init__(self, parent, configfile):
- wxDialog.__init__(self, parent, -1, title = 'docutils.conf')
- try:
- self.cfg = ConfigParser.ConfigParser()
- self.cfg.read(configfile)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- if self.cfg.sections() == []:
- self.cfg.add_section('general')
- self.cfg.set('general','output_encoding','UTF-8')
- self.cfg.set('general','generator','1')
- self.cfg.set('general','source_link','1')
- self.cfg.set('general','datestamp','%Y-%m-%d %H:%M UTC')
- self.cfg.add_section('html4css1 writer')
- self.cfg.set('html4css1 writer','stylesheet_path','')
- self.configfile = configfile
- self.currentItem = None
- btn_size = wxSize(75, 23)
- exitID = wxNewId()
- self.list = wxListCtrl(self, exitID,
- wxDLG_PNT(self, 26, 10),
- wxDLG_SZE(self, 230, 120),
- wxLC_REPORT|wxSUNKEN_BORDER|wxLC_SINGLE_SEL|wxLC_HRULES|wxLC_VRULES)
- self.list.InsertColumn(0, "Section")
- self.list.InsertColumn(1, "Option")
- self.list.InsertColumn(2, "Value")
- EVT_LIST_ITEM_SELECTED(self, exitID, self.on_item_selected)
- self.update()
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxDLG_PNT(self, 105, 135),
- size = btn_size)
- exitID = wxNewId()
- bmp = images.getPlusBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 10),
- wxSize(23, 23))
- b.SetToolTipString("Add entry")
- EVT_BUTTON(self, exitID, self.on_plus_btn)
- exitID = wxNewId()
- bmp = images.getPenBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 26),
- wxSize(23, 23))
- b.SetToolTipString("Edit entry")
- EVT_BUTTON(self, exitID, self.on_edit_btn)
- exitID = wxNewId()
- bmp = images.getMinusBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- b = wxBitmapButton(self, exitID, bmp, wxDLG_PNT(self, 5, 42),
- wxSize(23, 23))
- b.SetToolTipString("Remove entry")
- EVT_BUTTON(self, exitID, self.on_minus_btn)
- self.ok.SetDefault()
- self.Fit()
-
- def add(self, section, option, value):
- go_ahead = 1
- if self.cfg.has_option(section, option):
- customMsgBox(self, '%s, %s has already been set.\nUse the edit-' \
- 'button to change its value.' % (section, option), 'wakeup')
- go_ahead = 0
- if go_ahead:
- if not self.cfg.has_section(section):
- self.cfg.add_section(section)
- self.cfg.set(section, option, value)
- self.update()
-
- def colourize_list(self):
- color = ('Green Yellow', 'Medium Goldenrod')
- for i in range(self.list.GetItemCount()):
- item = self.list.GetItem(i)
- item.SetBackgroundColour(color[i%2])
- self.list.SetItem(item)
-
- def get_column_text(self, index, col):
- item = self.list.GetItem(index, col)
- return item.GetText()
-
- def update(self):
- f = open(self.configfile, 'wt')
- self.cfg.write(f)
- f.close()
- self.list.DeleteAllItems()
- x = 0
- for section in self.cfg.sections():
- for option in self.cfg.options(section):
- key, data = x, [section, option, self.cfg.get(section, option)]
- self.list.InsertStringItem(x, str(data[0]))
- self.list.SetStringItem(x, 1, data[1])
- self.list.SetStringItem(x, 2, data[2])
- self.list.SetItemData(x, key)
- x +=1
- for i in range(3):
- self.list.SetColumnWidth(i, wxLIST_AUTOSIZE)
- self.colourize_list()
-
- def on_edit_btn(self, event):
- go_ahead = 1
- if self.currentItem != None:
- item = self.currentItem
- else:
- go_ahead = 0
- customMsgBox(self, 'Select an item first.', 'wakeup')
- if go_ahead:
- select = [self.list.GetItemText(self.currentItem),
- self.get_column_text(self.currentItem, 1),
- self.get_column_text(self.currentItem, 2)]
- self.cfg.remove_option(select[0], select[1])
- dlg = editConfigEntryDlg(self, select)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- section, option, value = dlg.get_values()
- else:
- go_ahead = 0
- if go_ahead:
- if not self.cfg.has_section(section):
- self.cfg.add_section(section)
- self.cfg.set(section, option, value)
- self.update()
-
- def on_item_selected(self, event):
- self.currentItem = event.m_itemIndex
-
- def on_minus_btn(self, event):
- go_ahead = 1
- if self.currentItem != None:
- item = self.currentItem
- else:
- go_ahead = 0
- customMsgBox(self, 'Select an item first.', 'wakeup')
- if go_ahead:
- section, option = [self.list.GetItemText(self.currentItem),
- self.get_column_text(self.currentItem, 1)]
- self.cfg.remove_option(section, option)
- self.update()
-
- def on_plus_btn(self, event):
- dlg = editConfigEntryDlg(self)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- new = dlg.get_values()
- self.add(new[0],new[1],new[2])
- dlg.Destroy()
-
-#---------------------------------------------------------------------------
-
-class editConfigEntryDlg(wxDialog):
-
- def __init__(self, parent, entry=['','','']):
- wxDialog.__init__(self, parent, -1, title = 'docutils.conf setting')
- wxStaticText(self, -1, 'Section:', wxPoint(18, 13))
- self.section = wxTextCtrl(self, -1, pos = wxPoint(70, 10),
- size = wxSize(310, -1))
- wxStaticText(self, -1, 'Option:', wxPoint(18, 45))
- self.option = wxTextCtrl(self, -1, pos = wxPoint(70, 42),
- size = wxSize(310, -1))
- wxStaticText(self, -1, 'Value:', wxPoint(18, 77))
- self.value = wxTextCtrl(self, -1, pos = wxPoint(70, 74),
- size = wxSize(310, -1))
- btn_size = wxSize(75, 23)
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxPoint(210-90,110),
- size = btn_size)
- EVT_BUTTON(self, wxID_OK, self.on_btn_ok)
- self.cancel = wxButton(self, wxID_CANCEL, 'Cancel',
- pos = wxPoint(210-5,110),
- size = btn_size)
- self.section.SetValue(entry[0])
- self.option.SetValue(entry[1])
- self.value.SetValue(entry[2])
- self.ok.SetDefault()
- self.Fit()
-
- def get_values(self):
- return self.section.GetValue(), self.option.GetValue(), self.value.GetValue()
-
- def on_btn_ok(self, event):
- go_ahead = 1
- for ctrl in (self.section, self.option):
- if ctrl.GetValue() == '':
- go_ahead = 0
- break
- if go_ahead:
- self.EndModal(event.GetId())
- else:
- customMsgBox(self, 'At least section and option have to be filled.', 'wakeup')
-
-#---------------------------------------------------------------------------
-
-class editToolDlg(wxDialog):
-
- def __init__(self, parent, tool=['','','','']):
- wxDialog.__init__(self, parent, -1, title = 'Tool')
- wxStaticText(self, -1, 'Name:', wxPoint(28, 13))
- self.name = wxTextCtrl(self, -1, pos = wxPoint(64, 10),
- size = wxSize(322, -1),
- validator = customValidator(TOOL_NAME))
- wxStaticText(self, -1, 'Command:', wxPoint(28, 45))
- self.command = wxTextCtrl(self, -1, pos = wxPoint(84, 42),
- size = wxSize(302, -1),
- validator = customValidator(NO_SEMICOLON))
- wxStaticText(self, -1, 'Initial Directory:', wxPoint(28, 77))
- self.init_dir = wxTextCtrl(self, -1, pos = wxPoint(105, 74),
- size = wxSize(282, -1),
- validator = customValidator(NO_SEMICOLON))
- btn_size = wxSize(75, 23)
- self.ok = wxButton(self, wxID_OK, 'OK',
- pos = wxPoint(230-80,110),
- size = btn_size)
- EVT_BUTTON(self, wxID_OK, self.on_btn_ok)
- self.cancel = wxButton(self, wxID_CANCEL, 'Cancel',
- pos = wxPoint(230+5,110),
- size = btn_size)
- self.name.SetValue(tool[1])
- self.command.SetValue(tool[2])
- self.init_dir.SetValue(tool[3])
- self.ok.SetDefault()
- self.Fit()
-
- def get_values(self):
- return self.name.GetValue(), self.command.GetValue(), self.init_dir.GetValue()
-
- def on_btn_ok(self, event):
- go_ahead = 1
- for ctrl in (self.name, self.command, self.init_dir):
- if ctrl.GetValue() == '':
- go_ahead = 0
- break
- if go_ahead:
- self.EndModal(event.GetId())
- else:
- customMsgBox(self, 'All fields have to be filled.', 'wakeup')
-
-#---------------------------------------------------------------------------
-
-PROJECT_NAME = 1
-TOOL_NAME = 2
-NO_SEMICOLON = 3
-PROJECT_CHARS = string.letters + string.digits
-TOOL_CHARS = PROJECT_CHARS + '$[]|<>,.:-_\\/(){} '
-
-class customValidator(wxPyValidator):
- def __init__(self, flag=None, pyVar=None):
- wxPyValidator.__init__(self)
- self.flag = flag
- EVT_CHAR(self, self.OnChar)
-
- def Clone(self):
- return customValidator(self.flag)
-
- def Validate(self, win):
- tc = self.GetWindow()
- val = tc.GetValue()
- if self.flag == PROJECT_NAME:
- for x in val:
- if x not in PROJECT_CHARS:
- return false
-
- elif self.flag == TOOL_NAME:
- for x in val:
- if x not in TOOL_CHARS:
- return false
-
- elif self.flag == NO_SEMICOLON:
- for x in val:
- if x == ';':
- return false
-
- return true
-
- def OnChar(self, event):
- key = event.KeyCode()
- if key < WXK_SPACE or key == WXK_DELETE or key > 255:
- event.Skip()
- return
- if self.flag == PROJECT_NAME and chr(key) in PROJECT_CHARS:
- event.Skip()
- return
- if self.flag == TOOL_NAME and chr(key) in TOOL_CHARS:
- event.Skip()
- return
- if self.flag == NO_SEMICOLON and chr(key) != ';':
- event.Skip()
- return
- if not wxValidator_IsSilent():
- wxBell()
- return
-
diff --git a/sandbox/gschwant/docfactory/factory/docutilsadapter.py b/sandbox/gschwant/docfactory/factory/docutilsadapter.py
deleted file mode 100644
index f34e9f737..000000000
--- a/sandbox/gschwant/docfactory/factory/docutilsadapter.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-from docutils.languages import en, de, fr, it
-from docutils.parsers.rst.languages.en import directives
-from docutils.core import publish_file
-from docutils import __version__
-from re import findall
-import os, sys
-from wxPython.wx import wxLogMessage
-
-docutilsversion = __version__
-
-language_codes = ['en', 'de', 'fr', 'it']
-
-publishers = { 'HTML': (None, 'html', '.html'),
- 'Docutils-XML': (None, 'xml', '.xml'),
- 'LaTeX': (None, 'latex', '.tex'),
- 'PEP-HTML': ('pep', 'pep_html', '.html'),
- 'Pseudo-XML': (None, None, '.xml'),
- }
-
-try:
- from docutils.writers import htmlnav
- publishers['HTML with navigation-bars'] = (None, 'htmlnav', '.html')
-except:
- pass
-
-def get_rest_bibl_fields(language_code='en'):
- # suitable for autocompletion in wxStyledTextCtrl
- bibl_fields = ''
- if language_code not in language_codes:
- language_code = 'en'
- if language_code == 'en':
- list = en.bibliographic_fields.keys()
- if language_code == 'de':
- list = de.bibliographic_fields.keys()
- if language_code == 'fr':
- list = fr.bibliographic_fields.keys()
- if language_code == 'it':
- list = it.bibliographic_fields.keys()
- list.sort()
- for value in list:
- bibl_fields = '%s %s:' % (bibl_fields, value)
- return bibl_fields[1:]
-
-def get_rest_directives():
- # suitable for autocompletion in wxStyledTextCtrl
- drvs = ''
- list = directives.keys()
- list.sort()
- for value in list:
- drvs = '%s %s::' % (drvs, value)
- return drvs[1:]
-
-def publish_document(writer, infile, outfile, outdir):
- current_dir = os.path.abspath(os.curdir)
- sys.stderr = StdCatcher()
- os.chdir(outdir)
- if publishers[writer][0] != None:
- publish_file(reader_name=publishers[writer][0],
- writer_name=publishers[writer][1],
- source_path=infile,
- destination_path=os.path.join(outdir,outfile))
- else:
- if publishers[writer][1] != None:
- publish_file(writer_name=publishers[writer][1],
- source_path=infile,
- destination_path=os.path.join(outdir,outfile))
- else:
- publish_file(source_path=infile,
- destination_path=os.path.join(outdir,outfile))
- os.chdir(current_dir)
- sys.stderr = sys.__stderr__
- return 1
-
-class StdCatcher:
- # suitable for catching docutils stderr-output
- def __init__(self):
- self.text = ''
-
- def write(self,s):
- wxLogMessage(s)
-
-def get_errors(str):
- errors = []
- warnings = []
- lines = str.splitlines()
- for s in lines:
- if docutilsversion < '0.2.5':
- if s.startswith('WARNING'):
- for i in findall('line \d+', s):
- warnings.append(int(i.split(' ')[1])-1)
- if s.startswith('ERROR') or s.startswith('SEVERE'):
- for i in findall('line \d+', s):
- errors.append(int(i.split(' ')[1])-1)
- else:
- parts = s.split(': (')
- if len(parts) > 1:
- s2 = parts[1]
- if s2.startswith('WARNING'):
- for i in findall(':\d+:', s):
- warnings.append(int(i[1:-1])-1)
- if s2.startswith('ERROR') or s2.startswith('SEVERE'):
- for i in findall(':\d+:', s):
- errors.append(int(i[1:-1])-1)
- errors.sort()
- warnings.sort()
- return warnings, errors
diff --git a/sandbox/gschwant/docfactory/factory/images.py b/sandbox/gschwant/docfactory/factory/images.py
deleted file mode 100644
index f8e15908c..000000000
--- a/sandbox/gschwant/docfactory/factory/images.py
+++ /dev/null
@@ -1,460 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-#----------------------------------------------------------------------
-# This file was generated by img2py.py
-#
-from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap
-import cPickle, zlib
-from wxPython.wx import wxImageFromStream, wxBitmapFromImage
-import cStringIO
-
-
-def getLogoSmallData():
- return cPickle.loads(zlib.decompress(
-'x\xda\x8d\x90=\x0b\x830\x10\x86w\x7f\xc5\x81_%\x81#\x96"\x8eZ\xc1\xd5\xc1\
-\xc5U\x1c+\xd8\xff?\xf5\xde\x8b\x89\xba\xf5U\x02\xcfs\x17/\xf1\xb1}\xabd*\
-\xab\x9a\xf0>\xa9*\x93e*\x99Vzo\xcb\xfaQ\xca\x84\xd2A\xa3<\x83\x9d\xe4\xe0\
-\xd1\xf308\xa7\xdc\x82kW\x87\xba\x01\xf7\xae\x0f\x9c\x82\x9b\xb3\x9e{n\x02\
-\x93\x9f\x87\t\xca\x16\xfcr\xafP\xdf\xc3y\x8ez\x01\xee\\\x17\xf7\xf3-\xe4\
-\xaf4kv\x84\xc7\x91\x83\x94\x06,j/r\x97u\x14+\xe5\x8b\xdcgVI\xf4\xaf\xbco\
-\xc7\x0c\xc99H\xb46Y\x0e\x9d\xf1\xf0\xd6\xda6=\x0eO\x19\x9e\x0c\x92\xd3<tB\
-\x12\xc1\x11\x17\xe6\x94\x19:e\xaf\xb8(5\xb2\xb70&~\xd3GF\x99\xf8\x97(\x06Jo\
-\xc4?\x8a\x04u\xfa' ))
-
-def getLogoSmallBitmap():
- return wxBitmapFromXPMData(getLogoSmallData())
-
-def getLogoSmallImage():
- return wxImageFromBitmap(getLogoSmallBitmap())
-
-#----------------------------------------------------------------------
-def getLogoBigData():
- return cPickle.loads(zlib.decompress(
-'x\xda\x8d\x94Ko\xc20\x10\x84\xef\xfc\nKyPa\xb12m\x84\xb8D\nE\xca\x95\x03\
-\x17_\x11\xc7"\xa5\xff\xff\xd4\x9d];qL(\x8c\x90\xea\xe9~\x9d]?\xe8\xc7\xfdw\
-\xb7\xba\xac\xbf>\r\x7fv\x8d\xd9\xadW\xd7\xcb\x9a\xcc\xcd|\xdf\xaf\xb7\x1fq[\
-v\x85s\x07\xd7\xf7\xe2\x0b\xf8^$\xdek\xdd\xc5\xfaY}\xdf;\'\xbe\x84\xdf\xbb}\
-\xac\xb7\xf0\'w\x8a\xbe\x82?Lu\xa3\xf9\x07\xd7\xe8\xdf\xd7Z\x1f\xfb[\xad\xa3\
-\xa3\xf8\x0e\xbea:\xd4\x878_\xa8o\xe0\x8f\xee8\xe6S\x94\xaeL\xf8\x85\t\xd2#\
-\xf0Q4@Dg\x11YQ\x0e\x05j\x88\x14r\x12H\xf2\xf1\xd3Z\x920\xc4!j\x06\xf1 \x83\
-\xd2g\xa6\x90AH\x9aC\x1a\xc0\x0b\xb4\xe1\x15\x87\x10\xd9\x17\x90\xd1y^&Y\xf3\
-F\x92}#\xe9\r\x88\x8b\x0b\x83\x83\xe2\x95\x15\ne>\x82\x1cb\x8d\x87\x08J\x0fs\
-\x0e\xcd\xef\x84\x9eC\x9e\xe2\x05\x93\xbatp;>\x95\xb8\xf2\xbe\xebt\x84\x1126\
-U\xf2&\xb0\x9f\t*\xe2\x07\x1b\xf7\xc8\xe9\xba\xb2\xac\xea\xfa\x1f\xa8\x0bP\
-\xf5\x04\xa2\xc0\x101R\xd7\x1eS=B\xda\x0c3\x03\xaa\xfd\x02\xc4ck\x0e27\x9b\
-\xb6]\x80\xf89F\xc8\n\xb4\x90\xc4B\xbbmY\xa1\x1d\xe7,\xb4\x93Sb\n\xfb\xd2f\
-\x8f\x83\x07\x91\xc7\xbe\x800\x94\x1fAT\n\xe5\'\x9e]\x8b\xcc\x93_\xcb$\xbd`\
-\x9dgv\xc1E&}*\xc6$_\xf3\xf9+\xd0=JJ\xfa\x0f\xc3\xbc\x10C\xf4\x07\xe7\xd5-h'\
- ))
-
-def getLogoBigBitmap():
- return wxBitmapFromXPMData(getLogoBigData())
-
-def getLogoBigImage():
- return wxImageFromBitmap(getLogoBigBitmap())
-
-#----------------------------------------------------------------------
-def getProjectData():
- return cPickle.loads(zlib.decompress(
-'x\xda]\x90\xb1\n\x840\x0c\x86\xf7{\x8a@\xb5\x1e\x14B\x0b"\x8ez\x82k\x07\x17\
-Wq<\xa1\xf7\xfe\xd3\xa5\x899\xeb\xfdt\xf9\xbe\xfe\t\xb4\xcf\xe3\x13\x1eK\x13\
-:\xc8\'@h\x1e\xdb\xd2 \xec\xf0:\xb6\xfd\xcd\xb4\x12\x99\x99\xd2zfP\x9eg\xe6!\
-s\xe7;\x7f\xb2\xcd<\xf9I\xd9d\xee\xaf\xfbJ\xb8W\x8e\xb2o\xf4^\xf6\'\xe1I\xd9\
-en}\xab\xfd:\xf3\xe8Ge\x00\xa4\xc0/"Y\xe0]"\xac\x14\xae\xf3\x80\xc8\x95\x03\
-\xda\x17\x99\x12\x16Qy\xedK\xa02\x9e\x0b\xa8\x16\xd7\xbb$\xe5\x8aq\x92\x89\
-\xf6:\xe7\x06s\x97\xd4sh\xaaR\xc6\x98]\xc4\xda\xa2\xbeHB\xb3\xe4TJh\xb6\xb6T\
-\xbcKD\xcb\xef,%\xeb\xeb\x97\xfeB\x12\xbf\x98zjg' ))
-
-def getProjectBitmap():
- return wxBitmapFromXPMData(getProjectData())
-
-def getProjectImage():
- return wxImageFromBitmap(getProjectBitmap())
-
-#----------------------------------------------------------------------
-def getFile1Data():
- return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\
-\xe4l0O\x01\xc8Sv\x03\x030?\x02\xc4w6p6\x80\xf2\xf5@|\x0b\x03\x10\x84\xa8\
-\xd7\x83\x03\x05\x10\x80\n*@A\x84\x1e6A0\x13.\x98\x0f\x02`\x12C%Pm>\xbaJ\xa0\
-\xb2\x88A\xad2\x02\x01\xe0\x82\xf9\xc8\x00&\x88\x06\x80\x82z\x00lj[\xe4' ))
-
-def getFile1Bitmap():
- return wxBitmapFromXPMData(getFile1Data())
-
-def getFile1Image():
- return wxImageFromBitmap(getFile1Bitmap())
-
-#----------------------------------------------------------------------
-def getLinkData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4gz\xba8\x86T\xcc\
-\xb9:\xd1\x91\xaf\xc1\x80\x83\xe5\xe0\x8f\xff\xfa\xfd\xe2\x01J\t+\xe6\xdd\
-\xf1\x9e=\xcd\xaf\xdc\xd1\xd5\xc1k\xe5\xda\xb3[3_\xcb13\xb1\\\x10JXw\x9f!dW\
-\xdc\x9b\xc9\xcfo,\x08Qn\xb1|\xc0\xf9m%{\x83\xf5\x89k\xcb\xac\x94\xafX\xae\
-\xff\xfc\xfb\xdeT\xa5\x10\xd7\xa9{\xce1,\x99\xbf\x9c\x8b\xef\x9e\xe3)M\x9fd\
-\x91\x86Rq\xf6S\xef4\xc5]Z\xc3N\x01-e\xf0t\xf5sY\xe7\x94\xd0\x04\x00\t\x8e?\
-\x85' )
-
-def getLinkBitmap():
- return wxBitmapFromImage(getLinkImage())
-
-def getLinkImage():
- stream = cStringIO.StringIO(getLinkData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getImageData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xf7z\xba8\x86T\xcc\
-9\x1a\xec\xc8\xd5`\xc0\xe3}\xb4\xfd%{\xcd\xe5_\xaa\x07w\xdf\xfb\x1bl\xe3\xb3\
-tv\xe8\x1c.\xb1S7<6M\xc8c\x9aP\x11xU\xfa\x93:Si\xcc\x13\xc6\xa93\x99?\xd51;,\
-\xbev\xf0\xee\xef\xbe\xba\xd7\xc6\x13X\xe3z5\x05-\xbc\x0fqu.\xd3\xa8\xe7z\
-\xe5\xfd4%>\x819r\xc3\xaa\x9b\xec\xf1\x0b\xe4\x8f){\xa8\xce{\xbfd\n\xcf\x0c\
-\x9e];\xcf20:8\x98\xfb\xeb]\x14\xe9\x9c\xe1\x1fi\xde\xc8\xb0\xd3\xea\xc1?\
-\x03/\xef\xba\xff\xbd\xdc\xcf/\xb9\\\xfb\xb4`}3\xd0a\x0c\x9e\xae~.\xeb\x9c\
-\x12\x9a\x00\x90]PH' )
-
-def getImageBitmap():
- return wxBitmapFromImage(getImageImage())
-
-def getImageImage():
- stream = cStringIO.StringIO(getImageData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getOpenData():
- return zlib.decompress(
-"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4W{\xba8\x86T\xccY\
-\x1a\xec\xc9w@\x81\xa3e\x19\xff\xf3\xe7\x97\xbb\x05\\X\xa5<{\xa47;Lal\xd0{\
-\xf4V\xc5p\xf3\xda\xc5\xf7.32oX\x98b5\x9d%\xf0\xe2d\x81^!\xa3nk\xf7\xcbvI\
-\x87j_\x1d\x939\xe3\xa9\xfe\xf4o\xe5\xcdf\xadiBF[%\x18\xae\t\xcd\xe8t\xc9\
-\xda\xf0\xccG\xf5\x0f\xe3\xea\\\xe5\x0f\t\x13\x8d'\xb2\x0b\xf7\xcaUx\xc7>m] \
-|\xbb\xbc\xe0\xa7\xe4\xfb\xfb\x07\xd9\xd9\xa5\x9c\xf8\x1f\xecJ\xf2\x05:\x83\
-\xc1\xd3\xd5\xcfe\x9dSB\x13\x00\x15\x16EI" )
-
-def getOpenBitmap():
- return wxBitmapFromImage(getOpenImage())
-
-def getOpenImage():
- stream = cStringIO.StringIO(getOpenData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getNewData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x07{\xba8\x86T\xcc\
-INI\xf8\xf1\x7f~#\xd3\x81\xa6\x04#\xa1\x80\xae\xbbrb"\xaa\x162\x87O\x9c\xe0\
-\xd8\xca\x10<\xaf\xb3akF[\xf2\xaeI\x19\xcc\n\xeb\x12\x0e\x18\xb4\xb0\x06k\
-\xea\xdd\xbe\xc8\xabt\x91u\xc7\x81\x15\x8c\xcd\x07\x19\xa6\x944\xc8\x1dW\x91\
-r\x88[\xb6\xe4\x067\xc3\xf1W|:\xa9.g\xc4\x80\xc63x\xba\xfa\xb9\xacsJh\x02\
-\x00\x18\x0c1\x97' )
-
-def getNewBitmap():
- return wxBitmapFromImage(getNewImage())
-
-def getNewImage():
- stream = cStringIO.StringIO(getNewData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getPasteData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4/\xf4tq\x0c\xa9\x98\
-\xb3tr\xa0P\x93\x01\x8f\x8b9\xcf\xf5\x027\xff,\x1b\xcd\xd2\x0fr\x1f\x95\xd3&\
-]\x9a\x12vw=\xd3\xcd\xed\xd1\x0bX:\x1e\xf0\xaf\xfd\x99k\x15\xf3\xdd\xf8\xda\
-\x1d\x86\x13\xcb%\x04\xe72q6\x18\xfcVN3]}\xf1\xfaq\xc9f\x9d\x89\xa7y\xa6\xe4\
-\x1e\xdf\xbc\'`\xdb\xde(w\x87M\xac\xd7\xbf\x96\x9dT\xb7^\xc5\xb0wJ\xe6\x01\
-\xfd\rz\x0c\x1f\xf4\x05S\xf5\xafo1\x11\x16\x0e2\xe8\x95\xcex\xa4,\xf1\xde\
-\xb7[\xf1\x80O\xe9.\xe7}Y\x13\x1c=\xf9\x83\x7fk\x1f\xdf"\xe3\xc3p\x84\xe1\
-\xe5\x89\x152\x0c\x96\xb7\x0f\xdd\xd1\xacg\xae`r\xba\xee;u\xc9r\xa0c\x19<]\
-\xfd\\\xd69%4\x01\x00\xaaxW\x00' )
-
-def getPasteBitmap():
- return wxBitmapFromImage(getPasteImage())
-
-def getPasteImage():
- stream = cStringIO.StringIO(getPasteData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getCopyData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47y\xba8\x86T\xccY:9\
-\x90\xaf\xc1\x80\xc3\xb9\xfb\xe3\xbdc\x93\xaf\xf3\x1f\x94\xdc \xdd\xf97U{}\
-\x8e\x84\xc3\xa3v\x9e\x06\x83\x17?\xa5\x18\x8c\x1cgD\xdeN\tn\xbd}%\xe4\xe7E\
-\xbb]\xf3\xea>z\x88\xdcT\xb9\xf8H\xd9I\xa2d\x91h\xd3T\x8f]\x82\xd5,\xef3\x9a\
-\x13\x8eD\n\x1d\xf1YT\xddwY\xed\xc42\xc1\xe4O\x13\x03\xdafHW\xb0\x94\x9e\x10\
-d=\xf8zJV\xf0\xfc@\x81\x8c\xab+\xc3}y\xaaN\xab\x94/\\\xcd\xfd\xea\xa0\xc7\
-\xac\xb8\x1bb \xa72x\xba\xfa\xb9\xacsJh\x02\x00\x80\xa5K\xbe' )
-
-def getCopyBitmap():
- return wxBitmapFromImage(getCopyImage())
-
-def getCopyImage():
- stream = cStringIO.StringIO(getCopyData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getCutData():
- return zlib.decompress(
-"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xe7{\xba8\x86T\xcc\
-Y;\xc9\x9b\xaf\xc1\x80\xc3E\xf6\xf1\xde\xd9\xf3d\xc2%\xbc\x12/<xs\xeb\xc0\
-\x87\x1f\x0e.O2^\xf4\xd81^(\xcf\xbc\xa0\xf6\xe3\xa8\xc3F\xc9\xba\xac\x07\xcf\
-O=\xf3\x89^\xb1*\x98ymT\xae\xe4MY\x86\xcb3z\xdf\xb3\x98\t\xce\xe8^x\xf5\xa8\
-\x96\xbb\xdb\xbc4\xc5\x0b\x0cmo\xae\xda-Y\xcb\xaa?\xf1\xe3\x16\xd1\x89\xb9\
-\xd1\t\x07'^2\xddw\x957h\xa2\xd9D\x1b\x9b\x8e\x87@\xab\x19<]\xfd\\\xd69%4\
-\x01\x00\xb0TE\xc8" )
-
-def getCutBitmap():
- return wxBitmapFromImage(getCutImage())
-
-def getCutImage():
- stream = cStringIO.StringIO(getCutData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getRedoData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x17{\xba8\x86T\xcc\
-9;\xe94o\x83\x82\x80\x0b{\xb2\xf257\xc5\x04E\xef\xa6\xde\xc8S\x15\x02\xc2\
-\xfb\xdaN0\xde\xcfm\xbf+~c\x81\x87\x10\xb3\x8e\xf2\xe1\xff\x02k\n\x1f\xdea\\\
-{~I\xa3\xc9{66\x17\x1b\xc6\xd32\x07\xc4*c\x16\x8b]\xab8W\x9c\xf8\x9d\xcf\x83\
-y\xe97\xa5\xf7bW\xda\x84\x1bO\\\xcb\xc9z\xfa0\xeb\xa5\xb5\xeb\x9f\xd7zEWl\
-\x7f\xcc\xfdi_\xb8\xef\x01\xd3n\xa6]}\xfb3ZA\xd63x\xba\xfa\xb9\xacsJh\x02\
-\x00\'\xb0Ez' )
-
-def getRedoBitmap():
- return wxBitmapFromImage(getRedoImage())
-
-def getRedoImage():
- stream = cStringIO.StringIO(getRedoData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getUndoData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x97x\xba8\x86T\xcc\
-9;\xc9\x9a\xef\x80\x02\x8f\xf3\xe3U\xe2\x0f\x93dwx<T\x90\xb3\xc8\xb4\xda\xd2\
-!&\xf0\xd7\xe0\xc2\xf6\xa3]\xbaG\xb9BB\x976\xaf<\xfe\xa7\xbf\xe1g\x1e\xe3\
-\x87\xe93M\x92\xdeNb\xb1\x15(\xacr;"\x1au\xe5\xe4\x84g\xb3\x16\xa6\x9dqVreo\
-\x10\xbf\xfa\xb5\x90\xfd\xaa\xd0\xe7\xdd\xf1\xec[\x9c\x18\xf4\x97x:}\xbe\xc1\
-c$\xf27A\xff\xa9\xf5c\xfb\xc2\x9a\x03le\xdf\xb7\xf7945\x1b\x00\xedg\xf0t\xf5\
-sY\xe7\x94\xd0\x04\x00\x0bZD\xf2' )
-
-def getUndoBitmap():
- return wxBitmapFromImage(getUndoImage())
-
-def getUndoImage():
- stream = cStringIO.StringIO(getUndoData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getSaveData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xd7z\xba8\x86T\xcc\
-9:\xd9\x91\xab\xc1\x80\x87E\xfd\x919\xd7\xd7T\xb9_\xebd~m\x12\xfb5\xa1B`aR`\
-\x0f\xfbw\xb1\x17~\xb3\x96i\xa7\xa5\xd5\\\xe0QP\xd2\xdb<\xf3-\x03\xc3U\x1f/\
-\xed\xad[\xa2\x83c\x98\xb6\x9a<\x12b\x98a3\x97\x7f\xb3\xf4\x82Y\xfb\x19\xab\
-\xfe\xf2\xcf\xf8\xedd:_.cI\xdd?\xee\x84\x92\x07Wy\x19\x82\xa2\xe4}\xd7\xe9^\
-\xb9\xd46\xff\xcd\x7f\xdd\x13\x13\xdd\xfc\x17\xf8%~ZV\xc5|g\x91V\xcf\xdb\x93\
-nU@\x870x\xba\xfa\xb9\xacsJh\x02\x00\x98\x94G\xa0' )
-
-def getSaveBitmap():
- return wxBitmapFromImage(getSaveImage())
-
-def getSaveImage():
- stream = cStringIO.StringIO(getSaveData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getAboutData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x97{\xba8\x86T\xcc\
-\xd9\x1a\xe4\xc8u\xc0\x80\xc38\xf9\xff\xff\xa22\x81\x83\xdb\xd2J\xa7\xb0r\
-\xad53\xecR\xf0\xb4>\x10\xcb\xca8e\xfe\xea\xa8n\x06\x86\xd56\x8c\x13\xa5\'OW\
-\xb2>\xd8\x1f\xbe\xfe./\xd3\xce\xa8\x08\xb5\xccE\xca\xba\x0bbrY\x8bL\xf7\xf7\
-\xeb\xba\xda$K&\xd5\xbc\x980[7\xa3\xc8;\xa1\xfd?\xcb\xb3F\xad)\xabs\xcc\xf8\
-\x05\x83^\xec`}\xa9\xf0Ma\xbf=\xe7\x9e\x89Fr\xe9"N\x8a{#4\x80f20x\xba\xfa\
-\xb9\xacsJh\x02\x00\x89\x06=\xeb' )
-
-def getAboutBitmap():
- return wxBitmapFromImage(getAboutImage())
-
-def getAboutImage():
- stream = cStringIO.StringIO(getAboutData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getBoldData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xcf\xf6tq\x0c\xa9\
-\x98\xb35\xf8 /\xb3"O\xf1\xaau\xd3{\xf3\xe6\x7fH\xe3\xdc\xf7!\x85{\xc6\x81\
-\xbf"/\x1fDe\xbc\x8f\xf2\x9e\x16 \xa4\xa3\xce\xa8\xe8\x19s\xe0\xed\xa9\xa7\
-\xcd\r\x1d>/\xe78\xaf\xdd\x1a\xfe\xa0!\x88\x8b\xb1\xc0\xe7\xa8\x04g\xc3\xaa[\
-G\x9f^\xe5qY\xd2\xa9\xff8\xfe\xbcC\xe8s]\x1b\xd9R\xdd\'sv\xe6J3\x1a\x1c\xbbq\
-\xfd\x1c\x8b[\xd5\xfb\xfe\xad\xf3-\x14<\x8d\x95\x19\xda\x04\xceqn\xf9\xf1\
-\x7f\xfb\x86z\x8d\xdf\xc5^\x99{[\xcb\x0fg\x9b\x18O\x0b\xda%\xf6\xae\xf9FFF\
-\xe7\xfd\xbae\xc6\x15\x0c\xf3\x16\xf9\x17]h\xf1\xe2\x07:\x93\xc1\xd3\xd5\xcf\
-e\x9dSB\x13\x005-YC' )
-
-def getBoldBitmap():
- return wxBitmapFromImage(getBoldImage())
-
-def getBoldImage():
- stream = cStringIO.StringIO(getBoldData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getItalicData():
- return zlib.decompress(
-"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x07x\xba8\x86T\xcc\
-9:\xd9\x93\x8b\xc1\x80\x83y\xee\xa5\xff\xf57\xe7q\xc5\xc5\xac\xf0\xb0\xcd\
-\x96\x10v\r\r\x95\xdajuX\x95\xd1\xa1\xc1\xb2i\xaei\x8a\xd8Y\xa1\x1bwm'MX0\
-\xa9@\xa3\x80Si\xe1O\xeb\n\xb1\r?\xd6:39\xf1\xdf\x91Xm\xff\xed\xfe\x11\xe6\
-\x96\xe9\x92J\x1e[\x05\xc5\x81f3x\xba\xfa\xb9\xacsJh\x02\x00\xf9\xac.\xf0" )
-
-def getItalicBitmap():
- return wxBitmapFromImage(getItalicImage())
-
-def getItalicImage():
- stream = cStringIO.StringIO(getItalicData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getPreData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xbbx\xba8\x86T\xcc\
-I\xfe\xf3\xff\xff\xffz6.\x06a\xd5Y+\x93\x18\xb8\xcd\x1c\xdd\xdc\xdcD\xec\xec\
-\xe2\x93J\x0f\x02e>f)e0h&\\i8\x98\xc0\xe0\xe6\xe4\xe4\xef\xf2"\xe9\xc5K\xe6\
-\xc3\x0cA\x9f\xaf\x1dhgd\x905\x14\x96\xf9\xde`s\x08h\x1e\x83\xa7\xab\x9f\xcb\
-:\xa7\x84&\x00={+\xe6' )
-
-def getPreBitmap():
- return wxBitmapFromImage(getPreImage())
-
-def getPreImage():
- stream = cStringIO.StringIO(getPreData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getPlusData():
- return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5\x08\x85d\x05e\x03 \
-\xb00\x00\xf3\xf5@|70\x00\xf3\x15`\xf2P~>\x88oa\x02\x82PyT@HPOO\x0fS0""\x82\
-\\A\xa0yz@A=\x88\xb9P\xc1\x08\x04P\xc8\xc7"\x98\x8fU\x10\xdd\xa2|\x08@\xb3\
-\x1d\x9b \xd0<b\x1cO8\x94\xf4\x003\xc5Uu' ))
-
-def getPlusBitmap():
- return wxBitmapFromXPMData(getPlusData())
-
-def getPlusImage():
- return wxImageFromBitmap(getPlusBitmap())
-
-#----------------------------------------------------------------------
-def getMinusData():
- return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05e70\x00\xf3\x15\
-@|\x03 \x80\xf2#@|\'\x17\x90\x08\x98\x9f\x0f\xe2[\x98\x80 T=*\xa0\xb7\xa0\
-\x1e\x02 \x04#\x10\x00\xab`>~A\x85|\x04\xa0\xaf\x8f\xf4\x00ixNy' ))
-
-def getMinusBitmap():
- return wxBitmapFromXPMData(getMinusData())
-
-def getMinusImage():
- return wxImageFromBitmap(getMinusBitmap())
-
-#----------------------------------------------------------------------
-def getToolData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x1f\xf0tq\x0c\xa9\
-\x98\xb3t\xf2F\xdeC\x06\x02\xae\xf5Nb\x0b\x16,1\xd0\x15be\xad=\xc3\xe1\xe1s@\
-\x81GH?!\xc5\x8dc\xf6\x06\x06W\xb7\x1f"\x9d\xc9\xea]\xb2\xec\xfbJ&\x95^\xfa\
-\xbd\xef\xf3\\\xe3\x86#=\x1e\x0f~\x0604\x9c\xfe\xcav@\xf1\xa7}\xc1\xa4\x83\'\
-\xd6\xd9K\xae\xad3,\xd8\xa0\xa3\xda\x13\xa61\xad\x89A\xc1\xbb\xf3Wh\xb9n#\
-\x0f\xab\xa7T\xec\xc6\x9f{\xd8\x13K\x8en\x937\xcaxp\x98\xefCsbs\xa6EH&\xfb\
-\x0f\xaf\xf6\x93\x87\xe6o\xbe\xfaa\xe2\xa3\xeamVo\xb6\x7f/\x0c\xe2h|\xfc\xd2\
-\x86\x9b9\xe3\xf8\x8b\xfb)\xeeSW\xd9,=\xb3\xe2\xe0\x95\xaau\xe6\xbbS.\xd7M\
-\xd5\xdd\xb3e\x91\xceS\xeb\xe3_X\x9f\x9d\xbd\xa4sx\x8d8\x0b\xd0/\x0c\x9e\xae\
-~.\xeb\x9c\x12\x9a\x00\xe5\xfej@' )
-
-def getToolBitmap():
- return wxBitmapFromImage(getToolImage())
-
-def getToolImage():
- stream = cStringIO.StringIO(getToolData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getPublishData():
- return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
-\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xef\xf6tq\x0c\xa9\
-\x98\xd3;\xf9.\xef!\x03\x9e\x16{e\xb5%M\xac\x12\xca\xb5>\xdb\x1bX\x1d\x0c\
-\xc4\xa3e\xf8\xfd\x9c\xbb\xef\x98\xa8Gz\x89>\xaf\xbbs\x84\xe1\xa2C\xb1\xb0\
-\x81C\xd0\x9d\xb4\xb4\xdd*\xc7+?\xd6\xdd\x0b\x97^\xfe\xf9*\xbf\xf7\x8c\x9bj\
-\x9e\xd3\x9b%\x03\xaf/k\x8e\xac\xf5LKa0\x9a 1\xbd\xf6w\x83\xce\x849W\xf7\xb3\
-fY1\xcco\xbd\xc9\xb2$\x9e\x8dq\xda\x8c*Y\x87\xb2T\xcf\xf5\xc7\xd7\xaeS\\\xcd\
-gXd\x10cg\xfayG\tC\xc2\x84\xee\xf6wg.\xf28\xb1\xaf\x93\xd1\xee\xb3\xad_8u\
-\xe7\x89\xebV-\x8b\xf5\xbb\x18\x9cwN|\xa7\xd0\xf6\xa8\xcb\xf8\xff\xf4\x95\
-\x1f\xc3\xb6\xe5\xdd[\xb5\xdc\xf5B\xb3~M\xa0`\x81\xc0\xbe}b@o0x\xba\xfa\xb9\
-\xacsJh\x02\x00:\xc2a\x8f' )
-
-def getPublishBitmap():
- return wxBitmapFromImage(getPublishImage())
-
-def getPublishImage():
- stream = cStringIO.StringIO(getPublishData())
- return wxImageFromStream(stream)
-
-#----------------------------------------------------------------------
-def getPenData():
- return zlib.decompress(
-'x\xda\x01\n\x02\xf5\xfd\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\
-\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\
-\x08\x08\x08|\x08d\x88\x00\x00\x01\xc1IDATx\x9c}\x931o\xd3P\x10\xc7\x7f\xa9:\
-\xa4[2 1\xfa*u\x80\x89\x8e\xee\xe6\x872P\x89\x85HH\xb0\xb9f"]\x10S)c\xc87@H(\
-n\'\xf2%P\xed\x01\x89\x0c\x95b&:D\xeay\x8b7g\xf4\xf6\x18\x9e\x95\xb8\xb4\xc9\
-\x93Nzw\xa7\xdf\xff\xee\xdd{\xaf\x05\xd6\xb2u\xb5\xf0\x01S{\t0\xc56\xb2[\x05\
-Z\x0cGCL`hO\x7fSV\x15\xe6\xd3g\x8e\x1a"\xbb\xdb\xe0\xf1\xc5\x18\x13\xb8\xda\
-\x85\x7fDU\x96\xa8\'D\xb9aJ\x0b\xb0\xecl\x82\xdf\xbe\x81(|G7\xeb\xd3\xcd\xb2\
-U&\x16\xa1@V\xfe\x03\x02-\xce\xcf\xe0\xc7\x04\xc0g\xd6i\xd3\xe9\xf4y|\xf3\
-\x97\xecO\xc6D\x15\x88\x9b\x80\xb5k\xc3\x9e\x9fa\xad\xc5Z\xeb\xdb\xab\xc4\
-\xaf\xf7\xd8\xdb\x0b\xb1\xe29\x1bb\xac\t\x9c\xed\xfe_y8r\x95\x93\x14L0\x05@s\
-\x98\xfc\x12D@\x10\xe2<!\xeaEw\x8f\xf0\xf1\xc3+\xfa\xafg$\xe9\x98\xaf\xdf*\
-\xa0\x01\x9f\x00\x07\x80\x02)\x98\xd0\rV\xe7\xeanA\xbc}\xba\x8f\x0c\x87\xcf\
-\x0e\xd1\xbc\xc3\xde\xdeSf\xd9\x00\x91\xcc\xc1=\xd0\x9f \xb9@\x08r \xe8\\\
-\x89/\xc7\xae\x03\xcd\x95\xe3\x17\x03\x96\xcb%EQ\xe0D#4p\xb0\xff\x1dH\x93{0\
-\xd4\xef\xc0\x04\xc2b\xb1\xa0\xaa\xaa\xd5D4\x8fy"\x0e\x9e\xe4@\x18\xdd\x83\
-\x01v\xc4\xdb\xe7\xf8\xe5\x80\xd3\xf7\xa7$iBY\xce\x98e\x03\xda\xd7\x19\x92n\
-\x87\xdd\xe8\xc1FaD|\xe9\xeev\x1c@\x01$)\xe0\t\x12\x98\x8d\xf0J\xa0\x19\x10O\
-\x10\x11L\xcf\xacb\x9b\xe0z\x06k~8\xfar\'\xa9sEs%I\xaf\x1e\x84\xeb\x0e\xd6\
-\xbf\xd1\x04\xcf\x1d\xa8\x8a\xe6\xb7\x1b\xa1\xe6\xfa\x07\xecS\xd8\xcf\xc1gS\
-\x99\x00\x00\x00\x00IEND\xaeB`\x82V\xf3\xec\xf7' )
-
-def getPenBitmap():
- return wxBitmapFromImage(getPenImage())
-
-def getPenImage():
- stream = cStringIO.StringIO(getPenData())
- return wxImageFromStream(stream)
-
diff --git a/sandbox/gschwant/docfactory/factory/main.py b/sandbox/gschwant/docfactory/factory/main.py
deleted file mode 100755
index 0b1d88487..000000000
--- a/sandbox/gschwant/docfactory/factory/main.py
+++ /dev/null
@@ -1,1708 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-import browser, images, re, sys, os, time, ConfigParser
-from wxPython.wx import *
-from wxPython.lib.dialogs import wxMultipleChoiceDialog, \
- wxScrolledMessageDialog
-from wxPython.lib.imagebrowser import ImageDialog
-from wxPython.help import *
-from dialogs import *
-from controls import CustomStyledTextCtrl
-from controls import CustomTreeCtrl
-from controls import CustomStatusBar
-from docutilsadapter import publish_document, get_errors, \
- get_rest_bibl_fields, publishers, publish_document
-from docutils.utils import relative_path
-from urllib import quote
-from wxPython.lib.buttons import *
-
-
-#-------------------------------------------------------------------------
-# global variables
-#-------------------------------------------------------------------------
-
-NAME = 'DocFactory'
-
-try:
- factory_path = os.path.dirname(__file__)
-except:
- factory_path = os.path.abspath(sys.path[0])
-
-if not os.path.isdir(factory_path):
- factory_path = os.path.abspath(sys.path[0])
-
-try:
- f = open(os.path.join(factory_path, 'conf.pth'))
- DATA = f.readline().splitlines()[0]
- f.close()
-except:
- DATA = os.path.join(factory_path, 'docfactory.dat')
-
-# need some IDs
-[wxID_WXNEWPROJ, wxID_WXNEWREST, wxID_WXOPENFILE,
- wxID_WXREMFILE, wxID_WXSAVEFILE, wxID_WXEXITAPP, wxID_WXPUBL, wxID_WXPUBLALL,
- wxID_WXPROJSETTINGS, wxID_WXINSERTPATH, wxID_WXINSERTIMAGE,
- wxID_WXINSERTFIGURE, wxID_WXCLOSEFILE, wxID_WXVIEWEOLS, wxID_WXEOLSTOCR,
- wxID_WXEOLSTOLF, wxID_WXEOLSTOCRLF, wxID_WXEOLSTO, wxID_WXVIEWEDGE,
- wxID_WXCUTSELECTION, wxID_WXCOPYSELECTION, wxID_WXPASTESELECTION,
- wxID_WXUNDO, wxID_WXREDO, wxID_WXGOTO, wxID_WXSELECTALL, wxID_WXVIEWWS,
- wxID_WXDELETEPROJ, wxID_WXFONTSIZE, wxID_WXSMALLFONT, wxID_WXNORMALFONT,
- wxID_WXBIGFONT, wxID_WXINSERT, wxID_WXBTNBOLD, wxID_WXBTNITALIC,
- wxID_WXBTNLITERAL, wxID_WXBTNLINK, wxID_WXBTNIMAGE, wxID_WXBTNTOOL,
- wxID_WXINSERTHYPERLINK, wxID_WXBTNPASTE, wxID_WXBTNCOPY, wxID_WXRUNTOOL,
- wxID_WXBTNCUT, wxID_WXBTNREDO, wxID_WXBTNUNDO, wxID_WXBTNSAVE,
- wxID_WXBTNOPEN, wxID_WXBTNNEW, wxID_WXBTNPUBLISH, wxID_WXBTNABOUT,
- wxID_WXFINDREPLACE, wxID_WXBACKUPFILES] = map(lambda init_menubar: wxNewId(), range(53))
-
-# Accelerator-Table for key commands
-ACCEL = [(wxACCEL_NORMAL,WXK_F7,wxID_WXPUBL),
- (wxACCEL_NORMAL,WXK_F8,wxID_WXRUNTOOL),
- (wxACCEL_CTRL,ord('F'),wxID_WXFINDREPLACE),
- (wxACCEL_CTRL,ord('G'),wxID_WXGOTO),
- (wxACCEL_CTRL,ord('N'),wxID_WXNEWREST),
- (wxACCEL_CTRL,ord('O'),wxID_WXOPENFILE),
- (wxACCEL_CTRL,ord('S'),wxID_WXSAVEFILE),
- (wxACCEL_ALT,ord('X'),wxID_WXEXITAPP)]
-
-#-------------------------------------------------------------------------
-
-def get_file_extension(filename):
- return os.path.splitext(filename)[1]
-
-#-------------------------------------------------------------------------
-
-class DocProject:
- def __init__(self):
- self.name = ''
- self.directory = 'Nobody expects the spamish inquisition.'
- self.files = []
-
- def add(self, file):
- if file not in self.files:
- self.files.append(file)
- else:
- raise 'File is already part of this project.'
-
- def remove(self, file):
- if file in self.files:
- self.files.remove(file)
-
-#-------------------------------------------------------------------------
-
-class CustomLog(wxPyLog):
- def __init__(self, textCtrl, logTime=0):
- wxPyLog.__init__(self)
- self.tc = textCtrl
- self.logTime = logTime
-
- def DoLogString(self, message, timeStamp):
- if self.logTime:
- message = time.strftime('%X', time.localtime(timeStamp)) + \
- ': ' + message
- self.tc.AppendText(message + '\n')
-
-#-------------------------------------------------------------------------
-
-class DocFactoryFrame(wxFrame):
- def __init__(self, projects=[], initial_file=None):
- wxFrame.__init__(
- self, NULL, -1, NAME, wxDefaultPosition, (800, 600),
- style=wxDEFAULT_FRAME_STYLE)
- self.Centre()
- self.projects = projects
- self.formats = {}
- self.files = []
- self.project = None
- self.editor = None
- self.activeitem = None
- self.imagedir = None
- self.language_code = 'en'
-
- # Application-Icon
- bmp = images.getLogoSmallBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- logoicon = wxEmptyIcon()
- logoicon.CopyFromBitmap(bmp)
- self.SetIcon(logoicon)
-
- self.init_preferences()
- self.init_menubar()
- self.init_toolbar()
-
- self.SetAcceleratorTable(wxAcceleratorTable(ACCEL))
-
- # splitter windows
- splitter = wxSplitterWindow(self, -1, style=wxNO_3D|wxSP_3D)
- splitter2 = wxSplitterWindow(splitter, -1, style=wxNO_3D|wxSP_3D)
-
- # Set up a log
- self.log = wxTextCtrl(splitter2, -1,
- style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL)
-
- # Set the wxWindows log target to be this textctrl
- wxLog_SetActiveTarget(CustomLog(self.log))
-
- # tree
- tID = wxNewId()
- self.tree = CustomTreeCtrl(splitter, tID, style=wxTR_HAS_BUTTONS |
- wxTR_HAS_VARIABLE_ROW_HEIGHT)
- EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.on_tree_item_activated)
-
- # make an image list for tree
- self.im0 = self.im1 = self.im2 = -1
- self.il = wxImageList(16, 16)
- self.im0 = self.il.Add(images.getLogoSmallBitmap())
- self.im1 = self.il.Add(images.getProjectBitmap())
- self.im2 = self.il.Add(images.getFile1Bitmap())
- self.tree.SetImageList(self.il)
-
- self.init_tree()
-
- # Create a Notebook
- tID = wxNewId()
- self.nb = wxNotebook(splitter2, tID, style=wxCLIP_CHILDREN)
- EVT_NOTEBOOK_PAGE_CHANGED(self.nb, tID, self.on_notebook_page_changed)
-
- # editor-page
- self.InitEditorPage()
-
- # create statusbar
- self.sb = CustomStatusBar(self)
- self.SetStatusBar(self.sb)
-
- # initial file
- if initial_file != None:
- self.load_initial_file(initial_file)
-
- self.Show(1)
-
- # add the windows to the splitter and split it.
- splitter2.SplitHorizontally(self.nb, self.log)
- splitter.SplitVertically(self.tree, splitter2)
-
- splitter.SetSashPosition(180, 1)
- splitter.SetMinimumPaneSize(20)
- splitter2.SetSashPosition(450, 1)
- splitter2.SetMinimumPaneSize(20)
-
- # Some global state variables.
- self.projectdirty = 0
-
- EVT_CLOSE(self, self.on_close_window)
-
- def init_menubar(self):
- self.mainmenu = wxMenuBar()
- mainwindow = self
-
- # File
- menu=wxMenu()
- menu.Append(wxID_WXNEWREST, 'New\tCtrl+N',
- 'Create a new txt-file and add to project')
- EVT_MENU(self, wxID_WXNEWREST, self.on_file_new)
- menu.Append(wxID_WXOPENFILE, 'Open...\tCtrl+O',
- 'Open a file')
- EVT_MENU(self, wxID_WXOPENFILE, self.on_file_open)
- menu.Append(wxID_WXCLOSEFILE, 'Close',
- 'Close file')
- EVT_MENU(self, wxID_WXCLOSEFILE, self.on_file_close)
- menu.Enable(wxID_WXCLOSEFILE, 0)
- menu.Append(wxID_WXSAVEFILE, 'Save\tCtrl+S', 'Save file now')
- EVT_MENU(self, wxID_WXSAVEFILE, self.on_file_save)
- menu.Enable(wxID_WXSAVEFILE, 0)
- menu.Append(wxID_WXREMFILE, 'Remove From Project',
- 'Remove file from project')
- EVT_MENU(self, wxID_WXREMFILE, self.on_file_remove)
- menu.Enable(wxID_WXREMFILE, 0)
- menu.AppendSeparator()
- menu.Append(wxID_WXPUBL, 'Publish...\tF7',
- 'Publish file')
- EVT_MENU(self, wxID_WXPUBL, self.on_publish)
- menu.Enable(wxID_WXPUBL, 0)
- menu.AppendSeparator()
- menu.Append(wxID_WXEXITAPP, 'Exit\tAlt+X', 'Exit program')
- EVT_MENU(self, wxID_WXEXITAPP, self.on_app_exit)
- self.mainmenu.Append (menu, '&File')
-
- # Edit
- menu=wxMenu()
- menu.Append(wxID_WXUNDO, 'Undo\tCtrl-Z', 'Undo')
- EVT_MENU(self, wxID_WXUNDO, self.on_undo)
- menu.Enable(wxID_WXUNDO, 0)
- menu.Append(wxID_WXREDO, 'Redo\tCtrl-Y', 'Redo')
- EVT_MENU(self, wxID_WXREDO, self.on_redo)
- menu.Enable(wxID_WXREDO, 0)
- menu.AppendSeparator()
- menu.Append(wxID_WXCUTSELECTION, 'Cut\tCtrl-X', 'Cut')
- EVT_MENU(self, wxID_WXCUTSELECTION, self.on_cut)
- menu.Enable(wxID_WXCUTSELECTION, 0)
- menu.Append(wxID_WXCOPYSELECTION, 'Copy\tCtrl-C', 'Copy')
- EVT_MENU(self, wxID_WXCOPYSELECTION, self.on_copy)
- menu.Enable(wxID_WXCOPYSELECTION, 0)
- menu.Append(wxID_WXPASTESELECTION, 'Paste\tCtrl-V', 'Paste')
- EVT_MENU(self, wxID_WXPASTESELECTION, self.on_paste)
- menu.Enable(wxID_WXPASTESELECTION, 0)
- menu.Append(wxID_WXSELECTALL, 'Select all\tCtrl-A', 'Select the entire file')
- EVT_MENU(self, wxID_WXSELECTALL, self.on_select_all)
- menu.Enable(wxID_WXSELECTALL, 0)
- menu.AppendSeparator()
- submenu=wxMenu()
- submenu.Append(wxID_WXINSERTFIGURE, 'Figure',
- 'Insert a figure')
- EVT_MENU(self, wxID_WXINSERTFIGURE, self.on_insert_figure)
- submenu.Append(wxID_WXINSERTHYPERLINK, 'Hyperlink', 'Insert a hyperlink')
- EVT_MENU(self, wxID_WXINSERTHYPERLINK, self.on_btn_hyperlink)
- submenu.Append(wxID_WXINSERTIMAGE, 'Image', 'Insert an image')
- EVT_MENU(self, wxID_WXINSERTIMAGE, self.on_insert_image)
- submenu.Append(wxID_WXINSERTPATH, 'Path', 'Insert a path')
- EVT_MENU(self, wxID_WXINSERTPATH, self.on_insert_path)
- menu.AppendMenu(wxID_WXINSERT, 'Insert', submenu)
- menu.Enable(wxID_WXINSERT, 0)
- menu.AppendSeparator()
- submenu=wxMenu()
- submenu.Append(wxID_WXEOLSTOCR,'CR',
- 'Change all end of line characters to CR (\\r)')
- EVT_MENU(self, wxID_WXEOLSTOCR, self.on_eols_to_cr)
- submenu.Append(wxID_WXEOLSTOLF,'LF',
- 'Change all end of line characters to LF (\\n)')
- EVT_MENU(self, wxID_WXEOLSTOLF, self.on_eols_to_lf)
- submenu.Append(wxID_WXEOLSTOCRLF,'CRLF',
- 'Change all end of line characters to LF (\\r\\n)')
- EVT_MENU(self, wxID_WXEOLSTOCRLF, self.on_eols_to_crlf)
- menu.AppendMenu(wxID_WXEOLSTO, 'Change all EOLs to', submenu)
- menu.Enable(wxID_WXEOLSTO, 0)
- menu.AppendSeparator()
- menu.Append(wxID_WXFINDREPLACE, 'Find && Replace...\tCtrl-F', 'Find and replace')
- EVT_MENU(self, wxID_WXFINDREPLACE, self.on_findreplace_show)
- EVT_COMMAND_FIND(self, -1, self.on_find)
- EVT_COMMAND_FIND_NEXT(self, -1, self.on_find)
- EVT_COMMAND_FIND_REPLACE(self, -1, self.on_find)
- EVT_COMMAND_FIND_REPLACE_ALL(self, -1, self.on_find)
- EVT_COMMAND_FIND_CLOSE(self, -1, self.on_find_close)
- menu.Append(wxID_WXGOTO, 'Goto line...\tCtrl-G', 'Goto a specific line in the file')
- EVT_MENU(self, wxID_WXGOTO, self.on_goto)
- menu.Enable(wxID_WXGOTO, 0)
- self.mainmenu.Append (menu, '&Edit')
-
- # Project
- menu=wxMenu()
- menu.Append(wxID_WXNEWPROJ, 'New', 'Create a new project')
- EVT_MENU(self, wxID_WXNEWPROJ, self.on_project_new)
- menu.Append(wxID_WXDELETEPROJ, 'Delete...',
- 'Delete one or more projects')
- EVT_MENU(self, wxID_WXDELETEPROJ, self.on_project_delete)
- menu.Append(wxID_WXPUBLALL, 'Publish...',
- 'Publish all txt-files of active project')
- EVT_MENU(self, wxID_WXPUBLALL, self.on_publish_all)
- menu.Enable(wxID_WXPUBLALL, 0)
- menu.AppendSeparator()
- menu.Append(wxID_WXPROJSETTINGS, 'Project Settings...',
- 'Edit project settings')
- EVT_MENU(self, wxID_WXPROJSETTINGS, self.on_project_settings)
- if len(self.projects) == 0:
- menu.Enable(wxID_WXDELETEPROJ, 0)
- menu.Enable(wxID_WXPROJSETTINGS, 0)
- self.mainmenu.Append (menu, 'Pr&oject')
-
- self.init_tools()
-
- # Preferences
- menu=wxMenu()
- menu.Append(wxID_WXVIEWEOLS, 'View EOL markers',
- 'Show or hide end-of-line markers', wxITEM_CHECK)
- EVT_MENU(self, wxID_WXVIEWEOLS, self.on_view_eols)
- menu.Check(wxID_WXVIEWEOLS, self.preferences['eol_markers'])
- menu.Append(wxID_WXVIEWEDGE, 'View right edge indicator',
- 'Toggle display of the right edge indicator (75 characters)',
- wxITEM_CHECK)
- EVT_MENU(self, wxID_WXVIEWEDGE, self.on_view_edge)
- menu.Check(wxID_WXVIEWEDGE, self.preferences['right_edge_indicator'])
- menu.Append(wxID_WXVIEWWS, 'View whitespace',
- 'Show or hide whitespace', wxITEM_CHECK)
- EVT_MENU(self, wxID_WXVIEWWS, self.on_view_ws)
- menu.Check(wxID_WXVIEWWS, self.preferences['whitespace'])
- menu.AppendSeparator()
- submenu=wxMenu()
- submenu.Append(wxID_WXSMALLFONT,'Small',
- 'Reduce font', wxITEM_RADIO)
- EVT_MENU(self, wxID_WXSMALLFONT, self.on_font_small)
- submenu.Append(wxID_WXNORMALFONT,'Normal',
- 'Restore font', wxITEM_RADIO)
- EVT_MENU(self, wxID_WXNORMALFONT, self.on_font_normal)
- submenu.Append(wxID_WXBIGFONT,'Big',
- 'Magnify font', wxITEM_RADIO)
- EVT_MENU(self, wxID_WXBIGFONT, self.on_font_big)
- if self.preferences['fontsize'] == 'small':
- submenu.Check(wxID_WXSMALLFONT, 1)
- elif self.preferences['fontsize'] == 'big':
- submenu.Check(wxID_WXBIGFONT, 1)
- else:
- submenu.Check(wxID_WXNORMALFONT, 1)
- menu.AppendMenu(wxID_WXFONTSIZE, 'Fontsize', submenu)
- menu.AppendSeparator()
- menu.Append(wxID_WXBACKUPFILES, 'Backup files',
- 'Backup files as [filename].bak', wxITEM_CHECK)
- EVT_MENU(self, wxID_WXBACKUPFILES, self.on_backup_files)
- menu.Check(wxID_WXBACKUPFILES, self.preferences['backup_files'])
- self.mainmenu.Append(menu, '&Preferences')
-
- # Toolbox
- menu=wxMenu()
- exitID=wxNewId()
- menu.Append(exitID, 'Configure', 'Configure toolbox')
- EVT_MENU(self, exitID, self.on_configure_tools)
- menu.Append(wxID_WXRUNTOOL, 'Open...\tF8', 'Open toolbox')
- EVT_MENU(self, wxID_WXRUNTOOL, self.on_run_tool)
- self.mainmenu.Append (menu, '&Toolbox')
-
- # Help
- menu=wxMenu()
- exitID=wxNewId()
- menu.Append(exitID, 'About', 'About')
- EVT_MENU(self, exitID, self.on_help_about)
- self.mainmenu.Append (menu, '&Help')
-
- self.SetMenuBar(self.mainmenu)
-
- def init_preferences(self):
- self.preferences = {}
- if os.path.exists(DATA):
- try:
- cfg = ConfigParser.ConfigParser()
- cfg.read(DATA)
- if cfg.has_section('preferences'):
- for pref in cfg.options('preferences'):
- if pref in ('eol_markers', 'right_edge_indicator', \
- 'whitespace', 'backup_files'):
- self.preferences[pref] = cfg.getboolean('preferences', pref)
- else:
- self.preferences[pref] = cfg.get('preferences', pref)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- if not self.preferences.has_key('eol_markers'):
- self.preferences['eol_markers'] = 0
- if not self.preferences.has_key('right_edge_indicator'):
- self.preferences['right_edge_indicator'] = 1
- if not self.preferences.has_key('whitespace'):
- self.preferences['whitespace'] = 0
- if not self.preferences.has_key('fontsize'):
- self.preferences['fontsize'] = 'normal'
- if not self.preferences.has_key('backup_files'):
- self.preferences['backup_files'] = 0
-
- def init_toolbar(self):
- self.toolbar = tb = self.CreateToolBar(wxTB_HORIZONTAL|wxTB_FLAT|wxNO_BORDER)
- bmp = images.getNewBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNNEW, 'New', bmp, shortHelp='New',
- longHelp='Create a new file')
- EVT_TOOL(tb, wxID_WXBTNNEW, self.on_file_new)
- bmp = images.getOpenBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNOPEN, 'Open', bmp, shortHelp='Open',
- longHelp='Open an existing file')
- EVT_TOOL(tb, wxID_WXBTNOPEN, self.on_file_open)
- bmp = images.getSaveBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNSAVE, 'Save', bmp, shortHelp='Save',
- longHelp='Save the active file')
- EVT_TOOL(tb, wxID_WXBTNSAVE, self.on_file_save)
- tb.EnableTool(wxID_WXBTNSAVE, 0)
- tb.AddSeparator()
- bmp = images.getCutBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNCUT, 'Cut', bmp, shortHelp='Cut',
- longHelp='Cut the selection and put it on the Clipboard')
- EVT_TOOL(tb, wxID_WXBTNCUT, self.on_cut)
- tb.EnableTool(wxID_WXBTNCUT, 0)
- bmp = images.getCopyBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNCOPY, 'Copy', bmp, shortHelp='Copy',
- longHelp='Copy the selection and put it on the Clipboard')
- EVT_TOOL(tb, wxID_WXBTNCOPY, self.on_copy)
- tb.EnableTool(wxID_WXBTNCOPY, 0)
- bmp = images.getPasteBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNPASTE, 'Paste', bmp, shortHelp='Paste',
- longHelp='Insert Clipboard contents')
- EVT_TOOL(tb, wxID_WXBTNPASTE, self.on_paste)
- tb.EnableTool(wxID_WXBTNPASTE, 0)
- tb.AddSeparator()
- bmp = images.getUndoBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNUNDO, 'Undo', bmp, shortHelp='Undo',
- longHelp='Undo the last action')
- EVT_TOOL(tb, wxID_WXBTNUNDO, self.on_undo)
- tb.EnableTool(wxID_WXBTNUNDO, 0)
- bmp = images.getRedoBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNREDO, 'Redo', bmp, shortHelp='Redo',
- longHelp='Redo the previously undone action')
- EVT_TOOL(tb, wxID_WXBTNREDO, self.on_redo)
- tb.EnableTool(wxID_WXBTNREDO, 0)
- tb.AddSeparator()
- bmp = images.getLinkBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNLINK, 'Hyperlink', bmp,
- shortHelp='Insert hyperlink',
- longHelp='Insert hyperlink')
- EVT_TOOL(tb, wxID_WXBTNLINK, self.on_btn_hyperlink)
- tb.EnableTool(wxID_WXBTNLINK, 0)
- bmp = images.getImageBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNIMAGE, 'Image', bmp,
- shortHelp='Insert image',
- longHelp='Insert image')
- EVT_TOOL(tb, wxID_WXBTNIMAGE, self.on_btn_image)
- tb.EnableTool(wxID_WXBTNIMAGE, 0)
- tb.AddSeparator()
- bmp = images.getPublishBitmap()
- mask = wxMaskColour(bmp, wxRED)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNPUBLISH, 'Publish', bmp, shortHelp='Publish file',
- longHelp='Publish file')
- EVT_TOOL(tb, wxID_WXBTNPUBLISH, self.on_publish)
- tb.EnableTool(wxID_WXBTNPUBLISH, 0)
- tb.AddSeparator()
- bmp = images.getToolBitmap()
- mask = wxMaskColour(bmp, wxBLUE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNTOOL, 'Toolbox', bmp, shortHelp='Open toolbox',
- longHelp='Open toolbox')
- EVT_TOOL(tb, wxID_WXBTNTOOL, self.on_run_tool)
- tb.AddSeparator()
- bmp = images.getBoldBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNBOLD, 'Bold', bmp, shortHelp='Bold', longHelp='Bold')
- EVT_TOOL(tb, wxID_WXBTNBOLD, self.on_format_word)
- tb.EnableTool(wxID_WXBTNBOLD, 0)
- bmp = images.getItalicBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNITALIC, 'Italic', bmp, shortHelp='Italic', longHelp='Italic')
- EVT_TOOL(tb, wxID_WXBTNITALIC, self.on_format_word)
- tb.EnableTool(wxID_WXBTNITALIC, 0)
- bmp = images.getPreBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNLITERAL, 'literal', bmp, shortHelp='Literal', longHelp='Literal')
- EVT_TOOL(tb, wxID_WXBTNLITERAL, self.on_format_word)
- tb.EnableTool(wxID_WXBTNLITERAL, 0)
- if wxPlatform != '__WXMAC__':
- tb.AddSeparator()
- self.formats = {'Title' : '=', 'Subtitle' : '-',
- 'Heading 1' : '=', 'Heading 2' : '-',
- 'Heading 3' : '~', 'Heading 4' : '`'}
- formats = self.formats.keys()
- formats.sort()
- exitID=wxNewId()
- self.combobox_format = wxComboBox(tb, exitID, '',
- choices = formats,
- style=wxCB_DROPDOWN|wxCB_READONLY)
- tb.AddControl(self.combobox_format)
- EVT_COMBOBOX(tb, exitID, self.on_format_paragraph)
- tb.AddSeparator()
- bmp = images.getAboutBitmap()
- mask = wxMaskColour(bmp, wxWHITE)
- bmp.SetMask(mask)
- tb.AddLabelTool(wxID_WXBTNABOUT, 'About', bmp, shortHelp='About',
- longHelp='Display program information')
- EVT_TOOL(tb, wxID_WXBTNABOUT, self.on_help_about)
- tb.Realize()
-
- def init_tools(self):
- self.tools = {}
- if os.path.exists(DATA):
- try:
- cfg = ConfigParser.ConfigParser()
- cfg.read(DATA)
- if cfg.has_section('tools'):
- for i in range(len(cfg.options('tools'))):
- self.tools[i+1] = [i+1] \
- + cfg.get('tools', str(i+1)).split(';')
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def init_tree(self):
- self.tree.DeleteAllItems()
- self.root = self.tree.AddRoot('Workspace', self.im0)
- self.tree.SetPyData(self.root, None)
- for proj in self.projects:
- child = self.tree.AppendItem(self.root, proj.name, self.im1)
- self.tree.SetPyData(child, None)
- for file in proj.files:
- last = self.tree.AppendItem(child, file, self.im2)
- self.tree.SetPyData(last, None)
- self.tree.SortChildren(self.root)
- for file in self.files:
- last = self.tree.AppendItem(self.root, file, self.im2)
- self.tree.SetPyData(last, None)
- self.project = None
- self.activateMenuItemsProjectOpen(0)
- self.activateMenuItemsFileSelected(0)
- self.activeitem = self.root
- self.tree.SelectItem(self.activeitem)
- self.tree.Expand(self.activeitem)
- if self.editor != None:
- self.nb.SetPageText(0, 'Editor')
- self.editor.Clear()
- self.editor.Enable(0)
- self.activateMenuItemsFileSelected(0)
- if self.nb.GetPageCount() > 1:
- self.nb.DeletePage(1)
-
- def InitEditorPage(self):
- # init editor
- edID = wxNewId()
- self.editor = CustomStyledTextCtrl(self.nb, edID, self.log)
- self.editor.SetViewEOL(self.preferences['eol_markers'])
- self.editor.SetEdgeMode(self.preferences['right_edge_indicator'])
- self.editor.SetViewWhiteSpace(self.preferences['whitespace'])
- if self.preferences['fontsize'] == 'small':
- self.editor.SetZoom(-2)
- elif self.preferences['fontsize'] == 'big':
- self.editor.SetZoom(2)
- else:
- self.editor.SetZoom(0)
- self.editor.Clear()
- self.editor.Enable(0)
- self.nb.AddPage(self.editor, 'Editor')
- self.nb.SetSelection(0)
-
- # --------------------------------------------------------------------
- # handlers
- # --------------------------------------------------------------------
-
- def activateMenuItemsProjectOpen(self, value):
- menu = self.mainmenu.GetMenu(self.mainmenu.FindMenu('Project'))
- if len(self.projects) > 0 and value:
- menu.Enable(wxID_WXDELETEPROJ, value)
- menu.Enable(wxID_WXPROJSETTINGS, value)
- menu.Enable(wxID_WXPUBLALL, value)
-
- def activateMenuItemsFileSelected(self, value):
- menu = self.mainmenu.GetMenu(self.mainmenu.FindMenu('File'))
- if self.project != None:
- menu.Enable(wxID_WXREMFILE, value)
- else:
- menu.Enable(wxID_WXREMFILE, 0)
- menu.Enable(wxID_WXCLOSEFILE, value)
- menu.Enable(wxID_WXSAVEFILE, value)
- menu.Enable(wxID_WXPUBL, value)
- menu = self.mainmenu.GetMenu(self.mainmenu.FindMenu('Edit'))
- menu.Enable(wxID_WXUNDO, value)
- menu.Enable(wxID_WXREDO, value)
- menu.Enable(wxID_WXCUTSELECTION, value)
- menu.Enable(wxID_WXCOPYSELECTION, value)
- menu.Enable(wxID_WXPASTESELECTION, value)
- menu.Enable(wxID_WXSELECTALL, value)
- menu.Enable(wxID_WXINSERT, value)
- menu.Enable(wxID_WXEOLSTO, value)
- menu.Enable(wxID_WXFINDREPLACE, value)
- menu.Enable(wxID_WXGOTO, value)
- self.toolbar.EnableTool(wxID_WXBTNSAVE, value)
- self.toolbar.EnableTool(wxID_WXBTNLINK, value)
- self.toolbar.EnableTool(wxID_WXBTNIMAGE, value)
- self.toolbar.EnableTool(wxID_WXBTNBOLD, value)
- self.toolbar.EnableTool(wxID_WXBTNITALIC, value)
- self.toolbar.EnableTool(wxID_WXBTNLITERAL, value)
- self.toolbar.EnableTool(wxID_WXBTNPASTE, value)
- self.toolbar.EnableTool(wxID_WXBTNCOPY, value)
- self.toolbar.EnableTool(wxID_WXBTNCUT, value)
- self.toolbar.EnableTool(wxID_WXBTNREDO, value)
- self.toolbar.EnableTool(wxID_WXBTNUNDO, value)
- self.toolbar.EnableTool(wxID_WXBTNPUBLISH, value)
-
- def CheckEditorChanges(self):
- go_ahead = 1
- if self.editor != None:
- if self.editor.IsModified:
- dlg=wxMessageDialog(self, 'Save changes?', NAME,
- wxYES_NO | wxCANCEL | wxICON_QUESTION)
- result = dlg.ShowModal()
- if result == wxID_YES:
- file = self.tree.GetItemText(self.activeitem)
- go_ahead = self.editor.SaveFile(file, self.preferences['backup_files'])
- if result == wxID_CANCEL:
- go_ahead = 0
- dlg.Destroy()
- return go_ahead
-
- def delete_project(self, project):
- if project in self.projects:
- self.projects.remove(project)
- try:
- self.save_projects()
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- self.init_tree()
-
- def htmlfile(self, file, dir):
- htmlfile = os.path.join(dir,
- os.path.splitext(os.path.basename(file))[0] \
- + '.html')
- return htmlfile
-
- def insert_hyperlink(self):
- item = self.activeitem
- itemimage = self.tree.GetItemImage(item)
- file = self.tree.GetItemText(item)
- if self.project != None:
- dir = self.project.directory
- else:
- dir = os.path.dirname(file)
- go_ahead = 1
- dlg = hyperlinkDlg(self, directory=dir, project=self.project)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- target = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- selection = self.editor.GetSelectedText()
- curpos = self.editor.GetCurrentPos()
- if selection != '':
- self.editor.BeginUndoAction()
- selection = '`%s`' % selection
- self.editor.ReplaceSelection(selection + '_')
- endpos = self.editor.GetTextLength()
- self.editor.GotoPos(endpos)
- text = '\n\n.. _%s: %s' % (selection, target)
- self.editor.ReplaceSelection(text)
- self.editor.GotoPos(curpos + 3)
- self.editor.EndUndoAction()
- else:
- text = '\n\n.. _``: %s\n' % target
- self.editor.ReplaceSelection(text)
- self.editor.GotoPos(curpos + 7)
-
- def insert_image(self, directive):
- item = self.activeitem
- itemimage = self.tree.GetItemImage(item)
- file = self.tree.GetItemText(item)
- if self.imagedir == None:
- if self.project != None:
- dir = self.project.directory
- else:
- dir = os.path.dirname(file)
- else:
- dir = self.imagedir
- dlg = ImageDialog(self, dir)
- dlg.Centre()
- go_ahead = 1
- if dlg.ShowModal() == wxID_OK:
- target = dlg.GetFile()
- self.imagedir = os.path.dirname(target)
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- if self.project != None:
- dir = self.project.directory
- else:
- dir = os.path.dirname(file)
- dlg = wxDirDialog(self, 'Calculate path relative'
- ' to which outputdirectory?', dir)
- if dlg.ShowModal() == wxID_OK:
- dir = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- selection = self.editor.GetSelectedText()
- if selection != '' and directive == 'image':
- self.editor.BeginUndoAction()
- curpos = self.editor.GetCurrentPos()
- selection = '|%s|' % selection
- self.editor.ReplaceSelection(selection)
- endpos = self.editor.GetTextLength()
- self.editor.GotoPos(endpos)
- text = '\n\n.. %s %s:: %s' % (selection, directive,
- quote(relative_path(self.htmlfile(file,dir),
- target)))
- self.editor.ReplaceSelection(text)
- self.editor.GotoPos(curpos + 2)
- self.editor.EndUndoAction()
- else:
- text = '\n\n.. %s:: %s\n\n' % (directive,
- quote(relative_path(self.htmlfile(file,dir),
- target)))
- self.editor.ReplaceSelection(text)
-
- def load_initial_file(self, file):
- if os.path.exists(file):
- try:
- self.files.append(file)
- dir = ''
- parent = self.root
- self.open_file_in_editor(file)
- last = self.tree.AppendItem(parent, file, self.im2)
- self.tree.SetPyData(last, None)
- self.tree.SetItemBold(self.activeitem, 0)
- self.tree.SetItemTextColour(self.activeitem, wxBLACK)
- self.activeitem = last
- self.tree.SetItemBold(self.activeitem, 1)
- self.tree.SetItemTextColour(self.activeitem, wxBLUE)
- self.tree.EnsureVisible(self.activeitem)
- self.tree.SelectItem(self.activeitem)
- parent = self.tree.GetItemParent(self.activeitem)
- self.tree.SetItemBold(parent, 1)
- self.tree.SetItemTextColour(parent, wxBLUE)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- else:
- customMsgBox(self, 'Can not find %s.' % file, 'error')
-
- def open_file_in_editor(self, file):
- if self.nb.GetPageCount() > 1:
- self.nb.DeletePage(1)
- self.nb.SetSelection(0)
- self.editor.LoadFile(file)
- self.set_editor_language_code(file)
- self.nb.SetPageText(0, 'Editor: %s' %
- os.path.basename(file))
- self.editor.Enable(1)
- self.activateMenuItemsFileSelected(1)
- self.editor.IsModified = 0
-
- def project_save(self):
- try:
- self.save_projects()
- self.projectdirty = 0
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def publishFile(self, infile, outfile, outdir, writer):
- wxBeginBusyCursor()
- try:
- self.log.Clear()
- t = time.localtime(time.time())
- st = time.strftime('%d-%b-%Y, %H:%M:%S', t)
- wxLogMessage('%s: Publishing %s' % (st, writer))
- wxLogMessage('SOURCE: %s' % infile)
- outfile_fullpath = os.path.join(outdir, outfile)
- wxLogMessage('DESTINATION: %s' % outfile_fullpath)
- if outfile_fullpath == infile:
- customMsgBox(self, 'Destination and source are identical.'
- '\nNo processing.', 'wakeup')
- warning_lines = error_lines = []
- else:
- try:
- publish_document(writer, infile, outfile, outdir)
- finally:
- warning_lines, error_lines = get_errors(self.log.GetValue())
- linecount = self.editor.GetLineCount()
- self.editor.MarkerDeleteAll(0)
- self.editor.MarkerDeleteAll(1)
- if warning_lines != []:
- for line in warning_lines:
- if line < linecount:
- self.editor.MarkerAdd(line, 0)
- self.editor.GotoLine(warning_lines[-1])
- if error_lines != []:
- for line in error_lines:
- if line < linecount:
- self.editor.MarkerAdd(line, 1)
- self.editor.GotoLine(error_lines[-1])
- self.editor.IsModified = 0
- if os.path.exists(outfile_fullpath):
- if self.nb.GetPageCount() > 1:
- self.nb.DeletePage(1)
- if get_file_extension(outfile) in ['.html', '.htm']:
- # init html-viewer page
- if wxPlatform == '__WXMSW__':
- htmlprv = browser.IEHtmlPanel(self.nb, self, self.log,
- 'file://%s' % quote(outfile_fullpath))
- else:
- htmlprv = browser.HtmlPanel(self.nb, self, self.log,
- outfile_fullpath)
- self.nb.AddPage(htmlprv, 'HTML-Viewer: %s'
- % outfile)
- if warning_lines == error_lines == []:
- self.nb.SetSelection(1)
- t = time.localtime(time.time())
- st = time.strftime('%d-%b-%Y, %H:%M:%S: ', t)
- wxLogMessage('%sFinished.' % st)
- finally:
- wxEndBusyCursor()
-
- def save_preferences(self):
- cfg = ConfigParser.ConfigParser()
- try:
- cfg.read(DATA)
- if not cfg.has_section('preferences'):
- cfg.add_section('preferences')
- for pref in self.preferences.keys():
- cfg.set('preferences', pref,
- self.preferences[pref])
- f = open(DATA, 'wt')
- cfg.write(f)
- f.close()
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def save_projects(self):
- cfg = ConfigParser.ConfigParser()
- cfg.read(DATA)
- for section in cfg.sections():
- if section[:19] == 'docfactory_project:':
- cfg.remove_section(section)
- for project in self.projects:
- section = 'docfactory_project: %s' % project.name
- cfg.add_section(section)
- cfg.set(section, 'outputdirectory', project.directory)
- files = ''
- for file in project.files:
- files = '%s;%s' % (files, file)
- if len(files) > 1:
- files = files[1:]
- cfg.set(section, 'files', files)
- f = open(DATA, 'wt')
- cfg.write(f)
- f.close()
-
- def set_editor_language_code(self, file=None):
- language_code = 'en'
- if self.project != None:
- directory = self.project.directory
- else:
- directory = os.path.split(os.path.abspath(file))[0]
- docutils_conf = os.path.join(directory, 'docutils.conf')
- if os.path.exists(docutils_conf):
- try:
- cfg = ConfigParser.ConfigParser()
- cfg.read(docutils_conf)
- if cfg.has_option('general', 'language_code'):
- language_code = cfg.get('general', 'language_code')
- except:
- print '%s:\n%s\n%s' % sys.exc_info()
- self.editor.bibliographic_fields = get_rest_bibl_fields(language_code)
-
- # --------------------------------------------------------------------
- # event handlers
- # --------------------------------------------------------------------
-
- def on_app_exit(self, event):
- self.Close()
-
- def on_backup_files(self, event):
- self.preferences['backup_files'] = not self.preferences['backup_files']
-
- def on_btn_image(self, event):
- self.insert_image('image')
-
- def on_close_window(self, event):
- go_ahead = 1
- if self.projectdirty:
- dlg=wxMessageDialog(self, 'Save project?', NAME,
- wxYES_NO | wxCANCEL | wxICON_QUESTION)
- result = dlg.ShowModal()
- if result == wxID_YES:
- self.project_save()
- if result == wxID_CANCEL:
- go_ahead = 0
- dlg.Destroy()
-
- if go_ahead and self.CheckEditorChanges():
- self.Destroy()
-
- def on_configure_tools(self, event):
- dlg = toolsDlg(self)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- self.tools = dlg.get_tools()
- dlg.Destroy()
- cfg = ConfigParser.ConfigParser()
- try:
- cfg.read(DATA)
- if cfg.has_section('tools'):
- cfg.remove_section('tools')
- cfg.add_section('tools')
- for tool in self.tools.values():
- cfg.set('tools', str(tool[0]),
- '%s;%s;%s' % (tool[1],tool[2],tool[3]))
- f = open(DATA, 'wt')
- cfg.write(f)
- f.close()
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def on_copy(self, event):
- self.editor.Copy()
-
- def on_cut(self, event):
- self.editor.Cut()
-
- def on_eols_to_cr(self, event):
- wxBeginBusyCursor()
- self.editor.ConvertEOLs(1)
- wxEndBusyCursor()
-
- def on_eols_to_lf(self, event):
- wxBeginBusyCursor()
- self.editor.ConvertEOLs(2)
- wxEndBusyCursor()
-
- def on_eols_to_crlf(self, event):
- wxBeginBusyCursor()
- self.editor.ConvertEOLs(0)
- wxEndBusyCursor()
-
- def on_file_close(self, event):
- if self.CheckEditorChanges():
- if self.nb.GetPageCount() > 1:
- self.nb.DeletePage(1)
- self.nb.SetPageText(0, 'Editor')
- self.editor.Clear()
- self.editor.Enable(0)
- self.activateMenuItemsFileSelected(0)
- item = self.activeitem
- parent = self.tree.GetItemParent(item)
- self.tree.SetItemBold(item, 0)
- self.tree.SetItemTextColour(item, wxBLACK)
- if parent == self.root:
- self.files.remove(self.tree.GetItemText(item))
- self.tree.Delete(item)
- self.activeitem = parent
- self.tree.SelectItem(self.activeitem)
-
- def on_file_open(self, event):
-
- go_ahead = 1
-
- if self.CheckEditorChanges():
-
- if self.project != None:
- dir = self.project.directory
- parent = self.tree.GetItemParent(self.activeitem)
- if parent == self.root:
- parent = self.activeitem
- else:
- dir = ''
- parent = self.root
-
- wildcard = 'Text (*.txt)|*.txt|' \
- 'All files (*.*)|*.*'
-
- dlg = wxFileDialog (self, 'Open file',
- dir, '', wildcard,
- wxOPEN|wxFILE_MUST_EXIST)
- if dlg.ShowModal() == wxID_OK:
- file = dlg.GetPath()
- if parent == self.root:
- if file not in self.files:
- self.files.append(file)
- else:
- customMsgBox(self, '%s already in workspace.' % file,
- 'wakeup')
- go_ahead = 0
- else:
- if file not in self.project.files:
- self.project.add(file)
- self.project_save()
- else:
- customMsgBox(self, '%s already part of project "%s".'
- % (file, self.project.name),
- 'wakeup')
- go_ahead = 0
- else:
- go_ahead = 0
- dlg.Destroy()
-
- if go_ahead:
- self.open_file_in_editor(file)
- last = self.tree.AppendItem(parent, file, self.im2)
- self.tree.SetPyData(last, None)
- self.tree.SetItemBold(self.activeitem, 0)
- self.tree.SetItemTextColour(self.activeitem, wxBLACK)
- self.activeitem = last
- self.tree.SetItemBold(self.activeitem, 1)
- self.tree.SetItemTextColour(self.activeitem, wxBLUE)
- self.tree.EnsureVisible(self.activeitem)
- self.tree.SelectItem(self.activeitem)
- parent = self.tree.GetItemParent(self.activeitem)
- self.tree.SetItemBold(parent, 1)
- self.tree.SetItemTextColour(parent, wxBLUE)
-
- def on_file_new(self, event):
- go_ahead = 1
-
- if self.project != None:
- dir = self.project.directory
- else:
- dir = ''
-
- dlg = wxFileDialog (self, 'Create new file',
- dir, '', '*.txt',
- wxSAVE|wxOVERWRITE_PROMPT)
- if dlg.ShowModal() == wxID_OK:
- file = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
-
- if go_ahead:
- dlg = wxTextEntryDialog(
- self, 'Enter a title for this document:', 'Title', '',
- wxOK | wxCANCEL)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- title = dlg.GetValue()
- else:
- go_ahead = 0
- dlg.Destroy()
-
- if go_ahead:
- try:
- f = open(file, 'w')
- f.write(len(title)*'='+'\n')
- f.write(title+'\n')
- f.write(len(title)*'='+'\n')
- f.close()
- if self.project != None:
- self.project.add(file)
- self.project_save()
- parent = self.tree.GetItemParent(self.activeitem)
- if parent == self.root:
- parent = self.activeitem
- else:
- self.files.append(file)
- parent = self.root
- self.open_file_in_editor(file)
- last = self.tree.AppendItem(parent, file, self.im2)
- self.tree.SetPyData(last, None)
- self.tree.SetItemBold(self.activeitem, 0)
- self.tree.SetItemTextColour(self.activeitem, wxBLACK)
- self.activeitem = last
- self.tree.SetItemBold(self.activeitem, 1)
- self.tree.SetItemTextColour(self.activeitem, wxBLUE)
- self.tree.EnsureVisible(self.activeitem)
- self.tree.SelectItem(self.activeitem)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(),
- 'error')
- dlg.Destroy()
-
- def on_file_remove(self, event):
- item = self.tree.GetSelection()
- file = self.tree.GetItemText(item)
- self.activeitem = self.tree.GetItemParent(item)
- self.tree.Delete(item)
- self.project.remove(file)
- self.project_save()
- self.nb.SetPageText(0, 'Editor')
- self.editor.Clear()
- self.editor.Enable(0)
- self.activateMenuItemsFileSelected(0)
- dlg=wxMessageDialog(
- self, 'Delete file %s from disk?' % file, NAME,
- wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION)
- result = dlg.ShowModal()
- if result == wxID_YES:
- try:
- os.remove(file)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(),
- 'error')
- dlg.Destroy()
-
- def on_file_save(self, event):
- go_ahead = 1
- file = self.tree.GetItemText(self.activeitem)
- wxLogMessage('Saving %s.' % file)
- go_ahead = self.editor.SaveFile(file, self.preferences['backup_files'])
- if go_ahead:
- if self.nb.GetPageCount() > 1:
- self.nb.DeletePage(1)
-
- def on_publish(self, event):
- go_ahead = 1
- item = self.activeitem
- file = self.tree.GetItemText(item)
- if self.editor.IsModified:
- wxLogMessage('Saving %s.' % file)
- wxBeginBusyCursor()
- go_ahead = self.editor.SaveFile(file, self.preferences['backup_files'])
- wxEndBusyCursor()
- if go_ahead and os.path.exists(file):
- dlg = publishDlg(self, infile=file, project=self.project)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- outfile, outdir, writer = dlg.GetValues()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- self.publishFile(file, outfile, outdir, writer)
-
- def on_publish_all(self, event):
- go_ahead = 1
- item = self.activeitem
- file = self.tree.GetItemText(item)
- if self.editor.IsModified:
- wxLogMessage('Saving %s.' % file)
- wxBeginBusyCursor()
- go_ahead = self.editor.SaveFile(file, self.preferences['backup_files'])
- wxEndBusyCursor()
- if go_ahead:
- writers = publishers.keys()
- writers.sort()
- dlg = wxSingleChoiceDialog(self, 'Please select a writer:',
- 'Publish "%s"' % self.project.name,
- writers, wxOK|wxCANCEL)
- dlg.SetSelection(writers.index('HTML'))
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- writer = writers[dlg.GetSelection()]
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- self.log.Clear()
- files_to_publish = []
- for file in self.project.files:
- if os.path.splitext(file)[1] == '.txt':
- files_to_publish.append(file)
- max = len(files_to_publish)
- dlg = wxProgressDialog('Publishing "%s"' % self.project.name,
- '',
- max,
- self,
- wxPD_CAN_ABORT | wxPD_APP_MODAL)
- keepGoing = true
- count = 0
- error_files = []
- while keepGoing and count < max:
- infile = files_to_publish[count]
- outfile = '%s%s' % (os.path.splitext(os.path.split(infile)[1])[0],
- publishers[writer][2])
- outdir = self.project.directory
- keepGoing = dlg.Update(count, outfile)
- t = time.localtime(time.time())
- st = time.strftime('%d-%b-%Y, %H:%M:%S', t)
- wxLogMessage('\n%s: Publishing %s' % (st, writer))
- wxLogMessage('SOURCE: %s' % infile)
- outfile_fullpath = os.path.join(outdir, outfile)
- wxLogMessage('DESTINATION: %s' % outfile_fullpath)
- try:
- publish_document(writer, infile, outfile, outdir)
- except:
- wxLogMessage('ERROR: %s (%s)' % sys.exc_info()[:2])
- error_files.append((infile, sys.exc_info()[1]))
- count = count + 1
- dlg.Destroy()
- if error_files != []:
- msg = 'Due to severe errors the following files have ' \
- 'not been published properly: \n'
- for file in error_files:
- msg = '%s\n%s\n(%s)\n' % (msg, file[0], file[1])
- msg = '%s\nHINT: You should try to publish the files ' \
- 'in question separately first. If that works, ' \
- 'you can try to publish all files again.' % msg
- dlg = wxScrolledMessageDialog(self, msg, "WARNING!")
- dlg.Centre()
- dlg.ShowModal()
- dlg.Destroy()
-
- def on_find(self, event):
- et = event.GetEventType()
- if et == wxEVT_COMMAND_FIND_REPLACE or et == wxEVT_COMMAND_FIND_REPLACE_ALL:
- replacetxt = event.GetReplaceString()
- self.sb.SetStatusText('', 0)
- findtxt = event.GetFindString()
- length = len(findtxt)
- lastpos = self.editor.GetTextLength()
- flags = event.GetFlags()
- if flags in (1, 3, 5, 7):
- if flags == 7:
- # whole word / match case
- regexp = re.compile(r'\b%s\b' % findtxt)
- elif flags == 5:
- # no whole word / match case
- regexp = re.compile(r'%s' % findtxt)
- elif flags == 3:
- # whole word / no match case
- regexp = re.compile(r'\b%s\b' % findtxt, re.IGNORECASE)
- else:
- # no whole word / no match case
- regexp = re.compile(findtxt, re.IGNORECASE)
- else:
- regexp = None
- print 'Unknown combination of flags.'
- if regexp != None:
- if et == wxEVT_COMMAND_FIND_REPLACE_ALL:
- wxBeginBusyCursor()
- self.editor.BeginUndoAction()
- origtxt = self.editor.GetText()
- if regexp.search(origtxt) != None:
- self.editor.SetText(regexp.sub(replacetxt, origtxt))
- self.sb.SetStatusText('Replaced.', 0)
- else:
- self.sb.SetStatusText('No match found.', 0)
- self.editor.EndUndoAction()
- wxEndBusyCursor()
- else:
- currpos = self.editor.GetCurrentPos()
- if et == wxEVT_COMMAND_FIND_REPLACE and currpos != 0:
- self.editor.ReplaceSelection(replacetxt)
- currpos = self.editor.GetCurrentPos()
- lastpos = self.editor.GetTextLength()
- origtxt = self.editor.GetTextRange(currpos, lastpos)
- position = len(regexp.split(origtxt)[0])
- startpos = currpos + position
- if startpos < lastpos:
- self.editor.GotoPos(startpos + len(regexp.findall(origtxt)[0]))
- self.editor.SetAnchor(startpos)
- else:
- self.sb.SetStatusText('Can not find "%s". Next search will '
- 'start from beginning.' % findtxt, 0)
- self.editor.GotoPos(0)
-
- def on_find_close(self, event):
- event.GetDialog().Destroy()
-
- def on_findreplace_show(self, event):
- data = wxFindReplaceData()
- dlg = wxFindReplaceDialog(self, data, 'Find & Replace',
- wxFR_REPLACEDIALOG)
- dlg.data = data
- dlg.Show(1)
-
- def on_font_small(self, event):
- self.preferences['fontsize'] = 'small'
- self.editor.SetZoom(-2)
- self.save_preferences()
-
- def on_font_normal(self, event):
- self.preferences['fontsize'] = 'normal'
- self.editor.SetZoom(0)
- self.save_preferences()
-
- def on_font_big(self, event):
- self.preferences['fontsize'] = 'big'
- self.editor.SetZoom(2)
- self.save_preferences()
-
- def on_format_paragraph(self, event):
- self.nb.SetSelection(0)
- line_no = self.editor.GetCurrentLine()
- self.editor.GotoLine(line_no)
- startpos = self.editor.GetCurrentPos()
- line = self.editor.GetLine(line_no)
- endpos = startpos + len(line)
- self.editor.SetSelection(startpos, endpos)
- format = event.GetString()
- if format in ['Title','Subtitle']:
- overline = (len(line)-1)*self.formats[format]+'\n'
- else:
- overline = ''
- underline = (len(line)-1)*self.formats[format]+'\n'
- line_below = self.editor.GetLine(line_no+1)
- if line != underline and line_below != underline:
- self.editor.ReplaceSelection('\n%s%s%s\n' % (overline,
- line.strip(' '),
- underline))
- self.editor.GotoPos(startpos)
-
- def on_format_word(self, event):
- self.nb.SetSelection(0)
- selection = self.editor.GetSelectedText()
- if selection != '':
- if event.GetId() == wxID_WXBTNBOLD:
- symbol = '**'
- elif event.GetId() == wxID_WXBTNITALIC:
- symbol = '*'
- elif event.GetId() == wxID_WXBTNLITERAL:
- symbol = '``'
- else:
- symbol = ''
- selection = selection.replace('*','').replace('`','').strip()
- selection = '%s%s%s' % (symbol,selection,symbol)
- self.editor.ReplaceSelection(selection)
-
- def on_goto(self, event):
- values = []
- for i in range(self.editor.GetLineCount()+1)[1:]:
- values.append(str(i))
- dlg = wxSingleChoiceDialog(self, 'Select a line number:', 'Goto line...',
- values, wxOK|wxCANCEL)
- if dlg.ShowModal() == wxID_OK:
- self.editor.GotoLine(int(dlg.GetStringSelection())-1)
- dlg.Destroy()
-
- def on_help_about(self, event):
- """
- Event handler for menu
- option *Help -> About*.
- """
- dlg = aboutDlg(self)
- try:
- dlg.Centre()
- dlg.ShowModal()
- finally:
- dlg.Destroy()
-
- def on_insert_figure(self, event):
- self.insert_image('figure')
-
- def on_btn_hyperlink(self, event):
- self.insert_hyperlink()
-
- def on_insert_image(self, event):
- self.insert_image('image')
-
- def on_insert_path(self, event):
- item = self.activeitem
- itemimage = self.tree.GetItemImage(item)
- file = self.tree.GetItemText(item)
- if self.project != None:
- dir = self.project.directory
- else:
- dir = os.path.dirname(file)
- dlg = wxFileDialog (self, 'Choose file',
- dir, '', '*.*',
- wxOPEN|wxFILE_MUST_EXIST)
- go_ahead = 1
- if dlg.ShowModal() == wxID_OK:
- target = dlg.GetPath()
- else:
- go_ahead = 0
- if go_ahead:
- if self.project != None:
- dir = self.project.directory
- else:
- dir = os.path.dirname(file)
- dlg = wxDirDialog(self, 'Calculate path relative'
- ' to which outputdirectory?', dir)
- if dlg.ShowModal() == wxID_OK:
- dir = dlg.GetPath()
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- self.editor.ReplaceSelection(
- quote(relative_path(self.htmlfile(file,dir), target)))
- dlg.Destroy()
-
- def on_notebook_page_changed(self, event):
- event.Skip()
-
- def on_paste(self, event):
- self.editor.Paste()
-
- def on_project_delete(self, event):
- available_projects = []
- for project in self.projects:
- available_projects.append(project.name)
- if available_projects != []:
- available_projects.sort()
- dlg = wxMultipleChoiceDialog(self, 'Select the projects which you want to' \
- '\ndelete or press "Cancel" to abort.',
- 'Delete Projects',
- available_projects)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- selection = dlg.GetValueString()
- for project_name in selection:
- for project in self.projects:
- if project.name == project_name:
- self.delete_project(project)
- dlg.Destroy()
- else:
- customMsgBox(self, 'Sorry, I don\'t remember any projects.',
- 'info')
-
- def on_project_new(self, event):
- go_ahead = 1
-
- other_project_names = []
- for project in self.projects:
- other_project_names.append(project.name)
-
- if self.CheckEditorChanges():
- project = DocProject()
- dlg = projectSettingsDlg(self, project, other_project_names)
- dlg.Centre()
- if dlg.ShowModal() == wxID_CANCEL:
- go_ahead = 0
- else:
- self.project = project
- self.project.name, self.project.directory = dlg.getValues()
- dlg.Destroy()
-
- if go_ahead:
- try:
- self.projects.append(self.project)
- self.save_projects()
- self.init_tree()
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
-
- def on_project_settings(self, event):
- go_ahead = 1
-
- other_project_names = []
- for project in self.projects:
- if project.name != self.project.name:
- other_project_names.append(project.name)
-
- dlg = projectSettingsDlg(self, self.project, other_project_names)
- dlg.Centre()
- if dlg.ShowModal() == wxID_CANCEL:
- go_ahead = 0
- else:
- name, directory = dlg.getValues()
- self.set_editor_language_code()
- dlg.Destroy()
-
- if go_ahead:
- sort_tree_new = 0
- if self.project.name != name:
- self.projectdirty = 1
- sort_tree_new = 1
- for project in self.projects:
- if project.name == self.project.name:
- project.name = name
- self.project.name = name
- if self.project.directory != directory:
- self.project.directory = directory
- self.projectdirty = 1
-
- if self.projectdirty:
- self.project_save()
- if sort_tree_new:
- self.init_tree()
-
- def on_redo(self, event):
- self.editor.Redo()
-
- def on_run_tool(self, event):
- go_ahead = 1
- choices = []
- for tool in self.tools.values():
- choices.append('%s: %s' % (tool[0],tool[1]))
- dlg = wxSingleChoiceDialog(self, 'Select a tool...', 'Toolbox',
- choices, wxOK|wxCANCEL)
- dlg.Centre()
- if dlg.ShowModal() == wxID_OK:
- tool_id=int(dlg.GetStringSelection().split(':')[0])
- for key in self.tools.keys():
- if self.tools[key][0] == tool_id:
- tool_key = key
- break
- else:
- go_ahead = 0
- dlg.Destroy()
- if go_ahead:
- self.log.Clear()
- tool = self.tools[tool_key]
- item = self.activeitem
- file = self.tree.GetItemText(item)
- curdir = os.getcwd()
- try:
- replmts = {'$[FileDir]': os.path.split(file)[0],
- '$[FilePath]': file,
- '$[FileName]': os.path.split(file)[1],
- '$[FileBase]': os.path.splitext(os.path.basename(file))[0],
- '$[ProjectDir]': self.project.directory}
- command = tool[2]
- for str in replmts.keys():
- command = command.replace(str, replmts[str])
- directory = tool[3]
- for str in replmts.keys():
- directory = directory.replace(str, replmts[str])
- except:
- go_ahead = 0
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- if go_ahead:
- t = time.localtime(time.time())
- st = time.strftime('%d-%b-%Y, %H:%M:%S', t)
- wxLogMessage('%s: %s' % (st, tool[1]))
- wxLogMessage('COMMAND: %s\nDIRECTORY: %s' % (command, directory))
- try:
- os.chdir(directory)
- os.system(command)
- t = time.localtime(time.time())
- st = time.strftime('%d-%b-%Y, %H:%M:%S', t)
- wxLogMessage('%s: Finished.' % st)
- except:
- customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
- os.chdir(curdir)
-
- def on_select_all(self, event):
- self.editor.SelectAll()
-
- def on_tree_item_activated(self, event):
- item=event.GetItem()
- go_ahead = 1
-
- if item != self.activeitem \
- and self.tree.GetItemImage(self.activeitem) == self.im2:
- go_ahead = self.CheckEditorChanges()
-
- if go_ahead:
- self.nb.SetSelection(0)
- if item != self.activeitem:
- if self.activeitem != self.root:
- olditemparent = self.tree.GetItemParent(self.activeitem)
- self.tree.SetItemBold(olditemparent, 0)
- self.tree.SetItemTextColour(olditemparent, wxBLACK)
- self.tree.SetItemBold(self.activeitem, 0)
- self.tree.SetItemTextColour(self.activeitem, wxBLACK)
- self.activeitem = item
- self.tree.SetItemBold(item, 1)
- if item != self.root:
- self.tree.SetItemTextColour(item, wxBLUE)
- else:
- go_ahead = 0
-
- if go_ahead:
- itemparent = self.tree.GetItemParent(item)
- itemimage = self.tree.GetItemImage(item)
-
- # item is file:
- if itemimage == self.im2:
- # file is part of project:
- if self.tree.GetItemImage(itemparent) == self.im1:
- self.tree.SetItemBold(itemparent, 1)
- self.tree.SetItemTextColour(itemparent, wxBLUE)
- project_name = self.tree.GetItemText(itemparent)
- for project in self.projects:
- if project.name == project_name:
- self.project = project
- self.activateMenuItemsProjectOpen(1)
- # file is not part of project:
- else:
- self.project = None
- self.activateMenuItemsProjectOpen(0)
- file=self.tree.GetItemText(item)
- if os.path.exists(file):
- self.open_file_in_editor(file)
- else:
- self.editor.Clear()
- self.editor.Enable(0)
- self.nb.SetPageText(0, 'Editor')
- self.activateMenuItemsFileSelected(0)
- parent = self.tree.GetItemParent(item)
- self.tree.SetItemBold(item, 0)
- self.tree.SetItemTextColour(item, wxBLACK)
- self.activeitem = parent
- dlg=wxMessageDialog(self, '%s does not exist.\nRemove '
- 'from project?' % file,
- NAME, wxYES_NO | wxICON_QUESTION)
- if dlg.ShowModal() == wxID_YES:
- self.tree.Delete(item)
- self.project.remove(file)
- self.project_save()
- dlg.Destroy()
- self.tree.SelectItem(self.activeitem)
-
- # item is project:
- elif itemimage == self.im1:
- project_name = self.tree.GetItemText(item)
- for project in self.projects:
- if project.name == project_name:
- self.project = project
- self.activateMenuItemsProjectOpen(1)
- self.nb.SetPageText(0, 'Editor')
- self.editor.Clear()
- self.editor.Enable(0)
- self.activateMenuItemsFileSelected(0)
-
- # item is neither file nor project:
- else:
- self.nb.SetPageText(0, 'Editor')
- self.editor.Clear()
- self.editor.Enable(0)
- self.project = None
- self.activateMenuItemsProjectOpen(0)
- self.activateMenuItemsFileSelected(0)
-
- def on_undo(self, event):
- self.editor.Undo()
-
- def on_view_eols(self, event):
- self.preferences['eol_markers'] = not self.preferences['eol_markers']
- self.editor.SetViewEOL(self.preferences['eol_markers'])
- self.save_preferences()
-
- def on_view_edge(self, event):
- self.preferences['right_edge_indicator'] = not self.preferences['right_edge_indicator']
- self.editor.SetEdgeMode(self.preferences['right_edge_indicator'])
- self.save_preferences()
-
- def on_view_ws(self, event):
- self.preferences['whitespace'] = not self.preferences['whitespace']
- self.editor.SetViewWhiteSpace(self.preferences['whitespace'])
- self.save_preferences()
-
-#---------------------------------------------------------------------------
-
-class FactoryApp(wxApp):
- def OnInit(self):
- provider = wxSimpleHelpProvider()
- wxHelpProvider_Set(provider)
- self.projects = []
- if self.init_projects():
- wxInitAllImageHandlers()
- if len(sys.argv) > 1:
- frame = DocFactoryFrame(self.projects, sys.argv[1])
- else:
- frame = DocFactoryFrame(self.projects)
- self.SetTopWindow(frame)
- return 1
- else:
- return 0
-
- def init_projects(self):
- if os.path.exists(DATA):
- try:
- cfg = ConfigParser.ConfigParser()
- cfg.read(DATA)
- for section in cfg.sections():
- if section[:19] == 'docfactory_project:':
- project = DocProject()
- project.name = section.split(': ')[1]
- project.directory = cfg.get(section, 'outputdirectory')
- if cfg.has_option(section, 'files'):
- project.files = cfg.get(section, 'files').split(';')
- if project.files == ['']:
- project.files = []
- self.projects.append(project)
- except:
- f = open('error.txt', 'w')
- f.write('%s:\n%s\n%s' % sys.exc_info())
- f.close()
- return 0
- return 1
-
-#--------------------------------------------------------------------------
-
-def main():
- app = FactoryApp(0)
- app.MainLoop()
-
-#--------------------------------------------------------------------------
-
-if __name__ == '__main__':
- main()
-
-#--------------------------------------------------------------------------
diff --git a/sandbox/gschwant/docfactory/factory/stylesheets.py b/sandbox/gschwant/docfactory/factory/stylesheets.py
deleted file mode 100644
index 3c8884564..000000000
--- a/sandbox/gschwant/docfactory/factory/stylesheets.py
+++ /dev/null
@@ -1,528 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-html_classic = '''
-/*
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:date: $Date$
-:version: $Revision$
-:copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-*/
-
-.first {
- margin-top: 0 }
-
-.last {
- margin-bottom: 0 }
-
-a.toc-backref {
- text-decoration: none ;
- color: black }
-
-dd {
- margin-bottom: 0.5em }
-
-div.abstract {
- margin: 2em 5em }
-
-div.abstract p.topic-title {
- font-weight: bold ;
- text-align: center }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning, div.admonition {
- margin: 2em ;
- border: medium outset ;
- padding: 1em }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: red ;
- font-weight: bold ;
- font-family: sans-serif }
-
-div.hint p.admonition-title, div.important p.admonition-title,
-div.note p.admonition-title, div.tip p.admonition-title,
-div.admonition p.admonition-title {
- font-weight: bold ;
- font-family: sans-serif }
-
-div.dedication {
- margin: 2em 5em ;
- text-align: center ;
- font-style: italic }
-
-div.dedication p.topic-title {
- font-weight: bold ;
- font-style: normal }
-
-div.figure {
- margin-left: 2em }
-
-div.footer, div.header {
- font-size: smaller }
-
-div.sidebar {
- margin-left: 1em ;
- border: medium outset ;
- padding: 0em 1em ;
- background-color: #ffffee ;
- width: 40% ;
- float: right ;
- clear: right }
-
-div.sidebar p.rubric {
- font-family: sans-serif ;
- font-size: medium }
-
-div.system-messages {
- margin: 5em }
-
-div.system-messages h1 {
- color: red }
-
-div.system-message {
- border: medium outset ;
- padding: 1em }
-
-div.system-message p.system-message-title {
- color: red ;
- font-weight: bold }
-
-div.topic {
- margin: 2em }
-
-h1.title {
- text-align: center }
-
-h2.subtitle {
- text-align: center }
-
-hr {
- width: 75% }
-
-ol.simple, ul.simple {
- margin-bottom: 1em }
-
-ol.arabic {
- list-style: decimal }
-
-ol.loweralpha {
- list-style: lower-alpha }
-
-ol.upperalpha {
- list-style: upper-alpha }
-
-ol.lowerroman {
- list-style: lower-roman }
-
-ol.upperroman {
- list-style: upper-roman }
-
-p.attribution {
- text-align: right ;
- margin-left: 50% }
-
-p.caption {
- font-style: italic }
-
-p.credits {
- font-style: italic ;
- font-size: smaller }
-
-p.label {
- white-space: nowrap }
-
-p.rubric {
- font-weight: bold ;
- font-size: larger ;
- color: darkred ;
- text-align: center }
-
-p.sidebar-title {
- font-family: sans-serif ;
- font-weight: bold ;
- font-size: larger }
-
-p.sidebar-subtitle {
- font-family: sans-serif ;
- font-weight: bold }
-
-p.topic-title {
- font-weight: bold }
-
-pre.address {
- margin-bottom: 0 ;
- margin-top: 0 ;
- font-family: serif ;
- font-size: 100% }
-
-pre.line-block {
- font-family: serif ;
- font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
- margin-left: 2em ;
- margin-right: 2em ;
- background-color: #eeeeee }
-
-span.classifier {
- font-family: sans-serif ;
- font-style: oblique }
-
-span.classifier-delimiter {
- font-family: sans-serif ;
- font-weight: bold }
-
-span.interpreted {
- font-family: sans-serif }
-
-span.option {
- white-space: nowrap }
-
-span.option-argument {
- font-style: italic }
-
-span.pre {
- white-space: pre }
-
-span.problematic {
- color: red }
-
-table {
- margin-top: 0.5em ;
- margin-bottom: 0.5em }
-
-table.citation {
- border-left: solid thin gray ;
- padding-left: 0.5ex }
-
-table.docinfo {
- margin: 2em 4em }
-
-table.footnote {
- border-left: solid thin black ;
- padding-left: 0.5ex }
-
-td, th {
- padding-left: 0.5em ;
- padding-right: 0.5em ;
- vertical-align: top }
-
-th.docinfo-name, th.field-name {
- font-weight: bold ;
- text-align: left ;
- white-space: nowrap }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 100% }
-
-tt {
- background-color: #eeeeee }
-
-ul.auto-toc {
- list-style-type: none }
-'''
-
-html_modern = html_classic + '''
-
-/*
-Additional styles for "modern"-style of DocFactory.
-
-:Author: Gunnar Schwant
-:Contact: g.schwant@gmx.de
-*/
-
-.first {
- font-size: 10pt }
-
-.last {
- font-size: 10pt }
-
-a {
- text-decoration: none }
-
-a.reference {
- color: #0000BF }
-
-a:hover {
- background-color: #003366 ;
- color: white }
-
-body {
- font-family: arial,helvetica,univers ;
- font-size: 10pt ;
- padding-top: 1cm ;
- margin-left:0.5cm ;
- margin-right:0.5cm ;
- margin-bottom:0.5cm }
-
-dd {
- font-size: 10pt ;
- padding-top: 0.1cm
-}
-
-dt {
- font-size: 10pt ;
- font-weight: bold ;
- background-color: #C8DBEB ;
- padding-left: 0.1cm ;
- padding-top: 0.1cm ;
- padding-bottom: 0.1cm }
-
-div.abstract {
- font-size: 10pt }
-
-div.abstract p.topic-title {
- font-size: 10pt }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning {
- font-size: 10pt }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
- margin-top: 0em ;
- font-size: 12pt ;
- font-family: arial,helvetica,univers }
-
-div.dedication {
- font-size: 10pt }
-
-div.dedication p.topic-title {
- font-size: 10pt }
-
-div.figure {
- font-size: 10pt }
-
-div.footer, div.header {
- font-size: 8pt }
-
-div.system-messages {
- font-size: 10pt }
-
-div.system-messages h1 {
- font-size: 12pt }
-
-div.system-message {
- font-size: 10pt }
-
-div.system-message p.system-message-title {
- font-size: 10pt }
-
-div.topic {
- font-size: 10pt }
-
-h1, h2, h3, h4, h5, h6 {
- padding-top: 0.5cm ;
- page-break-after: avoid ;
- font-family: arial,helvetica,univers }
-
-h1 {
- font-size: 18pt }
-
-h1.title {
- padding-top: 0cm }
-
-h2 {
- font-size: 16pt }
-
-h2.subtitle {
- padding-top: 0cm }
-
-h3 {
- font-size: 14pt }
-
-h4 {
- font-size: 12pt }
-
-h5, h6 {
- font-size: 10pt }
-
-hr {
- width: 100%;
- page-break-after: always }
-
-li {
- padding-top: 1mm ;
- padding-bottom: 1mm }
-
-ol.simple, ul.simple {
- font-size: 10pt }
-
-ol.arabic {
- font-size: 10pt }
-
-ol.loweralpha {
- font-size: 10pt }
-
-ol.upperalpha {
- font-size: 10pt }
-
-ol.lowerroman {
- font-size: 10pt }
-
-ol.upperroman {
- font-size: 10pt }
-
-p.caption {
- font-size: 10pt }
-
-p.credits {
- font-style: italic ;
- font-size: 8pt }
-
-p.label {
- font-size: 10pt }
-
-p.topic-title {
- font-size: 10pt }
-
-pre.address {
- font-family: arial,helvetica,univers ;
- font-size: 10pt }
-
-pre.line-block {
- font-size: 10pt }
-
-pre.literal-block, pre.doctest-block {
- border-width: 1pt ;
- border-style: solid ;
- border-color: #999999 ;
- color: #0000C0 ;
- background-color: #ffffe0 ;
- font-size: 9pt }
-
-span.classifier {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.classifier-delimiter {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.field-argument {
- font-size: 10pt }
-
-span.interpreted {
- font-size: 10pt ;
- font-family: arial,helvetica,univers }
-
-span.option-argument {
- font-size: 10pt }
-
-span.problematic {
- font-size: 10pt }
-
-table {
- font-size: 10pt ;
- border-collapse: collapse ;
- border-width: 1.5pt ;
- border-color: #003366 }
-
-table.citation {
- font-size: 10pt }
-
-table.docinfo {
- font-size: 10pt }
-
-table.footnote {
- font-size: 8pt ;
- text-align: left }
-
-table.table {
- width: 100% }
-
-th {
- border-width: 1.5pt }
-
-td {
- border-width: 1pt }
-
-td, th {
- font-size: 10pt ;
- border-style: thin ;
- border-color: #003366 }
-
-td.docinfo-name, th.field-name {
- font-size: 10pt }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 10pt }
-'''
-
-tex_classic = '''
-% donot indent first line.
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{5pt plus 2pt minus 1pt}
-
-% sloppy
-% ------
-% Less strict (opposite to default fussy) space size between words. Therefore
-% less hyphenation.
-\sloppy
-
-% fonts
-% -----
-% times for pdf generation, gives smaller pdf files.
-%
-% But in standard postscript fonts: courier and times/helvetica do not fit.
-% Maybe use pslatex.
-\usepackage{times}
-
-% pagestyle
-\pagestyle{plain}
-'''
-
-tex_fancyhdr2side = '''
-% geometry
-\geometry{a4paper,twoside,tmargin=1.5cm,
- headheight=1cm,headsep=0.75cm}
-
-% donot indent first line.
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{5pt plus 2pt minus 1pt}
-
-% sloppy
-% ------
-% Less strict (opposite to default fussy) space size between words. Therefore
-% less hyphenation.
-\sloppy
-
-% fonts
-% -----
-% times for pdf generation, gives smaller pdf files.
-%
-% But in standard postscript fonts: courier and times/helvetica do not fit.
-% Maybe use pslatex.
-\usepackage{times}
-\\renewcommand{\\familydefault}{\sfdefault}
-
-% pagestyle
-\usepackage{fancyhdr}
-\pagestyle{fancy}
-\\addtolength{\headheight}{\\baselineskip}
-\\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
-\\renewcommand{\subsectionmark}[1]{\markright{#1}}
-\\fancyhf{}
-\\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
-\\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
-\\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
-%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
-\\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
-'''
-
-stylesheets = { 'HTML: Classic': html_classic,
- 'LaTeX: Classic': tex_classic,
- 'HTML: Modern': html_modern,
- 'LaTeX: Fancyheader2side': tex_fancyhdr2side}
diff --git a/sandbox/gschwant/docfactory/factory/throbimages.py b/sandbox/gschwant/docfactory/factory/throbimages.py
deleted file mode 100644
index 2343b3a40..000000000
--- a/sandbox/gschwant/docfactory/factory/throbimages.py
+++ /dev/null
@@ -1,7340 +0,0 @@
-"""
-:author: Dr. Gunnar Schwant
-:contact: g.schwant@gmx.de
-:version: 0.3
-"""
-
-#----------------------------------------------------------------------
-# This file was generated by encode_bitmaps.py
-#
-from wxPython.wx import wxImageFromStream, wxBitmapFromImage
-import cStringIO
-
-
-catalog = {}
-index = []
-
-class ImageClass: pass
-
-def getDocFactory001Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r`\
-IDATx\x9c\xed\x9bil\x1d\xd7y\x86\x9fsf\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb\xfe\xc8\xcf\xa0\
-\x08\n\x14]\x8c\x06\x81\xed&\xa9Q\xb4p\x9d\xbaQ\x12;\x8e\x11\xc9Nd\xc9V\x14j\
-\xb3\xac\x95\xb2$\x92\xe2r\xb9\x93\x97\xbc\xeb\xcc\x9d\x99\xd3\x1f\xb4e\xb3\
-\xb2$\xa6\xb0%\x01\xbd\xcf\xcf\x8b3\xf3\xbe\xdf|\xdf\x879s\xce=\xe2\xef\xbe\
-\xa3\x14\x15*T\xf8\\\xf4P\xf5\xd5\xb6P\xa1\xc2\xb5\x8b\x1e\xac4H\x85\n\x17E\
-\x0f\'\xae\xb6\x85\n\x9fE\xa00\xb0\x91xs~w1p1\xaf\x9c\x07a\xa3\xfd/\x0f\n(\
-\xab\x00\x1e\xda\x97\xa2+\xf11E\t\x1fIYY(\xc4\x97\xa2\xf3\xdb\xa0\x87\xe2W\
-\xdbB\x85O\x10\xf84\x14v\x11u\xcf\xe1\x7f\xa66\xa5\x04i\xea\xe4\xdd8\xb9`;3\
-\xfa"\\\x02_\x92\x07\x8f&\xfb\x1d\xaa\xbc\x9e9\x1e\x00tKak5tk[(\x13\xfaBu5\
-\x1c\x16\xbb?\'P\x1eA3\x04cr\x19iy\xeb\x17\xaa\xf1\x7fA\x0fW\x1a\xe4\x9a\xc1\
-b\x94&\xfd\x05N\xbfY\xcb\xf4`\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4-\x9f\xc4\xb1\
-\x16\xd1\x17\xfck\x1c\xea\xbep\x0fA\x86i*\xbe\xca\xc9\x9f\xc6\x99N\x07@\x08\
-\x10\x12\x80X\xa3\xcd\xb2\x87\xdf\xa3h\xd43\xc1\xed_\xa8n\x88a\x1a\xec\x1fs\
-\xec\xc7)b\x0bK\xb4\xac9D!x#e\xaen\x81\xea\x91J\x83\\3\x84\x94 \xa1\xadB\xf8\
-E\xa4\xa6\x08\xc6\x05F@\xa0\x10\x94\xf2AFOJ\xf2\xa3\xcd,\xbfOb\x1a\xbf\xa1?\
-\xfc\xc0\x9ci\x88\xf0=\x84[F\xf8\x1eJj(\xdd@\xc9\xcf\x9f\x0e\t\xd7A\xbae\x80\
-9cCJ\',\xaeG\xb9\x05\xa4\xc6y\x0f H-6\t\x85:0\x83MD\xe4\x85\xf7\xf1u\x13\xa5\
-\xe9H\xa7\x08B\xe2\x1b\xd6l\x83]FS\xa0\x88\xfbE\xc2\xf9\xa5HJd\xd31n\x88Z\
-\xd4\x85\xc6\xc9\xc8O\x0bt^\xf1)\xf5\xa9\xbe\x19\x98\xd5\xf4\xca\xf8\xba5\
-\xabU\xb6g\x87\x99\x81\x0b\xaf\x01|38\xc7\xb3^e\x0e\xfc\x16)\xac\xf0eb)\x07\
-\x8cu\x18\xfa{\xc4R.7\xff\xc1mh\xa1 (\x9fr\xdef\xe0P\x0f#\xc7\xd3\x9c\xdb\
-\x9f\xe2\x86{\xa28\xc6\x19\n"\x88P\x1ef\xa6\x1b3\xd3\x8dW(!P\xb3/\x9f@\x00;\
-\xb5\x14\xa7\xaa\x19>n$\xe1\x97\xb1fz0&\xcf\xa2l\x07P\xb3/\x08#@\xb1\xf6f\
-\xb4p52p\x1b\x96\xb5\x13-\xe5r\xf3S\x1b1"A\x00\xec\xb2b\xd2\x88 \x03\x92\x98\
-\xdf\x839u\x06k\xa6\x1be\xbb(\xa5\xc0\x0c\xe2\x05\xab1\x8bi\x94\x02\'\xdeJ)\
-\xd5qY\xcd\xb0\xd0\xa9\xf6f\xc8M-\x03\xb7\x13\xa1A\xa9\xb0\x92E\xd6(C\x06\
-\x94\xa41\xbf\xf8\x94O }\x00#\x97F\x1a\x127\xdc\x80V\x18\xc3\xb7\xcb\x08\xd3\
-\xc2\xd1k\x91\xd9q\x84\x14\xd8\x0bW\xe0Ek\x010\xd2\'0\xa6\x06@(\xca\xf1f\xca\
-\x8dK\xcf\xe7D\x8fp\xf2J\xd6@\x85K`\x08\x1daV\xa1\xcb\x1czP`\xc4Rd\xac\x02\
-\x1e`\x85\xc2\xb4\xdd\xb5\x16/\xb7\x9d\xdcp7\x85\xccu$\xac\x11ts\x86H\xf64z9\
-\xc3\xd0\x89I\xc6\x8fd\xf1\\\x1f=\xa8\xd3\xb8!ACl\x88bq\x01\x85\xe0B\xa4\xf2\
-\x88\xe4N\xa1\xb2\xd3\xf4\xbf7Ln\xd0Fh`F\x0c\xaao\x8aR\x1b\x1a\xc1\x0e\xadG\
-\x18)t\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0e\xa3D\xd4\x10\xd1\\\x17\x94\
-\xa6\x19>4N\xa6;\x0f@\xe3\x86$\xf1\xe6\x10\xa3G\xa7\xd1\xc3:5\xab2\xe4|\x87P\
-\xae\xfb\xa2\x9au\xe1\t\xcc\xaaM\x0c\xef;\xc5\xe0\x9e}(\xdfCI\xc1\xa9m\xbf`\
-\xe9c\x0f\x91\xd0\xfa\xc192\xaf\xf8tU"\x168N\xf7/\xd3\x84j-\x927\x0e3\xd1\
-\x95e\xfc\xd8\x0cK\x1eN\x12\xf2~B\xdf\xaf\xc3\xc4\xdb\x1d\x12U\xefbG\xb6"\
-\xbd,\x01\xf7U\xd2\x87\x83\x98U\x1e\xf1\x0e\x81\xa3\xfe\x08%\x0c\x00\xf40{\
-\xaebIT\xf8,\x1aI\x04w\xa33\x89\x10\x02\xa1B\x98\xfc\x1a\x8fI\x94&\xf1\xbc;X\
-\xb0\xba\x83\x9e\xed\xff\x86=6D,\x15#Q\x1eA\x14\x1a8\xfd\xa3\xfd\x14\xc6F\t\
-\xc4cH\xd3\xc4\xc9O1\xbc;M1\xddF\xcb\xd7\x97c\x98\'\xd0\x9d$\x9a\xddB\xd7O\
-\x7fDql\x143\x1a\xc1\x08\x87A8\xe4{\\\x1aWnB\xf3\x07\x10\xb4\xa03\x81g\x17\
-\xb1\'\xa61\x82\x16\xa6\xd0\xd0\x021J\xfa>\xf0r\x04\xdc6N\xbd\xfe\x1a\xf9\
-\xe1a\x02\x898\xd2\xb2\x18?p\x8e\xd1\xbd6\xbe[&T_Op\xc3\xdd\xe8v\x06y)\xcdUw\
-\xa3\x14\x04\xab"T\xd5J\xf2#}\x08)\t\xc7\x17\xa1\x07b\x18*\x8d?\xaf\xf8\x8e\
-\xa3\xa4\x87i\xac\xc6\x9f\xeeb\xf4\xec\x18S\x1f\x86\x08V\'Y\xb8\xb6\x95\xaa\
-\x9a\xa5\xe0\x841\xfc\xa3\xe4?\xd2X\xb8\xa2\x85\x82w\x00Y\xf2\xd1\xb5\x0e\
-\xca\xa3G\x89\xd7\xd4\x11\xafj \xcf>>\xd9=\xd7C\xec\xba\xaaEQ\xe1S\x04\x8b\
-\x10\xdc\x8f.\xc6\x11\x12\x84\x08\x12\xe0\x03\x14\xbd\x00H\xcd&X\xfd\x10\x01\
-k\x08{\xfc \x1a+1D\x07}{^\xa6<v\x90\x85\xb7o\xa5\xee\xd6-\xa0\xca\xb8\xc5"\
-\x03;\xfe\x95B\xefN\n\xe9\xe5D\xda\x17\x80_\xc3\xc0\xee\xff\xc6\x9d\xf8\x90\
-\x96\xbb\x9e \xd1\xb1\x0e\x19\xf0\xd1\xb48\x9eSD\xe9\x93\x98z\'\xc2\xdd\x84.\
-\xc6p\xb3g8\xfb\x9f\xcf!M\x89\xd0$\x8d\x1b\x9f%\xbad\t\xca\xcb\x929\xd5\x853\
-z\x88\x85w<B\xdd\xad[\x10\xba\x8fo\xc3\xe0;/3}z/\x86\xae!\xcczt7\xca\xc0\xee\
-W/\xa9\xa9\xac\x1d\xc4\xae\xbf\x87X\xdb\xb3\x9cy\xe59\x84\xee\xd1\xfe\xe03\
-\x08k\x12\xa9\xd5\xd1\xb7\xe7g\x97\x8f\xaf\xad\x1eemG\x98\x9b\xd0\xe5\x14\
-\xa6\x1c\xa2e\xf3\x9f\x11k_\x81/zQ\x81\x0f \xb7\x84\xfa5&}o\xfd\x17\xa5\xe9\
-\xaf\x13\x0c\x16Q^\x92\xa9\x9e.t\x86H-{\x0cB\xfd\x04\xc5\xdb\xf0q\x8b\xe8\
-\x81\xd1\xab\xbf\xd6\\\xe1ct\r/\x10A\xb3%R\n\xf0#X\x93\x1a\xb8\xb39RV\x1c\
-\xd7\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\xde>B\xc1F\xea\xd6=\x8eV\xde\x8e\
-\xf4\xf6#\xcdG\xa8[\xfd(\x03\xdd\'(\xf5\xf4\x10[\xfc$\x9e\'\xb0\xbb\xcf\x12\
-\n\xd4Q\xb3\xea\x11\xa4\xfb\x13da\x0f\xc8\x04\x9a\xd0\xc1\x99\x82R\x12\xcf\
-\x04\xad\x04z\x11\xacP\x02\xdd\x8a"\r\r+\x98Bs]\x94l%\xd3\xf9/\x84\x02\xf5\
-\xd4\xad\xdd\x8a\xee\xfc\x1cQ:\x82o=M\xcd\xf2\x07(\x9e\xd8\x8f\xee\xe8\x08\
-\x95\x00/py\xcd\xdc\x0c\xe8\x19<\xeb[\x98*\x82T\x02M\xafB\xb3_\xc33\x9e\x9eW\
-|U-[\xd1\n\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\xf9\x1e8G \xeb\xa1\
-\xf4\x12UK6\x13\xb0\xdef\xb2\xf3\x00M[\xff\x14\xcf\xcf\x93=\xfc\n\x89\xa6\
-\x95\x98\xc9\xc5\xc8\xfc\x0e\xc8\xc2\'\xdfl:;\x17_\xbd\x82\xa80\x97X-\xac\
-\x1fA\x0c\x07A\x02\xf6\x08\xec\xab\x85i\x05\x86\x85Z\xb7\x8eR\xdf\x07\xa8\
-\x93!\xac\xf6V\xe4\xf4\x04\x9eH\xe1\x9d\x16\xe8\xb1F(\x04\x90\x07\x06\xa1\
-\x10DkLc5\xdc\x816\xdc\x08c1T!\x81*\x16q?\x02#Q\x8f?c\xa0\x1f\x9a\x80\xc2g\
-\x97\x8a\xab!V\x03k\xd2\x88\xe1\x00\x96\xd3N\xeb\xd6\xbf@\x8bF\xc0\xf7\xf1\
-\xc7\x07\x91G\xce\xe04/\xc09^\xc2H6"\xca\t\xc4\xbei\xc8\x05\x91-\x03\x18\xf5\
-\xb7\xa0\r\xd5#\xbc$x\tTN]^\xf3\x13\xdd\xb5\x83\xc8\xe1\x00B\n(\xa5\xa1+\x89\
-\xbfX\xce+>\xf2\t8\xd2\x04\xeb\xe20\x1c\x9b\x9d\xa2\xfa)\xe8\x8c@\xa6\x19\
-\x00\x11(#o\x8d\x12\x89\xdfJv\xf7\x07\xd8\xb7\x14\xb0\xd3i\xcaG]\xea\xef\xb8\
-\x1f\x86\xf3\xb0/\x00\xfe\xa7=\xa1\x0f\xbe\xf0\xf4\x95H}\x85y`\xb4\n\x12\x1d\
-\xe3\x14N.B\xa2\xe1\xe7\'\x99\xde\xbb\x19\xa4\xc2\\\xed\xa3g]\x06\xbf;D\xe1\
-\xd4m\xd4<\xd4H\xf1\xb0\x8d\xb9"\x8f*m {:\x83\x97\x9d\xc2\t=\x89\xfd\xa1Kh\
-\x89\xc5Lg?\xd3\xbb:\x0864\xe0OM!B@\xf9v2\xbbFp\x1e\x1f\xa1\xa4~\x0f{\x97\
-\x8b\xde\xa4c\\\xa7a\x1f*\xe3\xa5\x8b$\x96\x8e\xcez\x10\x1a\x88\x02\x99\x7f\
-\x14\xb8\xfd\x02w\xb0\x06\xad\xa1\x81\xe4\xdf\x96\xf02k)t\xe5(O\x0c\xe3\x04\
-\x1e\xa3\xb8\xd7&\xbc$\xc0\xcc\x9e\x1e\xa6wu\x10\xba.\x85_H#\xa4\x7fY\xcd\
-\xd2\x1e\x1bc\x91O\xe2\xc6q\xf2\xc7\xda\x11H\xfc\xfc\x18\x997\xd7P\xf5la^\
-\xf1\xb9\xe3Y&\xb7}\x95\xf8MC\x14\xba\x9af\x97y\xf3\xc3L\xfc\xf0\x1e\xca\xdd\
-\xe5\xf3\xcf8\xd4\x17 \xb6\xfaQ\x06_\x9c\xe1\xc4\x9flG\x15]\xac\x86{\xb0\x16\
-\xae\'\xf3\xdd!\x8a\xbf\xfa\xfd99\xd1__\xb5\xfe\n\x97A\x85\x8bQ]?\xc3\xfd\
-\xec\xe6\\\xaa\x1a\xa7(\xa9\x1d\x1c\x84\x07-\xf2\x93\x90\x1dv\xe8\xfe\x8eM&\
-\x97\xe2\x86?\xac\xc7XZ\xe6\x9dm\xcd\xdc\x14\xeb\'\xfaT;\x87\xff\xfe4\xc3\
-\xcf\xef\xa6\xed\xee\x05\xc8\x95AJ\xc7\xf3\x9cz;C\xb1\xb5\x9d\xba\x8dq\xbaz\
-\x1d\x12\xa9,\xe1\'\xda8\xf4\x0f>c\xdf\xef\xa4\xed\xaez\xd4=Qt\x0bt\xc3%\xf9\
-\x8d\x08\xfbw\xb4r\xa7\xdc\xc1\xb9T\x12\xa4F;\x83\xbc\x1dy\x80\x89d\x12\x92 \
-5\xc5\xd7\xfa\xf6\xa3?\xd4\xca\xe1\x1f\xf4Q\xf8\xe1~\x1a\xd7\xd6\xe2\xaf7\
-\x19\xf8X3\xd7\xd4F\xb2\xce\xa2\xd5\xed#;e\\V\xf3\xbd\xe8J\x046\xf7\x8b7\xe8\
-\xa9\xa9FI\x83V\x91\xe6W\xc9U\xac\xea\xed\x9d_|\x03.\xa7\x16/\xe1>u\x80\xbed\
-\x0c!%\xd7\xab~v\xde\xb0\x96\x89x\xf8\xfc3\x8e\xcd\x08\xb64\xbbL\xde\xb9\x96\
-\x91\xe3C\x10\xd2Y\xfd\xe8F\xa6sU\xbc\xee\xc4\xb1W\xcd\xfds\xbb~\xca/\\\xe9:\
-\xa8p\x11\x1a\xfdil\xbb\x97q\xa7\xc4\xc4\x98N\xff\xb7\xd3\xa0\xe9\xd8\x8e\
-\x81\x12\x1a\x08\xc9\xa2e.\x1d\xbf\x9b\xe7\xe0\x916\xde\xed\t1\xaa\x87y\xea\
-\xe1Q\x16n68\xfc\x8b\x1c\'_<\x8b\x92\x1a\xbe0\x08\'$\xcb\xee\x93\x985#\xbc\
-\xb9m\x19\x8d\xb5>\x8fn\x19\xa3\xee+\x1a\xa7\xf6\xe69\xf9R\xef\xf9\xb1\xd5M\
-\x92\x07\xfe\xca`\\\x0bb\x97\xce0^\x0ecE%\x8e=\xca\xd9r\x8e\x11\xff\xe3\x8d5\
-\x1f\xdc\xce\x04\x8fo\xc9\x11^!9\xb4g\x9c\xfd\xefgPR#Zk\xb0\xe0\x06\xc9PI\
-\x12\x8c\xe4\xb1\x8bgy\xff\xf0\n~g\xe3\xa55\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\
-\xae&\x18s(\xdb\xe3\x9c.\xe5\x99>2\xbf\xf8\xde\xda\xb6\x0c)\xa7qJ\xa7\x99t\n\
-XU\x06e\xfb\x0cg\xcb\xd73\xe2\x7ff\xb3r\x0c\x9aN\xceP\xb7\xb1\x89\xe3\'\x06\
-\t%L\x1a\xd6G\xe8\xfc`\x92#\xb9\xe0\x059\xd1\x07\x06*\x1b\x85\xd7\n\xf9l\x9e\
-R\xbe\x9b\xf6[\x04\xe5\xce\x10\xb6c\xe0\x0b\x9dHBR\xdb\xec\xd0\xb2\xd4\xa6yi\
-\x89=\x9dm\xbc\xf2z\x13\xc5R\x9a\xf4\xa0BzA\x1e\xdc|\x88\xeaV\x833\x07\x83\
-\x14s\x1aVTp\xf3W\xb3\x84\xab\xe1\xa5\xff\xb8\x8f\xa3]Y\x0c]C\xd9:\x0f?\xd9\
-\xc5u\xb7i\x1c\xdd\x1daj\xdc"V\xafX\xf1\x95,=\xbd)\xf6\x1fZ\xc2\xd7Vw\xb3he\
-\x84\xaaZ\x9f\xf4\x80\xc5\xb1\x133\xd8N\xe9\xbc\xcftZQ\x1d\x81\xcd\xcf\x9c\
-\xe6\xdc\xd1\x00\xc7\xdf\x0f\xa1\x99\x825\x9b\xb34_\x97g\xdf\x8e$\xd1\xa4\
-\xc7\xd93Ul{s=\xd9\xc9\xcbh\x1e\xcc\x11\xab\xcaR,\xf4\xd0\xb2|\x92\x86\xb6"\
-\xddg\xa3|x,\x8f\x80y\xc7W\x9b\xca`\x17\x0e\xd1\xbcF\'V\xe73\xd0?\xce\xb1\
-\xe3\x93\xd8Nv\xces\xde\xbb\xdf\xe5\xe1M\x0ey\xa7DS{\x02!\xc7y{g\x89\x81\x01\
-yAN\xc4\xfa\xf5oU\x0eL]#\x08\x01[6vq\xe7\x9a\x1eR\xc9"B\xce\xa6&\x9b5\xc9\
-\xccX\x8cNF\xf8\xe5o\x96p\xf6\\5eW\xce\xb9ni\xfb4\x1b\x96\r\xd1\xd28\x83\xf2\
-\x14>\x1a]=\t\xf6\x1f\xaf\xa3\xa7?r~\xac\x94\x8a\xe5\xd7O\xb2q\xf5 \xa9x\x81\
-rY\xa2\xa4\xce\x87\x1fU\xb3\xb3\xb3\x91\\\xde\xe0\xde;\x87X\xdf1I\xd9\xd7x\
-\xe3\xddF\x0e\x9f\xac\xba\xc0k\xc0\xf2\xb8}\xed(\xb7,\x1fB\xfa.R\x83\x91L\
-\x843\xe7\xaa\xd8\xb0l\x08\x10\xbc\xf1\xeeb\x0e\x9f\xac\xbe\xacf6g \x04\xdc{\
-\xe7\x08\xeb:&p}9Gw\xbe\xf1\xcd\xde\xa3\x97\r\x1dC\x94}\x8d\xd7\xdfm\xe3\xf0\
-\xc9\xb9\xe79\x0c\x1d\xfe\xe6\x9b9\xca\xfdC\xbc\xf5\xbd^\xbe\xf1O\x1d\xf4\
-\x8cE\xf9\xf6\xf3\x11>\xef\xe8\xa0X\xb0\xe0\xfb\x95\x06\xb9\xc6\x10\x02B\xc1\
-O\xd3\xe2\xba`;\x95\xe5\xf8/\x82u\xab\xca\xfc\xe0\xf9)^\xf8\xcb\x01\\O\xf0\
-\xe7\xff\xbc\x80g\xbe\x19\xe7\xbd\xbd\x9f\x7f\x94@\x1f\x1c\x1c\xbc\xc2\x16+T\
-\xb8z\xdc\xb4u\x82\xa9\xa1\x0c\xc7\x0e\xe6y\xe2\xb9\x00]\'l\xde\xda\xbe\x80\
-\x99\xec\x85\xd3+\x98]m\xafP\xe1\xff\r\xe1\xa0M4\x9a\xe7\xa1?\x86\x8d\xf7\
-\xda\xbc\xfcj\xe8\xa2\xcd\x01\xa0_Ao\x15*\\u^\xfc\xf7F\x82f\x1d\xd51\x9f\xe7\
-_\x92\xbc\xf6\xb3K\x9f\x8e\x14\xf0\xad\xca7H\x85\n\x17\xa12\xc5\xaaP\xe1\x12\
-T\x1a\xa4B\x85K\xf0?`M\x96s\\\xcam\xe7\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory001Bitmap():
- return wxBitmapFromImage(getDocFactory001Image())
-
-def getDocFactory001Image():
- stream = cStringIO.StringIO(getDocFactory001Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory001')
-catalog['DocFactory001'] = ImageClass()
-catalog['DocFactory001'].getData = getDocFactory001Data
-catalog['DocFactory001'].getImage = getDocFactory001Image
-catalog['DocFactory001'].getBitmap = getDocFactory001Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory002Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rc\
-IDATx\x9c\xed\x9bi\x8c]\xe5y\xc7\x7f\xef{\xb6\xbb\xce]\xe6\xcej\xcf\x8c=3\
-\x06\x0cc\x1b\xeffubH\xa8\xcdR6\x97\xa5\x85\xaaj\x15U\x05\xb5\xa2\xed\x87|\
-\x8c\xaa\xa8R\xd5\x055\x8a MRT\xb5\xa2\xa44N\x02!(6$\xc6\x06\xc7\x19/\x83\
-\xf1:\xc6\x9e\xc5\xb3\xdc\xd9g\xee\xcc]\xcf\xb9\xe7\x9c\xb7\x1f\x86\x18\x0c\
-\xd8\x1e\xb5`\xa3\xe6\xfe>^\xbd\xe7\xfc\xff\xcfy\x9eG\xe7\xbd\xef{^\xf1w\xdf\
-R\x8a\n\x15*|*z\xa8\xfaj[\xa8P\xe1\x8b\x8b\x1e\xac4H\x85\n\x17E\x0f\'\xae\
-\xb6\x85\n\x00\x02\x85\x81\x8d\xc4\xbb\xe0w\x17\x03\x17\xf3\xcay\x106\xda\
-\xc7<(\xa0\xac\x02xh\x9f\x8b\xae\xc4\xc7\x14%|$ee\xa1\x10\x9f\x8b\xce\xff\
-\x06=\x14\xbf\xda\x16*\x08|\x1a\n{\x88\xba\xe7\xf0?R\x9bR\x824u\xf2n\x9c\\\
-\xb0\x9d9}\t.\x81\xcf\xc9\x83G\x93\xfd&U^\xdf\x05\x1e\x00tKak5\xf4j\xdb(\x13\
-\xfaLu5\x1c\x96\xba?#P\x1eC3\x04\x13r\x05iy\xf3g\xaa\xf1\x7fA\x0fW\x1a\xe4\
-\xaac1N\x93\xfe\x1cg^\xabev8\x02\x08\x90\x12\xa9+\xc25E"\xf5E\xdaVN\xe3XK\
-\x18\x08\xfe5\x0eu\x9f\xb9\x87 \xa34\x15_\xe2\xd4O\xe2\xcc\xa6\x03 \x04\x08\
-\t@\xac\xd1f\xc5\x83oS4\xea\x99\xe2\xd6\xcfT7\xc4(\r\xf6\x8f8\xfe\xa3\x14\
-\xb1\xc5%Z\xd6uQ\x08^O\x99/Fa\xea\x91/\x86\x8f\xdfjBJ\x90\xd0\xd6 \xfc"RS\
-\x04\xe3\x02# P\x08J\xf9 \xe3\xa7$\xf9\xf1fV\xde#1\x8d_3\x18\xbe\xef\x82i\
-\x88\xf0=\x84[F\xf8\x1eJj(\xdd@\xc9O\x9f\x0e\t\xd7A\xbae\x80\x0b\xc6\x86\x94\
-NX\\\x8br\x0bH\x8d\xf3\x1e@\x90Zj\x12\nu`\x06\x9b\x88\xc8O\xde\xc7\xd7M\x94\
-\xa6#\x9d"\x08\x89oX\xf3\rv\x19M\x81"\xee\x17\t\xe7\x97#)\x91M\xc7\xb8.jQ\
-\x17\x9a$#?,\xcc\x05\xc5\xa7\xd4\x87\xfaf`^\xd3+\xe3\xeb\xd6\xbcV\xd9\x9e\
-\x1ff\x06>y\r\xe0\x9b\xc1\x0b<\xff\x06\xbd\xca\x1cZ@\n+|\x9eX\xca\x01c\x03\
-\x86\xfe6\xb1\x94\xcb\x8d\x7fp\x0bZ(\x08\xca\xa7\x9c\xb7\x19\xea\xeac\xecD\
-\x9as\x07S\\wW\x14\xc78KA\x04\x11\xca\xc3\xcc\xf4bfz\xf1\n%\x04j\xfe\xe5\x13\
-\x08`\xa7\x96\xe3T5\xc3\x07\x8d$\xfc2\xd6\\\x1f\xc6t\x0f\xcav\x005\xff\x820\
-\x02\x14koD\x0bW#\x03\xb7`Y\xbb\xd1R.7>\xb1\x19#\x12\x04\xc0.+\xa6\x8d\x082 \
-\x89\xf9}\x983g\xb1\xe6zQ\xb6\x8bR\n\xcc ^\xb0\x1a\xb3\x98F)p\xe2\xad\x94R\
-\x1d\x97\xd5\x0c\x0b\x9djo\x8e\xdc\xcc\np;\x11\x1a\x94\n\xabYb\x8d3b@I\x1a\
-\x0b\x8bO\xf9\x04\xd2\x870ri\xa4!q\xc3\rh\x85\t|\xbb\x8c0-\x1c\xbd\x16\x99\
-\x9dDH\x81\xbdx\x15^\xb4\x16\x00#}\x12cf\x08\x84\xa2\x1co\xa6\xdc\xb8\xfc\
-\x13\xb9\xd1#\x9c\xba\x125P\xe1\x12\x18BG\x98U\xe82\x87\x1e\x14\x18\xb1\x14\
-\x19\xab\x80\x07X\xa10mw\xac\xc7\xcb\xed$7\xdaK!s\r\tk\x0c\xdd\x9c#\x92=\x83\
-^\xce0rr\x9a\xc9\xa3Y<\xd7G\x0f\xea4nJ\xd0\x10\x1b\xa1X\\D!\xb8\x18\xa9<"\
-\xb9\xd3\xa8\xec,\x83o\x8f\x92\x1b\xb6\x11\x1a\x98\x11\x83\xea\x1b\xa2\xd4\
-\x86\xc6\xb0C\x1b\x11F\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc38\x115B4\
-\xd7\r\xa5YF\xbb&\xc9\xf4\xe6\x01h\xdc\x94$\xde\x1cb\xfc\xd8,zX\xa7fM\x86\
-\x9c\xef\x10\xca\xf5^T\xb3.<\x85Y\xb5\x85\xd1\x03\xa7\x19\xdew\x00\xe5{()8\
-\xbd\xe3\xe7,\x7f\xe4\x01\x12\xda 8G\x17\x14\x9f\xaeJ\xc4\x02\'\xe8\xfdE\x9a\
-P\xadE\xf2\xfaQ\xa6\xba\xb3L\x1e\x9fc\xd9\x83IB\xde\x8f\x19\xf8U\x98x\xbbC\
-\xa2\xea-\xec\xc8v\xa4\x97%\xe0\xbeD\xfaH\x10\xb3\xca#\xde!p\xd4\x1f\xa1\x84\
-qAn\xf40\xfb\xaeBIT\xf8(\x1aI\x04w\xa23\x8d\x10\x02\xa1B\x98\xfc\n\x8fi\x94&\
-\xf1\xbc\xdbX\xb4\xb6\x83\xbe\x9d\xff\x86=1B,\x15#Q\x1eC\x14\x1a8\xf3\xc3\
-\x83\x14&\xc6\t\xc4cH\xd3\xc4\xc9\xcf0\xba7M1\xddF\xcbWWb\x98\'\xd1\x9d$\x9a\
-\xddB\xf7O~Hqb\x1c3\x1a\xc1\x08\x87A8\xe4\xfb\\\x1aWoA\xf3\x87\x10\xb4\xa03\
-\x85g\x17\xb1\xa7f1\x82\x16\xa6\xd0\xd0\x021J\xfa\x01\xf0r\x04\xdc6N\xbf\xf2\
-2\xf9\xd1Q\x02\x898\xd2\xb2\x98<t\x8e\xf1\xfd6\xbe[&T_Op\xd3\x9d\xe8v\x06y)\
-\xcd5w\xa2\x14\x04\xab"T\xd5J\xf2c\x03\x08)\t\xc7\x97\xa0\x07b\x18*\x8d\xbf\
-\xa0\xf8N\xa0\xa4\x87i\xac\xc5\x9f\xedf\xbcg\x82\x99\xf7B\x04\xab\x93,^\xdfJ\
-U\xcdrp\xc2\x18\xfe1\xf2\xefk,^\xd5B\xc1;\x84,\xf9\xe8Z\x07\xe5\xf1c\xc4k\
-\xea\x88W5\x90\xe7\x00\x1f\xdf5\xd7C\xec\xb9*EQ\xe1C\x04K\x10\xdc\x8b.&\x11\
-\x12\x84\x08\x12\xe0]\x14\xfd\x00H\xcd&X\xfd\x00\x01k\x04{\xf20\x1a\xab1D\
-\x07\x03\xfb^\xa0<q\x98\xc5\xb7n\xa7\xee\xe6m\xa0\xca\xb8\xc5"C\xbb\xfe\x95B\
-\xffn\n\xe9\x95D\xda\x17\x81_\xc3\xd0\xde\xff\xc6\x9dz\x8f\x96;\x1e#\xd1\xb1\
-\x01\x19\xf0\xd1\xb48\x9eSD\xe9\xd3\x98z\'\xc2\xdd\x82.&p\xb3g\xe9\xf9\xcfg\
-\x90\xa6Dh\x92\xc6\xcdO\x13]\xb6\x0c\xe5e\xc9\x9c\xee\xc6\x19\xefb\xf1m\x0fQ\
-w\xf36\x84\xee\xe3\xdb0\xfc\xe6\x0b\xcc\x9e\xd9\x8f\xa1k\x08\xb3\x1e\xdd\x8d\
-2\xb4\xf7\xa5Kj*k\x17\xb1k\xef"\xd6\xf64g_|\x06\xa1{\xb4\xdf\xff\x14\xc2\x9a\
-Fju\x0c\xec\xfb\xe9\xe5\xe3k\xabGY;\x11\xe6\x16t9\x83)Gh\xd9\xfag\xc4\xdaW\
-\xe1\x8b~T\xe0]\xc8-\xa3~\x9d\xc9\xc0\xeb\xffEi\xf6\xab\x04\x83E\x94\x97d\
-\xa6\xaf\x1b\x9d\x11R+\x1e\x81\xd0 A\xf1\x06|\xacE\xf4\xc0\xf8\x17g\xcd\xf9\
-\xb7\x16]\xc3\x0bD\xd0l\x89\x94\x02\xfc\x08\xd6\xb4\x06\xee|n\x94\x15\xc7\
-\xf5\xc3\x98%\x81\xe9\x85\x11*\x06e\x1f\xbb\x7f\x80P\xb0\x91\xba\r\x8f\xa2\
-\x95w"\xbd\x83H\xf3!\xea\xd6>\xccP\xefIJ}}\xc4\x96>\x8e\xe7\t\xec\xde\x1eB\
-\x81:j\xd6<\x84t\x7f\x8c,\xec\x03\x99@\x13:83PJ\xe2\x99\xa0\x95@/\x82\x15J\
-\xa0[Q\xa4\xa1a\x05Sh\xae\x8b\x92\xadd:\xff\x85P\xa0\x9e\xba\xf5\xdb\xd1\x9d\
-\x9f!JG\xf1\xad\'\xa9Yy\x1f\xc5\x93\x07\xd1\x1d\x1d\xa1\x12\xe0\x05.\xaf\x99\
-\x9b\x03=\x83g}\x03SE\x90J\xa0\xe9Uh\xf6\xcbx\xc6\x93\x0b\x8a\xaf\xaae;Za/\
-\x9e\x15C\xb35B\xe1\xc5\xc4Z\xb7\xa0;\xdf\x05\xe7(d=\x94^\xa2j\xd9V\x02\xd6\
-\x1bLw\x1e\xa2i\xfb\x9f\xe2\xf9y\xb2G^$\xd1\xb4\x1a3\xb9\x14\x99\xdf\x05Y\
-\xe0c{0:\xbb\x97^\xf9\x82\xa8p!\xb1Z\xd88\x86\x18\r\x82\x04\xec18P\x0b\xb3\n\
-\x0c\x0b\xb5a\x03\xa5\x81wQ\xa7BX\xed\xad\xc8\xd9)<\x91\xc2;#\xd0c\x8dP\x08 \
-\x0f\rC!\x88\xd6\x98\xc6j\xb8\rm\xb4\x11&b\xa8B\x02U,\xe2\xbe\x0fF\xa2\x1e\
-\x7f\xce@\xef\x9a\x82\xc2G\x97\x8a\xab!V\x03\xeb\xd2\x88\xd1\x00\x96\xd3N\
-\xeb\xf6\xbf@\x8bF\xc0\xf7\xf1\'\x87\x91G\xcf\xe24/\xc29Q\xc2H6"\xca\t\xc4\
-\x81Y\xc8\x05\x91-C\x18\xf57\xa1\x8d\xd4#\xbc$x\tTN]^\xf37\xba\xeb\x87\x91\
-\xa3\x01\x84\x14PJCw\x12\x7f\xa9\\P|\xe4\x13p\xb4\t6\xc4a46?E\xf5S\xd0\x19\
-\x81L3\x00"PF\xde\x1c%\x12\xbf\x99\xec\xdew\xb1o*`\xa7\xd3\x94\x8f\xb9\xd4\
-\xdfv/\x8c\xe6\xe1@\x00\xfcO\xf6\x82>\xfc\xdc\x93\x9fg\xea+,\x00\xa3U\x90\
-\xe8\x98\xa4pj\t\x12\r??\xcd\xec\xfe\xad \x15\xe6Z\x1f=\xeb2\xfc\xed\x11\n\
-\xa7o\xa1\xe6\x81F\x8aGl\xccUyTi\x13\xd93\x19\xbc\xec\x0cN\xe8q\xec\xf7\\B\
-\xcb,\xe6:\x07\x99\xdd\xd3A\xb0\xa1\x01\x7ff\x06\x11\x02\xca\xb7\x92\xd93\
-\x86\xf3\xe8\x18%\xf5{\xd8{\\\xf4&\x1d\xe3\x1a\r\xbb\xab\x8c\x97.\x92X>>\xef\
-Ah \nd\xfeQ\xe0\x0e\n\xdc\xe1\x1a\xb4\x86\x06\x92\x7f[\xc2\xcb\xac\xa7\xd0\
-\x9d\xa3<5\x8a\x13x\x84\xe2~\x9b\xf0\xb2\x00s\xfb\xfa\x98\xdd\xd3A\xe8\x9a\
-\x14~!\x8d\x90\xfee5K\xfbl\x8c%>\x89\xeb\'\xc9\x1foG \xf1\xf3\x13d^[G\xd5\
-\xd3\x85\x05\xc5\xe7Nf\x99\xde\xf1e\xe27\x8cP\xe8n\x9a_\xe6\xcd\x8f2\xf5\x83\
-\xbb(\xf7\x96\xcf?\xe3\xd0@\x80\xd8\xda\x87\x19~~\x8e\x93\x7f\xb2\x13Ut\xb1\
-\x1a\xee\xc2Z\xbc\x91\xcc\xb7G(\xfe\xf2\xf7?57\xfa+k6^\xa12\xa8p1\xaa\xeb\
-\xe7\xb8\x97\xbd\x9cKU\xe3\x14%\xb5\xc3\xc3p\xbfE~\x1a\xb2\xa3\x0e\xbd\xdf\
-\xb2\xc9\xe4R\\\xf7\x87\xf5\x18\xcb\xcb\xbc\xb9\xa3\x99\x1bb\x83D\x9fh\xe7\
-\xc8\xdf\x9fa\xf4\xd9\xbd\xb4\xdd\xb9\x08\xb9:H\xe9D\x9e\xd3od(\xb6\xb6S\xb7\
-9Nw\xbfC"\x95%\xfcX\x1b]\xff\xe03\xf1\xbdN\xda\xee\xa8G\xdd\x15E\xb7@7\\\x92\
-_\x8bppW+\xb7\xcb]\x9cK%Aj\xb43\xcc\x1b\x91\xfb\x98J&!\tRS|e\xe0 \xfa\x03\
-\xad\x1c\xf9\xfe\x00\x85\x1f\x1c\xa4q}-\xfeF\x93\xa1\x0f4sMm$\xeb,Z\xdd\x01\
-\xb23\xc6e5\xdf\x8e\xaeF`s\xafx\x95\xbe\x9aj\x944h\x15i~\x99\\\xc3\x9a\xfe\
-\xfe\x85\xc57\xe4rz\xe92\xeeQ\x87\x18H\xc6\x10Rr\xad\x1ad\xf7u\xeb\x99\x8a\
-\x87\xcf?\xe3\xd8\x9c`[\xb3\xcb\xf4\xed\xeb\x19;1\x02!\x9d\xb5\x0fof6W\xc5+N\
-\x1c{\xcd\xa7\x7f\xd4\xae\x9f\xf6\x0bW\xaa\x0e*\\\x84F\x7f\x16\xdb\xeeg\xd2)\
-15\xa13\xf8\xcd4h:\xb6c\xa0\x84\x06B\xb2d\x85K\xc7\xef\xe69|\xb4\x8d\xb7\xfa\
-B\x8c\xeba\x9exp\x9c\xc5[\r\x8e\xfc<\xc7\xa9\xe7{PR\xc3\x17\x06\xe1\x84d\xc5\
-=\x12\xb3f\x8c\xd7v\xac\xa0\xb1\xd6\xe7\xe1m\x13\xd4}I\xe3\xf4\xfe<\xa7\xbe\
-\xd3\x7f~lu\x93\xe4\xbe\xbf2\x98\xd4\x82\xd8\xa5\xb3L\x96\xc3XQ\x89c\x8f\xd3\
-S\xce1\xe6\x7f\xb0\xb1\xe6\x83\xdb\x99\xe0\xd1m9\xc2\xab$]\xfb&9\xf8N\x06%5\
-\xa2\xb5\x06\x8b\xae\x93\x8c\x94$\xc1H\x1e\xbb\xd8\xc3;GV\xf1;\x9b/\xad9\xa2\
-7\xe18>\xa5B/\xa3v5\xc1\x98C\xd9\x9e\xe4L)\xcf\xec\xd1\x85\xc5\xf7\xfa\x8e\
-\x15H9\x8bS:\xc3\xb4S\xc0\xaa2(\xdbg\xe9)_\xcb\x98\xff\x91\xcd\xca\th:5G\xdd\
-\xe6&N\x9c\x1c&\x940i\xd8\x18\xa1\xf3\xddi\x8e\xe6\x82\x17\xcd\x8d>4T\xd9(\
-\xbc\xda\xe4\xb3yJ\xf9^\xdao\x12\x94;C\xd8\x8e\x81/t"\tIm\xb3C\xcbr\x9b\xe6\
-\xe5%\xf6u\xb6\xf1\xe2+M\x14Ki\xd2\xc3\n\xe9\x05\xb9\x7fk\x17\xd5\xad\x06g\
-\x0f\x07)\xe64\xac\xa8\xe0\xc6/g\tW\xc3w\xfe\xe3\x1e\x8eug1t\re\xeb<\xf8x7\
-\xd7\xdc\xa2qlo\x84\x99I\x8bX\xbdb\xd5\x97\xb2\xf4\xf5\xa78\xd8\xb5\x8c\xaf\
-\xac\xede\xc9\xea\x08U\xb5>\xe9!\x8b\xe3\'\xe7\xb0\x9d\xd2y\x9f\xe9\xb4\xa2:\
-\x02[\x9f:\xc3\xb9c\x01N\xbc\x13B3\x05\xeb\xb6fi\xbe&\xcf\x81]I\xa2I\x8f\x9e\
-\xb3U\xecxm#\xd9\xe9\xcbh\x1e\xce\x11\xab\xcaR,\xf4\xd1\xb2r\x9a\x86\xb6"\
-\xbd=Q\xde;\x9eG\xc0\x82\xe3\xabMe\xb0\x0b]4\xaf\xd3\x89\xd5\xf9\x0c\rNr\xfc\
-\xc44\xb6\x93\xbd\xe09\xef?\xe8\xf2\xe0\x16\x87\xbcS\xa2\xa9=\x81\x90\x93\
-\xbc\xb1\xbb\xc4\xd0\x90\xbchn\xc4\xc6\x8d\xafW\x0eL]e\x84\x80m\x9b\xbb\xb9}\
-]\x1f\xa9d\x11!\xe7S\x92\xcd\x9ad\xe6,\xc6\xa7#\xfc\xe2\xd7\xcb\xe89WM\xd9\
-\x95\x17\\\xb7\xbc}\x96M+Fhi\x9cCy\n\x1f\x8d\xee\xbe\x04\x07O\xd4\xd17\x189?\
-VJ\xc5\xcak\xa7\xd9\xbcv\x98T\xbc@\xb9,QR\xe7\xbd\xf7\xab\xd9\xdd\xd9H.op\
-\xf7\xed#l\xec\x98\xa6\xeck\xbc\xfaV#GNU}\xc2k\xc0\xf2\xb8u\xfd87\xad\x1cA\
-\xfa.R\x83\xb1L\x84\xb3\xe7\xaa\xd8\xb4b\x04\x10\xbc\xfa\xd6R\x8e\x9c\xaa\
-\xbe\xacf6g \x04\xdc}\xfb\x18\x1b:\xa6p}y\x81\xeeB\xe3\x9b\xbfG?\x9b:F(\xfb\
-\x1a\xaf\xbc\xd5\xc6\x91S\x17\x9e\xe30t\xf8\x9b\xaf\xe7(\x0f\x8e\xf0\xfaw\
-\xfb\xf9\xda?u\xd07\x11\xe5\x9b\xcfF\xb8\xd4\x91A\xb1h\xd1\xf7*\r\xf2\x05A\
-\x08\x08\x05?L\x87\xeb\x82\xedT\x96\xe1?\x0b6\xac)\xf3\xfdggx\xee/\x87p=\xc1\
-\x9f\xff\xf3"\x9e\xfaz\x9c\xb7\xf7_\xfa(\x81><<|\x85,V\xa8p\xf5\xb8a\xfb\x14\
-3#\x19\x8e\x1f\xce\xf3\xd83\x01\xbaO\xda\xbc\xbes\x11s\xd9\x8bO\xaf`~\xd5\
-\xbdB\x85\xff\xf7\x84\x836\xd1h\x9e\x07\xfe\x186\xdfm\xf3\xc2K\xa1\xcb6\x07\
-\x80~\x05\xbcU\xa8p\xd5y\xfe\xdf\x1b\t\x9auT\xc7|\x9e\xfd\x8e\xe4\xe5\x9f.\
-\xect\xa4\x80oT\xfe\x83T\xa8p\x11*S\xac\n\x15.A\xa5A*T\xb8\x04\xff\x03D\xe1\
-\x96sL\xad_\xbf\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory002Bitmap():
- return wxBitmapFromImage(getDocFactory002Image())
-
-def getDocFactory002Image():
- stream = cStringIO.StringIO(getDocFactory002Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory002')
-catalog['DocFactory002'] = ImageClass()
-catalog['DocFactory002'].getData = getDocFactory002Data
-catalog['DocFactory002'].getImage = getDocFactory002Image
-catalog['DocFactory002'].getBitmap = getDocFactory002Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory003Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rd\
-IDATx\x9c\xed\x9bil\x1d\xd7y\x86\x9fsf\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb\xfe\xc8\xcf\xa0\
-\x08\n\x14]\x8c\x06\x81\xed,5\x8a\x16\x8e\x137Jb\xc71"\xd9\x89,\xd9\x8aBm\
-\x96\xb5R\x96DR\\.w\xf2\x92w\x9d\xb93s\xfa\x83\xael\xc5\x96\xc8\xa2\x92e\xd4\
-\xf7\xf9yqf\xde\xf7\x9b\xef\xfb0\xe7\x9e3G\xfc\xc3\xb7\x94\xa2B\x85\n\x9f\
-\x8a\x1e\xaa\xbe\xda\x16*T\xf8\xfc\xa2\x07+\rR\xa1\xc2E\xd1\xc3\x89\xabm\xe1\
-\x8b\x8d@a`#\xf1.\xf8\xdd\xc5\xc0\xc5\xfc\xec<\x08\x1b\xedw<(\xa0\xac\x02xhW\
-DW\xe2c\x8a\x12>\x92\xb2\xb2P\x88+\xa2\xf3\x7fA\x0f\xc5\xaf\xb6\x85/.\x02\
-\x9f\x86\xc2.\xa2\xee9\xfc\x8f\xd5\xa6\x94 M\x9d\xbc\x1b\'\x17lgF_\x84K\xe0\
-\ny\xf0h\xb2\xdf\xa2\xca\xeb\xb9\xc0\x03\x80n)l\xad\x86nm\x0beB\x97UW\xc3a\
-\xb1\xfb\x0b\x02\xe5\x114C0&\x97\x91\x967_V\x8d\xcb\x81\x1e\xae4\xc8U\xc3b\
-\x94&\xfd9N\xbf^\xcb\xf4`\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4-\x9f\xc4\xb1\x16\
-\xd1\x17\xfc[\x1c\xea.\xbb\x87 \xc34\x15_\xe6\xe4\xcf\xe2L\xa7\x03 \x04\x08\
-\t@\xac\xd1f\xd9\x83\xefP4\xea\x99\xe0\xd6\xcb\xaa\x1bb\x98\x06\xfb\'\x1c\
-\xfbI\x8a\xd8\xc2\x12-k\x0eQ\x08^O\x99\xcfWA\xea\x91\xcf\x97\x9f/\x14!%Hh\
-\xab\x10~\x11\xa9)\x82q\x81\x11\x10(\x04\xa5|\x90\xd1\x93\x92\xfch3\xcb\xef\
-\x91\x98\xc6o\xe9\x0f\xdfw\xc14D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\xe4\xa7O\x87\
-\x84\xeb \xdd2\xc0\x05cCJ\',\xaeE\xb9\x05\xa4\xc6y\x0f H-6\t\x85:0\x83MD\xe4\
-\'\xef\xe3\xeb&J\xd3\x91N\x11\x84\xc47\xac\xd9\x06\x9bCS\xa0\x88\xfbE\xc2\
-\xf9\xa5HJd\xd31\xae\x8bZ\xd4\x85\xc6\xc9\xc8\x8f\nr^\xf1)\xf5\x91\xbe\x19\
-\x98\xd5\xf4\xca\xf8\xba5\xabU\xb6g\x87\x99\x81O^\x03\xf8f\xf0\x02\xcf\xbf\
-\x8b^e\x0e\\"\x85\x15\xae$\x96r\xc0X\x87\xa1\xbfC,\xe5r\xe3\x1f\xdd\x82\x16\
-\n\x82\xf2)\xe7m\x06\x0e\xf50r<\xcd\xb9\xfd)\xae\xbb+\x8ac\x9c\xa1 \x82\x08\
-\xe5af\xba13\xddx\x85\x12\x025\xfb\xf2\t\x04\xb0SKq\xaa\x9a\xe1\xc3F\x12~\
-\x19k\xa6\x07c\xf2,\xcav\x005\xfb\x820\x02\x14koD\x0bW#\x03\xb7`Y;\xd1R.7>\
-\xb1\x11#\x12\x04\xc0.+&\x8d\x082 \x89\xf9=\x98Sg\xb0f\xbaQ\xb6\x8bR\n\xcc ^\
-\xb0\x1a\xb3\x98F)p\xe2\xad\x94R\x1dsj\x86\x85N\xb57Cnj\x19\xb8\x9d\x08\rJ\
-\x85\x95,\xb2F\x192\xa0$\x8d\xf9\xc5\xa7|\x02\xe9\x03\x18\xb94\xd2\x90\xb8\
-\xe1\x06\xb4\xc2\x18\xbe]F\x98\x16\x8e^\x8b\xcc\x8e#\xa4\xc0^\xb8\x02/Z\x0b\
-\x80\x91>\x8115\x00BQ\x8e7Sn\\z\xd1\x1c\xe9\x11N^\xc9\x1a\xa8p\t\x0c\xa1#\
-\xcc*t\x99C\x0f\n\x8cX\x8a\x8cU\xc0\x03\xacP\x98\xb6;\xd6\xe2\xe5\xb6\x93\
-\x1b\xee\xa6\x90\xb9\x86\x845\x82n\xce\x10\xc9\x9eF/g\x18:1\xc9\xf8\x91,\x9e\
-\xeb\xa3\x07u\x1a7$h\x88\rQ,.\xa0\x10\\\x88T\x1e\x91\xdc)Tv\x9a\xfew\x86\xc9\
-\r\xda\x08\r\xcc\x88A\xf5\rQjC#\xd8\xa1\xf5\x08#\x85.\xf3\xe8A0\xa2)\n\x81\
-\x12.\x1en\xd0\xc5a\x94\x88\x1a"\x9a\xeb\x82\xd24\xc3\x87\xc6\xc9t\xe7\x01h\
-\xdc\x90$\xde\x1cb\xf4\xe84zX\xa7fU\x86\x9c\xef\x10\xcau_T\xb3.<\x81Y\xb5\
-\x89\xe1}\xa7\x18\xdc\xb3\x0f\xe5{()8\xb5\xed\x97,}\xe4\x01\x12Z?8G\xe6\x15\
-\x9f\xaeJ\xc4\x02\xc7\xe9\xfeU\x9aP\xadE\xf2\xfaa&\xba\xb2\x8c\x1f\x9ba\xc9\
-\x83IB\xdeO\xe9\xfbM\x98x\xbbC\xa2\xeam\xec\xc8V\xa4\x97%\xe0\xbeL\xfap\x10\
-\xb3\xca#\xde!p\xd4\x9f\xa0\x84\xf1\xa99\xd2\xc3\xec\xf9\x0cK\xa2\xc2\xc7\
-\xd1H"\xb8\x13\x9dI\x84\x10\x08\x15\xc2\xe47xL\xa24\x89\xe7\xdd\xc6\x82\xd5\
-\x1d\xf4l\xffw\xec\xb1!b\xa9\x18\x89\xf2\x08\xa2\xd0\xc0\xe9\x1f\xef\xa706J \
-\x1eC\x9a&N~\x8a\xe1\xddi\x8a\xe96Z\xbe\xba\x1c\xc3<\x81\xee$\xd1\xec\x16\
-\xba~\xf6c\x8ac\xa3\x98\xd1\x08F8\x0c\xc2!\xdf\xe3\xd2\xb8r\x13\x9a?\x80\xa0\
-\x05\x9d\t<\xbb\x88=1\x8d\x11\xb40\x85\x86\x16\x88Q\xd2\xf7\x81\x97#\xe0\xb6\
-q\xea\xd5W\xc8\x0f\x0f\x13H\xc4\x91\x96\xc5\xf8\x81s\x8c\xee\xb5\xf1\xdd2\
-\xa1\xfaz\x82\x1b\xeeD\xb73\xc8Ki\xae\xba\x13\xa5 X\x15\xa1\xaaV\x92\x1f\xe9\
-CHI8\xbe\x08=\x10\xc3Pi\xfcy\xc5w\x1c%=Lc5\xfet\x17\xa3g\xc7\x98z?D\xb0:\xc9\
-\xc2\xb5\xadT\xd5,\x05\'\x8c\xe1\x1f%\xff\x81\xc6\xc2\x15-\x14\xbc\x03\xc8\
-\x92\x8f\xaeuP\x1e=J\xbc\xa6\x8exU\x03y\xf6q\xb1\xddr=\xc4\xae\xcf\xb4(*|\
-\x84`\x11\x82{\xd1\xc58B\x82\x10A\x02\xbc\x87\xa2\x17\x00\xa9\xd9\x04\xab\
-\x1f `\ra\x8f\x1fDc%\x86\xe8\xa0o\xcf\x8b\x94\xc7\x0e\xb2\xf0\xd6\xad\xd4\
-\xdd\xbc\x05T\x19\xb7Xd`\xc7\xbfQ\xe8\xddI!\xbd\x9cH\xfb\x02\xf0k\x18\xd8\
-\xfd_\xb8\x13\xef\xd3r\xc7c$:\xd6!\x03>\x9a\x16\xc7s\x8a(}\x12S\xefD\xb8\x9b\
-\xd0\xc5\x18n\xf6\x0cg\x7f\xf0\x0c\xd2\x94\x08M\xd2\xb8\xf1i\xa2K\x96\xa0\
-\xbc,\x99S]8\xa3\x87Xx\xdbC\xd4\xdd\xbc\x05\xa1\xfb\xf86\x0c\xbe\xf5"\xd3\
-\xa7\xf7b\xe8\x1a\xc2\xacGw\xa3\x0c\xec~\xf9\x92\x9a\xca\xdaA\xec\xda\xbb\
-\x88\xb5=\xcd\x99\x97\x9eA\xe8\x1e\xed\xf7?\x85\xb0&\x91Z\x1d}{~>w|m\xf5(k;\
-\xc2\xdc\x84.\xa70\xe5\x10-\x9b\xff\x82X\xfb\n|\xd1\x8b\n\xbc\x07\xb9%\xd4\
-\xaf1\xe9{\xe3G\x94\xa6\xbfJ0XDyI\xa6z\xba\xd0\x19"\xb5\xec\x11\x08\xf5\x13\
-\x14o\xc2EZD\x0f\x8c~\xfe\xd6\x9e\xbf0\xe8\x1a^ \x82fK\xa4\x14\xe0G\xb0&5pgs\
-\xa2\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\xd8\xbd}\x84\x82\x8d\xd4\xad{\x14\xad\
-\xbc\x1d\xe9\xedG\x9a\x0fQ\xb7\xfaa\x06\xbaOP\xea\xe9!\xb6\xf8q<O`w\x9f%\x14\
-\xa8\xa3f\xd5CH\xf7\xa7\xc8\xc2\x1e\x90\t4\xa1\x833\x05\xa5$\x9e\tZ\t\xf4"X\
-\xa1\x04\xba\x15E\x1a\x1aV0\x85\xe6\xba(\xd9J\xa6\xf3;\x84\x02\xf5\xd4\xad\
-\xdd\x8a\xee\xfc\x02Q:\x82o=I\xcd\xf2\xfb(\x9e\xd8\x8f\xee\xe8\x08\x95\x00/0\
-\xb7fn\x06\xf4\x0c\x9e\xf5\rL\x15A*\x81\xa6W\xa1\xd9\xaf\xe0\x19O\xce+\xbe\
-\xaa\x96\xadh\x85\xddxV\x0c\xcd\xd6\x08\x85\x17\x12k\xdd\x84\xee|\x17\x9c#\
-\x90\xf5Pz\x89\xaa%\x9b\tXo2\xd9y\x80\xa6\xad\x7f\x8e\xe7\xe7\xc9\x1e~\x89D\
-\xd3J\xcc\xe4bd~\x07d\x81\x8b\xec\xc1\xe8\xec\\\xfc\xd9\x15D\x85\x0b\x89\xd5\
-\xc2\xfa\x11\xc4p\x10$`\x8f\xc0\xbeZ\x98V`X\xa8u\xeb(\xf5\xbd\x87:\x19\xc2jo\
-ENO\xe0\x89\x14\xdei\x81\x1ek\x84B\x00y`\x10\nA\xb4\xc64V\xc3mh\xc3\x8d0\x16\
-C\x15\x12\xa8b\x11\xf7\x030\x12\xf5\xf83\x06\xfa\xa1\t(||\xa9\xb8\x1ab5\xb0&\
-\x8d\x18\x0e`9\xed\xb4n\xfd+\xb4h\x04|\x1f\x7f|\x10y\xe4\x0cN\xf3\x02\x9c\
-\xe3%\x8cd#\xa2\x9c@\xec\x9b\x86\\\x10\xd92\x80Q\x7f\x13\xdaP=\xc2K\x82\x97@\
-\xe5\xd4\xdc\x9a\xff\xa3\xbbv\x109\x1c@H\x01\xa54t%\xf1\x17\xcby\xc5G>\x01G\
-\x9a`]\x1c\x86c\xb3ST?\x05\x9d\x11\xc84\x03 \x02e\xe4\xcdQ"\xf1\x9b\xc9\xee~\
-\x0f\xfb\xa6\x02v:M\xf9\xa8K\xfdm\xf7\xc2p\x1e\xf6\x05\xc0\xbfx\x0f\xe8\x83\
-\xcf=y%R_a\x1e\x18\xad\x82D\xc78\x85\x93\x8b\x90h\xf8\xf9I\xa6\xf7n\x06\xa90\
-W\xfb\xe8Y\x97\xc1o\x0fQ8u\x0b5\x0f4R<lc\xae\xc8\xa3J\x1b\xc8\x9e\xce\xe0e\
-\xa7pB\x8fc\xbf\xef\x12Zb1\xd3\xd9\xcf\xf4\xae\x0e\x82\r\r\xf8SS\x88\x10P\
-\xbe\x95\xcc\xae\x11\x9cGG(\xa9?\xc0\xde\xe5\xa27\xe9\x18\xd7h\xd8\x87\xcax\
-\xe9"\x89\xa5\xa3\xb3\x1e\x84\x06\xa2@\xe6\x9f\x05n\xbf\xc0\x1d\xacAkh \xf9\
-\xf7%\xbc\xccZ\n]9\xca\x13\xc38\x81G(\xee\xb5\t/\t0\xb3\xa7\x87\xe9]\x1d\x84\
-\xaeI\xe1\x17\xd2\x08\xe9\xcf\xa9Y\xdacc,\xf2I\\?N\xfeX;\x02\x89\x9f\x1f#\
-\xf3\xfa\x1a\xaa\x9e.\xcc+>w<\xcb\xe4\xb6/\x13\xbfa\x88BW\xd3\xec2o~\x98\x89\
-\x1f\xdeE\xb9\xbb|\xfe\x19\x87\xfa\x02\xc4V?\xcc\xe0\xf33\x9c\xf8\xb3\xed\
-\xa8\xa2\x8b\xd5p\x17\xd6\xc2\xf5d\xbe=D\xf1\xd7\x7fx\xc9\x1c\xe9\xaf\xaeZ\
-\x7f\x85\xcb\xa0\xc2\xc5\xa8\xae\x9f\xe1^vs.U\x8dS\x94\xd4\x0e\x0e\xc2\xfd\
-\x16\xf9I\xc8\x0e;t\x7f\xcb&\x93Kq\xdd\x1f\xd7c,-\xf3\xd6\xb6fn\x88\xf5\x13}\
-\xa2\x9d\xc3\xffx\x9a\xe1gw\xd3v\xe7\x02\xe4\xca \xa5\xe3yN\xbd\x99\xa1\xd8\
-\xdaN\xdd\xc68]\xbd\x0e\x89T\x96\xf0cm\x1c\xfa\'\x9f\xb1\xefu\xd2vG=\xea\xae\
-(\xba\x05\xba\xe1\x92\xfcZ\x84\xfd;Z\xb9]\xee\xe0\\*\tR\xa3\x9dA\xde\x8c\xdc\
-\xc7D2\tI\x90\x9a\xe2+}\xfb\xd1\x1fh\xe5\xf0\xf7\xfb(\xfcp?\x8dkk\xf1\xd7\
-\x9b\x0c|\xa8\x99kj#Yg\xd1\xea\xf6\x91\x9d2\xe6\xd4|\'\xba\x12\x81\xcd\xbd\
-\xe25zj\xaaQ\xd2\xa0U\xa4\xf9ur\x15\xabz{\xe7\x17\xdf\x80\xcb\xa9\xc5K\xb8G\
-\x1d\xa0/\x19CH\xc9\xb5\xaa\x9f\x9d\xd7\xade"\x1e>\xff\x8cc3\x82-\xcd.\x93\
-\xb7\xafe\xe4\xf8\x10\x84tV?\xbc\x91\xe9\\\x15\xaf:q\xecU\x97\xfe\x98]?\xe5\
-\x17\xaet\x1dT\xb8\x08\x8d\xfe4\xb6\xdd\xcb\xb8SbbL\xa7\xff\x9bi\xd0tl\xc7@\
-\t\r\x84d\xd12\x97\x8e\xdf\xcfs\xf0H\x1bo\xf7\x84\x18\xd5\xc3<\xf1\xe0(\x0b7\
-\x1b\x1c\xfee\x8e\x93\xcf\x9fEI\r_\x18\x84\x13\x92e\xf7H\xcc\x9a\x11^\xdf\
-\xb6\x8c\xc6Z\x9f\x87\xb7\x8cQ\xf7%\x8dS{\xf3\x9c|\xa1\xf7\xfc\xd8\xea&\xc9}\
-\x7fc0\xae\x05\xb1Kg\x18/\x87\xb1\xa2\x12\xc7\x1e\xe5l9\xc7\x88\xff\xe1\xc6\
-\x9a\x0fng\x82G\xb7\xe4\x08\xaf\x90\x1c\xda3\xce\xfew3(\xa9\x11\xad5Xp\x9dd\
-\xa8$\tF\xf2\xd8\xc5\xb3\xbc{x\x05\xbf\xb7\xf1\xd2\x9aCz\x13\x8e\xe3S*t3lW\
-\x13\x8c9\x94\xedqN\x97\xf2L\x1f\x99_|ol[\x86\x94\xd38\xa5\xd3L:\x05\xac*\
-\x83\xb2}\x86\xb3\xe5k\x19\xf1?\xb6Y9\x06M\'g\xa8\xdb\xd8\xc4\xf1\x13\x83\
-\x84\x12&\r\xeb#t\xbe7\xc9\x91\\p\xce\x1c\xe9\x03\x03\x95\x8d\xc2\xabE>\x9b\
-\xa7\x94\xef\xa6\xfd&A\xb93\x84\xed\x18\xf8B\'\x92\x90\xd46;\xb4,\xb5i^ZbOg\
-\x1b/\xbd\xdaD\xb1\x94&=\xa8\x90^\x90\xfb7\x1f\xa2\xba\xd5\xe0\xcc\xc1 \xc5\
-\x9c\x86\x15\x15\xdc\xf8\xe5,\xe1jx\xe1?\xef\xe1hW\x16C\xd7P\xb6\xce\x83\x8f\
-wq\xcd-\x1aGwG\x98\x1a\xb7\x88\xd5+V|)KOo\x8a\xfd\x87\x96\xf0\x95\xd5\xdd,Z\
-\x19\xa1\xaa\xd6\'=`q\xec\xc4\x0c\xb6S:\xef3\x9dVTG`\xf3S\xa79w4\xc0\xf1wCh\
-\xa6`\xcd\xe6,\xcd\xd7\xe4\xd9\xb7#I4\xe9q\xf6L\x15\xdb^_Ovr\x0e\xcd\x839bUY\
-\x8a\x85\x1eZ\x96O\xd2\xd0V\xa4\xfbl\x94\xf7\x8f\xe5\x110\xef\xf8jS\x19\xec\
-\xc2!\x9a\xd7\xe8\xc4\xea|\x06\xfa\xc79v|\x12\xdb\xc9^\xf0\x9c\xf7\xeewyp\
-\x93C\xde)\xd1\xd4\x9e@\xc8q\xde\xdcYb`@\xce\x99#\xb1~\xfd\x1b\x95\x03SW\t!`\
-\xcb\xc6.n_\xd3C*YD\xc8\xd9Td\xb3&\x99\x19\x8b\xd1\xc9\x08\xbf\xfa\xed\x12\
-\xce\x9e\xab\xa6\xec\xca\x0b\xae[\xda>\xcd\x86eC\xb44\xce\xa0<\x85\x8fFWO\
-\x82\xfd\xc7\xeb\xe8\xe9\x8f\x9c\x1f+\xa5b\xf9\xb5\x93l\\=H*^\xa0\\\x96(\xa9\
-\xf3\xfe\x07\xd5\xec\xecl$\x977\xb8\xfb\xf6!\xd6wLR\xf65^{\xbb\x91\xc3\'\xab\
->\xe15`y\xdc\xbav\x94\x9b\x96\x0f!}\x17\xa9\xc1H&\xc2\x99sUlX6\x04\x08^{{1\
-\x87OV\xcf\xa9\x99\xcd\x19\x08\x01w\xdf>\xc2\xba\x8e\t\\_^\xa0;\xdf\xf8f\xef\
-\xd1\xcb\x86\x8e!\xca\xbe\xc6\xabo\xb7q\xf8\xe4\x85\xe77\x0c\x1d\xfe\xee\xeb\
-9\xca\xfdC\xbc\xf1\xdd^\xbe\xf6/\x1d\xf4\x8cE\xf9\xe6\xb3\x11\xe6sTP,X\xf0\
-\xbdJ\x83\\e\x84\x80P\xf0\xa34\xb8.\xd8Ne\xf9\xfdr\xb0nU\x99\xef?;\xc5s\x7f=\
-\x80\xeb\t\xfe\xf2_\x17\xf0\xd4\xd7\xe3\xbc\xb3w~G\t\xf4\xc1\xc1\xc1+l\xb1B\
-\x85\xab\xc7\r[\'\x98\x1a\xcap\xec`\x9e\xc7\x9e\t\xd0u\xc2\xe6\x8d\xed\x0b\
-\x98\xc9\xce=\xbd\x82\xd9\xd5\xf7\n\x15\xfe\xdf\x12\x0e\xdaD\xa3y\x1e\xf8S\
-\xd8x\xb7\xcd\x8b/\x87\xe6\xdd\x1c\x00\xfa\x15\xf4V\xa1\xc2U\xe7\xf9\xffh$h\
-\xd6Q\x1d\xf3y\xf6\x05\xc9+?\xff\xdf\x9d\x8e\x14\xf0\x8d\xca\x7f\x90\n\x15.B\
-e\x8aU\xa1\xc2%\xa84H\x85\n\x97\xe0\xbf\x01)u\x96s1\xa7x\x1f\x00\x00\x00\x00\
-IEND\xaeB`\x82'
-
-def getDocFactory003Bitmap():
- return wxBitmapFromImage(getDocFactory003Image())
-
-def getDocFactory003Image():
- stream = cStringIO.StringIO(getDocFactory003Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory003')
-catalog['DocFactory003'] = ImageClass()
-catalog['DocFactory003'].getData = getDocFactory003Data
-catalog['DocFactory003'].getImage = getDocFactory003Image
-catalog['DocFactory003'].getBitmap = getDocFactory003Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory004Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rd\
-IDATx\x9c\xed\x9bil\\\xd7y\x86\x9fs\xee6+g\xe1p\x95HJ$e[6%Y\xbb\xbc*\x91\x9d\
-\xb8\x92\x97zS\xbd\xb4vQ\xb4\x08\x8a\xdah\xe1\xb6?\xf23(\x82\x02E\x17\xa3A`\
-\xa7Ij\x14-\\\xa7n\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xda,k\xa5,\x89\xa4\xb8\
-\x0cwr\xc8Y\xef\x9d{\xef\xe9\x0f\xba\xb2UG"]h1\x9cy~\x0e\xce\xbd\xef\xfb\x9d\
-\xef\xfb0g\xce\x99#\xfe\xee[JQ\xa1B\x85\xdf\x88\x1e\xaa\xbe\xd6\x16*T\xf8\
-\xfc\xa2\x07+\rR\xa1\xc2E\xd1\xc3\x89km\xe1\xb7\x13\x81\xc2\xc0F\xe2]\xf0\
-\xb9\x8b\x81\x8by\xf5<\x08\x1b\xed\xffxP@Y\x05\xf0\xd0\xae\x88\xae\xc4\xc7\
-\x14%|$ee\xa1\x10WD\xe7r\xa0\x87\xe2\xd7\xda\xc2o\x1f\x02\x9f\x86\xc2.\xa2\
-\xee9\xfcO\xd4\xa6\x94 M\x9d\xbc\x1b\'\x17lgF_\x84K\xe0\ny\xf0h\xb2\xdf\xa6\
-\xca\xeb\xb9\xc0\x03\x80n)l\xad\x86nm\x0beB\x97UW\xc3a\xb1\xfb3\x02\xe5\x114\
-C0&\x97\x91\x96\xb7^V\x8d\xcb\x89\x1e\xae4\xc8U\xc7b\x94&\xfd\x05N\xbfQ\xcb\
-\xf4`\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4-\x9f\xc4\xb1\x16\xd1\x17\xfck\x1c\
-\xea.\xbb\x87 \xc34\x15_\xe1\xe4O\xe2L\xa7\x03 \x04\x08\t@\xac\xd1f\xd9\xc3\
-\xefR4\xea\x99\xe0\xf6\xcb\xaa\x1bb\x98\x06\xfbG\x1c\xfbQ\x8a\xd8\xc2\x12-k\
-\x0eQ\x08\xdeH\x99\xcfg!\xea\x91\xcf\xa7\xaf/4!%Hh\xab\x10~\x11\xa9)\x82q\
-\x81\x11\x10(\x04\xa5|\x90\xd1\x93\x92\xfch3\xcb\xef\x93\x98\xc6\xaf\xe9\x0f\
-?p\xc12D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\xe4o^\x0e\t\xd7A\xbae\x80\x0b\xc6\x86\
-\x94NX\\\x8fr\x0bH\x8d\xf3\x1e@\x90Zl\x12\nu`\x06\x9b\x88\xc8O\xbf\xc7\xd7M\
-\x94\xa6#\x9d"\x08\x89oX\xb3\r6\x87\xa6@\x11\xf7\x8b\x84\xf3K\x91\x94\xc8\
-\xa6c\xdc\x10\xb5\xa8\x0b\x8d\x93\x91\x1f\x17\xe2\xbc\xe2S\xeac}30\xab\xe9\
-\x95\xf1ukV\xabl\xcf\x0e3\x03\x9f~\x06\xf0\xcd\xe0\x05\x9e/\x86^e\x0e\xcc9\
-\xa8\xc2\xe5\xc5R\x0e\x18\xeb0\xf4w\x89\xa5\\n\xfe\x83\xdb\xd0BAP>\xe5\xbc\
-\xcd\xc0\xa1\x1eF\x8e\xa79\xb7?\xc5\r\xf7Dq\x8c3\x14D\x10\xa1<\xccL7f\xa6\
-\x1b\xafPB\xa0f\xbf|\x02\x01\xec\xd4R\x9c\xaaf\xf8\xa8\x91\x84_\xc6\x9a\xe9\
-\xc1\x98<\x8b\xb2\x1d@\xcd~A\x18\x01\x8a\xb57\xa3\x85\xab\x91\x81\xdb\xb0\
-\xac\x9dh)\x97\x9b\x9f\xda\x88\x11\t\x02`\x97\x15\x93F\x04\x19\x90\xc4\xfc\
-\x1e\xcc\xa93X3\xdd(\xdbE)\x05f\x10/X\x8dYL\xa3\x148\xf1VJ\xa9\x8e95\xc3B\
-\xa7\xda\x9b!7\xb5\x0c\xdcN\x84\x06\xa5\xc2J\x16Y\xa3\x0c\x19P\x92\xc6\xfc\
-\xe2S>\x81\xf4\x01\x8c\\\x1aiH\xdcp\x03Za\x0c\xdf.#L\x0bG\xafEf\xc7\x11R`/\\\
-\x81\x17\xad\x05\xc0H\x9f\xc0\x98\x1a\x00\xa1(\xc7\x9b)7.\x9d3Wz\x84\x93W\
-\xa2\x06*\\\x02C\xe8\x08\xb3\n]\xe6\xd0\x83\x02#\x96"c\x15\xf0\x00+\x14\xa6\
-\xed\xae\xb5x\xb9\xed\xe4\x86\xbb)d\xae#a\x8d\xa0\x9b3D\xb2\xa7\xd1\xcb\x19\
-\x86NL2~$\x8b\xe7\xfa\xe8A\x9d\xc6\r\t\x1abC\x14\x8b\x0b(\x04\x17"\x95G$w\n\
-\x95\x9d\xa6\xff\xddar\x836B\x033bP}S\x94\xda\xd0\x08vh=\xc2H\xa1\xcb<z\x10\
-\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18%\xa2\x86\x88\xe6\xba\xa04\xcd\xf0\xa1q2\
-\xddy\x00\x1a7$\x897\x87\x18=:\x8d\x1e\xd6\xa9Y\x95!\xe7;\x84r\xdd\x17\xd5\
-\xac\x0bO`Vmbx\xdf)\x06\xf7\xecC\xf9\x1eJ\nNm\xfb9K\x1f{\x88\x84\xd6\x0f\xce\
-\x91y\xc5\xa7\xab\x12\xb1\xc0q\xba\x7f\x91&Tk\x91\xbcq\x98\x89\xae,\xe3\xc7f\
-X\xf2p\x92\x90\xf7c\xfa~\x15&\xde\xee\x90\xa8z\x07;\xb2\x15\xe9e\t\xb8\xaf\
-\x90>\x1c\xc4\xac\xf2\x88w\x08\x1c\xf5G(a\\2Wz\x98=W\xa1$*|\x12\x8d$\x82\xbb\
-\xd1\x99D\x08\x81P!L~\x85\xc7$J\x93x\xde\x1d,X\xddA\xcf\xf6\x7f\xc3\x1e\x1b"\
-\x96\x8a\x91(\x8f \n\r\x9c\xfe\xe1~\nc\xa3\x04\xe21\xa4i\xe2\xe4\xa7\x18\xde\
-\x9d\xa6\x98n\xa3\xe5\xab\xcb1\xcc\x13\xe8N\x12\xcdn\xa1\xeb\'?\xa486\x8a\
-\x19\x8d`\x84\xc3 \x1c\xf2=.\x8d+7\xa1\xf9\x03\x08Z\xd0\x99\xc0\xb3\x8b\xd8\
-\x13\xd3\x18A\x0bShh\x81\x18%}\x1fx9\x02n\x1b\xa7^{\x95\xfc\xf00\x81D\x1ciY\
-\x8c\x1f8\xc7\xe8^\x1b\xdf-\x13\xaa\xaf\'\xb8\xe1nt;\x83\xbc\x94\xe6\xaa\xbb\
-Q\n\x82U\x11\xaaj%\xf9\x91>\x84\x94\x84\xe3\x8b\xd0\x031\x0c\x95\xc6\x9fW|\
-\xc7Q\xd2\xc34V\xe3Ow1zv\x8c\xa9\x0fB\x04\xab\x93,\\\xdbJU\xcdRp\xc2\x18\xfe\
-Q\xf2\x1fj,\\\xd1B\xc1;\x80,\xf9\xe8Z\x07\xe5\xd1\xa3\xc4k\xea\x88W5\x90g\
-\x1fs\x9d\x92\xeb!v]\x95\xa2\xa8\xf01\x82E\x08\xeeG\x17\xe3\x08\tB\x04\t\xf0\
->\x8a^\x00\xa4f\x13\xac~\x88\x805\x84=~\x10\x8d\x95\x18\xa2\x83\xbe=/Q\x1e;\
-\xc8\xc2\xdb\xb7Rw\xeb\x16Pe\xdcb\x91\x81\x1d\xffJ\xa1w\'\x85\xf4r"\xed\x0b\
-\xc0\xafa`\xf7\x7f\xe3N|@\xcb]O\x90\xe8X\x87\x0c\xf8hZ\x1c\xcf)\xa2\xf4IL\
-\xbd\x13\xe1nB\x17c\xb8\xd93\x9c\xfd\xcf\xe7\x90\xa6Dh\x92\xc6\x8d\xcf\x12]\
-\xb2\x04\xe5e\xc9\x9c\xea\xc2\x19=\xc4\xc2;\x1e\xa1\xee\xd6-\x08\xdd\xc7\xb7\
-a\xf0\xed\x97\x98>\xbd\x17C\xd7\x10f=\xba\x1be`\xf7+\x97\xd4T\xd6\x0eb\xd7\
-\xdfC\xac\xedY\xce\xbc\xfc\x1cB\xf7h\x7f\xf0\x19\x845\x89\xd4\xea\xe8\xdb\
-\xf3\xd3\xb9\xe3k\xabGY\xdb\x11\xe6&t9\x85)\x87h\xd9\xfcg\xc4\xdaW\xe0\x8b^T\
-\xe0}\xc8-\xa1~\x8dI\xdf\x9b\xffEi\xfa\xab\x04\x83E\x94\x97d\xaa\xa7\x0b\x9d\
-!R\xcb\x1e\x83P?A\xf1\x16\xcc\xd1"z`\xf4\xf3\xbb\x07\xfd\x85E\xd7\xf0\x02\
-\x114["\xa5\x00?\x825\xa9\x81;\x9b\x0be\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\
-\xed#\x14l\xa4n\xdd\xe3h\xe5\xedHo?\xd2|\x84\xba\xd5\x8f2\xd0}\x82RO\x0f\xb1\
-\xc5O\xe2y\x02\xbb\xfb,\xa1@\x1d5\xab\x1eA\xba?F\x16\xf6\x80L\xa0\t\x1d\x9c)\
-(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9V2\x9d\xffB(P\
-O\xdd\xda\xad\xe8\xce\xcf\x10\xa5#\xf8\xd6\xd3\xd4,\x7f\x80\xe2\x89\xfd\xe8\
-\x8e\x8eP\t\xf0\x02sk\xe6f@\xcf\xe0Y\xdf\xc0T\x11\xa4\x12hz\x15\x9a\xfd*\x9e\
-\xf1\xf4\xbc\xe2\xabj\xd9\x8aV\xd8\x8dg\xc5\xd0l\x8dPx!\xb1\xd6M\xe8\xcew\
-\xc19\x02Y\x0f\xa5\x97\xa8Z\xb2\x99\x80\xf5\x16\x93\x9d\x07h\xda\xfa\xa7x~\
-\x9e\xec\xe1\x97I4\xad\xc4L.F\xe6w@\x16\x98\xe3\x0cFg\xe7\xe2+_\x10\x15.$V\
-\x0b\xebG\x10\xc3A\x90\x80=\x02\xfbjaZ\x81a\xa1\xd6\xad\xa3\xd4\xf7>\xead\
-\x08\xab\xbd\x159=\x81\'Rx\xa7\x05z\xac\x11\n\x01\xe4\x81A(\x04\xd1\x1a\xd3X\
-\rw\xa0\r7\xc2X\x0cUH\xa0\x8aE\xdc\x0f\xc1H\xd4\xe3\xcf\x18\xe8\x87&\xa0\xf0\
-\xc9\xad\xe2j\x88\xd5\xc0\x9a4b8\x80\xe5\xb4\xd3\xba\xf5/\xd0\xa2\x11\xf0}\
-\xfc\xf1A\xe4\x9138\xcd\x0bp\x8e\x970\x92\x8d\x88r\x02\xb1o\x1arAd\xcb\x00F\
-\xfd-hC\xf5\x08/\t^\x02\x95Ssk\xfe\xaf\xee\xdaA\xe4p\x00!\x05\x94\xd2\xd0\
-\x95\xc4_,\xe7\x15\x1f\xf9\x04\x1ci\x82uq\x18\x8e\xcd.Q\xfd\x14tF \xd3\x0c\
-\x80\x08\x94\x91\xb7F\x89\xc4o%\xbb\xfb}\xec[\n\xd8\xe94\xe5\xa3.\xf5w\xdc\
-\x0f\xc3y\xd8\x17\x00\x7f\xee\xda\xd7\x07_x\xfar\xa6\xbe\xc2<0Z\x05\x89\x8eq\
-\n\'\x17!\xd1\xf0\xf3\x93L\xef\xdd\x0cRa\xae\xf6\xd1\xb3.\x83\xdf\x1e\xa2p\
-\xea6j\x1ej\xa4x\xd8\xc6\\\x91G\x956\x90=\x9d\xc1\xcbN\xe1\x84\x9e\xc4\xfe\
-\xc0%\xb4\xc4b\xa6\xb3\x9f\xe9]\x1d\x04\x1b\x1a\xf0\xa7\xa6\x10!\xa0|;\x99]#\
-8\x8f\x8fPR\xbf\x87\xbd\xcbEo\xd21\xae\xd3\xb0\x0f\x95\xf1\xd2E\x12KGg=\x08\
-\rD\x81\xcc?\n\xdc~\x81;X\x83\xd6\xd0@\xf2oKx\x99\xb5\x14\xbar\x94\'\x86q\
-\x02\x8fQ\xdck\x13^\x12`fO\x0f\xd3\xbb:\x08]\x97\xc2/\xa4\x11\xd2\x9fS\xb3\
-\xb4\xc7\xc6X\xe4\x93\xb8q\x9c\xfc\xb1v\x04\x12??F\xe6\x8d5T=[\x98W|\xeex\
-\x96\xc9m_&~\xd3\x10\x85\xae\xa6\xd9m\xde\xfc0\x13?\xb8\x87rw\xf9\xfc\x1c\
-\x87\xfa\x02\xc4V?\xca\xe0\x8b3\x9c\xf8\x93\xed\xa8\xa2\x8b\xd5p\x0f\xd6\xc2\
-\xf5d\xbe=D\xf1\x97\xbf?\xaf\\\xe9\xaf\xadZ\x7f\x85\xca\xa0\xc2\xc5\xa8\xae\
-\x9f\xe1~vs.U\x8dS\x94\xd4\x0e\x0e\xc2\x83\x16\xf9I\xc8\x0e;t\x7f\xcb&\x93Kq\
-\xc3\x1f\xd6c,-\xf3\xf6\xb6fn\x8a\xf5\x13}\xaa\x9d\xc3\x7f\x7f\x9a\xe1\xe7w\
-\xd3v\xf7\x02\xe4\xca \xa5\xe3yN\xbd\x95\xa1\xd8\xdaN\xdd\xc68]\xbd\x0e\x89T\
-\x96\xf0\x13m\x1c\xfa\x07\x9f\xb1\xefu\xd2vW=\xea\x9e(\xba\x05\xba\xe1\x92\
-\xfcZ\x84\xfd;Z\xb9S\xee\xe0\\*\tR\xa3\x9dA\xde\x8a<\xc0D2\tI\x90\x9a\xe2+}\
-\xfb\xd1\x1fj\xe5\xf0\xf7\xfb(\xfc`?\x8dkk\xf1\xd7\x9b\x0c|\xa4\x99kj#Yg\xd1\
-\xea\xf6\x91\x9d2\xe6\xd4|7\xba\x12\x81\xcd\xfd\xe2uzj\xaaQ\xd2\xa0U\xa4\xf9\
-er\x15\xabz{\xe7\x17\xdf\x80\xcb\xa9\xc5K\xb8O\x1d\xa0/\x19CH\xc9\xf5\xaa\
-\x9f\x9d7\xace"\x1e>?\xc7\xb1\x19\xc1\x96f\x97\xc9;\xd72r|\x08B:\xab\x1f\xdd\
-\xc8t\xae\x8a\xd7\x9c8\xf6\xaa\xf9\xfd\x89]?\xe5\x17\xaeT\x1dT\xb8\x08\x8d\
-\xfe4\xb6\xdd\xcb\xb8SbbL\xa7\xff\x9bi\xd0tl\xc7@\t\r\x84d\xd12\x97\x8e\xdf\
-\xcds\xf0H\x1b\xef\xf4\x84\x18\xd5\xc3<\xf5\xf0(\x0b7\x1b\x1c\xfey\x8e\x93/\
-\x9eEI\r_\x18\x84\x13\x92e\xf7I\xcc\x9a\x11\xde\xd8\xb6\x8c\xc6Z\x9fG\xb7\
-\x8cQ\xf7%\x8dS{\xf3\x9c\xfcN\xef\xf9\xb1\xd5M\x92\x07\xfe\xca`\\\x0bb\x97\
-\xce0^\x0ecE%\x8e=\xca\xd9r\x8e\x11\xff\xa3\x835\x1f\xdc\xce\x04\x8fo\xc9\
-\x11^!9\xb4g\x9c\xfd\xefePR#Zk\xb0\xe0\x06\xc9PI\x12\x8c\xe4\xb1\x8bgy\xef\
-\xf0\n~g\xe3\xa55\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\xae&\x18s(\xdb\xe3\x9c.\xe5\
-\x99>2\xbf\xf8\xde\xdc\xb6\x0c)\xa7qJ\xa7\x99t\nXU\x06e\xfb\x0cg\xcb\xd73\
-\xe2\x7f\xe2\xb0r\x0c\x9aN\xceP\xb7\xb1\x89\xe3\'\x06\t%L\x1a\xd6G\xe8|\x7f\
-\x92#\xb9\xe0\xbcs\xa5\x0f\x0cT\x0e\n\xaf6\xf9l\x9eR\xbe\x9b\xf6[\x04\xe5\
-\xce\x10\xb6c\xe0\x0b\x9dHBR\xdb\xec\xd0\xb2\xd4\xa6yi\x89=\x9dm\xbc\xfcZ\
-\x13\xc5R\x9a\xf4\xa0BzA\x1e\xdc|\x88\xeaV\x833\x07\x83\x14s\x1aVTp\xf3\x97\
-\xb3\x84\xab\xe1;\xffq\x1fG\xbb\xb2\x18\xba\x86\xb2u\x1e~\xb2\x8b\xebn\xd38\
-\xba;\xc2\xd4\xb8E\xac^\xb1\xe2KYzzS\xec?\xb4\x84\xaf\xac\xeef\xd1\xca\x08U\
-\xb5>\xe9\x01\x8bc\'f\xb0\x9d\xd2y\x9f\xe9\xb4\xa2:\x02\x9b\x9f9\xcd\xb9\xa3\
-\x01\x8e\xbf\x17B3\x05k6gi\xbe.\xcf\xbe\x1dI\xa2I\x8f\xb3g\xaa\xd8\xf6\xc6z\
-\xb2\x93sh\x1e\xcc\x11\xab\xcaR,\xf4\xd0\xb2|\x92\x86\xb6"\xddg\xa3|p,\x8f\
-\x80y\xc7W\x9b\xca`\x17\x0e\xd1\xbcF\'V\xe73\xd0?\xce\xb1\xe3\x93\xd8N\xf6\
-\x82y\xde\xbb\xdf\xe5\xe1M\x0ey\xa7DS{\x02!\xc7ykg\x89\x81\x019\xef\\\x89\
-\xf5\xeb\xdf\xac\\\x98\xba\xca\x08\x01[6vq\xe7\x9a\x1eR\xc9"B\xce\xa6 \x9b5\
-\xc9\xccX\x8cNF\xf8\xc5\xaf\x97p\xf6\\5eW^\xf0\xdc\xd2\xf6i6,\x1b\xa2\xa5q\
-\x06\xe5)|4\xbaz\x12\xec?^GO\x7f\xe4\xfcX)\x15\xcb\xaf\x9fd\xe3\xeaAR\xf1\
-\x02\xe5\xb2DI\x9d\x0f>\xacfgg#\xb9\xbc\xc1\xbdw\x0e\xb1\xbec\x92\xb2\xaf\
-\xf1\xfa;\x8d\x1c>Y\xf5)\xaf\x01\xcb\xe3\xf6\xb5\xa3\xdc\xb2|\x08\xe9\xbbH\r\
-F2\x11\xce\x9c\xabb\xc3\xb2!@\xf0\xfa;\x8b9|\xb2zN\xcdl\xce@\x08\xb8\xf7\xce\
-\x11\xd6uL\xe0\xfa\xf2\x02\xdd\xf9\xc67\xfb\x8e^6t\x0cQ\xf65^{\xa7\x8d\xc3\'\
-/\xbc\xb7a\xe8\xf07_\xcfQ\xee\x1f\xe2\xcd\xef\xf6\xf2\xb5\x7f\xea\xa0g,\xca7\
-\x9f\x8f\xf0Y\xae\x08\x8a\x05\x0b\xbeWi\x90k\x84\x10\x10\n~<\xfd\xae\x0b\xb6\
-S\xd9v\xbf\x1c\xac[U\xe6\xfb\xcfO\xf1\xc2_\x0e\xe0z\x82?\xff\xe7\x05<\xf3\
-\xf58\xef\xee\xfdlW\t\xf4\xc1\xc1\xc1+d\xb1B\x85k\xc7M[\'\x98\x1a\xcap\xec`\
-\x9e\'\x9e\x0b\xd0u\xc2\xe6\xcd\xed\x0b\x98\xc9\xce\x7fy\x05\xb3\xbb\xf0\x15\
-*|\xe1\x08\x07m\xa2\xd1<\x0f\xfd1l\xbc\xd7\xe6\xa5WB\x9f\xb99\x00\xf4+\xe0\
-\xadB\x85k\xce\x8b\xff\xdeH\xd0\xac\xa3:\xe6\xf3\xfcw$\xaf\xfe\xf4\xffw;R\
-\xc07*\xbfA*T\xb8\x08\x95%V\x85\n\x97\xa0\xd2 \x15*\\\x82\xff\x01\x0e\t\x96s\
-<\xfa\x1bp\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory004Bitmap():
- return wxBitmapFromImage(getDocFactory004Image())
-
-def getDocFactory004Image():
- stream = cStringIO.StringIO(getDocFactory004Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory004')
-catalog['DocFactory004'] = ImageClass()
-catalog['DocFactory004'].getData = getDocFactory004Data
-catalog['DocFactory004'].getImage = getDocFactory004Image
-catalog['DocFactory004'].getBitmap = getDocFactory004Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory005Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rf\
-IDATx\x9c\xed\x9bi\x90\\\xd5y\x86\x9fs\xee\xd6\xeb\xf42=\xab43\xd2\xcc\x08\
-\x10\x8c$\xb4\x8bU\xb6\xc0&\x12K\xd8\x14\x96\x04R\xa9\xa4\\\xa9@%E\x92\x1f\
-\xfe\xe9J\xb9R\x95\xcaB\xc5\xe5\x02\xbc\x84J%Ep\x88e\x1b\x8c)K`\x0b\tdy\xb4!\
-\xb4\x8e\x9043\x9a\xa5g\x9f\xe9\x99^\xef\xed{\xef\xc9\x8f!\x02\x05K\x1a\xf0\
-\x08(\xdc\xcf\xcf\xaes\xef\xfb~\xe7\xfb\xbe\xea\xd3\xe7\xf4\x11\xff\xf0-\xa5\
-\xa8P\xa1\xc2oD\x0fU\x7f\xd6\x16*T\xf8\xfc\xa2\x07+\rR\xa1\xc2E\xd1\xc3\x89\
-\xcf\xda\xc2\xef\x16\x02\x85\x81\x8d\xc4\xbb\xe0s\x17\x03\x17\xf3\xd3\xf3 l\
-\xb4\xff\xe7A\x01e\x15\xc0C\xbb"\xba\x12\x1fS\x94\xf0\x91\x94\x95\x85B\\\x11\
-\x9d\xf9D\x0f\xc5?k\x0b\xbf;\x08|\x1a\n\xbb\x88\xba\xe7\xf0?T\x9bR\x824u\xf2\
-n\x9c\\\xb0\x9d\x19}\x11.\x81+\xe4\xc1\xa3\xc9~\x83*\xaf\xe7\x02\x0f\x00\xba\
-\xa5\xb0\xb5\x1a\xba\xb5-\x94\t\xcd\xab\xae\x86\xc3b\xf7g\x04\xca#h\x86`L.#-\
-o\x9cW\x8d+\x81\x1e\xae4\xc8\xa7\x86\xc5(M\xfa3\x9c~\xb5\x96\xe9\xc1\x08 @J\
-\xa4\xae\x08\xd7\x14\x89\xd4\x17i[>\x89c-\xa2/\xf8\xb78\xd4\xcd\xbb\x87 \xc3\
-4\x15_\xe4\xe4O\xe2L\xa7\x03 \x04\x08\t@\xac\xd1f\xd9\xfdoQ4\xea\x99\xe0\xe6\
-y\xd5\r1L\x83\xfd#\x8e\xfd(Ela\x89\x965\x87(\x04\xaf\xa5\xcc\xe7\xbb\x00\xf5\
-\xc8\xe7\xdb\xdf\x17\x8a\x90\x12$\xb4U\x08\xbf\x88\xd4\x14\xc1\xb8\xc0\x08\
-\x08\x14\x82R>\xc8\xe8II~\xb4\x99\xe5wIL\xe3\xd7\xf4\x87\xef\xb9`\x19"|\x0f\
-\xe1\x96\x11\xbe\x87\x92\x1aJ7P\xf27/\x87\x84\xeb \xdd2\xc0\x05cCJ\',\xaeF\
-\xb9\x05\xa4\xc6y\x0f H-6\t\x85:0\x83MD\xe4G\xdf\xe3\xeb&J\xd3\x91N\x11\x84\
-\xc47\xac\xd9\x06\xbb\x8c\xa6@\x11\xf7\x8b\x84\xf3K\x91\x94\xc8\xa6c\\\x13\
-\xb5\xa8\x0b\x8d\x93\x91\x1f\x14\xe0\x9c\xe2S\xea\x03}30\xab\xe9\x95\xf1ukV\
-\xabl\xcf\x0e3\x03\x1f}\x06\xf0\xcd\xe0\x05\x9e/\x87^e\x0e\xccyp\x85\xdf\x0e\
-K9`\xac\xc3\xd0\xdf"\x96r\xb9\xfe\x8fnB\x0b\x05A\xf9\x94\xf36\x03\x87z\x189\
-\x9e\xe6\xdc\xfe\x14\xd7\xdc\x11\xc51\xceP\x10A\x84\xf203\xdd\x98\x99n\xbcB\
-\t\x81\x9a\xfd\xf2\t\x04\xb0SKq\xaa\x9a\xe1\xfdF\x12~\x19k\xa6\x07c\xf2,\xca\
-v\x005\xfb\x05a\x04(\xd6^\x8f\x16\xaeF\x06n\xc2\xb2v\xa2\xa5\\\xae\x7fl#F$\
-\x08\x80]VL\x1a\x11d@\x12\xf3{0\xa7\xce`\xcdt\xa3l\x17\xa5\x14\x98A\xbc`5f1\
-\x8dR\xe0\xc4[)\xa5:.\xab\x19\x16:\xd5\xde\x0c\xb9\xa9e\xe0v"4(\x15V\xb2\xc8\
-\x1ae\xc8\x80\x924\xe6\x16\x9f\xf2\t\xa4\x0f`\xe4\xd2HC\xe2\x86\x1b\xd0\nc\
-\xf8v\x19aZ8z-2;\x8e\x90\x02{\xe1\n\xbch-\x00F\xfa\x04\xc6\xd4\x00\x08E9\xde\
-L\xb9q\xe9\x9cs\xa6G89\x9f5P\xe1\x12\x18BG\x98U\xe82\x87\x1e\x14\x18\xb1\x14\
-\x19\xab\x80\x07X\xa10m\xb7\xad\xc5\xcbm\'7\xdcM!s\x15\tk\x04\xdd\x9c!\x92=\
-\x8d^\xce0tb\x92\xf1#Y<\xd7G\x0f\xea4nH\xd0\x10\x1b\xa2X\\@!\xb8\x10\xa9<"\
-\xb9S\xa8\xec4\xfdo\r\x93\x1b\xb4\x11\x1a\x98\x11\x83\xea\xeb\xa2\xd4\x86F\
-\xb0C\xeb\x11F\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc3(\x115D4\xd7\x05\
-\xa5i\x86\x0f\x8d\x93\xe9\xce\x03\xd0\xb8!I\xbc9\xc4\xe8\xd1i\xf4\xb0N\xcd\
-\xaa\x0c9\xdf!\x94\xeb\xbe\xa8f]x\x02\xb3j\x13\xc3\xfbN1\xb8g\x1f\xca\xf7PRp\
-j\xdb\xcfY\xfa\xd0}$\xb4~p\x8e\xcc)>]\x95\x88\x05\x8e\xd3\xfd\x8b4\xa1Z\x8b\
-\xe4\xb5\xc3Lte\x19?6\xc3\x92\xfb\x93\x84\xbc\x1f\xd3\xf7\xab0\xf1v\x87D\xd5\
-\x9b\xd8\x91\xadH/K\xc0}\x91\xf4\xe1 f\x95G\xbcC\xe0\xa8?A\tcN9\xd3\xc3\xec\
-\xb9\x82%Q\xe1\xc3h$\x11\xdc\x8e\xce$B\x08\x84\na\xf2+<&Q\x9a\xc4\xf3na\xc1\
-\xea\x0ez\xb6\xff;\xf6\xd8\x10\xb1T\x8cDy\x04Qh\xe0\xf4\x0f\xf7S\x18\x1b%\
-\x10\x8f!M\x13\'?\xc5\xf0\xee4\xc5t\x1b-_]\x8ea\x9e@w\x92hv\x0b]?\xf9!\xc5\
-\xb1Q\xcch\x04#\x1c\x06\xe1\x90\xefqi\\\xb9\t\xcd\x1f@\xd0\x82\xce\x04\x9e]\
-\xc4\x9e\x98\xc6\x08Z\x98BC\x0b\xc4(\xe9\xfb\xc0\xcb\x11p\xdb8\xf5\xf2K\xe4\
-\x87\x87\t$\xe2H\xcbb\xfc\xc09F\xf7\xda\xf8n\x99P}=\xc1\r\xb7\xa3\xdb\x19\
-\xe4\xa54W\xdd\x8eR\x10\xac\x8aPU+\xc9\x8f\xf4!\xa4$\x1c_\x84\x1e\x88a\xa84\
-\xfe\x9c\xe2;\x8e\x92\x1e\xa6\xb1\x1a\x7f\xba\x8b\xd1\xb3cL\xbd\x1b"X\x9dd\
-\xe1\xdaV\xaaj\x96\x82\x13\xc6\xf0\x8f\x92\x7fOc\xe1\x8a\x16\n\xde\x01d\xc9G\
-\xd7:(\x8f\x1e%^SG\xbc\xaa\x81<\xfb\x98\xeb\xe9\xb8\x1eb\xd7\x15-\x8a\n\x1f \
-X\x84\xe0nt1\x8e\x90 D\x90\x00\xef\xa0\xe8\x05@j6\xc1\xea\xfb\x08XC\xd8\xe3\
-\x07\xd1X\x89!:\xe8\xdb\xf3<\xe5\xb1\x83,\xbcy+u7n\x01U\xc6-\x16\x19\xd8\xf1\
-o\x14zwRH/\'\xd2\xbe\x00\xfc\x1a\x06v\xff\x0f\xee\xc4\xbb\xb4\xdc\xf6\x08\
-\x89\x8eu\xc8\x80\x8f\xa6\xc5\xf1\x9c"J\x9f\xc4\xd4;\x11\xee&t1\x86\x9b=\xc3\
-\xd9\xffz\niJ\x84&i\xdc\xf8$\xd1%KP^\x96\xcc\xa9.\x9c\xd1C,\xbc\xe5\x01\xean\
-\xdc\x82\xd0}|\x1b\x06\xdfx\x9e\xe9\xd3{1t\ra\xd6\xa3\xbbQ\x06v\xbfxIMe\xed \
-v\xf5\x1d\xc4\xda\x9e\xe4\xcc\x0bO!t\x8f\xf6{\x9f@X\x93H\xad\x8e\xbe=?\xbd||\
-m\xf5(k;\xc2\xdc\x84.\xa70\xe5\x10-\x9b\xff\x82X\xfb\n|\xd1\x8b\n\xbc\x03\
-\xb9%\xd4\xaf1\xe9{\xed\xbf)M\x7f\x95`\xb0\x88\xf2\x92L\xf5t\xa13Dj\xd9C\x10\
-\xea\'(^\x879\xb6\x88\x1e\x18\xfd\xfc\xefE\x7fa\xd05\xbc@\x04\xcd\x96H)\xc0\
-\x8f`Mj\xe0\xce\xe6@Yq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\x05\x1b\
-\xa9[\xf70Zy;\xd2\xdb\x8f4\x1f\xa0n\xf5\x83\x0ct\x9f\xa0\xd4\xd3Cl\xf1\xa3x\
-\x9e\xc0\xee>K(PG\xcd\xaa\x07\x90\xee\x8f\x91\x85= \x13hB\x07g\nJI<\x13\xb4\
-\x12\xe8E\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7w\x08\x05\xea\xa9[\xbb\x15\
-\xdd\xf9\x19\xa2t\x04\xdfz\x9c\x9a\xe5\xf7P<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\
-\xf2\x9a\xb9\x19\xd03x\xd670U\x04\xa9\x04\x9a^\x85f\xbf\x84g<>\xa7\xf8\xaaZ\
-\xb6\xa2\x15v\xe3Y14[#\x14^H\xacu\x13\xba\xf3]p\x8e@\xd6C\xe9%\xaa\x96l&`\
-\xbd\xced\xe7\x01\x9a\xb6\xfe9\x9e\x9f\'{\xf8\x05\x12M+1\x93\x8b\x91\xf9\x1d\
-\x90\x05\xe6x\x06\xa3\xb3s\xf1\x95+\x88\n\x17\x12\xab\x85\xf5#\x88\xe1 H\xc0\
-\x1e\x81}\xb50\xad\xc0\xb0P\xeb\xd6Q\xea{\x07u2\x84\xd5\xde\x8a\x9c\x9e\xc0\
-\x13)\xbc\xd3\x02=\xd6\x08\x85\x00\xf2\xc0 \x14\x82h\x8di\xac\x86[\xd0\x86\
-\x1ba,\x86*$P\xc5"\xee{`$\xea\xf1g\x0c\xf4C\x13P\xf8\xf0Vq5\xc4j`M\x1a1\x1c\
-\xc0r\xdai\xdd\xfaWh\xd1\x08\xf8>\xfe\xf8 \xf2\xc8\x19\x9c\xe6\x058\xc7K\x18\
-\xc9FD9\x81\xd87\r\xb9 \xb2e\x00\xa3\xfe\x06\xb4\xa1z\x84\x97\x04/\x81\xca\
-\xa9\xcbk\xfe\x9f\xee\xdaA\xe4p\x00!\x05\x94\xd2\xd0\x95\xc4_,\xe7\x14\x1f\
-\xf9\x04\x1ci\x82uq\x18\x8e\xcd.Q\xfd\x14tF \xd3\x0c\x80\x08\x94\x917F\x89\
-\xc4o$\xbb\xfb\x1d\xec\x1b\n\xd8\xe94\xe5\xa3.\xf5\xb7\xdc\r\xc3y\xd8\x17\
-\x00\x7f\xee5\xaf\x0f>\xf3\xf8|\xa4\xbe\xc2\x1c0Z\x05\x89\x8eq\n\'\x17!\xd1\
-\xf0\xf3\x93L\xef\xdd\x0cRa\xae\xf6\xd1\xb3.\x83\xdf\x1e\xa2p\xea&j\xeek\xa4\
-x\xd8\xc6\\\x91G\x956\x90=\x9d\xc1\xcbN\xe1\x84\x1e\xc5~\xd7%\xb4\xc4b\xa6\
-\xb3\x9f\xe9]\x1d\x04\x1b\x1a\xf0\xa7\xa6\x10!\xa0|3\x99]#8\x0f\x8fPR\x7f\
-\x80\xbd\xcbEo\xd21\xae\xd2\xb0\x0f\x95\xf1\xd2E\x12KGg=\x08\rD\x81\xcc?\x0b\
-\xdc~\x81;X\x83\xd6\xd0@\xf2\xefKx\x99\xb5\x14\xbar\x94\'\x86q\x02\x0fQ\xdck\
-\x13^\x12`fO\x0f\xd3\xbb:\x08]\x95\xc2/\xa4\x11\xd2\xbf\xacfi\x8f\x8d\xb1\
-\xc8\'q\xed8\xf9c\xed\x08$~~\x8c\xcc\xabk\xa8z\xb20\xa7\xf8\xdc\xf1,\x93\xdb\
-\xbeL\xfc\xba!\n]M\xb3\xdb\xbc\xf9a&~p\x07\xe5\xee\xf2\xf99\x0e\xf5\x05\x88\
-\xad~\x90\xc1gg8\xf1g\xdbQE\x17\xab\xe1\x0e\xac\x85\xeb\xc9|{\x88\xe2/\xff\
-\xf0c\xe5L\x7fy\xd5\xfay.\x83\n\x17\xa3\xba~\x86\xbb\xd9\xcd\xb9T5NQR;8\x08\
-\xf7Z\xe4\'!;\xec\xd0\xfd-\x9bL.\xc55\x7f\\\x8f\xb1\xb4\xcc\x1b\xdb\x9a\xb9.\
-\xd6O\xf4\xb1v\x0e\xff\xe3i\x86\x9f\xdeM\xdb\xed\x0b\x90+\x83\x94\x8e\xe79\
-\xf5z\x86bk;u\x1b\xe3t\xf5:$RY\xc2\x8f\xb4q\xe8\x9f|\xc6\xbe\xd7I\xdbm\xf5\
-\xa8;\xa2\xe8\x16\xe8\x86K\xf2k\x11\xf6\xefh\xe5V\xb9\x83s\xa9$H\x8dv\x06y=r\
-\x0f\x13\xc9$$Aj\x8a\xaf\xf4\xedG\xbf\xaf\x95\xc3\xdf\xef\xa3\xf0\x83\xfd4\
-\xae\xad\xc5_o2\xf0\xbef\xae\xa9\x8dd\x9dE\xab\xdbGv\xca\xb8\xac\xe6[\xd1\
-\x95\x08l\xee\x16\xaf\xd0SS\x8d\x92\x06\xad"\xcd/\x93\xabX\xd5\xdb;\xb7\xf8\
-\x06\\N-^\xc2]\xea\x00}\xc9\x18BJ\xaeV\xfd\xec\xbcf-\x13\xf1\xf0\xf99\x8e\
-\xcd\x08\xb64\xbbL\xde\xba\x96\x91\xe3C\x10\xd2Y\xfd\xe0F\xa6sU\xbc\xec\xc4\
-\xb1W}\xbc?\xaf\xeb\xa7\xfc\xc2|\xd7A\x85\x8b\xd0\xe8Oc\xdb\xbd\x8c;%&\xc6t\
-\xfa\xbf\x99\x06M\xc7v\x0c\x94\xd0@H\x16-s\xe9\xf8\xfd<\x07\x8f\xb4\xf1fO\
-\x88Q=\xccc\xf7\x8f\xb2p\xb3\xc1\xe1\x9f\xe78\xf9\xecY\x94\xd4\xf0\x85A8!Yv\
-\x97\xc4\xac\x19\xe1\xd5m\xcbh\xac\xf5yp\xcb\x18u_\xd28\xb57\xcf\xc9\xe7z\
-\xcf\x8f\xadn\x92\xdc\xf37\x06\xe3Z\x10\xbbt\x86\xf1r\x18+*q\xecQ\xce\x96s\
-\x8c\xf8\xef\x1f\xac\xf9\xe0v&xxK\x8e\xf0\n\xc9\xa1=\xe3\xec\x7f;\x83\x92\
-\x1a\xd1Z\x83\x05\xd7H\x86J\x92`$\x8f]<\xcb\xdb\x87W\xf0{\x1b/\xad9\xa47\xe1\
-8>\xa5B7\xc3v5\xc1\x98C\xd9\x1e\xe7t)\xcf\xf4\x91\xb9\xc5\xf7\xda\xb6eH9\x8d\
-S:\xcd\xa4S\xc0\xaa2(\xdbg8[\xbe\x9a\x11\xffC\x87\x95c\xd0tr\x86\xba\x8dM\
-\x1c?1H(a\xd2\xb0>B\xe7;\x93\x1c\xc9\x05?v\xce\xf4\x81\x81\xcaA\xe1\xa7E>\
-\x9b\xa7\x94\xef\xa6\xfd\x06A\xb93\x84\xed\x18\xf8B\'\x92\x90\xd46;\xb4,\xb5\
-i^ZbOg\x1b/\xbc\xdcD\xb1\x94&=\xa8\x90^\x90{7\x1f\xa2\xba\xd5\xe0\xcc\xc1 \
-\xc5\x9c\x86\x15\x15\\\xff\xe5,\xe1jx\xee?\xef\xe2hW\x16C\xd7P\xb6\xce\xfd\
-\x8fvq\xd5M\x1aGwG\x98\x1a\xb7\x88\xd5+V|)KOo\x8a\xfd\x87\x96\xf0\x95\xd5\
-\xdd,Z\x19\xa1\xaa\xd6\'=`q\xec\xc4\x0c\xb6S:\xef3\x9dVTG`\xf3\x13\xa79w4\
-\xc0\xf1\xb7Ch\xa6`\xcd\xe6,\xcdW\xe5\xd9\xb7#I4\xe9q\xf6L\x15\xdb^]Ov\xf22\
-\x9a\x07s\xc4\xaa\xb2\x14\x0b=\xb4,\x9f\xa4\xa1\xadH\xf7\xd9(\xef\x1e\xcb#`\
-\xce\xf1\xd5\xa62\xd8\x85C4\xaf\xd1\x89\xd5\xf9\x0c\xf4\x8fs\xec\xf8$\xb6\
-\x93\xbd`\x9e\xf7\xeew\xb9\x7f\x93C\xde)\xd1\xd4\x9e@\xc8q^\xdfYb`@~\xec\x9c\
-\x89\xf5\xeb_\xab\\\x98\xfa\x94\x10\x02\xb6l\xec\xe2\xd65=\xa4\x92E\x84\x9c\
-\x9d\xfal\xd6$3c1:\x19\xe1\x17\xbf^\xc2\xd9s\xd5\x94]y\xc1sK\xdb\xa7\xd9\xb0\
-l\x88\x96\xc6\x19\x94\xa7\xf0\xd1\xe8\xeaI\xb0\xffx\x1d=\xfd\x91\xf3c\xa5T,\
-\xbfz\x92\x8d\xab\x07I\xc5\x0b\x94\xcb\x12%u\xde}\xaf\x9a\x9d\x9d\x8d\xe4\
-\xf2\x06w\xde:\xc4\xfa\x8eI\xca\xbe\xc6+o6r\xf8d\xd5G\xbc\x06,\x8f\x9b\xd7\
-\x8er\xc3\xf2!\xa4\xef"5\x18\xc9D8s\xae\x8a\r\xcb\x86\x00\xc1+o.\xe6\xf0\xc9\
-\xea\xcbjfs\x06B\xc0\x9d\xb7\x8e\xb0\xaec\x02\xd7\x97\x17\xe8\xce5\xbe\xd9w\
-\xf4\xb2\xa1c\x88\xb2\xaf\xf1\xf2\x9bm\x1c>y\xe1}\rC\x87\xbf\xfbz\x8er\xff\
-\x10\xaf}\xb7\x97\xaf\xfdK\x07=cQ\xbe\xf9t\x84Or5P,X\xf0\xbdJ\x83|\xca\x08\
-\x01\xa1\xe0\x07\xd3\xee\xba`;\x95\xed\xf6\xf9`\xdd\xaa2\xdf\x7fz\x8ag\xfez\
-\x00\xd7\x13\xfc\xe5\xbf.\xe0\x89\xaf\xc7yk\xef\'\xbbJ\xa0\x0f\x0e\x0e\xce\
-\xb3\xc5\n\x15>;\xae\xdb:\xc1\xd4P\x86c\x07\xf3<\xf2T\x80\xae\x136\xafm_\xc0\
-L\xf6\xe3/\xaf`v7\xbeB\x85/\x0c\xe1\xa0M4\x9a\xe7\xbe?\x85\x8dw\xda<\xffb\
-\xe8\x137\x07\x80>\x8f\xde*T\xf8\xccy\xf6?\x1a\t\x9auT\xc7|\x9e~N\xf2\xd2O\
-\x7f\xbb\xdb\x91\x02\xbeQ\xf9\rR\xa1\xc2E\xa8,\xb1*T\xb8\x04\x95\x06\xa9P\
-\xe1\x12\xfc/\xf2\x8e\x96s\xb76k\x01\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory005Bitmap():
- return wxBitmapFromImage(getDocFactory005Image())
-
-def getDocFactory005Image():
- stream = cStringIO.StringIO(getDocFactory005Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory005')
-catalog['DocFactory005'] = ImageClass()
-catalog['DocFactory005'].getData = getDocFactory005Data
-catalog['DocFactory005'].getImage = getDocFactory005Image
-catalog['DocFactory005'].getBitmap = getDocFactory005Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory006Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rh\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19\xa0I\xcat\xda\xa1\xa44N\x02!LlH\x8c\r\x8e#o\x18\xaf2\xb6%Y\xcb\xd3.=\
-\xe9\xad\xf7\xbe{\xef\xe9\x1f\xa2\x06\x97`\xcb \x87\xba}\x9f?\xdf\x9cs\xbf\
-\xdf\xdf9\xbf\xdf\xdc\xf3\xce\xb9G\xfc\xcd\xb7\x94\xa2B\x85\n\xbf\x16=T\xfdE\
-[\xa8P\xe1\x7f/z\xb0R \x15*|*z8\xf1E[\xf8\xff\x81@a`#\xf1.\xf8\xdd\xc5\xc0\
-\xc5\xfc\xcdy\x106\xda\xff\xf0\xa0\x80\xb2\n\xe0\xa1]\x11]\x89\x8f)J\xf8H\
-\xca\xcaB!\xae\x88\xce\x95@\x0f\xc5\xbfh\x0b\xff\xf7\x11\xf84\x14v\x11u\xcf\
-\xe1\x7f,7\xa5\x04i\xea\xe4\xdd8\xb9`;3\xfa"\\\x02W\xc8\x83G\x93\xfd\x16U^\
-\xcf\x05\x1e\x00tKak5tk[(\x13\x9aW]\r\x87\xc5\xeeO\t\x94G\xd0\x0c\xc1\x98\\F\
-Z\xde<\xaf\x1aW\x12=\\)\x90+\x8e\xc5(M\xfas\x9c~\xbd\x96\xe9\xc1\x08 @J\xa4\
-\xae\x08\xd7\x14\x89\xd4\x17i[>\x89c-\xa2/\xf8\x978\xd4\xcd\xbb\x87 \xc34\
-\x15_\xe6\xe4\x8f\xe3L\xa7\x03 \x04\x08\t@\xac\xd1f\xd9\x83\xefP4\xea\x99\
-\xe0\xd6y\xd5\r1L\x83\xfdC\x8e\xfd0Ela\x89\x965\x87(\x04\xaf\xa7\xcc\xd5\x91\
-xz\xe4\xea\xf0yU\x13R\x82\x84\xb6\n\xe1\x17\x91\x9a"\x18\x17\x18\x01\x81BP\
-\xca\x07\x19=)\xc9\x8f6\xb3\xfc\x1e\x89i\xfc\x8a\xfe\xf0}\x17,C\x84\xef!\xdc\
-2\xc2\xf7PRC\xe9\x06J\xfe\xfa\xe5\x90p\x1d\xa4[\x06\xb8\xa0mH\xe9\x84\xc5\
-\xb5(\xb7\x80\xd48\xef\x01\x04\xa9\xc5&\xa1P\x07f\xb0\x89\x88\xfc\xe4s|\xddD\
-i:\xd2)\x82\x90\xf8\x865[`\x97\xd0\x14(\xe2~\x91p~)\x92\x12\xd9t\x8c\xeb\xa2\
-\x16u\xa1q2\xf2\xa3\xc4\x9bS|J}\xa4o\x06f5\xbd2\xben\xcdj\x95\xed\xd9ff\xe0\
-\x93}\x00\xdf\x0c^\xe0y\xae\xe8U\xe6\xc0ew\xaapyX\xca\x01c\x1d\x86\xfe\x0e\
-\xb1\x94\xcb\x8d\xbfw\x0bZ(\x08\xca\xa7\x9c\xb7\x198\xd4\xc3\xc8\xf14\xe7\
-\xf6\xa7\xb8\xee\xae(\x8eq\x86\x82\x08"\x94\x87\x99\xe9\xc6\xcct\xe3\x15J\
-\x08\xd4\xec\xcb\'\x10\xc0N-\xc5\xa9j\x86\x0f\x0bI\xf8e\xac\x99\x1e\x8c\xc9\
-\xb3(\xdb\x01\xd4\xec\x0b\xc2\x08P\xac\xbd\x11-\\\x8d\x0c\xdc\x82e\xedDK\xb9\
-\xdc\xf8\xc4F\x8cH\x10\x00\xbb\xac\x984"\xc8\x80$\xe6\xf7`N\x9d\xc1\x9a\xe9F\
-\xd9.J)0\x83x\xc1j\xccb\x1a\xa5\xc0\x89\xb7RJu\\R3,t\xaa\xbd\x19rS\xcb\xc0\
-\xedDhP*\xacd\x915\xca\x90\x01%i\xcc->\xe5\x13H\x1f\xc0\xc8\xa5\x91\x86\xc4\
-\r7\xa0\x15\xc6\xf0\xed2\xc2\xb4p\xf4Zdv\x1c!\x05\xf6\xc2\x15x\xd1Z\x00\x8c\
-\xf4\t\x8c\xa9\x01\x10\x8ar\xbc\x99r\xe3\xd2\xcb\x9e;=\xc2\xc9\xf9\xc8\x81\n\
-\x17\xc1\x10:\xc2\xacB\x979\xf4\xa0\xc0\x88\xa5\xc8X\x05<\xc0\n\x85i\xbbc-^n\
-;\xb9\xe1n\n\x99kHX#\xe8\xe6\x0c\x91\xeci\xf4r\x86\xa1\x13\x93\x8c\x1f\xc9\
-\xe2\xb9>zP\xa7qC\x82\x86\xd8\x10\xc5\xe2\x02\n\xc1\x85H\xe5\x11\xc9\x9dBe\
-\xa7\xe9\x7fg\x98\xdc\xa0\x8d\xd0\xc0\x8c\x18T\xdf\x10\xa564\x82\x1dZ\x8f0R\
-\xe82\x8f\x1e\x04#\x9a\xa2\x10(\xe1\xe2\xe1\x06]\x1cF\x89\xa8!\xa2\xb9.(M3|h\
-\x9cLw\x1e\x80\xc6\rI\xe2\xcd!F\x8fN\xa3\x87ujVe\xc8\xf9\x0e\xa1\\\xf7\xa7j\
-\xd6\x85\'0\xab61\xbc\xef\x14\x83{\xf6\xa1|\x0f%\x05\xa7\xb6\xfd\x8c\xa5\x8f\
-<@B\xeb\x07\xe7\xc8\x9c\xe2\xd3U\x89X\xe08\xdd?O\x13\xaa\xb5H^?\xccDW\x96\
-\xf1c3,y0I\xc8\xfb\x11}\xbf\x0c\x13owHT\xbd\x8d\x1d\xd9\x8a\xf4\xb2\x04\xdc\
-\x97I\x1f\x0ebVy\xc4;\x04\x8e\xfa\x03\x940.k\xee\xf40{\xae@JT\xf88\x1aI\x04w\
-\xa23\x89\x10\x02\xa1B\x98\xfc\x12\x8fI\x94&\xf1\xbc\xdbX\xb0\xba\x83\x9e\
-\xed\xff\x82=6D,\x15#Q\x1eA\x14\x1a8\xfd\x83\xfd\x14\xc6F\t\xc4cH\xd3\xc4\
-\xc9O1\xbc;M1\xddF\xcbW\x97c\x98\'\xd0\x9d$\x9a\xddB\xd7\x8f\x7f@ql\x143\x1a\
-\xc1\x08\x87A8\xe4{\\\x1aWnB\xf3\x07\x10\xb4\xa03\x81g\x17\xb1\'\xa61\x82\
-\x16\xa6\xd0\xd0\x021J\xfa>\xf0r\x04\xdc6N\xbd\xfa\n\xf9\xe1a\x02\x898\xd2\
-\xb2\x18?p\x8e\xd1\xbd6\xbe[&T_Op\xc3\x9d\xe8v\x06y1\xcdUw\xa2\x14\x04\xab"T\
-\xd5J\xf2#}\x08)\t\xc7\x17\xa1\x07b\x18*\x8d?\xa7\xf8\x8e\xa3\xa4\x87i\xac\
-\xc6\x9f\xeeb\xf4\xec\x18S\xef\x87\x08V\'Y\xb8\xb6\x95\xaa\x9a\xa5\xe0\x841\
-\xfc\xa3\xe4?\xd0X\xb8\xa2\x85\x82w\x00Y\xf2\xd1\xb5\x0e\xca\xa3G\x89\xd7\
-\xd4\x11\xafj \xcf>.\xf7T\\\x0f\xb1\xeb\x8a$E\x85\x8f\x10,Bp/\xba\x18GH\x10"\
-H\x80\xf7P\xf4\x02 5\x9b`\xf5\x03\x04\xac!\xec\xf1\x83h\xac\xc4\x10\x1d\xf4\
-\xedy\x91\xf2\xd8A\x16\xde\xba\x95\xba\x9b\xb7\x80*\xe3\x16\x8b\x0c\xec\xf8g\
-\n\xbd;)\xa4\x97\x13i_\x00~\r\x03\xbb\xff\x13w\xe2}Z\xeex\x8cD\xc7:d\xc0G\
-\xd3\xe2xN\x11\xa5Ob\xea\x9d\x08w\x13\xba\x18\xc3\xcd\x9e\xe1\xec\xbf?\x834%\
-B\x934n|\x9a\xe8\x92%(/K\xe6T\x17\xce\xe8!\x16\xde\xf6\x10u7oA\xe8>\xbe\r\
-\x83o\xbd\xc8\xf4\xe9\xbd\x18\xba\x860\xeb\xd1\xdd(\x03\xbb_\xbe\xa8\xa6\xb2\
-v\x10\xbb\xf6.bmOs\xe6\xa5g\x10\xbaG\xfb\xfdO!\xacI\xa4VG\xdf\x9e\x9f\\:\xbe\
-\xb6z\x94\xb5\x1danB\x97S\x98r\x88\x96\xcd\x7fB\xac}\x05\xbe\xe8E\x05\xde\
-\x83\xdc\x12\xea\xd7\x98\xf4\xbd\xf1\x1f\x94\xa6\xbfJ0XDyI\xa6z\xba\xd0\x19"\
-\xb5\xec\x11\x08\xf5\x13\x14o\xc2e\x96\x88\x1e\x18\xbdz\xf6\xa4\xafZt\r/\x10\
-A\xb3%R\n\xf0#X\x93\x1a\xb8\xb3c\xaf\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\xd8\
-\xbd}\x84\x82\x8d\xd4\xad{\x14\xad\xbc\x1d\xe9\xedG\x9a\x0fQ\xb7\xfaa\x06\
-\xbaOP\xea\xe9!\xb6\xf8q<O`w\x9f%\x14\xa8\xa3f\xd5CH\xf7G\xc8\xc2\x1e\x90\t4\
-\xa1\x833\x05\xa5$\x9e\tZ\t\xf4"X\xa1\x04\xba\x15E\x1a\x1aV0\x85\xe6\xba(\
-\xd9J\xa6\xf3\x9f\x08\x05\xea\xa9[\xbb\x15\xdd\xf9)\xa2t\x04\xdfz\x92\x9a\
-\xe5\xf7Q<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\xd2\x9a\xb9\x19\xd03x\xd670U\x04\
-\xa9\x04\x9a^\x85f\xbf\x82g<9\xa7\xf8\xaaZ\xb6\xa2\x15v\xe3Y14[#\x14^H\xacu\
-\x13\xba\xf3\x1dp\x8e@\xd6C\xe9%\xaa\x96l&`\xbd\xc9d\xe7\x01\x9a\xb6\xfe1\
-\x9e\x9f\'{\xf8%\x12M+1\x93\x8b\x91\xf9\x1d\x90\x05.\xf3\x0cFg\xe7\xe2\xf9O\
-\x88\n\x17\x12\xab\x85\xf5#\x88\xe1 H\xc0\x1e\x81}\xb50\xad\xc0\xb0P\xeb\xd6\
-Q\xea{\x0fu2\x84\xd5\xde\x8a\x9c\x9e\xc0\x13)\xbc\xd3\x02=\xd6\x08\x85\x00\
-\xf2\xc0 \x14\x82h\x8di\xac\x86\xdb\xd0\x86\x1ba,\x86*$P\xc5"\xee\x07`$\xea\
-\xf1g\x0c\xf4C\x13P\xf8\xf8Vq5\xc4j`M\x1a1\x1c\xc0r\xdai\xdd\xfagh\xd1\x08\
-\xf8>\xfe\xf8 \xf2\xc8\x19\x9c\xe6\x058\xc7K\x18\xc9FD9\x81\xd87\r\xb9 \xb2e\
-\x00\xa3\xfe&\xb4\xa1z\x84\x97\x04/\x81\xca\xa9Kk\xfe\xb7\xee\xdaA\xe4p\x00!\
-\x05\x94\xd2\xd0\x95\xc4_,\xe7\x14\x1f\xf9\x04\x1ci\x82uq\x18\x8e\xcd.Q\xfd\
-\x14tF \xd3\x0c\x80\x08\x94\x917G\x89\xc4o&\xbb\xfb=\xec\x9b\n\xd8\xe94\xe5\
-\xa3.\xf5\xb7\xdd\x0b\xc3y\xd8\x17\x00\xff\xf2s]\x1f|\xee\xc9\xcf3\xf5\x15\
-\xe6\x80\xd1*Ht\x8cS8\xb9\x08\x89\x86\x9f\x9fdz\xeff\x90\ns\xb5\x8f\x9eu\x19\
-\xfc\xf6\x10\x85S\xb7P\xf3@#\xc5\xc36\xe6\x8a<\xaa\xb4\x81\xec\xe9\x0c^v\n\'\
-\xf48\xf6\xfb.\xa1%\x163\x9d\xfdL\xef\xea \xd8\xd0\x80?5\x85\x08\x01\xe5[\
-\xc9\xec\x1a\xc1yt\x84\x92\xfa\x1d\xec].z\x93\x8eq\x8d\x86}\xa8\x8c\x97.\x92\
-X::\xebAh \nd\xfe^\xe0\xf6\x0b\xdc\xc1\x1a\xb4\x86\x06\x92\x7f]\xc2\xcb\xac\
-\xa5\xd0\x95\xa3<1\x8c\x13x\x84\xe2^\x9b\xf0\x92\x003{z\x98\xde\xd5A\xe8\x9a\
-\x14~!\x8d\x90\xfe%5K{l\x8cE>\x89\xeb\xc7\xc9\x1fkG \xf1\xf3cd^_C\xd5\xd3\
-\x859\xc5\xe7\x8eg\x99\xdc\xf6e\xe27\x0cQ\xe8j\x9a\xdd\xe6\xcd\x0f3\xf1\xfd\
-\xbb(w\x97\xcf\x8fq\xa8/@l\xf5\xc3\x0c>?\xc3\x89?\xda\x8e*\xbaX\rwa-\\O\xe6\
-\xdbC\x14\x7f\xf1\xbb\x9fi\xee\xf4WW\xad\x9f\xa74\xa8\xf0iT\xd7\xcfp/\xbb9\
-\x97\xaa\xc6)Jj\x07\x07\xe1~\x8b\xfc$d\x87\x1d\xba\xbfe\x93\xc9\xa5\xb8\xee\
-\xf7\xeb1\x96\x96yk[37\xc4\xfa\x89>\xd1\xce\xe1\xbf=\xcd\xf0\xb3\xbbi\xbbs\
-\x01re\x90\xd2\xf1<\xa7\xde\xccPlm\xa7nc\x9c\xae^\x87D*K\xf8\xb16\x0e\xfd\
-\x9d\xcf\xd8w;i\xbb\xa3\x1euW\x14\xdd\x02\xddpI~-\xc2\xfe\x1d\xad\xdc.wp.\
-\x95\x04\xa9\xd1\xce oF\xeec"\x99\x84$HM\xf1\x95\xbe\xfd\xe8\x0f\xb4r\xf8{}\
-\x14\xbe\xbf\x9f\xc6\xb5\xb5\xf8\xebM\x06>\xd4\xcc5\xb5\x91\xac\xb3hu\xfb\
-\xc8N\x19\x97\xd4|\'\xba\x12\x81\xcd\xbd\xe25zj\xaaQ\xd2\xa0U\xa4\xf9Er\x15\
-\xabz{\xe7\x16\xdf\x80\xcb\xa9\xc5K\xb8G\x1d\xa0/\x19CH\xc9\xb5\xaa\x9f\x9d\
-\xd7\xade"\x1e>?\xc6\xb1\x19\xc1\x96f\x97\xc9\xdb\xd72r|\x08B:\xab\x1f\xde\
-\xc8t\xae\x8aW\x9d8\xf6\xaa\xcf\xf6\xd1\xba~\xca/\xccW\x1eT\xf8\x14\x1a\xfdi\
-l\xbb\x97q\xa7\xc4\xc4\x98N\xff7\xd3\xa0\xe9\xd8\x8e\x81\x12\x1a\x08\xc9\xa2\
-e.\x1d\xbf\x9d\xe7\xe0\x916\xde\xee\t1\xaa\x87y\xe2\xc1Q\x16n68\xfc\xb3\x1c\
-\'\x9f?\x8b\x92\x1a\xbe0\x08\'$\xcb\xee\x91\x985#\xbc\xbem\x19\x8d\xb5>\x0fo\
-\x19\xa3\xeeK\x1a\xa7\xf6\xe69\xf9B\xef\xf9\xb6\xd5M\x92\xfb\xfe\xc2`\\\x0bb\
-\x97\xce0^\x0ecE%\x8e=\xca\xd9r\x8e\x11\xff\xc3\x835\x1f\xdc\xce\x04\x8fn\
-\xc9\x11^!9\xb4g\x9c\xfd\xeffPR#Zk\xb0\xe0:\xc9PI\x12\x8c\xe4\xb1\x8bgy\xf7\
-\xf0\n~k\xe3\xc55\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\xae&\x18s(\xdb\xe3\x9c.\xe5\
-\x99>2\xb7\xf8\xde\xd8\xb6\x0c)\xa7qJ\xa7\x99t\nXU\x06e\xfb\x0cg\xcb\xd72\
-\xe2\x7f\xec\xb0r\x0c\x9aN\xceP\xb7\xb1\x89\xe3\'\x06\t%L\x1a\xd6G\xe8|o\x92\
-#\xb9\xe0g\x9e;}`\xa0rPx\xa5\xc9g\xf3\x94\xf2\xdd\xb4\xdf$(w\x86\xb0\x1d\x03\
-_\xe8D\x12\x92\xdaf\x87\x96\xa56\xcdKK\xec\xe9l\xe3\xa5W\x9b(\x96\xd2\xa4\
-\x07\x15\xd2\x0br\xff\xe6CT\xb7\x1a\x9c9\x18\xa4\x98\xd3\xb0\xa2\x82\x1b\xbf\
-\x9c%\\\r/\xfc\xdb=\x1c\xed\xcab\xe8\x1a\xca\xd6y\xf0\xf1.\xae\xb9E\xe3\xe8\
-\xee\x08S\xe3\x16\xb1z\xc5\x8a/e\xe9\xe9M\xb1\xff\xd0\x12\xbe\xb2\xba\x9bE+#\
-T\xd5\xfa\xa4\x07,\x8e\x9d\x98\xc1vJ\xe7}\xa6\xd3\x8a\xea\x08l~\xea4\xe7\x8e\
-\x068\xfen\x08\xcd\x14\xac\xd9\x9c\xa5\xf9\x9a<\xfbv$\x89&=\xce\x9e\xa9b\xdb\
-\xeb\xeb\xc9N^B\xf3`\x8eXU\x96b\xa1\x87\x96\xe5\x934\xb4\x15\xe9>\x1b\xe5\
-\xfdcy\x04\xcc9\xbe\xdaT\x06\xbbp\x88\xe65:\xb1:\x9f\x81\xfeq\x8e\x1d\x9f\
-\xc4v\xb2\x17\x8c\xf3\xde\xfd.\x0fnr\xc8;%\x9a\xda\x13\x089\xce\x9b;K\x0c\
-\x0c\xc8\xcf<wb\xfd\xfa7*\x17\xa6\xae0B\xc0\x96\x8d]\xdc\xbe\xa6\x87T\xb2\
-\x88\x90\xb3C\x9e\xcd\x9adf,F\'#\xfc\xfcWK8{\xae\x9a\xb2+/\xe8\xb7\xb4}\x9a\
-\r\xcb\x86hi\x9cAy\n\x1f\x8d\xae\x9e\x04\xfb\x8f\xd7\xd1\xd3\x1f9\xdfVJ\xc5\
-\xf2k\'\xd9\xb8z\x90T\xbc@\xb9,QR\xe7\xfd\x0f\xaa\xd9\xd9\xd9H.op\xf7\xedC\
-\xac\xef\x98\xa4\xeck\xbc\xf6v#\x87OV}\xc2k\xc0\xf2\xb8u\xed(7-\x1fB\xfa.R\
-\x83\x91L\x843\xe7\xaa\xd8\xb0l\x08\x10\xbc\xf6\xf6b\x0e\x9f\xac\xbe\xa4f6g \
-\x04\xdc}\xfb\x08\xeb:&p}y\x81\xee\\\xe3\x9b}F/\x1b:\x86(\xfb\x1a\xaf\xbe\
-\xdd\xc6\xe1\x93\x17\xde\xd30t\xf8\xab\xaf\xe7(\xf7\x0f\xf1\xc6wz\xf9\xda?t\
-\xd03\x16\xe5\x9b\xcfF\xf8<W\x02\xc5\x82\x05\xdf\xad\x14\xc8o\x08! \x14\xfch\
-\xb8]\x17l\xa7\xb2\xcd>\x1f\xac[U\xe6{\xcfN\xf1\xdc\x9f\x0f\xe0z\x82?\xfd\
-\xc7\x05<\xf5\xf58\xef\xec\xfd|W\t\xf4\xc1\xc1\xc1y\xb2X\xa1\xc2\x17\xc7\r[\
-\'\x98\x1a\xcap\xec`\x9e\xc7\x9e\t\xd0u\xc2\xe6\x8d\xed\x0b\x98\xc9~\xf6\xe5\
-\x15\xcc\xee\xcaW\xa8p\xd5\x13\x0e\xdaD\xa3y\x1e\xf8C\xd8x\xb7\xcd\x8b/\x87>\
-wq\x00\xe8\xf3\xe0\xadB\x85/\x9c\xe7\xff\xb5\x91\xa0YGu\xcc\xe7\xd9\x17$\xaf\
-\xfcd~nG\n\xf8F\xe5?H\x85\n\x9fBe\x89U\xa1\xc2E\xa8\x14H\x85\n\x17\xe1\xbf\
-\x00\xd7"\x96s\xaa\x0e\x1d/\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory006Bitmap():
- return wxBitmapFromImage(getDocFactory006Image())
-
-def getDocFactory006Image():
- stream = cStringIO.StringIO(getDocFactory006Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory006')
-catalog['DocFactory006'] = ImageClass()
-catalog['DocFactory006'].getData = getDocFactory006Data
-catalog['DocFactory006'].getImage = getDocFactory006Image
-catalog['DocFactory006'].getBitmap = getDocFactory006Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory007Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rf\
-IDATx\x9c\xed\x9bil\x9c\xc7y\xc7\x7f3\xef\xb5\'\xf7\xe0\xf2\x94HJ$e[6%Y\xb7|\
-*\x91\x9d\xb8\x92\x8f\xfaR}\xb4vQ\xb4\x08\x8a\xdah\xe1\xb6\x1f\xf21(\x82\x02\
-E\x0f\xa3A`\xe7\xaaQ\xb4p\x9d\xbaQ\x12;\x8e\x11\xc9Nd\xc9V\x14\xea\xb2\xac\
-\x8b\x94%\x91\x14\x8f\xe5M.\xb9\xe7\xfb\xee\xfb\xbe\xd3\x0fte\xab\x8e%U\xa2\
-\xe2*\xd8\xdf\xc7\xc5\xcc\xfc\xff\xcf\xcc\xf3`ggv\xc4\xdf}C)*T\xa8\xf0k\xd1C\
-\xd5\x9f\xb7\x85\n\x15\xfe\xff\xa2\x07+\x05R\xa1\xc2g\xa2\x87\x13\x9f\xb7\
-\x85\xdfn\x04\n\x03\x1b\x89w\xde\xe7.\x06.\xe6o\xce\x83\xb0\xd1\xfe\x97\x07\
-\x05\x94U\x00\x0f\xed\xaa\xe8J|LQ\xc2GRV\x16\nqUt\xae&z(\xfey[\xf8\xedE\xe0\
-\xd3P\xd8E\xd4=\x8b\xff\x89\xdc\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xed\xcc\xea\
-\x8bp\t\\%\x0f\x1eM\xf6\xdbTy\xbd\xe7y\x00\xd0-\x85\xad\xd5\xd0\xa3m\xa1Lh^u\
-5\x1c\x16\xbb?%P\x1eE3\x04\xe3r\x19iy\xeb\xbcj\xfc&\xd0\xc3\x95\x02\xb9jX\
-\x8c\xd1\xa4\xbf\xc0\xa97j\x99\x19\x8a\x00\x02\xa4D\xea\x8apM\x91H}\x91\xb6\
-\xe5S8\xd6"\xfa\x83\x7f\x8dC\xdd\xbc{\x082BS\xf1\x15\xba~\x1cg&\x1d\x00!@H\
-\x00b\x8d6\xcb\x1e~\x97\xa2Q\xcf$\xb7\xcf\xabn\x88\x11\x1a\xec\x1fr\xec\x87)\
-b\x0bK\xb4\xac9D!x#e\xae\xad\x84\xd3#\xd7\x96\xdfk\x8a\x90\x12$\xb4U\x08\xbf\
-\x88\xd4\x14\xc1\xb8\xc0\x08\x08\x14\x82R>\xc8X\x97$?\xd6\xcc\xf2\xfb$\xa6\
-\xf1+\x06\xc2\x0f\x9c\xb7\r\x11\xbe\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\xeb\
-\xb7C\xc2u\x90n\x19\xe0\xbc\xb6!\xa5\x13\x16\xd7\xa3\xdc\x02R\xe3\x9c\x07\
-\x10\xa4\x16\x9b\x84B\x1d\x98\xc1&"\xf2\xd3\xe3\xf8\xba\x89\xd2t\xa4S\x04!\
-\xf1\rk\xae\xc0.\xa2)P\xc4\xfd"\xe1\xfcR$%\xb2\xe9\x187D-\xeaB\x13d\xe4\xc7\
-\twI\xf1)\xf5\xb1\xbe\x19\x98\xd3\xf4\xca\xf8\xba5\xa7U\xb6\xe7\x9a\x99\x81O\
-\xf7\x01|3x\x9e\xe7\xff+z\x959x\xd9\x9d+\\\x18K9`\xac\xc3\xd0\xdf%\x96r\xb9\
-\xf9\x0fnC\x0b\x05A\xf9\x94\xf36\x83\x87z\x19=\x9e\xe6\xec\xfe\x147\xdc\x13\
-\xc51NS\x10A\x84\xf203=\x98\x99\x1e\xbcB\t\x81\x9a\xfb\xf2\t\x04\xb0SKq\xaa\
-\x9a\xe1\xa3B\x12~\x19k\xb6\x17c\xea\x0c\xcav\x005\xf7\x05a\x04(\xd6\xde\x8c\
-\x16\xaeF\x06n\xc3\xb2v\xa2\xa5\\n~j#F$\x08\x80]VL\x19\x11d@\x12\xf3{1\xa7Oc\
-\xcd\xf6\xa0l\x17\xa5\x14\x98A\xbc`5f1\x8dR\xe0\xc4[)\xa5:.\xaa\x19\x16:\xd5\
-\xde,\xb9\xe9e\xe0v"4(\x15V\xb2\xc8\x1ac\xd8\x80\x924.->\xe5\x13H\x1f\xc0\
-\xc8\xa5\x91\x86\xc4\r7\xa0\x15\xc6\xf1\xed2\xc2\xb4p\xf4Zdv\x02!\x05\xf6\
-\xc2\x15x\xd1Z\x00\x8c\xf4\t\x8c\xe9A\x10\x8ar\xbc\x99r\xe3\xd2\xcb^C=B\xd7\
-\x95\xe4@\x85\x0b`\x08\x1daV\xa1\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\xc2\xb4\
-\xdd\xb5\x16/\xb7\x9d\xdcH\x0f\x85\xccu$\xacQts\x96H\xf6\x14z9\xc3\xf0\x89)&\
-\x8ed\xf1\\\x1f=\xa8\xd3\xb8!ACl\x98bq\x01\x85\xe0B\xa4\xf2\x88\xe4N\xa2\xb2\
-3\x0c\xbc;Bn\xc8Fh`F\x0c\xaao\x8aR\x1b\x1a\xc5\x0e\xadG\x18)t\x99G\x0f\x82\
-\x11MQ\x08\x94p\xf1p\x83.\x0ecD\xd40\xd1\\7\x94f\x1894A\xa6\'\x0f@\xe3\x86$\
-\xf1\xe6\x10cGg\xd0\xc3:5\xab2\xe4|\x87P\xae\xe735\xeb\xc2\x93\x98U\x9b\x18\
-\xd9w\x92\xa1=\xfbP\xbe\x87\x92\x82\x93\xdb~\xc6\xd2\xc7\x1e"\xa1\r\x80s\xe4\
-\x92\xe2\xd3U\x89X\xe08=?O\x13\xaa\xb5H\xde8\xc2dw\x96\x89c\xb3,y8I\xc8\xfb\
-\x11\xfd\xbf\x0c\x13owHT\xbd\x83\x1d\xd9\x8a\xf4\xb2\x04\xdcWH\x1f\x0ebVy\
-\xc4;\x04\x8e\xfa#\x940.k\r\xf50{\xe61%*|\x12\x8d$\x82\xbb\xd1\x99B\x08\x81P\
-!L~\x89\xc7\x14J\x93x\xde\x1d,X\xddA\xef\xf6\x7f\xc5\x1e\x1f&\x96\x8a\x91(\
-\x8f"\n\r\x9c\xfa\xc1~\n\xe3c\x04\xe21\xa4i\xe2\xe4\xa7\x19\xd9\x9d\xa6\x98n\
-\xa3\xe5\xcb\xcb1\xcc\x13\xe8N\x12\xcdn\xa1\xfb\xc7?\xa08>\x86\x19\x8d`\x84\
-\xc3 \x1c\xf2\xbd.\x8d+7\xa1\xf9\x83\x08Z\xd0\x99\xc4\xb3\x8b\xd8\x933\x18A\
-\x0bShh\x81\x18%}\x1fx9\x02n\x1b\'_{\x95\xfc\xc8\x08\x81D\x1ciYL\x1c8\xcb\
-\xd8^\x1b\xdf-\x13\xaa\xaf\'\xb8\xe1nt;\x83\xbc\x90\xe6\xaa\xbbQ\n\x82U\x11\
-\xaaj%\xf9\xd1~\x84\x94\x84\xe3\x8b\xd0\x031\x0c\x95\xc6\xbf\xa4\xf8\x8e\xa3\
-\xa4\x87i\xac\xc6\x9f\xe9f\xec\xcc8\xd3\x1f\x84\x08V\'Y\xb8\xb6\x95\xaa\x9a\
-\xa5\xe0\x841\xfc\xa3\xe4?\xd4X\xb8\xa2\x85\x82w\x00Y\xf2\xd1\xb5\x0e\xcacG\
-\x89\xd7\xd4\x11\xafj \xcf>.\xf76\\\x0f\xb1k^\x93\xa2\xc2\xc7\x08\x16!\xb8\
-\x1f]L $\x08\x11$\xc0\xfb(\xfa\x00\x90\x9aM\xb0\xfa!\x02\xd60\xf6\xc4A4Vb\
-\x88\x0e\xfa\xf7\xbcDy\xfc \x0bo\xdfJ\xdd\xad[@\x95q\x8bE\x06w\xfc\x0b\x85\
-\xbe\x9d\x14\xd2\xcb\x89\xb4/\x00\xbf\x86\xc1\xdd\xff\x85;\xf9\x01-w=A\xa2c\
-\x1d2\xe0\xa3iq<\xa7\x88\xd2\xa70\xf5N\x84\xbb\t]\x8c\xe3fOs\xe6?\x9eC\x9a\
-\x12\xa1I\x1a7>Kt\xc9\x12\x94\x97%s\xb2\x1bg\xec\x10\x0b\xefx\x84\xba[\xb7 t\
-\x1f\xdf\x86\xa1\xb7_b\xe6\xd4^\x0c]C\x98\xf5\xe8n\x94\xc1\xdd\xaf\\PSY;\x88\
-]\x7f\x0f\xb1\xb6g9\xfd\xf2s\x08\xdd\xa3\xfd\xc1g\x10\xd6\x14R\xab\xa3\x7f\
-\xcfO.\x1e_[=\xca\xda\x8e07\xa1\xcbiL9L\xcb\xe6?#\xd6\xbe\x02_\xf4\xa1\x02\
-\xefCn\t\xf5kL\xfa\xdf\xfcOJ3_&\x18,\xa2\xbc$\xd3\xbd\xdd\xe8\x0c\x93Z\xf6\
-\x18\x84\x06\x08\x8a\xb7\xe02KD\x0f\x8c]{g\xd3\xd7\x0c\xba\x86\x17\x88\xa0\
-\xd9\x12)\x05\xf8\x11\xac)\r\xdc\xb99WV\x1c\xd7\x0fc\x96\x04\xa6\x17F\xa8\
-\x18\x94}\xec\xbe~B\xc1F\xea\xd6=\x8eV\xde\x8e\xf4\xf6#\xcdG\xa8[\xfd(\x83=\
-\'(\xf5\xf6\x12[\xfc$\x9e\'\xb0{\xce\x10\n\xd4Q\xb3\xea\x11\xa4\xfb#da\x0f\
-\xc8\x04\x9a\xd0\xc1\x99\x86R\x12\xcf\x04\xad\x04z\x11\xacP\x02\xdd\x8a"\r\r\
-+\x98Bs]\x94l%\xd3\xf9mB\x81z\xea\xd6nEw~\x8a(\x1d\xc1\xb7\x9e\xa6f\xf9\x03\
-\x14O\xecGwt\x84J\x80\x17\xb8\xb8fn\x16\xf4\x0c\x9e\xf55L\x15A*\x81\xa6W\xa1\
-\xd9\xaf\xe2\x19O_R|U-[\xd1\n\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\
-\xf9\x0e8G \xeb\xa1\xf4\x12UK6\x13\xb0\xdeb\xaa\xf3\x00M[\xff\x14\xcf\xcf\
-\x93=\xfc2\x89\xa6\x95\x98\xc9\xc5\xc8\xfc\x0e\xc8\x02\x97y\x07\xa3\xb3s\xf1\
-\xfc%D\x85\xf3\x89\xd5\xc2\xfaQ\xc4H\x10$`\x8f\xc2\xbeZ\x98Q`X\xa8u\xeb(\xf5\
-\xbf\x8f\xea\na\xb5\xb7"g&\xf1D\n\xef\x94@\x8f5B!\x80<0\x04\x85 Zc\x1a\xab\
-\xe1\x0e\xb4\x91F\x18\x8f\xa1\n\tT\xb1\x88\xfb!\x18\x89z\xfcY\x03\xfd\xd0$\
-\x14>yT\\\r\xb1\x1aX\x93F\x8c\x04\xb0\x9cvZ\xb7\xfe\x05Z4\x02\xbe\x8f?1\x84<\
-r\x1a\xa7y\x01\xce\xf1\x12F\xb2\x11QN \xf6\xcd@.\x88l\x19\xc4\xa8\xbf\x05m\
-\xb8\x1e\xe1%\xc1K\xa0r\xea\xe2\x9a\xff\xa3\xbbv\x089\x12@H\x01\xa54t\'\xf1\
-\x17\xcbK\x8a\x8f|\x02\x8e4\xc1\xba8\x8c\xc4\xe6\xb6\xa8~\n:#\x90i\x06@\x04\
-\xca\xc8[\xa3D\xe2\xb7\x92\xdd\xfd>\xf6-\x05\xect\x9a\xf2Q\x97\xfa;\xee\x87\
-\x91<\xec\x0b\x80\x7f\xf99\xae\x0f\xbd\xf0\xf4ew\xaepa\x8cVA\xa2c\x82B\xd7"$\
-\x1a~~\x8a\x99\xbd\x9bA*\xcc\xd5>z\xd6e\xe8\x9b\xc3\x14N\xdeF\xcdC\x8d\x14\
-\x0f\xdb\x98+\xf2\xa8\xd2\x06\xb2\xa72x\xd9i\x9c\xd0\x93\xd8\x1f\xb8\x84\x96\
-X\xccv\x0e0\xb3\xab\x83`C\x03\xfe\xf44"\x04\x94o\'\xb3k\x14\xe7\xf1QJ\xea\
-\xf7\xb0w\xb9\xe8M:\xc6u\x1a\xf6\xa12^\xbaHb\xe9\xd8\x9c\x07\xa1\x81(\x90\
-\xf9G\x81; p\x87j\xd0\x1a\x1aH\xfem\t/\xb3\x96Bw\x8e\xf2\xe4\x08N\xe01\x8a{m\
-\xc2K\x02\xcc\xee\xe9efW\x07\xa1\xebR\xf8\x854B\xfa\x17\xd5,\xed\xb11\x16\
-\xf9$n\x9c \x7f\xac\x1d\x81\xc4\xcf\x8f\x93yc\rU\xcf\x16.)>w"\xcb\xd4\xb6/\
-\x12\xbfi\x98Bw\xd3\xdc1o~\x84\xc9\xef\xdfC\xb9\xa7|n\x8eC\xfd\x01b\xab\x1fe\
-\xe8\xc5YN\xfc\xc9vT\xd1\xc5j\xb8\x07k\xe1z2\xdf\x1c\xa6\xf8\x8b\xdf\xbf\xa2\
-5\xd4_[\xb5\xfe\n\xd3\xa0\xc2gQ]?\xcb\xfd\xec\xe6l\xaa\x1a\xa7(\xa9\x1d\x1a\
-\x82\x07-\xf2S\x90\x1dq\xe8\xf9\x86M&\x97\xe2\x86?\xac\xc7XZ\xe6\xedm\xcd\
-\xdc\x14\x1b \xfaT;\x87\xff\xfe\x14#\xcf\xef\xa6\xed\xee\x05\xc8\x95AJ\xc7\
-\xf3\x9c|+C\xb1\xb5\x9d\xba\x8dq\xba\xfb\x1c\x12\xa9,\xe1\'\xda8\xf4\x0f>\
-\xe3\xdf\xed\xa4\xed\xaez\xd4=Qt\x0bt\xc3%\xf9\x95\x08\xfbw\xb4r\xa7\xdc\xc1\
-\xd9T\x12\xa4F;C\xbc\x15y\x80\xc9d\x12\x92 5\xc5\x97\xfa\xf7\xa3?\xd4\xca\
-\xe1\xef\xf5S\xf8\xfe~\x1a\xd7\xd6\xe2\xaf7\x19\xfcH3\xd7\xd4F\xb2\xce\xa2\
-\xd5\xed\';m\\T\xf3\xdd\xe8J\x046\xf7\x8b\xd7\xe9\xad\xa9FI\x83V\x91\xe6\x17\
-\xc9U\xac\xea\xeb\xbb\xb4\xf8\x06]N.^\xc2}\xea\x00\xfd\xc9\x18BJ\xaeW\x03\
-\xec\xbca-\x93\xf1\xf0\xb99\x8e\xcd\n\xb64\xbbL\xdd\xb9\x96\xd1\xe3\xc3\x10\
-\xd2Y\xfd\xe8FfrU\xbc\xe6\xc4\xb1W]\xd9\x9f\xd5\xf5\x93~\xe1J\xf3\xa0\xc2g\
-\xd0\xe8\xcf`\xdb}L8%&\xc7u\x06\xbe\x9e\x06M\xc7v\x0c\x94\xd0@H\x16-s\xe9\
-\xf8\xdd<\x07\x8f\xb4\xf1No\x881=\xccS\x0f\x8f\xb1p\xb3\xc1\xe1\x9f\xe5\xe8z\
-\xf1\x0cJj\xf8\xc2 \x9c\x90,\xbbOb\xd6\x8c\xf2\xc6\xb6e4\xd6\xfa<\xbae\x9c\
-\xba/h\x9c\xdc\x9b\xa7\xeb[}\xe7\xdaV7I\x1e\xf8+\x83\t-\x88]:\xcdD9\x8c\x15\
-\x958\xf6\x18g\xca9F\xfd\x8f.\xd6|p;\x13<\xbe%Gx\x85\xe4\xd0\x9e\t\xf6\xbf\
-\x97AI\x8dh\xad\xc1\x82\x1b$\xc3%I0\x92\xc7.\x9e\xe1\xbd\xc3+\xf8\x9d\x8d\
-\x17\xd6\x1c\xd6\x9bp\x1c\x9fR\xa1\x87\x11\xbb\x9a`\xcc\xa1lOp\xaa\x94g\xe6\
-\xc8\xa5\xc5\xf7\xe6\xb6eH9\x83S:\xc5\x94S\xc0\xaa2(\xdb\xa79S\xbe\x9eQ\xff\
-\x13\x97\x95\xe3\xd0\xd45K\xdd\xc6&\x8e\x9f\x18"\x940iX\x1f\xa1\xf3\xfd)\x8e\
-\xe4\x82W\xbc\x86\xfa\xe0`\xe5\xa2\xf0j\x91\xcf\xe6)\xe5{h\xbfEP\xee\x0ca;\
-\x06\xbe\xd0\x89$$\xb5\xcd\x0e-Km\x9a\x97\x96\xd8\xd3\xd9\xc6\xcb\xaf5Q,\xa5\
-I\x0f)\xa4\x17\xe4\xc1\xcd\x87\xa8n58}0H1\xa7aE\x057\x7f1K\xb8\x1a\xbe\xf5\
-\xef\xf7q\xb4;\x8b\xa1k([\xe7\xe1\'\xbb\xb9\xee6\x8d\xa3\xbb#LOX\xc4\xea\x15\
-+\xbe\x90\xa5\xb7/\xc5\xfeCK\xf8\xd2\xea\x1e\x16\xad\x8cPU\xeb\x93\x1e\xb48v\
-b\x16\xdb)\x9d\xf3\x99N+\xaa#\xb0\xf9\x99S\x9c=\x1a\xe0\xf8{!4S\xb0fs\x96\
-\xe6\xeb\xf2\xec\xdb\x91$\x9a\xf48s\xba\x8amo\xac\';u\x11\xcd\x839bUY\x8a\
-\x85^Z\x96O\xd1\xd0V\xa4\xe7L\x94\x0f\x8e\xe5\x11p\xc9\xf1\xd5\xa62\xd8\x85C\
-4\xaf\xd1\x89\xd5\xf9\x0c\x0eLp\xec\xf8\x14\xb6\x93=o\x9e\xf7\xeewyx\x93C\
-\xde)\xd1\xd4\x9e@\xc8\t\xde\xdaYbpP^\xf1\x1a\x8a\xf5\xeb\xdf\xac<\x98\xbaJ\
-\x08\x01[6vs\xe7\x9a^R\xc9"B\xceMu6k\x92\x99\xb5\x18\x9b\x8a\xf0\xf3_-\xe1\
-\xcc\xd9j\xca\xae<\xaf\xdf\xd2\xf6\x196,\x1b\xa6\xa5q\x16\xe5)|4\xba{\x13\
-\xec?^G\xef@\xe4\\[)\x15\xcb\xaf\x9fb\xe3\xea!R\xf1\x02\xe5\xb2DI\x9d\x0f>\
-\xacfgg#\xb9\xbc\xc1\xbdw\x0e\xb3\xbec\x8a\xb2\xaf\xf1\xfa;\x8d\x1c\xee\xaa\
-\xfa\x94\xd7\x80\xe5q\xfb\xda1nY>\x8c\xf4]\xa4\x06\xa3\x99\x08\xa7\xcfV\xb1a\
-\xd90 x\xfd\x9d\xc5\x1c\xee\xaa\xbe\xa8f6g \x04\xdc{\xe7(\xeb:&q}y\x9e\xee\
-\xa5\xc677F\x1f\x1b:\x86)\xfb\x1a\xaf\xbd\xd3\xc6\xe1\xae\xf3\xdfg\x18:\xfc\
-\xcdWs\x94\x07\x86y\xf3;}|\xe5\x9f:\xe8\x1d\x8f\xf2\xf5\xe7#\xcc\xc7S@\xb1`\
-\xc1w+\x05r\x95\x11\x02B\xc1\x8f\xa7\xd9u\xc1v*\xc7\xeb\xf3\xc1\xbaUe\xbe\
-\xf7\xfc4/\xfc\xe5 \xae\'\xf8\xf3\x7f^\xc03_\x8d\xf3\xee\xde\xf9yJ\xa0\x0f\r\
-\r\xcd\xcb@\x15*|\x1e\xdc\xb4u\x92\xe9\xe1\x0c\xc7\x0e\xe6y\xe2\xb9\x00\xdd\
-\'l\xde\xdc\xbe\x80\xd9\xec\x95o\xaf`\xeet\xbeB\x85k\x96p\xd0&\x1a\xcd\xf3\
-\xd0\x1f\xc3\xc6{m^z%4o\xc5\x01\xa0\xcf\xdbH\x15*|\x0e\xbc\xf8o\x8d\x04\xcd:\
-\xaac>\xcf\x7fK\xf2\xeaO\xe6\xf7u\xa4\x80\xafU~\x83T\xa8\xf0\x19T\xb6X\x15*\
-\\\x80J\x81T\xa8p\x01\xfe\x1b\xbb\xb6\x96s\xa2\x04\x9a\xd7\x00\x00\x00\x00IE\
-ND\xaeB`\x82'
-
-def getDocFactory007Bitmap():
- return wxBitmapFromImage(getDocFactory007Image())
-
-def getDocFactory007Image():
- stream = cStringIO.StringIO(getDocFactory007Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory007')
-catalog['DocFactory007'] = ImageClass()
-catalog['DocFactory007'].getData = getDocFactory007Data
-catalog['DocFactory007'].getImage = getDocFactory007Image
-catalog['DocFactory007'].getBitmap = getDocFactory007Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory008Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rc\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0v\x93\xd4(Z\xb8N\x9c(\x89\x1d\xc7\x88d\'\xb2d+\n\xb5Y\xd6F\xca\x92\
-H\x8a\xcb\xe5N^\xf2\xae\xe7\xdcs\xce\xf4\x07]\xc9\xaccK\xa8\xe8-\xb8\xcf\xcf\
-\x8b9\xdf\xfb~3\xf3\xe1\xcc\x9d9#\xfe\xe1[JQ\xa1B\x85\xdf\x8a\x1e\xaa\xfe\
-\xac-T\xa8\xf0\xf9E\x0fV\n\xa4B\x85\x8fD\x0f\'>k\x0b\xbf\x9b\x08\x14\x066\
-\x12o\xde\xef.\x06.\xe6\xa7\xe7A\xd8h\xff\xc7\x83\x02\xca*\x80\x87\xf6\x89\
-\xe8J|LQ\xc2GRV\x16\n\xf1\x89\xe8|\x1a\xe8\xa1\xf8gm\xe1w\x0f\x81OCa\x0fQ\
-\xf7<\xfe\x07\xe6\xa6\x94 M\x9d\xbc\x1b\'\x17lgV_\x82K\xe0\x13\xf2\xe0\xd1d\
-\xbfA\x95\xd7;\xcf\x03\x80n)l\xad\x86\x1em\x1beB\x0b\xaa\xab\xe1\xb0\xd4\xfd\
-9\x81\xf2(\x9a!\x18\x97+H\xcb\x1b\x17T\xe3\xd3D\x0fW\nd\xc1\xb1\x18\xa3I\x7f\
-\x863\xaf\xd623\x14\x01\x04H\x89\xd4\x15\xe1\x9a"\x91\xfa"m+\xa7p\xac%\xf4\
-\x07\xff\x16\x87\xba\x05\xf7\x10d\x84\xa6\xe2\x8bt\xfd4\xceL:\x00B\x80\x90\
-\x00\xc4\x1amV\xdc\xff\x16E\xa3\x9eIn^P\xdd\x10#4\xd8?\xe6\xc4\x8fS\xc4\x16\
-\x97hYw\x84B\xf0Z\xca|1\'\x9a\x1e\xf9b\xfa\xfe\\\x13R\x82\x84\xb6\x06\xe1\
-\x17\x91\x9a"\x18\x17\x18\x01\x81BP\xca\x07\x19\xeb\x92\xe4\xc7\x9aYy\x97\
-\xc44~\xc3@\xf8\x9ey\xcb\x10\xe1{\x08\xb7\x8c\xf0=\x94\xd4P\xba\x81\x92\xbf}\
-9$\\\x07\xe9\x96\x01\xe6\xb5\r)\x9d\xb0\xb8\x1a\xe5\x16\x90\x1a\x17<\x80 \
-\xb5\xd4$\x14\xea\xc0\x0c6\x11\x91\x1f\x8e\xe3\xeb&J\xd3\x91N\x11\x84\xc47\
-\xac\xb9\x02\xbb\x84\xa6@\x11\xf7\x8b\x84\xf3\xcb\x91\x94\xc8\xa6c\\\x13\xb5\
-\xa8\x0bM\x90\x91\x17\'\xdae\xe5\xa7\xd4E}30\xa7\xe9\x95\xf1ukN\xabl\xcf53\
-\x03\x1f~\x06\xf0\xcd\xe0<\xcf\xff_\xf4*s\xf0\x8a\x83T\x98\x8f\xa5\x1c06`\
-\xe8o\x11K\xb9\\\xffG7\xa1\x85\x82\xa0|\xcay\x9b\xc1#\xbd\x8c\x9eLs\xfe`\x8a\
-k\xee\x88\xe2\x18g)\x88 By\x98\x99\x1e\xccL\x0f^\xa1\x84@\xcd\xbd|\x02\x01\
-\xec\xd4r\x9c\xaafx\xbf\x90\x84_\xc6\x9a\xed\xc5\x98:\x87\xb2\x1d@\xcd\xbd \
-\x8c\x00\xc5\xda\xeb\xd1\xc2\xd5\xc8\xc0MX\xd6n\xb4\x94\xcb\xf5\x8fm\xc6\x88\
-\x04\x01\xb0\xcb\x8a)#\x82\x0cHb~/\xe6\xf4Y\xac\xd9\x1e\x94\xed\xa2\x94\x023\
-\x88\x17\xac\xc6,\xa6Q\n\x9cx+\xa5T\xc7%5\xc3B\xa7\xda\x9b%7\xbd\x02\xdcN\
-\x84\x06\xa5\xc2j\x96Xc\x0c\x1bP\x92\xc6\xe5\xe5\xa7|\x02\xe9C\x18\xb94\xd2\
-\x90\xb8\xe1\x06\xb4\xc28\xbe]F\x98\x16\x8e^\x8b\xccN \xa4\xc0^\xbc\n/Z\x0b\
-\x80\x91>\x851=\x08BQ\x8e7Sn\\~\xc5c\xa9G\xe8\xba\xe2 \x15\xe6c\x08\x1daV\
-\xa1\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\xc2\xb4\xdd\xb6\x1e/\xb7\x93\xdcH\x0f\
-\x85\xccU$\xacQts\x96H\xf6\x0cz9\xc3\xf0\xa9)&\x8ee\xf1\\\x1f=\xa8\xd3\xb8)A\
-Cl\x98bq\x11\x85\xe0b\xa4\xf2\x88\xe4N\xa3\xb23\x0c\xbc5Bn\xc8Fh`F\x0c\xaa\
-\xaf\x8bR\x1b\x1a\xc5\x0emD\x18)t\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0ec\
-D\xd40\xd1\\7\x94f\x1892A\xa6\'\x0f@\xe3\xa6$\xf1\xe6\x10c\xc7g\xd0\xc3:5k2\
-\xe4|\x87P\xae\xe7#5\xeb\xc2\x93\x98U[\x189p\x9a\xa1}\x07P\xbe\x87\x92\x82\
-\xd3;~\xc1\xf2\x87\xee#\xa1\r\x80s\xec\xb2\xf2\xd3U\x89X\xe0$=\xbfL\x13\xaa\
-\xb5H^;\xc2dw\x96\x89\x13\xb3,\xbb?I\xc8\xfb\t\xfd\xbf\x0e\x13owHT\xbd\x89\
-\x1d\xd9\x8e\xf4\xb2\x04\xdc\x17I\x1f\rbVy\xc4;\x04\x8e\xfa\x13\x940\xaeh,\
-\xf50\xfb\x16`JT\xf8 \x1aI\x04\xb7\xa33\x85\x10\x02\xa1B\x98\xfc\x1a\x8f)\
-\x94&\xf1\xbc[X\xb4\xb6\x83\xde\x9d\xff\x81=>L,\x15#Q\x1eE\x14\x1a8\xf3\xa3\
-\x83\x14\xc6\xc7\x08\xc4cH\xd3\xc4\xc9O3\xb27M1\xddF\xcbWWb\x98\xa7\xd0\x9d$\
-\x9a\xddB\xf7O\x7fDq|\x0c3\x1a\xc1\x08\x87A8\xe4{]\x1aWoA\xf3\x07\x11\xb4\
-\xa03\x89g\x17\xb1\'g0\x82\x16\xa6\xd0\xd0\x021J\xfa\x01\xf0r\x04\xdc6N\xbf\
-\xfc\x12\xf9\x91\x11\x02\x898\xd2\xb2\x988t\x9e\xb1\xfd6\xbe[&T_Op\xd3\xed\
-\xe8v\x06\xf9q\x9aknG)\x08VE\xa8\xaa\x95\xe4G\xfb\x11R\x12\x8e/A\x0f\xc40T\
-\x1a\xff\xb2\xf2;\x89\x92\x1e\xa6\xb1\x16\x7f\xa6\x9b\xb1s\xe3L\xbf\x1b"X\
-\x9dd\xf1\xfaV\xaaj\x96\x83\x13\xc6\xf0\x8f\x93\x7fOc\xf1\xaa\x16\n\xde!d\
-\xc9G\xd7:(\x8f\x1d\'^SG\xbc\xaa\x81<\x07\xb8\xd2Sp=\xc4\x9e\x05\x99\x14\x15\
-."X\x82\xe0nt1\x81\x90 D\x90\x00\xef\xa0\xe8\x03@j6\xc1\xea\xfb\x08X\xc3\xd8\
-\x13\x87\xd1X\x8d!:\xe8\xdf\xf7<\xe5\xf1\xc3,\xbey;u7n\x03U\xc6-\x16\x19\xdc\
-\xf5\xef\x14\xfavSH\xaf$\xd2\xbe\x08\xfc\x1a\x06\xf7\xfe\x10w\xf2]Zn{\x84D\
-\xc7\x06d\xc0G\xd3\xe2xN\x11\xa5Oa\xea\x9d\x08w\x0b\xba\x18\xc7\xcd\x9e\xe5\
-\xdc\x7f?\x854%B\x934n~\x92\xe8\xb2e(/K\xe6t7\xce\xd8\x11\x16\xdf\xf2\x00u7n\
-C\xe8>\xbe\rCo<\xcf\xcc\x99\xfd\x18\xba\x860\xeb\xd1\xdd(\x83{_\xfcXMe\xed"v\
-\xf5\x1d\xc4\xda\x9e\xe4\xec\x0bO!t\x8f\xf6{\x9f@XSH\xad\x8e\xfe}?\xbbt~m\
-\xf5(k\'\xc2\xdc\x82.\xa71\xe50-[\xff\x82X\xfb*|\xd1\x87\n\xbc\x03\xb9e\xd4\
-\xaf3\xe9\x7f\xed\x07\x94f\xbeJ0XDyI\xa6{\xbb\xd1\x19&\xb5\xe2!\x08\r\x10\
-\x14\xaf\xc3\x15\x96\x88\x1e\x18\xfb\xe2\xeeQ\x7fn\xd15\xbc@\x04\xcd\x96H)\
-\xc0\x8f`Mi\xe0\xce\xf5\xb5\xb2\xe2\xb8~\x18\xb3$0\xbd0B\xc5\xa0\xecc\xf7\
-\xf5\x13\n6R\xb7\xe1a\xb4\xf2N\xa4w\x10i>@\xdd\xda\x07\x19\xec9E\xa9\xb7\x97\
-\xd8\xd2G\xf1<\x81\xdds\x8eP\xa0\x8e\x9a5\x0f \xdd\x9f \x0b\xfb@&\xd0\x84\
-\x0e\xce4\x94\x92x&h%\xd0\x8b`\x85\x12\xe8V\x14ihX\xc1\x14\x9a\xeb\xa2d+\x99\
-\xce\x7f#\x14\xa8\xa7n\xfdvt\xe7\xe7\x88\xd21|\xebqjV\xdeC\xf1\xd4AtGG\xa8\
-\x04x\x81Kk\xe6fA\xcf\xe0Y\xdf\xc0T\x11\xa4\x12hz\x15\x9a\xfd\x12\x9e\xf1\
-\xf8e\xe5W\xd5\xb2\x1d\xad\xb0\x17\xcf\x8a\xa1\xd9\x1a\xa1\xf0bb\xad[\xd0\
-\x9d\xef\x80s\x0c\xb2\x1eJ/Q\xb5l+\x01\xebu\xa6:\x0f\xd1\xb4\xfd\xcf\xf1\xfc\
-<\xd9\xa3/\x90hZ\x8d\x99\\\x8a\xcc\xef\x82,p\x85g0:\xbb\x97^\xf9\x84\xa80\
-\x9fX-l\x1cE\x8c\x04A\x02\xf6(\x1c\xa8\x85\x19\x05\x86\x85\xda\xb0\x81R\xff;\
-\xa8\xae\x10V{+rf\x12O\xa4\xf0\xce\x08\xf4X#\x14\x02\xc8CCP\x08\xa25\xa6\xb1\
-\x1anA\x1bi\x84\xf1\x18\xaa\x90@\x15\x8b\xb8\xef\x81\x91\xa8\xc7\x9f5\xd0\
-\x8fLB\xe1\x83[\xc5\xd5\x10\xab\x81ui\xc4H\x00\xcbi\xa7u\xfb_\xa1E#\xe0\xfb\
-\xf8\x13C\xc8cgq\x9a\x17\xe1\x9c,a$\x1b\x11\xe5\x04\xe2\xc0\x0c\xe4\x82\xc8\
-\x96A\x8c\xfa\x1b\xd0\x86\xeb\x11^\x12\xbc\x04*\xa7.\xad\xf9\xbf\xba\xeb\x87\
-\x90#\x01\x84\x14PJCw\x12\x7f\xa9\xbc\xac\xfc\xc8\'\xe0X\x13l\x88\xc3Hln\x89\
-\xea\xa7\xa03\x02\x99f\x00D\xa0\x8c\xbc1J$~#\xd9\xbd\xef`\xdfP\xc0N\xa7)\x1f\
-w\xa9\xbf\xe5n\x18\xc9\xc3\x81\x00\xf8W>\xb7\xf5\xa1g\x1e\xbf\xe2 \x15\xe6c\
-\xb4\n\x12\x1d\x13\x14\xba\x96 \xd1\xf0\xf3S\xcc\xec\xdf\nRa\xae\xf5\xd1\xb3\
-.C\xdf\x1e\xa6p\xfa&j\xeek\xa4x\xd4\xc6\\\x95G\x956\x91=\x93\xc1\xcbN\xe3\
-\x84\x1e\xc5~\xd7%\xb4\xccb\xb6s\x80\x99=\x1d\x04\x1b\x1a\xf0\xa7\xa7\x11!\
-\xa0|3\x99=\xa38\x0f\x8fRR\x7f\x80\xbd\xc7Eo\xd21\xae\xd2\xb0\x8f\x94\xf1\
-\xd2E\x12\xcb\xc7\xe6<\x08\rD\x81\xcc?\x0b\xdc\x01\x81;T\x83\xd6\xd0@\xf2\
-\xefKx\x99\xf5\x14\xbas\x94\'Gp\x02\x0fQ\xdco\x13^\x16`v_/3{:\x08]\x95\xc2/\
-\xa4\x11\xd2\xbf\xa4fi\x9f\x8d\xb1\xc4\'q\xed\x04\xf9\x13\xed\x08$~~\x9c\xcc\
-\xab\xeb\xa8z\xb2pY\xf9\xb9\x13Y\xa6v|\x99\xf8u\xc3\x14\xba\x9b\xe6\xb6y\xf3\
-#L~\xff\x0e\xca=\xe5\x0b}\x1c\xea\x0f\x10[\xfb C\xcf\xcer\xea\xcfv\xa2\x8a.V\
-\xc3\x1dX\x8b7\x92\xf9\xf60\xc5_\xfd\xe1\x82\x8c\xa5\xfe\xf2\x9a\x8d\x0b\x12\
-\xa8\xc2E\xaa\xebg\xb9\x9b\xbd\x9cOU\xe3\x14%\xb5CCp\xafE~\n\xb2#\x0e=\xdf\
-\xb2\xc9\xe4R\\\xf3\xc7\xf5\x18\xcb\xcb\xbc\xb1\xa3\x99\xebb\x03D\x1fk\xe7\
-\xe8?\x9ea\xe4\xe9\xbd\xb4\xdd\xbe\x08\xb9:H\xe9d\x9e\xd3\xafg(\xb6\xb6S\xb7\
-9Nw\x9fC"\x95%\xfcH\x1bG\xfe\xc9g\xfc\xbb\x9d\xb4\xddV\x8f\xba#\x8an\x81n\
-\xb8$\xbf\x16\xe1\xe0\xaeVn\x95\xbb8\x9fJ\x82\xd4hg\x88\xd7#\xf70\x99LB\x12\
-\xa4\xa6\xf8J\xffA\xf4\xfbZ9\xfa\xbd~\n\xdf?H\xe3\xfaZ\xfc\x8d&\x83\xefk\xe6\
-\x9a\xdaH\xd6Y\xb4\xba\xfdd\xa7\x8dKj\xbe\x15]\x8d\xc0\xe6n\xf1\n\xbd5\xd5(i\
-\xd0*\xd2\xfc*\xb9\x865}}\x97\x97\xdf\xa0\xcb\xe9\xa5\xcb\xb8K\x1d\xa2?\x19C\
-H\xc9\xd5j\x80\xdd\xd7\xacg2\x1e\xbe\xd0\xc7\xb1Y\xc1\xb6f\x97\xa9[\xd73zr\
-\x18B:k\x1f\xdc\xccL\xae\x8a\x97\x9d8\xf6\x9a\x85\xf9H]?\xed\x17\x16$P\x85\
-\x8b4\xfa3\xd8v\x1f\x13N\x89\xc9q\x9d\x81o\xa6A\xd3\xb1\x1d\x03%4\x10\x92%+\
-\\:~?\xcf\xe1cm\xbc\xd9\x1bbL\x0f\xf3\xd8\xfdc,\xdejp\xf4\x179\xba\x9e=\x87\
-\x92\x1a\xbe0\x08\'$+\xee\x92\x985\xa3\xbc\xbac\x05\x8d\xb5>\x0fn\x1b\xa7\
-\xeeK\x1a\xa7\xf7\xe7\xe9z\xae\xefB\xdb\xea&\xc9=\x7fc0\xa1\x05\xb1Kg\x99(\
-\x87\xb1\xa2\x12\xc7\x1e\xe3\\9\xc7\xa8\xff\xfe\xc1\x9a\x0fng\x82\x87\xb7\
-\xe5\x08\xaf\x92\x1c\xd97\xc1\xc1\xb73(\xa9\x11\xad5Xt\x8dd\xb8$\tF\xf2\xd8\
-\xc5s\xbc}t\x15\xbf\xb7\xf9\xe35\x87\xf5&\x1c\xc7\xa7T\xe8a\xc4\xae&\x18s(\
-\xdb\x13\x9c)\xe5\x999vy\xf9\xbd\xb6c\x05R\xce\xe0\x94\xce0\xe5\x14\xb0\xaa\
-\x0c\xca\xf6Y\xce\x95\xaff\xd4\xff\xc0a\xe584u\xcdR\xb7\xb9\x89\x93\xa7\x86\
-\x08%L\x1a6F\xe8|g\x8ac\xb9\xe0\x82\x8d\xa5>8X9(\\h\xf2\xd9<\xa5|\x0f\xed7\
-\x08\xca\x9d!l\xc7\xc0\x17:\x91\x84\xa4\xb6\xd9\xa1e\xb9M\xf3\xf2\x12\xfb:\
-\xdbx\xe1\xe5&\x8a\xa54\xe9!\x85\xf4\x82\xdc\xbb\xf5\x08\xd5\xad\x06g\x0f\
-\x07)\xe64\xac\xa8\xe0\xfa/g\tW\xc3s\xffu\x17\xc7\xbb\xb3\x18\xba\x86\xb2u\
-\xee\x7f\xb4\x9b\xabn\xd28\xbe7\xc2\xf4\x84E\xac^\xb1\xeaKYz\xfbR\x1c<\xb2\
-\x8c\xaf\xac\xeda\xc9\xea\x08U\xb5>\xe9A\x8b\x13\xa7f\xb1\x9d\xd2\x05\x9f\
-\xe9\xb4\xa2:\x02[\x9f8\xc3\xf9\xe3\x01N\xbe\x1dB3\x05\xeb\xb6fi\xbe*\xcf\
-\x81]I\xa2I\x8fsg\xab\xd8\xf1\xeaF\xb2S\x97\xd0<\x9c#V\x95\xa5X\xe8\xa5e\xe5\
-\x14\rmEz\xceEy\xf7D\x1e\x01\x97\x9d_m*\x83]8B\xf3:\x9dX\x9d\xcf\xe0\xc0\x04\
-\'NNa;\xd9y\xfd\xbc\xff\xa0\xcb\xfd[\x1c\xf2N\x89\xa6\xf6\x04BN\xf0\xfa\xee\
-\x12\x83\x83r\xc1\xc6Rl\xdc\xf8Z\xe5\xc2\xd4\x02#\x04l\xdb\xdc\xcd\xad\xebzI\
-%\x8b\x089\xd7\xc5\xd9\xacIf\xd6bl*\xc2/\x7f\xb3\x8cs\xe7\xab)\xbbr\xdes\xcb\
-\xdbg\xd8\xb4b\x98\x96\xc6Y\x94\xa7\xf0\xd1\xe8\xeeMp\xf0d\x1d\xbd\x03\x91\
-\x0bm\xa5T\xac\xbcz\x8a\xcdk\x87H\xc5\x0b\x94\xcb\x12%u\xde}\xaf\x9a\xdd\x9d\
-\x8d\xe4\xf2\x06w\xde:\xcc\xc6\x8e)\xca\xbe\xc6+o6r\xb4\xab\xeaC^\x03\x96\
-\xc7\xcd\xeb\xc7\xb8a\xe50\xd2w\x91\x1a\x8cf"\x9c=_\xc5\xa6\x15\xc3\x80\xe0\
-\x957\x97r\xb4\xab\xfa\x92\x9a\xd9\x9c\x81\x10p\xe7\xad\xa3l\xe8\x98\xc4\xf5\
-\xe5<\xdd\xcb\xcdo.F\x1f\x9b:\x86)\xfb\x1a/\xbf\xd9\xc6\xd1\xae\xf9\xf72\x0c\
-\x1d\xfe\xee\xeb9\xca\x03\xc3\xbc\xf6\x9d>\xbe\xf6/\x1d\xf4\x8eG\xf9\xe6\xd3\
-\x11\x16\xf2\n\xa0X\xb4\xe8\xbb\x95\x02\xf9\x84\x10\x02B\xc1\x8b\xdd\xeb\xba\
-`;\x95m\xf5\x85`\xc3\x9a2\xdf{z\x9ag\xfez\x10\xd7\x13\xfc\xe5\xbf.\xe2\x89\
-\xaf\xc7yk\xff\xc2^%\xd0\x87\x86\x86\x164`\x85\n\x9f\x06\xd7m\x9fdz8\xc3\x89\
-\xc3y\x1ey*@\xf7)\x9b\xd7v.b6\xbbp\xcb+\x98\xdb\xa5\xafP\xe1\x0bG8h\x13\x8d\
-\xe6\xb9\xefOa\xf3\x9d6\xcf\xbf\x18Z\xf0\xe2\x00\xd0\x17<b\x85\n\x9f\x02\xcf\
-\xfeg#A\xb3\x8e\xea\x98\xcf\xd3\xcfI^\xfa\xd9\'s;R\xc07*\xffA*T\xf8\x08*K\
-\xac\n\x15>\x86J\x81T\xa8\xf01\xfc\x0f\xa0J\x96s@\xaf\xd7\x90\x00\x00\x00\
-\x00IEND\xaeB`\x82'
-
-def getDocFactory008Bitmap():
- return wxBitmapFromImage(getDocFactory008Image())
-
-def getDocFactory008Image():
- stream = cStringIO.StringIO(getDocFactory008Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory008')
-catalog['DocFactory008'] = ImageClass()
-catalog['DocFactory008'].getData = getDocFactory008Data
-catalog['DocFactory008'].getImage = getDocFactory008Image
-catalog['DocFactory008'].getBitmap = getDocFactory008Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory009Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r]\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfbG\xfe\
-\x8c\xaa\xa8R\xd5\x055\x8a [Q\xd5\x8a\x92\xd28\t\x84\xa0\xd8\x90\x18\x1b\x1c\
-g<\xb61^\xc7\xd8\x9e\x19\xcf\xf2f\x9fy3o\xbd\xf7\xdd{O\xff\x18bp\t\xd8R\x9f\
-\x03\x84\xf7\xf9\xf3\xe9\xdc\xdf\xf7\xfb;\xe7\xfct\xcf;\xe7\x1e\xf1\x0f\xdfP\
-\x8a*U\xaa\xfcF\xf4P\xed\'m\xa1J\x95O/z\xb0Z U\xaa|$z8\xf1I[\xf8\xddB\xa00\
-\xb0\x91x\x17\xfd\xeeb\xe0b\xfe\xf6<\x08\x1b\xed\xffxP@Y\x05\xf0\xd0\xae\x88\
-\xae\xc4\xc7\x14%|$ee\xa1\x10WD\xe7\xb7\x89\x1e\x8a\x7f\xd2\x16~w\x10\xf84\
-\x15\xf6\x10u\xcf\xe3\x7f`nJ\t\xd2\xd4\xc9\xbbqr\xc1N\xe6\xf5%\xb8\x04\xae\
-\x90\x07\x8f\x16\xfbuj\xbc\xfe\x8b<\x00\xe8\x96\xc2\xd6\xea\xe8\xd3\xb6Q&TQ]\
-\r\x87\xa5\xeeO\t\x94\xc7\xd1\x0c\xc1\xa4\\AZ\xdeXQ\x8dO\x02=\\-\x90\x8aa1A\
-\x8b\xfe\x0cg^\xa9gn$\x02\x08\x90\x12\xa9+\xc2uE"\x8dE:V\xce\xe0XK\x18\x0c\
-\xfe-\x0e\r\x15\xf7\x10d\x8c\x96\xe2\x0b\x9c\xfaq\x9c\xb9t\x00\x84\x00!\x01\
-\x885\xdb\xac\xb8\xffM\x8aF#\xd3\xdc\\Q\xdd\x10c4\xd9?\xe4\xf8\x0fS\xc4\x16\
-\x97h[w\x98B\xf0Z\xca|\xb6\'\x98\x1e\xf9l\xfb\xffT\x11R\x82\x84\xb6\x06\xe1\
-\x17\x91\x9a"\x18\x17\x18\x01\x81BP\xca\x07\x998%\xc9O\xb4\xb2\xf2.\x89i\xfc\
-\x8a\xa1\xf0=\x17-C\x84\xef!\xdc2\xc2\xf7PRC\xe9\x06J\xfe\xe6\xe5\x90p\x1d\
-\xa4[\x06\xb8\xa8mH\xe9\x84\xc5\xd5(\xb7\x80\xd4\xb8\xe0\x01\x04\xa9\xa5&\
-\xa1P\x17f\xb0\x85\x88\xfcp\x1c_7Q\x9a\x8et\x8a $\xbea-\x14\xd8%4\x05\x8a\
-\xb8_$\x9c_\x8e\xa4D6\x1d\xe3\x9a\xa8ECh\x8a\x8c|\x7f\x82]V~J\xbd\xafo\x06\
-\x164\xbd2\xben-h\x95\xed\x85ff\xe0\xc3\xcf\x00\xbe\x19\xbc\xc8\xf3\xff\x17\
-\xbd\xc6\x1c\xaeX\xb0\xcf;\x96r\xc0\xd8\x80\xa1\xbfI,\xe5r\xfd\x1f\xdd\x84\
-\x16\n\x82\xf2)\xe7m\x86\x0f\xf73~"\xcd\xf9\x9e\x14\xd7\xdc\x11\xc51\xceR\
-\x10A\x84\xf203}\x98\x99>\xbcB\t\x81Zx\xf9\x04\x02\xd8\xa9\xe585\xad\xf0^!\t\
-\xbf\x8c5\xdf\x8f1s\x0ee;\x80ZxA\x18\x01\x8a\xf5\xd7\xa3\x85k\x91\x81\x9b\
-\xb0\xac\xddh)\x97\xeb\x1f\xdb\x8c\x11\t\x02`\x97\x153F\x04\x19\x90\xc4\xfc~\
-\xcc\xd9\xb3X\xf3}(\xdbE)\x05f\x10/X\x8bYL\xa3\x148\xf1vJ\xa9\xaeKj\x86\x85N\
-\xad7Onv\x05\xb8\xdd\x08\rJ\x85\xd5,\xb1&\x185\xa0$\x8d\xcb\xcbO\xf9\x04\xd2\
-\x071ri\xa4!q\xc3Mh\x85I|\xbb\x8c0-\x1c\xbd\x1e\x99\x9dBH\x81\xbdx\x15^\xb4\
-\x1e\x00#}\x12cv\x18\x84\xa2\x1co\xa5\xdc\xbc\xbcbc\xaaG8U\xb1`\x9fw\x0c\xa1\
-#\xcc\x1at\x99C\x0f\n\x8cX\x8a\x8cU\xc0\x03\xacP\x98\x8e\xdb\xd6\xe3\xe5v\
-\x92\x1b\xeb\xa3\x90\xb9\x8a\x845\x8en\xce\x13\xc9\x9eA/g\x18=9\xc3\xd4\xd1,\
-\x9e\xeb\xa3\x07u\x9a7%h\x8a\x8dR,.\xa2\x10\\\x8cT\x1e\x91\xdciTv\x8e\xa17\
-\xc7\xc8\x8d\xd8\x08\r\xcc\x88A\xeduQ\xeaC\xe3\xd8\xa1\x8d\x08#\x85.\xf3\xe8\
-A0\xa2)\n\x81\x12.\x1en\xd0\xc5a\x82\x88\x1a%\x9a\xeb\x85\xd2\x1cc\x87\xa7\
-\xc8\xf4\xe5\x01h\xde\x94$\xde\x1ab\xe2\xd8\x1czX\xa7nM\x86\x9c\xef\x10\xca\
-\xf5}\xa4fCx\x1a\xb3f\x0bc\x07N3\xb2\xef\x00\xca\xf7PRpz\xc7\xcfX\xfe\xd0}$\
-\xb4!p\x8e^V~\xba*\x11\x0b\x9c\xa0\xef\xe7iB\xf5\x16\xc9k\xc7\x98\xee\xcd2u|\
-\x9ee\xf7\'\ty?b\xf0\x97a\xe2\x9d\x0e\x89\x9a7\xb0#\xdb\x91^\x96\x80\xfb\x02\
-\xe9#A\xcc\x1a\x8fx\x97\xc0Q\x7f\x82\x12FE\xc6T\x0f\xb3\xaf"\x81\xaa\x80F\
-\x12\xc1\xed\xe8\xcc \x84@\xa8\x10&\xbf\xc4c\x06\xa5I<\xef\x16\x16\xad\xed\
-\xa2\x7f\xe7\xbfcO\x8e\x12K\xc5H\x94\xc7\x11\x85&\xce\xfc\xa0\x87\xc2\xe4\
-\x04\x81x\x0ci\x9a8\xf9Y\xc6\xf6\xa6)\xa6;h\xfb\xf2J\x0c\xf3$\xba\x93D\xb3\
-\xdb\xe8\xfd\xf1\x0f(NN`F#\x18\xe10\x08\x87|\xbfK\xf3\xea-h\xfe0\x826t\xa6\
-\xf1\xec"\xf6\xf4\x1cF\xd0\xc2\x14\x1aZ FI?\x00^\x8e\x80\xdb\xc1\xe9\x97^$?6\
-F \x11GZ\x16S\x07\xcf3\xb1\xdf\xc6w\xcb\x84\x1a\x1b\tn\xba\x1d\xdd\xce ?Ns\
-\xcd\xed(\x05\xc1\x9a\x085\xf5\x92\xfc\xf8 BJ\xc2\xf1%\xe8\x81\x18\x86J\xe3_\
-V~\'P\xd2\xc34\xd6\xe2\xcf\xf52qn\x92\xd9wB\x04k\x93,^\xdfNM\xddrp\xc2\x18\
-\xfe1\xf2\xefj,^\xd5F\xc1;\x88,\xf9\xe8Z\x17\xe5\x89c\xc4\xeb\x1a\x88\xd74\
-\x91\xe7\x00\x95:\xfd\xd6C\xec\xa9P\xa8*\x82%\x08\xeeF\x17S\x08\tB\x04\t\xf0\
-6\x8a\x01\x00\xa4f\x13\xac\xbd\x8f\x805\x8a=u\x08\x8d\xd5\x18\xa2\x8b\xc1}\
-\xcfQ\x9e<\xc4\xe2\x9b\xb7\xd3p\xe36Pe\xdcb\x91\xe1]\xffFa`7\x85\xf4J"\x9d\
-\x8b\xc0\xafcx\xef\xff\xe0N\xbfC\xdbm\x8f\x90\xe8\xda\x80\x0c\xf8hZ\x1c\xcf)\
-\xa2\xf4\x19L\xbd\x1b\xe1nA\x17\x93\xb8\xd9\xb3\x9c\xfb\xaf\xa7\x90\xa6Dh\
-\x92\xe6\xcdO\x12]\xb6\x0c\xe5e\xc9\x9c\xee\xc5\x998\xcc\xe2[\x1e\xa0\xe1\
-\xc6m\x08\xdd\xc7\xb7a\xe4\xf5\xe7\x98;\xb3\x1fC\xd7\x10f#\xba\x1bex\xef\x0b\
-\x1f\xab\xa9\xac]\xc4\xae\xbe\x83X\xc7\x93\x9c}\xfe)\x84\xee\xd1y\xef\x13\
-\x08k\x06\xa950\xb8\xef\'\x97\xce\xaf\xa3\x11e\xedD\x98[\xd0\xe5,\xa6\x1c\
-\xa5m\xeb_\x10\xeb\\\x85/\x06P\x81\xb7!\xb7\x8c\xc6u&\x83\xaf\xfe7\xa5\xb9/\
-\x13\x0c\x16Q^\x92\xd9\xfe^tFI\xadx\x08BC\x04\xc5kP\xa1\x12\xd1\x03\x13\x9f\
-\xfd\xbd\xeaO\r\xba\x86\x17\x88\xa0\xd9\x12)\x05\xf8\x11\xac\x19\r\xdc\x85>V\
-V\x1c\xd7\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\x81AB\xc1f\x1a6<\x8cV\xde\
-\x89\xf4z\x90\xe6\x034\xac}\x90\xe1\xbe\x93\x94\xfa\xfb\x89-}\x14\xcf\x13\
-\xd8}\xe7\x08\x05\x1a\xa8[\xf3\x00\xd2\xfd\x11\xb2\xb0\x0fd\x02M\xe8\xe0\xcc\
-B)\x89g\x82V\x02\xbd\x08V(\x81nE\x91\x86\x86\x15L\xa1\xb9.J\xb6\x93\xe9\xfe6\
-\xa1@#\r\xeb\xb7\xa3;?E\x94\x8e\xe2[\x8fS\xb7\xf2\x1e\x8a\'{\xd0\x1d\x1d\xa1\
-\x12\xe0\x05.\xad\x99\x9b\x07=\x83g}\rSE\x90J\xa0\xe95h\xf6\x8bx\xc6\xe3\x97\
-\x95_M\xdbv\xb4\xc2^<+\x86fk\x84\xc2\x8b\x89\xb5oAw\xbe\x03\xceQ\xc8z(\xbdD\
-\xcd\xb2\xad\x04\xac\xd7\x98\xe9>H\xcb\xf6?\xc7\xf3\xf3d\x8f<O\xa2e5fr)2\xbf\
-\x0b\xb2@\x85\xce`tv/\xadH\xa0*@\xac\x1e6\x8e#\xc6\x82 \x01{\x1c\x0e\xd4\xc3\
-\x9c\x02\xc3Bm\xd8@i\xf0m\xd4\xa9\x10Vg;rn\x1aO\xa4\xf0\xce\x08\xf4X3\x14\
-\x02\xc8\x83#P\x08\xa25\xa7\xb1\x9anA\x1bk\x86\xc9\x18\xaa\x90@\x15\x8b\xb8\
-\xef\x82\x91h\xc4\x9f7\xd0\x0fOC\xe1\x83[\xc5\xb5\x10\xab\x83ui\xc4X\x00\xcb\
-\xe9\xa4}\xfb_\xa1E#\xe0\xfb\xf8S#\xc8\xa3gqZ\x17\xe1\x9c(a$\x9b\x11\xe5\x04\
-\xe2\xc0\x1c\xe4\x82\xc8\xb6a\x8c\xc6\x1b\xd0F\x1b\x11^\x12\xbc\x04*\xa7.\
-\xad\xf9k\xdd\xf5#\xc8\xb1\x00B\n(\xa5\xa17\x89\xbfT^V~\xe4\x13p\xb4\x056\
-\xc4a,\xb6\xb0D\xf5S\xd0\x1d\x81L+\x00"PF\xde\x18%\x12\xbf\x91\xec\xde\xb7\
-\xb1o(`\xa7\xd3\x94\x8f\xb94\xder7\x8c\xe5\xe1@\x00\xfc\xca\xcdi}\xe4\x99\
-\xc7+\x16\xec\xf3\x8e\xd1.HtMQ8\xb5\x04\x89\x86\x9f\x9fan\xffV\x90\ns\xad\
-\x8f\x9eu\x19\xf9\xe6(\x85\xd37Qw_3\xc5#6\xe6\xaa<\xaa\xb4\x89\xec\x99\x0c^v\
-\x16\'\xf4(\xf6;.\xa1e\x16\xf3\xddC\xcc\xed\xe9"\xd8\xd4\x84?;\x8b\x08\x01\
-\xe5\x9b\xc9\xec\x19\xc7yx\x9c\x92\xfa\x03\xec=.z\x8b\x8eq\x95\x86}\xb8\x8c\
-\x97.\x92X>\xb1\xe0Ah \nd\xfeY\xe0\x0e\t\xdc\x91:\xb4\xa6&\x92\x7f_\xc2\xcb\
-\xac\xa7\xd0\x9b\xa3<=\x86\x13x\x88\xe2~\x9b\xf0\xb2\x00\xf3\xfb\xfa\x99\xdb\
-\xd3E\xe8\xaa\x14~!\x8d\x90\xfe%5K\xfbl\x8c%>\x89k\xa7\xc8\x1f\xefD \xf1\xf3\
-\x93d^YG\xcd\x93\x85\xcb\xca\xcf\x9d\xca2\xb3\xe3\x8b\xc4\xaf\x1b\xa5\xd0\
-\xdb\xb2\xb0\xcd\x9b\x1fc\xfa\xfbwP\xee+_\xe8\xe3\xd0`\x80\xd8\xda\x07\x19yv\
-\x9e\x93\x7f\xb6\x13Ut\xb1\x9a\xee\xc0Z\xbc\x91\xcc7G)\xfe\xe2\x0f+:\xa6\xfa\
-Kk6V4\xe0\xe7\x99\xda\xc6y\xeef/\xe7S\xb58EI\xfd\xc8\x08\xdck\x91\x9f\x81\
-\xec\x98C\xdf7l2\xb9\x14\xd7\xfcq#\xc6\xf22\xaf\xefh\xe5\xba\xd8\x10\xd1\xc7\
-:9\xf2\x8fg\x18{z/\x1d\xb7/B\xae\x0eR:\x91\xe7\xf4k\x19\x8a\xed\x9d4l\x8e\
-\xd3;\xe0\x90He\t?\xd2\xc1\xe1\x7f\xf2\x99\xfcn7\x1d\xb75\xa2\xee\x88\xa2[\
-\xa0\x1b.\xc9\xafD\xe8\xd9\xd5\xce\xadr\x17\xe7SI\x90\x1a\x9d\x8c\xf0Z\xe4\
-\x1e\xa6\x93IH\x82\xd4\x14_\x1a\xecA\xbf\xaf\x9d#\xdf\x1b\xa4\xf0\xfd\x1e\
-\x9a\xd7\xd7\xe3o4\x19~O3\xd7\xd2A\xb2\xc1\xa2\xdd\x1d$;k\\R\xf3\xcd\xe8j\
-\x046w\x8b\x97\xe9\xaf\xabEI\x83v\x91\xe6\x17\xc95\xac\x19\x18\xb8\xbc\xfc\
-\x86]N/]\xc6]\xea \x83\xc9\x18BJ\xaeVC\xec\xbef=\xd3\xf1\xf0\x85>\x8e\xcd\
-\x0b\xb6\xb5\xba\xcc\xdc\xba\x9e\xf1\x13\xa3\x10\xd2Y\xfb\xe0f\xe6r5\xbc\xe4\
-\xc4\xb1\xd7T\xf6\xe3t\xfd\xb4_\xa8h\xc0\xcf3\xcd\xfe\x1c\xb6=\xc0\x94SbzRg\
-\xe8\xebi\xd0tl\xc7@\t\r\x84d\xc9\n\x97\xae\xdf\xcfs\xe8h\x07o\xf4\x87\x98\
-\xd0\xc3<v\xff\x04\x8b\xb7\x1a\x1c\xf9Y\x8eS\xcf\x9eCI\r_\x18\x84\x13\x92\
-\x15wI\xcc\xbaq^\xd9\xb1\x82\xe6z\x9f\x07\xb7M\xd2\xf0\x05\x8d\xd3\xfb\xf3\
-\x9c\xfa\xd6\xc0\x85\xb6\xb5-\x92{\xfe\xc6`J\x0bb\x97\xce2U\x0ecE%\x8e=\xc1\
-\xb9r\x8eq\xff\xbd\x835\x1f\xdc\xee\x04\x0fo\xcb\x11^%9\xbco\x8a\x9e\xb72(\
-\xa9\x11\xad7Xt\x8dd\xb4$\tF\xf2\xd8\xc5s\xbcud\x15\xbf\xb7\xf9\xe35G\xf5\
-\x16\x1c\xc7\xa7T\xe8c\xcc\xae%\x18s(\xdbS\x9c)\xe5\x99;zy\xf9\xbd\xbac\x05R\
-\xce\xe1\x94\xce0\xe3\x14\xb0j\x0c\xca\xf6Y\xce\x95\xaff\xdc\xff\xc0a\xe5$\
-\xb4\x9c\x9a\xa7as\x0b\'N\x8e\x10J\x984m\x8c\xd0\xfd\xf6\x0cGs\xc1\x8a\x8f\
-\xa9><\\=(\xac\x14\xf9l\x9eR\xbe\x8f\xce\x1b\x04\xe5\xee\x10\xb6c\xe0\x0b\
-\x9dHBR\xdf\xea\xd0\xb6\xdc\xa6uy\x89}\xdd\x1d<\xffR\x0b\xc5R\x9a\xf4\x88BzA\
-\xee\xddz\x98\xdav\x83\xb3\x87\x82\x14s\x1aVTp\xfd\x17\xb3\x84k\xe1[\xffy\
-\x17\xc7z\xb3\x18\xba\x86\xb2u\xee\x7f\xb4\x97\xabn\xd28\xb67\xc2\xec\x94E\
-\xacQ\xb1\xea\x0bY\xfa\x07R\xf4\x1c^\xc6\x97\xd6\xf6\xb1du\x84\x9az\x9f\xf4\
-\xb0\xc5\xf1\x93\xf3\xd8N\xe9\x82\xcftZQ\x1b\x81\xadO\x9c\xe1\xfc\xb1\x00\'\
-\xde\n\xa1\x99\x82u[\xb3\xb4^\x95\xe7\xc0\xae$\xd1\xa4\xc7\xb9\xb35\xecxe#\
-\xd9\x99Kh\x1e\xca\x11\xab\xc9R,\xf4\xd3\xb6r\x86\xa6\x8e"}\xe7\xa2\xbcs<\
-\x8f\x80\xcb\xce\xaf>\x95\xc1.\x1c\xa6u\x9dN\xac\xc1gxh\x8a\xe3\'f\xb0\x9d\
-\xecE\xfd\xbc\xbf\xc7\xe5\xfe-\x0ey\xa7DKg\x02!\xa7xmw\x89\xe1aY\xf11\x15\
-\x1b7\xbeZ\xbd0U!\x84\x80m\x9b{\xb9u]?\xa9d\x11!\x17\xba6\x9b5\xc9\xcc[L\xcc\
-D\xf8\xf9\xaf\x96q\xee|-eW^\xf4\xdc\xf2\xce96\xad\x18\xa5\xady\x1e\xe5)|4z\
-\xfb\x13\xf4\x9ch\xa0\x7f(r\xa1\xad\x94\x8a\x95W\xcf\xb0y\xed\x08\xa9x\x81rY\
-\xa2\xa4\xce;\xef\xd6\xb2\xbb\xbb\x99\\\xde\xe0\xce[G\xd9\xd85C\xd9\xd7x\xf9\
-\x8df\x8e\x9c\xaa\xf9\x90\xd7\x80\xe5q\xf3\xfa\tnX9\x8a\xf4]\xa4\x06\xe3\x99\
-\x08g\xcf\xd7\xb0i\xc5( x\xf9\x8d\xa5\x1c9U{I\xcdl\xce@\x08\xb8\xf3\xd6q6tM\
-\xe3\xfa\xf2"\xdd\xcb\xcdo!\xc6\x00\x9b\xbaF)\xfb\x1a/\xbd\xd1\xc1\x91S\x17\
-\xdf\xc70t\xf8\xbb\xaf\xe6(\x0f\x8d\xf2\xeaw\x06\xf8\xca\xbft\xd1?\x19\xe5\
-\xebOG\xb8\x12W\xff\xc4\xa2E\xdf\xad\x16H\x85\x11\x02B\xc1\xf7\xbb\xd5u\xc1v\
-\xaa\xdb\xe9\x95`\xc3\x9a2\xdf{z\x96g\xfez\x18\xd7\x13\xfc\xe5\xbf.\xe2\x89\
-\xaf\xc6ys\xff\x95\xb9J\xa0\x8f\x8c\x8c\\\x91\xc0U\xaa\\\t\xae\xdb>\xcd\xech\
-\x86\xe3\x87\xf2<\xf2T\x80\xde\x936\xaf\xee\\\xc4|\xb6\xf2\xcb+X\xd8\xad\xaf\
-R\xe53C8h\x13\x8d\xe6\xb9\xefOa\xf3\x9d6\xcf\xbd\x10\xbab\xc5\x01\xa0_\xb1\
-\xc8U\xaa\\\x01\x9e\xfd\x8ff\x82f\x03\xb51\x9f\xa7\xbf%y\xf1\'W\xe6v\xe4\xaf\
-\x11\xf0\xb5\xea\x7f\x90*U>\x82\xea\x12\xabJ\x95\x8f\xa1Z U\xaa|\x0c\xff\x0b\
-\x84\xde\x96s_\x12\xdfl\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory009Bitmap():
- return wxBitmapFromImage(getDocFactory009Image())
-
-def getDocFactory009Image():
- stream = cStringIO.StringIO(getDocFactory009Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory009')
-catalog['DocFactory009'] = ImageClass()
-catalog['DocFactory009'].getData = getDocFactory009Data
-catalog['DocFactory009'].getImage = getDocFactory009Image
-catalog['DocFactory009'].getBitmap = getDocFactory009Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory010Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r_\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0v\x93\xd4(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\nEI\x96\xb5R\x96DR\
-\\.w\xf2\x92w=\xe7\x9es\xa6?\xe8\xcaV\x1c[\x02LV\xa9u\x9f\x9f\x17s\xbe\xf7{g\
-\xe6\xc3\x99;sF\xfc\xdd\xb7\x94\xa2B\x85\n\xbf\x11=T}\xa5S\xa8P\xe1\xb7\x17=\
-X)\x90\n\x15>\x15=\x9c\xb8\xd2)|1\x10(\x0cl$\xdeE\xbf\xbb\x18\xb8\x98\xffw9\
-\x08\x1b\xed\xd7rP@Y\x05\xf0\xd0\x16DW\xe2c\x8a\x12>\x92\xb2\xb2P\x88\x05\
-\xd1\xb9\x12\xe8\xa1\xf8\x95N\xe1\xff?\x02\x9f\x86\xc2\x1e\xa2\xeey\xfc\x8f\
-\xcdM)A\x9a:y7N.\xd8\xce\xac\xbe\x04\x97\xc0\x02\xe5\xe0\xd1d\xbfE\x95\xd7{Q\
-\x0e\x00\xba\xa5\xb0\xb5\x1az\xb4m\x94\t\xcd\xab\xae\x86\xc3R\xf7\xa7\x04\
-\xca\xa3h\x86`\\\xae -o\x9eW\x8d+\x89\x1e\xae\x14\xc8\xe7\xc6b\x8c&\xfd9\xce\
-\xbc^\xcb\xccP\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4\xad\x9c\xc2\xb1\x96\xd0\x1f\
-\xfck\x1c\xea\xe6=\x87 #4\x15_\xe6\xd4\x8f\xe3\xcc\xa4\x03 \x04\x08\t@\xac\
-\xd1f\xc5\x83\xefP4\xea\x99\xe4\xd6y\xd5\r1B\x83\xfdC\x8e\xff0Elq\x89\x96u\
-\x87)\x04\xaf\xa7\xcc\x17cb\xe9\x91/\x86\x8f+JH\t\x12\xda\x1a\x84_Dj\x8a`\\`\
-\x04\x04\nA)\x1fd\xec\x94$?\xd6\xcc\xca{$\xa6\xf1+\x06\xc2\xf7]\xb4\x0c\x11\
-\xbe\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\x9b\x97C\xc2u\x90n\x19\xe0\xa2\xb6!\
-\xa5\x13\x16\xd7\xa2\xdc\x02R\xe3B\x0e H-5\t\x85:0\x83MD\xe4\'\xe3\xf8\xba\
-\x89\xd2t\xa4S\x04!\xf1\rk\xae\xc0.\xa1)P\xc4\xfd"\xe1\xfcr$%\xb2\xe9\x18\
-\xd7E-\xeaB\x13d\xe4G\x13\xeb\xb2\xfc)\xf5\x91\xbe\x19\x98\xd3\xf4\xca\xf8\
-\xba5\xa7U\xb6\xe7\x9a\x99\x81O>\x03\xf8f\xf0\xa2\x9c\xe7\x0b\xbd\xca\x1c\
-\x9c\xf7\xa0W\x1b\x96r\xc0\xd8\x80\xa1\xbfC,\xe5r\xe3\x1f\xdc\x82\x16\n\x82\
-\xf2)\xe7m\x06\x0f\xf72z"\xcd\xf9\xae\x14\xd7\xdd\x15\xc51\xceR\x10A\x84\xf2\
-03=\x98\x99\x1e\xbcB\t\x81\x9a{\xf9\x04\x02\xd8\xa9\xe58U\xcd\xf0a!\t\xbf\
-\x8c5\xdb\x8b1u\x0ee;\x80\x9a{A\x18\x01\x8a\xb57\xa2\x85\xab\x91\x81[\xb0\
-\xac\xddh)\x97\x1b\x9f\xd8\x8c\x11\t\x02`\x97\x15SF\x04\x19\x90\xc4\xfc^\xcc\
-\xe9\xb3X\xb3=(\xdbE)\x05f\x10/X\x8dYL\xa3\x148\xf1VJ\xa9\x8eKj\x86\x85N\xb5\
-7Knz\x05\xb8\x9d\x08\rJ\x85\xd5,\xb1\xc6\x186\xa0$\x8d\xcb\xf3\xa7|\x02\xe9\
-\x83\x18\xb94\xd2\x90\xb8\xe1\x06\xb4\xc28\xbe]F\x98\x16\x8e^\x8b\xccN \xa4\
-\xc0^\xbc\n/Z\x0b\x80\x91>\x891=\x08BQ\x8e7Sn\\>\xefc\xabG85\xefA\xaf6\x0c\
-\xa1#\xcc*t\x99C\x0f\n\x8cX\x8a\x8cU\xc0\x03\xacP\x98\xb6;\xd6\xe3\xe5v\x92\
-\x1b\xe9\xa1\x90\xb9\x86\x845\x8an\xce\x12\xc9\x9eA/g\x18>9\xc5\xc4\xd1,\x9e\
-\xeb\xa3\x07u\x1a7%h\x88\rS,.\xa2\x10\\\x8cT\x1e\x91\xdciTv\x86\x81wF\xc8\r\
-\xd9\x08\r\xcc\x88A\xf5\rQjC\xa3\xd8\xa1\x8d\x08#\x85.\xf3\xe8A0\xa2)\n\x81\
-\x12.\x1en\xd0\xc5a\x8c\x88\x1a&\x9a\xeb\x86\xd2\x0c#\x87\'\xc8\xf4\xe4\x01h\
-\xdc\x94$\xde\x1cb\xec\xd8\x0czX\xa7fM\x86\x9c\xef\x10\xca\xf5|\xaaf]x\x12\
-\xb3j\x0b#\x07N3\xb4\xef\x00\xca\xf7PRpz\xc7\xcfX\xfe\xc8\x03$\xb4\x01p\x8e^\
-\x96?]\x95\x88\x05N\xd0\xf3\xf34\xa1Z\x8b\xe4\xf5#Lvg\x998>\xcb\xb2\x07\x93\
-\x84\xbc\x1f\xd1\xff\xcb0\xf1v\x87D\xd5\xdb\xd8\x91\xedH/K\xc0}\x99\xf4\x91 \
-f\x95G\xbcC\xe0\xa8?B\tc^\xc7V\x0f\xb3o^\x03^\x8dh$\x11\xdc\x89\xce\x14B\x08\
-\x84\na\xf2K<\xa6P\x9a\xc4\xf3nc\xd1\xda\x0ezw\xfe\x1b\xf6\xf80\xb1T\x8cDy\
-\x14Qh\xe0\xcc\x0f\xba(\x8c\x8f\x11\x88\xc7\x90\xa6\x89\x93\x9ffdo\x9ab\xba\
-\x8d\x96\xaf\xae\xc40O\xa2;I4\xbb\x85\xee\x1f\xff\x80\xe2\xf8\x18f4\x82\x11\
-\x0e\x83p\xc8\xf7\xba4\xae\xde\x82\xe6\x0f"hAg\x12\xcf.bO\xce`\x04-L\xa1\xa1\
-\x05b\x94\xf4\x03\xe0\xe5\x08\xb8m\x9c~\xf5\x15\xf2##\x04\x12q\xa4e1q\xf0<c\
-\xfbm|\xb7L\xa8\xbe\x9e\xe0\xa6;\xd1\xed\x0c\xf2\xb34\xd7\xdc\x89R\x10\xac\
-\x8aPU+\xc9\x8f\xf6#\xa4$\x1c_\x82\x1e\x88a\xa84\xfee\xf9;\x81\x92\x1e\xa6\
-\xb1\x16\x7f\xa6\x9b\xb1s\xe3L\xbf\x1f"X\x9dd\xf1\xfaV\xaaj\x96\x83\x13\xc6\
-\xf0\x8f\x91\xff@c\xf1\xaa\x16\n\xdeAd\xc9G\xd7:(\x8f\x1d#^SG\xbc\xaa\x81<\
-\x07\x98\xefSo=\xc4\x9ey\x0ey\xf5!X\x82\xe0^t1\x81\x90 D\x90\x00\xef\xa1\xe8\
-\x03@j6\xc1\xea\x07\x08X\xc3\xd8\x13\x87\xd0X\x8d!:\xe8\xdf\xf7"\xe5\xf1C,\
-\xbeu;u7o\x03U\xc6-\x16\x19\xdc\xf5\xaf\x14\xfavSH\xaf$\xd2\xbe\x08\xfc\x1a\
-\x06\xf7\xfe7\xee\xe4\xfb\xb4\xdc\xf1\x18\x89\x8e\r\xc8\x80\x8f\xa6\xc5\xf1\
-\x9c"J\x9f\xc2\xd4;\x11\xee\x16t1\x8e\x9b=\xcb\xb9\xff|\x06iJ\x84&i\xdc\xfc4\
-\xd1e\xcbP^\x96\xcc\xe9n\x9c\xb1\xc3,\xbe\xed!\xean\xde\x86\xd0}|\x1b\x86\
-\xdez\x91\x993\xfb1t\ra\xd6\xa3\xbbQ\x06\xf7\xbe\xfc\x99\x9a\xca\xdaE\xec\
-\xda\xbb\x88\xb5=\xcd\xd9\x97\x9eA\xe8\x1e\xed\xf7?\x85\xb0\xa6\x90Z\x1d\xfd\
-\xfb~ri\x7fm\xf5(k\'\xc2\xdc\x82.\xa71\xe50-[\xff\x8cX\xfb*|\xd1\x87\n\xbc\
-\x07\xb9e\xd4\xaf3\xe9\x7f\xe3\xbf(\xcd|\x95`\xb0\x88\xf2\x92L\xf7v\xa33Lj\
-\xc5#\x10\x1a (\xde\x84y.\x11=0\xf6\xc5\xd9\xb3\xbeb\xe8\x1a^ \x82fK\xa4\x14\
-\xe0G\xb0\xa64p\xe7\xfaVYq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1\xfb\xfa\t\x05\
-\x1b\xa9\xdb\xf0(Zy\'\xd2\xebB\x9a\x0fQ\xb7\xf6a\x06{NR\xea\xed%\xb6\xf4q<O`\
-\xf7\x9c#\x14\xa8\xa3f\xcdCH\xf7G\xc8\xc2>\x90\t4\xa1\x833\r\xa5$\x9e\tZ\t\
-\xf4"X\xa1\x04\xba\x15E\x1a\x1aV0\x85\xe6\xba(\xd9J\xa6\xf3_\x08\x05\xea\xa9\
-[\xbf\x1d\xdd\xf9)\xa2t\x14\xdfz\x92\x9a\x95\xf7Q<\xd9\x85\xee\xe8\x08\x95\
-\x00/pi\xcd\xdc,\xe8\x19<\xeb\x1b\x98*\x82T\x02M\xafB\xb3_\xc13\x9e\xbc,\x7f\
-U-\xdb\xd1\n{\xf1\xac\x18\x9a\xad\x11\n/&\xd6\xba\x05\xdd\xf9\x0e8G!\xeb\xa1\
-\xf4\x12U\xcb\xb6\x12\xb0\xded\xaa\xf3 M\xdb\xff\x14\xcf\xcf\x93=\xf2\x12\
-\x89\xa6\xd5\x98\xc9\xa5\xc8\xfc.\xc8\x02\xf3|\x06\xa3\xb3{\xe9\xbc\x06\xbc*\
-\x89\xd5\xc2\xc6Q\xc4H\x10$`\x8f\xc2\x81Z\x98Q`X\xa8\r\x1b(\xf5\xbf\x87:\x15\
-\xc2joE\xceL\xe2\x89\x14\xde\x19\x81\x1ek\x84B\x00yp\x08\nA\xb4\xc64V\xc3mh#\
-\x8d0\x1eC\x15\x12\xa8b\x11\xf7\x030\x12\xf5\xf8\xb3\x06\xfa\xe1I(||\xab\xb8\
-\x1ab5\xb0.\x8d\x18\t`9\xed\xb4n\xff\x0b\xb4h\x04|\x1f\x7fb\x08y\xf4,N\xf3"\
-\x9c\x13%\x8cd#\xa2\x9c@\x1c\x98\x81\\\x10\xd92\x88Q\x7f\x13\xdap=\xc2K\x82\
-\x97@\xe5\xd4\xa55\xffWw\xfd\x10r$\x80\x90\x02Ji\xe8N\xe2/\x95\x97\xe5\x8f|\
-\x02\x8e6\xc1\x868\x8c\xc4\xe6\x96\xa8~\n:#\x90i\x06@\x04\xca\xc8\x9b\xa3D\
-\xe27\x93\xdd\xfb\x1e\xf6M\x05\xect\x9a\xf21\x97\xfa\xdb\xee\x85\x91<\x1c\
-\x08\x80?\xffsY\x1fz\xee\xc9y\x0fz\xb5a\xb4\n\x12\x1d\x13\x14N-A\xa2\xe1\xe7\
-\xa7\x98\xd9\xbf\x15\xa4\xc2\\\xeb\xa3g]\x86\xbe=L\xe1\xf4-\xd4<\xd0H\xf1\
-\x88\x8d\xb9*\x8f*m"{&\x83\x97\x9d\xc6\t=\x8e\xfd\xbeKh\x99\xc5l\xe7\x003{:\
-\x0864\xe0OO#B@\xf9V2{Fq\x1e\x1d\xa5\xa4~\x0f{\x8f\x8b\xde\xa4c\\\xa3a\x1f.\
-\xe3\xa5\x8b$\x96\x8f\xcd\xe5 4\x10\x052\xff(p\x07\x04\xeeP\rZC\x03\xc9\xbf-\
-\xe1e\xd6S\xe8\xceQ\x9e\x1c\xc1\t<Bq\xbfMxY\x80\xd9}\xbd\xcc\xec\xe9 tM\n\
-\xbf\x90FH\xff\x92\x9a\xa5}6\xc6\x12\x9f\xc4\xf5\x13\xe4\x8f\xb7#\x90\xf8\
-\xf9q2\xaf\xaf\xa3\xea\xe9\xc2e\xf9s\'\xb2L\xed\xf82\xf1\x1b\x86)t7\xcdm\xf3\
-\xe6G\x98\xfc\xfe]\x94{\xca\x17\xfa8\xd4\x1f \xb6\xf6a\x86\x9e\x9f\xe5\xe4\
-\x9f\xecD\x15]\xac\x86\xbb\xb0\x16o$\xf3\xeda\x8a\xbf\xf8\xfd\x05\x19[\xfd\
-\xd55\x1b\x17$\xf0\xd5Du\xfd,\xf7\xb2\x97\xf3\xa9j\x9c\xa2\xa4vh\x08\xee\xb7\
-\xc8OAv\xc4\xa1\xe7[6\x99\\\x8a\xeb\xfe\xb0\x1ecy\x99\xb7v4sCl\x80\xe8\x13\
-\xed\x1c\xf9\xfb3\x8c<\xbb\x97\xb6;\x17!W\x07)\x9d\xc8s\xfa\xcd\x0c\xc5\xd6v\
-\xea6\xc7\xe9\xeesH\xa4\xb2\x84\x1fk\xe3\xf0?\xf8\x8c\x7f\xb7\x93\xb6;\xeaQw\
-E\xd1-\xd0\r\x97\xe4\xd7"t\xedj\xe5v\xb9\x8b\xf3\xa9$H\x8dv\x86x3r\x1f\x93\
-\xc9$$Aj\x8a\xaf\xf4w\xa1?\xd0\xca\x91\xef\xf5S\xf8~\x17\x8d\xebk\xf17\x9a\
-\x0c~\xa8\x99kj#Yg\xd1\xea\xf6\x93\x9d6.\xa9\xf9Nt5\x02\x9b{\xc5k\xf4\xd6T\
-\xa3\xa4A\xabH\xf3\x8b\xe4\x1a\xd6\xf4\xf5]\x9e\xbfA\x97\xd3K\x97q\x8f:H\x7f\
-2\x86\x90\x92k\xd5\x00\xbb\xaf[\xcfd<|\xa1\x8fc\xb3\x82m\xcd.S\xb7\xafg\xf4\
-\xc40\x84t\xd6>\xbc\x99\x99\\\x15\xaf:q\xec5\x0b\xf3Q\xba~\xda/,H\xe0\xab\
-\x89F\x7f\x06\xdb\xeec\xc2)19\xae3\xf0\xcd4h:\xb6c\xa0\x84\x06B\xb2d\x85K\
-\xc7\xef\xe69t\xb4\x8d\xb7{C\x8c\xe9a\x9exp\x8c\xc5[\r\x8e\xfc,\xc7\xa9\xe7\
-\xcf\xa1\xa4\x86/\x0c\xc2\t\xc9\x8a{$f\xcd(\xaf\xefXAc\xad\xcf\xc3\xdb\xc6\
-\xa9\xfb\x92\xc6\xe9\xfdyN\xbd\xd0w\xa1mu\x93\xe4\xbe\xbf2\x98\xd0\x82\xd8\
-\xa5\xb3L\x94\xc3XQ\x89c\x8fq\xae\x9cc\xd4\xff\xf0`\xcd\x07\xb73\xc1\xa3\xdb\
-r\x84WI\x0e\xef\x9b\xa0\xeb\xdd\x0cJjDk\r\x16]\'\x19.I\x82\x91<v\xf1\x1c\xef\
-\x1eY\xc5\xefl\xfel\xcda\xbd\t\xc7\xf1)\x15z\x18\xb1\xab\t\xc6\x1c\xca\xf6\
-\x04gJyf\x8e^\x9e\xbf7v\xac@\xca\x19\x9c\xd2\x19\xa6\x9c\x02V\x95A\xd9>\xcb\
-\xb9\xf2\xb5\x8c\xfa\x1f;\xac\x1c\x87\xa6S\xb3\xd4mn\xe2\xc4\xc9!B\t\x93\x86\
-\x8d\x11:\xdf\x9b\xe2h.\xb8`c\xab\x0f\x0eV\x0e\n?/\xf9l\x9eR\xbe\x87\xf6\x9b\
-\x04\xe5\xce\x10\xb6c\xe0\x0b\x9dHBR\xdb\xec\xd0\xb2\xdc\xa6yy\x89}\x9dm\xbc\
-\xf4j\x13\xc5R\x9a\xf4\x90BzA\xee\xdfz\x98\xeaV\x83\xb3\x87\x82\x14s\x1aVTp\
-\xe3\x97\xb3\x84\xab\xe1\x85\xff\xb8\x87c\xddY\x0c]C\xd9:\x0f>\xde\xcd5\xb7h\
-\x1c\xdb\x1baz\xc2"V\xafX\xf5\xa5,\xbd})\xba\x0e/\xe3+k{X\xb2:BU\xadOz\xd0\
-\xe2\xf8\xc9Yl\xa7t!\xcftZQ\x1d\x81\xadO\x9d\xe1\xfc\xb1\x00\'\xde\r\xa1\x99\
-\x82u[\xb34_\x93\xe7\xc0\xae$\xd1\xa4\xc7\xb9\xb3U\xecx}#\xd9\xa9Kh\x1e\xca\
-\x11\xab\xcaR,\xf4\xd2\xb2r\x8a\x86\xb6"=\xe7\xa2\xbc\x7f<\x8f\x80\xcb\xf6W\
-\x9b\xca`\x17\x0e\xd3\xbcN\'V\xe7380\xc1\xf1\x13S\xd8N\xf6\xa2~\xde\xdf\xe5\
-\xf2\xe0\x16\x87\xbcS\xa2\xa9=\x81\x90\x13\xbc\xb9\xbb\xc4\xe0\xa0\\\xb0\xb1\
-\x15\x1b7\xbeQ\xb90\xf59\x11\x02\xb6m\xee\xe6\xf6u\xbd\xa4\x92E\x84\x9c\xeb\
-\xd2l\xd6$3k16\x15\xe1\xe7\xbfZ\xc6\xb9\xf3\xd5\x94]y\xd1s\xcb\xdbg\xd8\xb4b\
-\x98\x96\xc6Y\x94\xa7\xf0\xd1\xe8\xeeM\xd0u\xa2\x8e\xde\x81\xc8\x85\xb6R*V^;\
-\xc5\xe6\xb5C\xa4\xe2\x05\xcae\x89\x92:\xef\x7fP\xcd\xee\xceFry\x83\xbbo\x1f\
-fc\xc7\x14e_\xe3\xb5\xb7\x1b9r\xaa\xea\x13\xb9\x06,\x8f[\xd7\x8fq\xd3\xcaa\
-\xa4\xef"5\x18\xcdD8{\xbe\x8aM+\x86\x01\xc1ko/\xe5\xc8\xa9\xeaKjfs\x06B\xc0\
-\xdd\xb7\x8f\xb2\xa1c\x12\xd7\x97\x17\xe9^\xae\xbf\xb9\x18}l\xea\x18\xa6\xec\
-k\xbc\xfav\x1bGN]|\x0f\xc3\xd0\xe1o\xbe\x9e\xa3<0\xcc\x1b\xdf\xe9\xe3k\xff\
-\xd4A\xefx\x94o>\x1ba!\xaf\xfc\x89E\x8b\xbe[)\x90yB\x08\x08\x05?\xeaN\xd7\
-\x05\xdb\xa9l\xa3\xcf\x07\x1b\xd6\x94\xf9\xde\xb3\xd3<\xf7\x97\x83\xb8\x9e\
-\xe0\xcf\xffy\x11O}=\xce;\xfb\x17\xf6*\x81>44\xb4\xa0\x02\x15*\xcc\x077l\x9f\
-dz8\xc3\xf1Cy\x1e{&@\xf7I\x9b7v.b6\xbbp\xcb+\x98\xdb\xb5\xafP\xe1\xb7\x9ep\
-\xd0&\x1a\xcd\xf3\xc0\x1f\xc3\xe6\xbbm^|9\xb4\xe0\xc5\x01\xa0/\xb8B\x85\n\
-\xf3\xc0\xf3\xff\xdeH\xd0\xac\xa3:\xe6\xf3\xec\x0b\x92W~\xb20\xb7#\x7f\x1d\
-\x01\xdf\xa8\xfc\x07\xa9P\xe1S\xa8,\xb1*T\xf8\x0c*\x05R\xa1\xc2g\xf0?ir\x96s\
-C-\x0e\xd3\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory010Bitmap():
- return wxBitmapFromImage(getDocFactory010Image())
-
-def getDocFactory010Image():
- stream = cStringIO.StringIO(getDocFactory010Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory010')
-catalog['DocFactory010'] = ImageClass()
-catalog['DocFactory010'].getData = getDocFactory010Data
-catalog['DocFactory010'].getImage = getDocFactory010Image
-catalog['DocFactory010'].getBitmap = getDocFactory010Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory011Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r`\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfbG\xfe\
-\x8c\xaa\xa8R\xd5\x055\x8a\x80&)\xaaZQR\x1a\'\x81\x10\x14\x1b\x12c\x83\xe3\
-\x8c7\x8c\xd71\xb6g\xc6\xb3\xbc\xd9g\xde\xcc[\xef}\xf7\xde\xd3?\x86\x02.\x01\
-[\xd4\xcf\x10\xe7}\xfe|:\xf7\xf7\xfd}\xcf9?\xdd\xf3\xce\xb9G\xfc\xdd\xb7\x94\
-\xa2J\x95*\xbf\x16=T\xfby\xa7P\xa5\xca\x17\x17=X-\x90*U>\x11=\x9c\xf8\xbcS\
-\xf8\xcdF\xa00\xb0\x91x\xe7\xfd\xeeb\xe0b^\xbe\x1c\x84\x8d\xf6\x7frP@Y\x05\
-\xf0\xd0*\xa2+\xf11E\t\x1fIYY(DEt>O\xf4P\xfc\xf3N\xe17\x17\x81OSa\x17Q\xf7\
-\x1c\xfeG\xe6\xa6\x94 M\x9d\xbc\x1b\'\x17\xecdN_\x84K\xa0B9x\xb4\xd8oP\xe3\
-\xf5\x9d\x97\x03\x80n)l\xad\x8e^m\x0beB\x97TW\xc3a\xb1\xfbS\x02\xe514C0!\x97\
-\x91\x967^R\x8d/\x02z\xb8Z \x9f\x19\x8bqZ\xf4g8\xfdj=\xb3\xc3\x11@\x80\x94H]\
-\x11\xae+\x12i,\xd2\xb1|\x1a\xc7Z\xc4@\xf0\xafqh\xb8\xe49\x04\x19\xa5\xa5\
-\xf8"\'\x7f\x1cg6\x1d\x00!@H\x00b\xcd6\xcb\xee\x7f\x8b\xa2\xd1\xc8\x147_R\
-\xdd\x10\xa34\xd9?\xe4\xd8\x0fS\xc4\x16\x96h[s\x88B\xf0Z\xca\\Y\x13J\x8f\\Y~\
-.+!%Hh\xab\x10~\x11\xa9)\x82q\x81\x11\x10(\x04\xa5|\x90\xf1\x93\x92\xfcx+\
-\xcb\xef\x92\x98\xc6\xaf\x18\x0c\xdfs\xde2D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\
-\xe4\xaf_\x0e\t\xd7A\xbae\x80\xf3\xda\x86\x94NX\\\x8dr\x0bH\x8d\x0fr\x00Aj\
-\xb1I(\xd4\x85\x19l!"?\x1e\xc7\xd7M\x94\xa6#\x9d"\x08\x89oX\xf3\x05v\x01M\
-\x81"\xee\x17\t\xe7\x97")\x91M\xc7\xb8&j\xd1\x10\x9a$#?\x9cP\x17\xe5O\xa9\
-\x0f\xf5\xcd\xc0\xbc\xa6W\xc6\xd7\xady\xad\xb2=\xdf\xcc\x0c|\xfc\x19\xc07\
-\x83\xe7\xe5|\xa9\xd1k\xcc\xa1\x8a\x05\xbf\xd2\xb1\x94\x03\xc6:\x0c\xfd-b)\
-\x97\xeb\xff\xe0&\xb4P\x10\x94O9o3t\xa8\x8f\xb1\xe3i\xce\xedOq\xcd\x1dQ\x1c\
-\xe3\x0c\x05\x11D(\x0f3\xd3\x8b\x99\xe9\xc5+\x94\x10\xa8\xf9\x97O \x80\x9dZ\
-\x8aS\xd3\n\xef\x17\x92\xf0\xcbXs}\x18\xd3gQ\xb6\x03\xa8\xf9\x17\x84\x11\xa0\
-X\x7f=Z\xb8\x16\x19\xb8\t\xcb\xda\x89\x96r\xb9\xfe\xb1\x8d\x18\x91 \x00vY1mD\
-\x90\x01I\xcc\xef\xc3\x9c9\x835\xd7\x8b\xb2]\x94R`\x06\xf1\x82\xb5\x98\xc54J\
-\x81\x13o\xa7\x94\xea\xba\xa0fX\xe8\xd4zs\xe4f\x96\x81\xdb\x8d\xd0\xa0TX\xc9\
-"k\x9c\x11\x03J\xd2\xb88\x7f\xca\'\x90>\x80\x91K#\r\x89\x1bnB+L\xe0\xdbe\x84\
-i\xe1\xe8\xf5\xc8\xec$B\n\xec\x85+\xf0\xa2\xf5\x00\x18\xe9\x13\x183C \x14\
-\xe5x+\xe5\xe6\xa5\x15\x1bc=\xc2\xc9\x8a\x05\xbf\xd21\x84\x8e0k\xd0e\x0e=(0b\
-)2V\x01\x0f\xb0Ba:n[\x8b\x97\xdbNn\xb4\x97B\xe6*\x12\xd6\x18\xba9G${\x1a\xbd\
-\x9ca\xe4\xc44\x93G\xb2x\xae\x8f\x1e\xd4i\xde\x90\xa0)6B\xb1\xb8\x80Bp!RyDr\
-\xa7P\xd9Y\x06\xdf\x1a%7l#40#\x06\xb5\xd7E\xa9\x0f\x8da\x87\xd6#\x8c\x14\xba\
-\xcc\xa3\x07\xc1\x88\xa6(\x04J\xb8x\xb8A\x17\x87q"j\x84h\xae\x07J\xb3\x8c\
-\x1e\x9a$\xd3\x9b\x07\xa0yC\x92xk\x88\xf1\xa3\xb3\xe8a\x9d\xbaU\x19r\xbeC(\
-\xd7\xfb\x89\x9a\r\xe1)\xcc\x9aM\x8c\xee;\xc5\xf0\x9e}(\xdfCI\xc1\xa9m?c\xe9\
-C\xf7\x91\xd0\x06\xc19rQ\xfetU"\x168N\xef\xcf\xd3\x84\xea-\x92\xd7\x8e2\xd5\
-\x93e\xf2\xd8\x1cK\xeeO\x12\xf2~\xc4\xc0/\xc3\xc4;\x1d\x125obG\xb6"\xbd,\x01\
-\xf7E\xd2\x87\x83\x985\x1e\xf1.\x81\xa3\xfe\x08%\x8c\x8a\x8c\xb1\x1efOE\x02\
-\xff6\xa0\x91Dp;:\xd3\x08!\x10*\x84\xc9/\xf1\x98Fi\x12\xcf\xbb\x85\x05\xab\
-\xbb\xe8\xdb\xfeo\xd8\x13#\xc4R1\x12\xe51D\xa1\x89\xd3?\xd8Oab\x9c@<\x864M\
-\x9c\xfc\x0c\xa3\xbb\xd3\x14\xd3\x1d\xb4}u9\x86y\x02\xddI\xa2\xd9m\xf4\xfc\
-\xf8\x07\x14\'\xc61\xa3\x11\x8cp\x18\x84C\xbe\xcf\xa5y\xe5&4\x7f\x08A\x1b:Sx\
-v\x11{j\x16#ha\n\r-\x10\xa3\xa4\xef\x03/G\xc0\xed\xe0\xd4\xcb/\x91\x1f\x1d%\
-\x90\x88#-\x8b\xc9\x03\xe7\x18\xdfk\xe3\xbbeB\x8d\x8d\x047\xdc\x8eng\x90\x9f\
-\xa6\xb9\xeav\x94\x82`M\x84\x9azI~l\x00!%\xe1\xf8"\xf4@\x0cC\xa5\xf1/\xca\
-\xdfq\x94\xf40\x8d\xd5\xf8\xb3=\x8c\x9f\x9d`\xe6\xdd\x10\xc1\xda$\x0b\xd7\
-\xb6SS\xb7\x14\x9c0\x86\x7f\x94\xfc{\x1a\x0bW\xb4Q\xf0\x0e K>\xba\xd6Ey\xfc(\
-\xf1\xba\x06\xe25M\xe4\xd9G\xa5N\xbb\xf5\x10\xbb*\x14\xfa\xcaG\xb0\x08\xc1\
-\xdd\xe8b\x12!A\x88 \x01\xdeA\xd1\x0f\x80\xd4l\x82\xb5\xf7\x11\xb0F\xb0\'\
-\x0f\xa2\xb1\x12Ct1\xb0\xe7y\xca\x13\x07Yx\xf3V\x1an\xdc\x02\xaa\x8c[,2\xb4\
-\xe3_)\xf4\xef\xa4\x90^N\xa4s\x01\xf8u\x0c\xed\xfeo\xdc\xa9wi\xbb\xed\x11\
-\x12]\xeb\x90\x01\x1fM\x8b\xe39E\x94>\x8d\xa9w#\xdcM\xe8b\x027{\x86\xb3\xff\
-\xf9\x14\xd2\x94\x08M\xd2\xbc\xf1I\xa2K\x96\xa0\xbc,\x99S=8\xe3\x87Xx\xcb\
-\x034\xdc\xb8\x05\xa1\xfb\xf86\x0c\xbf\xf1<\xb3\xa7\xf7b\xe8\x1a\xc2lDw\xa3\
-\x0c\xed~\xf1S5\x95\xb5\x83\xd8\xd5w\x10\xebx\x923/<\x85\xd0=:\xef}\x02aM#\
-\xb5\x06\x06\xf6\xfc\xe4\xc2\xfe:\x1aQ\xd6v\x84\xb9\t]\xce`\xca\x11\xda6\xff\
-\x19\xb1\xce\x15\xf8\xa2\x1f\x15x\x07rKh\\c2\xf0\xda\x7fQ\x9a\xfd*\xc1`\x11\
-\xe5%\x99\xe9\xebAg\x84\xd4\xb2\x87 4HP\xbc\x0e\x15*\x11=0~\xe5\xed]_6t\r/\
-\x10A\xb3%R\n\xf0#X\xd3\x1a\xb8\xf3}\xaa\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\
-\xd8\xfd\x03\x84\x82\xcd4\xac{\x18\xad\xbc\x1d\xe9\xedG\x9a\x0f\xd0\xb0\xfaA\
-\x86zOP\xea\xeb#\xb6\xf8Q<O`\xf7\x9e%\x14h\xa0n\xd5\x03H\xf7G\xc8\xc2\x1e\
-\x90\t4\xa1\x833\x03\xa5$\x9e\tZ\t\xf4"X\xa1\x04\xba\x15E\x1a\x1aV0\x85\xe6\
-\xba(\xd9N\xa6\xfb_\x08\x05\x1aiX\xbb\x15\xdd\xf9)\xa2t\x04\xdfz\x9c\xba\xe5\
-\xf7P<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\xc2\x9a\xb99\xd03x\xd670U\x04\xa9\x04\
-\x9a^\x83f\xbf\x84g<~Q\xfej\xda\xb6\xa2\x15v\xe3Y14[#\x14^H\xac}\x13\xba\xf3\
-\x1dp\x8e@\xd6C\xe9%j\x96l&`\xbd\xcet\xf7\x01Z\xb6\xfe)\x9e\x9f\'{\xf8\x05\
-\x12-+1\x93\x8b\x91\xf9\x1d\x90\x05*t\x06\xa3\xb3sqE\x02\xffV\x10\xab\x87\
-\xf5c\x88\xd1 H\xc0\x1e\x83}\xf50\xab\xc0\xb0P\xeb\xd6Q\x1ax\x07u2\x84\xd5\
-\xd9\x8e\x9c\x9d\xc2\x13)\xbc\xd3\x02=\xd6\x0c\x85\x00\xf2\xc00\x14\x82h\xcd\
-i\xac\xa6[\xd0F\x9ba"\x86*$P\xc5"\xee{`$\x1a\xf1\xe7\x0c\xf4CSP\xf8\xe8Vq-\
-\xc4\xea`M\x1a1\x1a\xc0r:i\xdf\xfa\x17h\xd1\x08\xf8>\xfe\xe40\xf2\xc8\x19\
-\x9c\xd6\x058\xc7K\x18\xc9fD9\x81\xd87\x0b\xb9 \xb2m\x08\xa3\xf1\x06\xb4\x91\
-F\x84\x97\x04/\x81\xca\xa9\x0bk\xfe\xaf\xee\xdaa\xe4h\x00!\x05\x94\xd2\xd0\
-\x93\xc4_,/\xca\x1f\xf9\x04\x1ci\x81uq\x18\x8d\xcd/Q\xfd\x14tG \xd3\n\x80\
-\x08\x94\x917F\x89\xc4o$\xbb\xfb\x1d\xec\x1b\n\xd8\xe94\xe5\xa3.\x8d\xb7\xdc\
-\r\xa3y\xd8\x17\x00\xbfrsX\x1f~\xe6\xf1\x8a\x05\xbf\xd21\xda\x05\x89\xaeI\n\
-\'\x17!\xd1\xf0\xf3\xd3\xcc\xee\xdd\x0cRa\xae\xf6\xd1\xb3.\xc3\xdf\x1e\xa1p\
-\xea&\xea\xeek\xa6x\xd8\xc6\\\x91G\x956\x90=\x9d\xc1\xcb\xce\xe0\x84\x1e\xc5\
-~\xd7%\xb4\xc4b\xae{\x90\xd9]]\x04\x9b\x9a\xf0gf\x10!\xa0|3\x99]c8\x0f\x8fQR\
-\xbf\x87\xbd\xcbEo\xd11\xae\xd2\xb0\x0f\x95\xf1\xd2E\x12K\xc7\xe7s\x10\x1a\
-\x88\x02\x99\x7f\x14\xb8\x83\x02w\xb8\x0e\xad\xa9\x89\xe4\xdf\x96\xf02k)\xf4\
-\xe4(O\x8d\xe2\x04\x1e\xa2\xb8\xd7&\xbc$\xc0\xdc\x9e>fwu\x11\xba*\x85_H#\xa4\
-\x7fA\xcd\xd2\x1e\x1bc\x91O\xe2\xdaI\xf2\xc7:\x11H\xfc\xfc\x04\x99W\xd7P\xf3\
-d\xe1\xa2\xfc\xb9\x93Y\xa6\xb7}\x99\xf8u#\x14zZ\xe6\xb7y\xf3\xa3L}\xff\x0e\
-\xca\xbd\xe5\x0f\xfa84\x10 \xb6\xfaA\x86\x9f\x9d\xe3\xc4\x9flG\x15]\xac\xa6;\
-\xb0\x16\xae\'\xf3\xed\x11\x8a\xbf\xf8\xfd\x8a\x8e\xb1\xfe\xf2\xaa\xf5\x15\
-\x15\xb8\x92\xa9m\x9c\xe3nvs.U\x8bS\x94\xd4\x0f\x0f\xc3\xbd\x16\xf9i\xc8\x8e\
-:\xf4~\xcb&\x93Kq\xcd\x1f6b,-\xf3\xc6\xb6V\xae\x8b\r\x12}\xac\x93\xc3\x7f\
-\x7f\x9a\xd1\xa7w\xd3q\xfb\x02\xe4\xca \xa5\xe3yN\xbd\x9e\xa1\xd8\xdeI\xc3\
-\xc68=\xfd\x0e\x89T\x96\xf0#\x1d\x1c\xfa\x07\x9f\x89\xefv\xd3q[#\xea\x8e(\
-\xba\x05\xba\xe1\x92\xfcZ\x84\xfd;\xda\xb9U\xee\xe0\\*\tR\xa3\x93a^\x8f\xdc\
-\xc3T2\tI\x90\x9a\xe2+\x03\xfb\xd1\xefk\xe7\xf0\xf7\x06(|\x7f?\xcdk\xeb\xf1\
-\xd7\x9b\x0c\xbd\xaf\x99k\xe9 \xd9`\xd1\xee\x0e\x90\x9d1.\xa8\xf9Vt%\x02\x9b\
-\xbb\xc5+\xf4\xd5\xd5\xa2\xa4A\xbbH\xf3\x8b\xe4*V\xf5\xf7_\x9c\xbf!\x97S\x8b\
-\x97p\x97:\xc0@2\x86\x90\x92\xab\xd5 ;\xafY\xcbT<\xfcA\x1f\xc7\xe6\x04[Z]\
-\xa6o]\xcb\xd8\xf1\x11\x08\xe9\xac~p#\xb3\xb9\x1a^v\xe2\xd8\xab*\xfb1\xba~\
-\xca/TT\xe0J\xa6\xd9\x9f\xc5\xb6\xfb\x99tJLM\xe8\x0c~3\r\x9a\x8e\xed\x18(\
-\xa1\x81\x90,Z\xe6\xd2\xf5\xbby\x0e\x1e\xe9\xe0\xcd\xbe\x10\xe3z\x98\xc7\xee\
-\x1fg\xe1f\x83\xc3?\xcbq\xf2\xd9\xb3(\xa9\xe1\x0b\x83pB\xb2\xec.\x89Y7\xc6\
-\xab\xdb\x96\xd1\\\xef\xf3\xe0\x96\t\x1a\xbe\xa4qjo\x9e\x93\xcf\xf5\x7f\xd0\
-\xb6\xb6Er\xcf_\x19LjA\xec\xd2\x19&\xcba\xac\xa8\xc4\xb1\xc79[\xce1\xe6\xbf\
-\x7f\xb0\xe6\x83\xdb\x9d\xe0\xe1-9\xc2+$\x87\xf6L\xb2\xff\xed\x0cJjD\xeb\r\
-\x16\\#\x19)I\x82\x91<v\xf1,o\x1f^\xc1\xefl\xfct\xcd\x11\xbd\x05\xc7\xf1)\
-\x15z\x19\xb5k\t\xc6\x1c\xca\xf6$\xa7Kyf\x8f\\\x9c\xbf\xd7\xb6-C\xcaY\x9c\
-\xd2i\xa6\x9d\x02V\x8dA\xd9>\xc3\xd9\xf2\xd5\x8c\xf9\x1f9\xac\x9c\x80\x96\
-\x93s4ll\xe1\xf8\x89aB\t\x93\xa6\xf5\x11\xba\xdf\x99\xe6H.X\xf11\xd6\x87\x86\
-\xaa\x07\x85\x9f\x95|6O)\xdfK\xe7\r\x82rw\x08\xdb1\xf0\x85N$!\xa9ouh[j\xd3\
-\xba\xb4\xc4\x9e\xee\x0e^x\xb9\x85b)MzX!\xbd \xf7n>Dm\xbb\xc1\x99\x83A\x8a9\
-\r+*\xb8\xfe\xcbY\xc2\xb5\xf0\xdc\x7f\xdc\xc5\xd1\x9e,\x86\xae\xa1l\x9d\xfb\
-\x1f\xed\xe1\xaa\x9b4\x8e\xee\x8e03i\x11kT\xac\xf8R\x96\xbe\xfe\x14\xfb\x0f-\
-\xe1+\xab{Y\xb42BM\xbdOz\xc8\xe2\xd8\x899l\xa7\xf4A\x9e\xe9\xb4\xa26\x02\x9b\
-\x9f8\xcd\xb9\xa3\x01\x8e\xbf\x1dB3\x05k6gi\xbd*\xcf\xbe\x1dI\xa2I\x8f\xb3gj\
-\xd8\xf6\xeaz\xb2\xd3\x17\xd0<\x98#V\x93\xa5X\xe8\xa3m\xf94M\x1dEz\xcfFy\xf7\
-X\x1e\x01\x17\xed\xaf>\x95\xc1.\x1c\xa2u\x8dN\xac\xc1ghp\x92c\xc7\xa7\xb1\
-\x9d\xecy\xfd\xbcw\xbf\xcb\xfd\x9b\x1c\xf2N\x89\x96\xce\x04BN\xf2\xfa\xce\
-\x12CC\xb2\xe2c,\xd6\xaf\x7f\xadza\xea3"\x04l\xd9\xd8\xc3\xadk\xfaH%\x8b\x08\
-9\xdf\x95\xd9\xacIf\xceb|:\xc2\xcf\x7f\xb5\x84\xb3\xe7j)\xbb\xf2\xbc\xe7\x96\
-v\xce\xb2a\xd9\x08m\xcds(O\xe1\xa3\xd1\xd3\x97`\xff\xf1\x06\xfa\x06#\x1f\xb4\
-\x95R\xb1\xfc\xeai6\xae\x1e&\x15/P.K\x94\xd4y\xf7\xbdZvv7\x93\xcb\x1b\xdcy\
-\xeb\x08\xeb\xbb\xa6)\xfb\x1a\xaf\xbc\xd9\xcc\xe1\x935\x1f\xcb5`y\xdc\xbcv\
-\x9c\x1b\x96\x8f }\x17\xa9\xc1X&\xc2\x99s5lX6\x02\x08^ys1\x87O\xd6^P3\x9b3\
-\x10\x02\xee\xbcu\x8cu]S\xb8\xbe<O\xf7b\xfd\xcd\xc7\xe8gC\xd7\x08e_\xe3\xe57\
-;8|\xf2\xfc\xfb\x17\x86\x0e\x7f\xf3\xf5\x1c\xe5\xc1\x11^\xfbN?_\xfb\xa7.\xfa\
-&\xa2|\xf3\xe9\x08\x97\xe3\xaa\x9fX\xb0\xe0\xbb\xd5\x02\xf9\x7f"\x04\x84\x82\
-\x1fv\xa3\xeb\x82\xedT\xb7\xcf/\x05\xebV\x95\xf9\xde\xd33<\xf3\x97C\xb8\x9e\
-\xe0\xcf\xffy\x01O|=\xce[{/\xcfU\x02}xx\xf8\xb2\x08U\xa9\xf2Y\xb8n\xeb\x143#\
-\x19\x8e\x1d\xcc\xf3\xc8S\x01zN\xd8\xbc\xb6}\x01s\xd9\xca/\xaf`~\xf7\xbeJ\
-\x95/,\xe1\xa0M4\x9a\xe7\xbe?\x86\x8dw\xda<\xffb\xe8\xb2\x15\x07\x80~\xd9\
-\x94\xaaT\xf9\x0c<\xfb\xef\xcd\x04\xcd\x06jc>O?\'y\xe9\'\x95\xb9\x1d\xf9I\
-\x08\xf8F\xf5?H\x95*\x9f@u\x89U\xa5\xca\xa7P-\x90*U>\x85\xff\x01N\x06\x96s\
-\x10h\xbf\xfe\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory011Bitmap():
- return wxBitmapFromImage(getDocFactory011Image())
-
-def getDocFactory011Image():
- stream = cStringIO.StringIO(getDocFactory011Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory011')
-catalog['DocFactory011'] = ImageClass()
-catalog['DocFactory011'].getData = getDocFactory011Data
-catalog['DocFactory011'].getImage = getDocFactory011Image
-catalog['DocFactory011'].getBitmap = getDocFactory011Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory012Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r]\
-IDATx\x9c\xed\x9bip]\xd5}\xc0\x7f\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\
-\xb6\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em?\xe4c\xa6\x93\xe9L\
-\xa7\x0b\xd3L\x06\xc8R\xa6\xd3\x0e%\xa5q\x12\x08abCblp\x1cy\xc3x\x95\xb1-\
-\xc9Z\x9ev\xe9Io\xbd\xf7\xdd{O?\x88\x18\\\x02\x16\x1d$\x88\xe7\xfd>\xbe9\xf7\
-\xfe\xfe\xffs\xce\x7f\xdey\xe7\xbc#\xfe\xe1[JQ\xa1B\x85\xdf\x8a\x1e\xaa\xfe\
-\xbcC\xa8P\xe1\x8b\x8b\x1e\xac\x14H\x85\n\x1f\x8b\x1eN|\xde!\xfcn"P\x18\xd8H\
-\xbcK>w1p1\x17.\x06a\xa3\xfd\x9f\x18\x14PV\x01<\xb4y\xf1J|LQ\xc2GRV\x16\n1/\
-\x9e/\x02z(\xfey\x87\xf0\xbb\x87\xc0\xa7\xa1\xb0\x87\xa8{\x01\xffCsSJ\x90\
-\xa6N\xde\x8d\x93\x0b\xb63\xa3/\xc1%0O1x4\xd9oP\xe5\xf5\\\x12\x03\x80n)l\xad\
-\x86nm\x1beB\x9f\xa9W\xc3a\xa9\xfb3\x02\xe5\x114C0&W\x90\x967~\xa6\x8e/\x12z\
-\xb8R \x9f\x1a\x8bQ\x9a\xf4g8\xfbj-\xd3\x83\x11@\x80\x94H]\x11\xae)\x12\xa9/\
-\xd2\xb6r\x12\xc7ZB_\xf0oq\xa8\xfb\xccc\x082LS\xf1EN\xff$\xcet:\x00B\x80\x90\
-\x00\xc4\x1amV\xdc\xff\x16E\xa3\x9e\tn\xfeL\xbd!\x86i\xb0\x7f\xc4\x89\x1f\
-\xa5\x88-.\xd1\xb2\xee\x08\x85\xe0\xb5\x94\xb92\'\x92\x1e\xb92\xf3\x9aWBJ\
-\x90\xd0\xd6 \xfc"RS\x04\xe3\x02# P\x08J\xf9 \xa3\xa7%\xf9\xd1fV\xde%1\x8d_\
-\xd3\x1f\xbe\xe7\x92e\x88\xf0=\x84[F\xf8\x1eJj(\xdd@\xc9\xdf\xbe\x1c\x12\xae\
-\x83t\xcb\x00\x97\xb4\r)\x9d\xb0\xb8\x1a\xe5\x16\x90\x1a\x17c\x00Aj\xa9I(\
-\xd4\x81\x19l""?\xfa\x1e_7Q\x9a\x8et\x8a $\xbea\xcd\x16\xd8e\x9c\x02E\xdc/\
-\x12\xce/GR"\x9b\x8eqM\xd4\xa2.4NF~0\x91\xe6\x94\x9fR\x1f\xf8\xcd\xc0\xac\
-\xd3+\xe3\xeb\xd6\xac\xabl\xcf63\x03\x1f}\x06\xf0\xcd\xe0%1\xcf\x17z\x9590\
-\xef\x92+\rK9`l\xc0\xd0\xdf"\x96r\xb9\xfe\x8fnB\x0b\x05A\xf9\x94\xf36\x03Gz\
-\x189\x99\xe6\xc2\xc1\x14\xd7\xdc\x11\xc51\xceQ\x10A\x84\xf203\xdd\x98\x99n\
-\xbcB\t\x81\x9a\xfd\xf2\t\x04\xb0S\xcbq\xaa\x9a\xe1\xfdB\x12~\x19k\xa6\x07c\
-\xf2<\xcav\x005\xfb\x05a\x04(\xd6^\x8f\x16\xaeF\x06n\xc2\xb2v\xa3\xa5\\\xae\
-\x7fl3F$\x08\x80]VL\x1a\x11d@\x12\xf3{0\xa7\xcea\xcdt\xa3l\x17\xa5\x14\x98A\
-\xbc`5f1\x8dR\xe0\xc4[)\xa5:.\xeb\x0c\x0b\x9djo\x86\xdc\xd4\np;\x11\x1a\x94\
-\n\xabYb\x8d2d@I\x1as\xcbO\xf9\x04\xd2\x870ri\xa4!q\xc3\rh\x851|\xbb\x8c0-\
-\x1c\xbd\x16\x99\x1dGH\x81\xbdx\x15^\xb4\x16\x00#}\ncj\x00\x84\xa2\x1co\xa6\
-\xdc\xb8|\xde\xc7Z\x8fpz\xde%W\x1a\x86\xd0\x11f\x15\xba\xcc\xa1\x07\x05F,E\
-\xc6*\xe0\x01V(L\xdbm\xeb\xf1r;\xc9\rwS\xc8\\E\xc2\x1aA7g\x88d\xcf\xa2\x973\
-\x0c\x9d\x9ad\xfcX\x16\xcf\xf5\xd1\x83:\x8d\x9b\x124\xc4\x86(\x16\x17Q\x08.F\
-*\x8fH\xee\x0c*;M\xff[\xc3\xe4\x06m\x84\x06f\xc4\xa0\xfa\xba(\xb5\xa1\x11\
-\xec\xd0F\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\x17\x0f7\xe8\xe20JD\r\x11\
-\xcduAi\x9a\xe1#\xe3d\xba\xf3\x004nJ\x12o\x0e1z|\x1a=\xacS\xb3&C\xcew\x08\
-\xe5\xba?\xd6Y\x17\x9e\xc0\xac\xda\xc2\xf0\x813\x0c\xee;\x80\xf2=\x94\x14\
-\x9c\xd9\xf1s\x96?t\x1f\t\xad\x1f\x9ccs\xcaOW%b\x81\x93t\xff"M\xa8\xd6"y\xed\
-0\x13]Y\xc6O\xcc\xb0\xec\xfe$!\xef\xc7\xf4\xfd*L\xbc\xdd!Q\xf5&vd;\xd2\xcb\
-\x12p_$}4\x88Y\xe5\x11\xef\x108\xeaOP\xc2\x98\xd7\xb1\xd6\xc3\xec\x9bW\xc1\
-\x95\x88F\x12\xc1\xed\xe8L"\x84@\xa8\x10&\xbf\xc2c\x12\xa5I<\xef\x16\x16\xad\
-\xed\xa0g\xe7\xbfc\x8f\r\x11K\xc5H\x94G\x10\x85\x06\xce\xfe\xf0 \x85\xb1Q\
-\x02\xf1\x18\xd24q\xf2S\x0c\xefMSL\xb7\xd1\xf2\xd5\x95\x18\xe6)t\'\x89f\xb7\
-\xd0\xf5\x93\x1fR\x1c\x1b\xc5\x8cF0\xc2a\x10\x0e\xf9\x1e\x97\xc6\xd5[\xd0\
-\xfc\x01\x04-\xe8L\xe0\xd9E\xec\x89i\x8c\xa0\x85)4\xb4@\x8c\x92~\x00\xbc\x1c\
-\x01\xb7\x8d3/\xbfD~x\x98@"\x8e\xb4,\xc6\x0f]`t\xbf\x8d\xef\x96\t\xd5\xd7\
-\x13\xdct;\xba\x9dA~\x92s\xcd\xed(\x05\xc1\xaa\x08U\xb5\x92\xfcH\x1fBJ\xc2\
-\xf1%\xe8\x81\x18\x86J\xe3\xcf)\xbf\x93(\xe9a\x1ak\xf1\xa7\xbb\x18=?\xc6\xd4\
-\xbb!\x82\xd5I\x16\xafo\xa5\xaaf98a\x0c\xff8\xf9\xf74\x16\xafj\xa1\xe0\x1dB\
-\x96|t\xad\x83\xf2\xe8q\xe25u\xc4\xab\x1a\xc8s\x80\xf9>\xe5\xd6C\xec\x99g\
-\xc5\x95\x87`\t\x82\xbb\xd1\xc58B\x82\x10A\x02\xbc\x83\xa2\x17\x00\xa9\xd9\
-\x04\xab\xef#`\ra\x8f\x1fFc5\x86\xe8\xa0o\xdf\xf3\x94\xc7\x0e\xb3\xf8\xe6\
-\xed\xd4\xdd\xb8\rT\x19\xb7Xd`\xd7\xbfQ\xe8\xddM!\xbd\x92H\xfb"\xf0k\x18\xd8\
-\xfb?\xb8\x13\xef\xd2r\xdb#$:6 \x03>\x9a\x16\xc7s\x8a(}\x12S\xefD\xb8[\xd0\
-\xc5\x18n\xf6\x1c\xe7\xff\xeb)\xa4)\x11\x9a\xa4q\xf3\x93D\x97-CyY2g\xbapF\
-\x8f\xb0\xf8\x96\x07\xa8\xbbq\x1bB\xf7\xf1m\x18|\xe3y\xa6\xcf\xee\xc7\xd05\
-\x84Y\x8f\xeeF\x19\xd8\xfb\xe2\':\x95\xb5\x8b\xd8\xd5w\x10k{\x92s/<\x85\xd0=\
-\xda\xef}\x02aM"\xb5:\xfa\xf6\xfd\xf4\xf2\xf9\xb5\xd5\xa3\xac\x9d\x08s\x0b\
-\xba\x9c\xc2\x94C\xb4l\xfd\x0bb\xed\xab\xf0E/*\xf0\x0e\xe4\x96Q\xbf\xce\xa4\
-\xef\xb5\xff\xa64\xfdU\x82\xc1"\xcaK2\xd5\xd3\x85\xce\x10\xa9\x15\x0fA\xa8\
-\x9f\xa0x\x1d\xe6\xb9D\xf4\xc0\xe8\x95\xbb\x87=o\xe8\x1a^ \x82fK\xa4\x14\xe0\
-G\xb0&5pg\xfbRYq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\x05\x1b\xa9\xdb\
-\xf00Zy\'\xd2;\x884\x1f\xa0n\xed\x83\x0ct\x9f\xa2\xd4\xd3Cl\xe9\xa3x\x9e\xc0\
-\xee>O(PG\xcd\x9a\x07\x90\xee\x8f\x91\x85} \x13hB\x07g\nJI<\x13\xb4\x12\xe8E\
-\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7w\x08\x05\xea\xa9[\xbf\x1d\xdd\xf9\
-\x19\xa2t\x0c\xdfz\x9c\x9a\x95\xf7P<u\x10\xdd\xd1\x11*\x01^\xe0\xf2\xce\xdc\
-\x0c\xe8\x19<\xeb\x1b\x98*\x82T\x02M\xafB\xb3_\xc23\x1e\x9fS~U-\xdb\xd1\n{\
-\xf1\xac\x18\x9a\xad\x11\n/&\xd6\xba\x05\xdd\xf9.8\xc7 \xeb\xa1\xf4\x12U\xcb\
-\xb6\x12\xb0^g\xb2\xf3\x10M\xdb\xff\x1c\xcf\xcf\x93=\xfa\x02\x89\xa6\xd5\x98\
-\xc9\xa5\xc8\xfc.\xc8\x02\xf3|\x06\xa3\xb3{\xe9\xbc\n\xaeHb\xb5\xb0q\x041\
-\x1c\x04\t\xd8#p\xa0\x16\xa6\x15\x18\x16j\xc3\x06J}\xef\xa0N\x87\xb0\xda[\
-\x91\xd3\x13x"\x85wV\xa0\xc7\x1a\xa1\x10@\x1e\x1a\x84B\x10\xad1\x8d\xd5p\x0b\
-\xdap#\x8c\xc5P\x85\x04\xaaX\xc4}\x0f\x8cD=\xfe\x8c\x81~d\x02\n\x1f\xde*\xae\
-\x86X\r\xacK#\x86\x03XN;\xad\xdb\xff\n-\x1a\x01\xdf\xc7\x1f\x1fD\x1e;\x87\
-\xd3\xbc\x08\xe7d\t#\xd9\x88(\'\x10\x07\xa6!\x17D\xb6\x0c`\xd4\xdf\x806T\x8f\
-\xf0\x92\xe0%P9uy\xe7o\xbc\xeb\x07\x91\xc3\x01\x84\x14PJCW\x12\x7f\xa9\x9cS~\
-\xe4\x13p\xac\t6\xc4a86\xbbD\xf5S\xd0\x19\x81L3\x00"PF\xde\x18%\x12\xbf\x91\
-\xec\xdew\xb0o(`\xa7\xd3\x94\x8f\xbb\xd4\xdfr7\x0c\xe7\xe1@\x00\xfc\xf9\x9f\
-\xbb\xfa\xe03\x8f\xcf\xbb\xe4J\xc3h\x15$:\xc6)\x9c^\x82D\xc3\xcfO2\xbd\x7f+H\
-\x85\xb9\xd6G\xcf\xba\x0c~{\x88\xc2\x99\x9b\xa8\xb9\xaf\x91\xe2Q\x1bsU\x1eU\
-\xdaD\xf6l\x06/;\x85\x13z\x14\xfb]\x97\xd02\x8b\x99\xce~\xa6\xf7t\x10lh\xc0\
-\x9f\x9aB\x84\x80\xf2\xcdd\xf6\x8c\xe0<<BI\xfd\x01\xf6\x1e\x17\xbdI\xc7\xb8J\
-\xc3>R\xc6K\x17I,\x1f\x9d\x8dAh \nd\xfeY\xe0\xf6\x0b\xdc\xc1\x1a\xb4\x86\x06\
-\x92\x7f_\xc2\xcb\xac\xa7\xd0\x95\xa3<1\x8c\x13x\x88\xe2~\x9b\xf0\xb2\x003\
-\xfbz\x98\xde\xd3A\xe8\xaa\x14~!\x8d\x90\xfee\x9d\xa5}6\xc6\x12\x9f\xc4\xb5\
-\xe3\xe4O\xb4#\x90\xf8\xf912\xaf\xae\xa3\xea\xc9\xc2\x9c\xf2s\xc7\xb3L\xee\
-\xf82\xf1\xeb\x86(t5\xcdn\xf3\xe6\x87\x99\xf8\xc1\x1d\x94\xbb\xcb\x17\xfb8\
-\xd4\x17 \xb6\xf6A\x06\x9f\x9d\xe1\xd4\x9f\xedD\x15]\xac\x86;\xb0\x16o$\xf3\
-\xed!\x8a\xbf\xfc\xc3\x05\x19k\xfd\xe55\x1b\x17Dt%Q]?\xc3\xdd\xec\xe5B\xaa\
-\x1a\xa7(\xa9\x1d\x1c\x84{-\xf2\x93\x90\x1dv\xe8\xfe\x96M&\x97\xe2\x9a?\xae\
-\xc7X^\xe6\x8d\x1d\xcd\\\x17\xeb\'\xfaX;G\xff\xf1,\xc3O\xef\xa5\xed\xf6E\xc8\
-\xd5AJ\'\xf3\x9cy=C\xb1\xb5\x9d\xba\xcdq\xbaz\x1d\x12\xa9,\xe1G\xda8\xf2O>c\
-\xdf\xeb\xa4\xed\xb6z\xd4\x1dQt\x0bt\xc3%\xf9\xb5\x08\x07w\xb5r\xab\xdc\xc5\
-\x85T\x12\xa4F;\x83\xbc\x1e\xb9\x87\x89d\x12\x92 5\xc5W\xfa\x0e\xa2\xdf\xd7\
-\xca\xd1\xef\xf7Q\xf8\xc1A\x1a\xd7\xd7\xe2o4\x19x\xdf\x99kj#Yg\xd1\xea\xf6\
-\x91\x9d2.\xeb|+\xba\x1a\x81\xcd\xdd\xe2\x15zj\xaaQ\xd2\xa0U\xa4\xf9er\rkz{\
-\xe7\x96\xdf\x80\xcb\x99\xa5\xcb\xb8K\x1d\xa2/\x19CH\xc9\xd5\xaa\x9f\xdd\xd7\
-\xacg"\x1e\xbe\xd8\xc7\xb1\x19\xc1\xb6f\x97\xc9[\xd73rr\x08B:k\x1f\xdc\xcct\
-\xae\x8a\x97\x9d8\xf6\x9a\x85\xf9\x13\xba~\xc6/,\x88\xe8J\xa2\xd1\x9f\xc6\
-\xb6{\x19wJL\x8c\xe9\xf4\x7f3\r\x9a\x8e\xed\x18(\xa1\x81\x90,Y\xe1\xd2\xf1\
-\xfby\x0e\x1fk\xe3\xcd\x9e\x10\xa3z\x98\xc7\xee\x1fe\xf1V\x83\xa3?\xcfq\xfa\
-\xd9\xf3(\xa9\xe1\x0b\x83pB\xb2\xe2.\x89Y3\xc2\xab;V\xd0X\xeb\xf3\xe0\xb61\
-\xea\xbe\xa4qf\x7f\x9e\xd3\xcf\xf5^l[\xdd$\xb9\xe7o\x0c\xc6\xb5 v\xe9\x1c\
-\xe3\xe50VT\xe2\xd8\xa3\x9c/\xe7\x18\xf1\xdf?X\xf3\xc1\xedL\xf0\xf0\xb6\x1c\
-\xe1U\x92#\xfb\xc69\xf8v\x06%5\xa2\xb5\x06\x8b\xae\x91\x0c\x95$\xc1H\x1e\xbb\
-x\x9e\xb7\x8f\xae\xe2\xf76\x7f\xb2sHo\xc2q|J\x85n\x86\xedj\x821\x87\xb2=\xce\
-\xd9R\x9e\xe9cs\xcb\xef\xb5\x1d+\x90r\x1a\xa7t\x96I\xa7\x80UeP\xb6\xcfq\xbe|\
-5#\xfe\x87\x0e+\xc7\xa0\xe9\xf4\x0cu\x9b\x9b8yj\x90P\xc2\xa4ac\x84\xcew&9\
-\x96\x0b.\xd8X\xeb\x03\x03\x95\x83\xc2OK>\x9b\xa7\x94\xef\xa6\xfd\x06A\xb93\
-\x84\xed\x18\xf8B\'\x92\x90\xd46;\xb4,\xb7i^^b_g\x1b/\xbc\xdcD\xb1\x94&=\xa8\
-\x90^\x90{\xb7\x1e\xa1\xba\xd5\xe0\xdc\xe1 \xc5\x9c\x86\x15\x15\\\xff\xe5,\
-\xe1jx\xee?\xef\xe2xW\x16C\xd7P\xb6\xce\xfd\x8fvq\xd5M\x1a\xc7\xf7F\x98\x1a\
-\xb7\x88\xd5+V})KOo\x8a\x83G\x96\xf1\x95\xb5\xdd,Y\x1d\xa1\xaa\xd6\'=`q\xe2\
-\xd4\x0c\xb6S\xba\x18g:\xad\xa8\x8e\xc0\xd6\'\xcer\xe1x\x80\x93o\x87\xd0L\
-\xc1\xba\xadY\x9a\xaf\xcas`W\x92h\xd2\xe3\xfc\xb9*v\xbc\xba\x91\xec\xe4e\x9c\
-\x87s\xc4\xaa\xb2\x14\x0b=\xb4\xac\x9c\xa4\xa1\xadH\xf7\xf9(\xef\x9e\xc8#`\
-\xce\xf9\xd5\xa62\xd8\x85#4\xaf\xd3\x89\xd5\xf9\x0c\xf4\x8fs\xe2\xe4$\xb6\
-\x93\xbd\xa4\x9f\xf7\x1ft\xb9\x7f\x8bC\xde)\xd1\xd4\x9e@\xc8q^\xdf]b`@.\xd8X\
-\x8b\x8d\x1b_\xab\\\x98\xfa\x94\x08\x01\xdb6wq\xeb\xba\x1eR\xc9"B\xceva6k\
-\x92\x99\xb1\x18\x9d\x8c\xf0\x8b_/\xe3\xfc\x85j\xca\xae\xbc\xe4\xb9\xe5\xed\
-\xd3lZ1DK\xe3\x0c\xcaS\xf8ht\xf5$8x\xb2\x8e\x9e\xfe\xc8\xc5\xb6R*V^=\xc9\xe6\
-\xb5\x83\xa4\xe2\x05\xcae\x89\x92:\xef\xbeW\xcd\xee\xceFry\x83;o\x1dbc\xc7$e\
-_\xe3\x957\x1b9z\xba\xea#\xb1\x06,\x8f\x9b\xd7\x8fr\xc3\xca!\xa4\xef"5\x18\
-\xc9D8w\xa1\x8aM+\x86\x00\xc1+o.\xe5\xe8\xe9\xea\xcb:\xb39\x03!\xe0\xce[G\
-\xd8\xd01\x81\xeb\xcbK\xbcs\xcdo\xf6\x1d\xbdl\xea\x18\xa2\xeck\xbc\xfcf\x1bG\
-O_z\xef\xc2\xd0\xe1\xef\xbe\x9e\xa3\xdc?\xc4k\xdf\xed\xe5k\xff\xd2A\xcfX\x94\
-o>\x1da!\xaf\xf8\x89E\x8b\xbeW)\x90\xff\'B@(\xf8A\xf7\xb9.\xd8Ne\xdb\xfc\xb3\
-`\xc3\x9a2\xdf\x7fz\x8ag\xfez\x00\xd7\x13\xfc\xe5\xbf.\xe2\x89\xaf\xc7yk\xff\
-\xc2\\%\xf8\r\xfa\xe0\xe0\xe0\x82\n+T\x98\x0b\xd7m\x9f`j(\xc3\x89\xc3y\x1ey*\
-@\xd7)\x9b\xd7v.b&\xbbp\xcb+\x98\xdd\xc5\xafP\xe1\x0bG8h\x13\x8d\xe6\xb9\xef\
-Oa\xf3\x9d6\xcf\xbf\x18Z\xf0\xe2\x00\xd0\x17\xdcX\xa1\xc2\x1cx\xf6?\x1a\t\
-\x9auT\xc7|\x9e~N\xf2\xd2O\xe7\xe7v\xe4\xe5\x10\xf0\x8d\xcao\x90\n\x15>\x86\
-\xca\x12\xabB\x85O\xa0R \x15*|\x02\xff\x0b2\x9a\x96s\xa7\x89\xfa\x81\x00\x00\
-\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory012Bitmap():
- return wxBitmapFromImage(getDocFactory012Image())
-
-def getDocFactory012Image():
- stream = cStringIO.StringIO(getDocFactory012Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory012')
-catalog['DocFactory012'] = ImageClass()
-catalog['DocFactory012'].getData = getDocFactory012Data
-catalog['DocFactory012'].getImage = getDocFactory012Image
-catalog['DocFactory012'].getBitmap = getDocFactory012Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory013Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r]\
-IDATx\x9c\xed\x9bil\\\xc7}\xc0\x7f3\xef\xda\x93{pyJ$%\x92\xb2-\x9b\x92\xac[>\
-\x95\xc8N\\\xc9G}\xa9>Z\xbb(Z\x04Em\xb4p\xdb\x0f\xf9\x18\x14A\x81\xa2\x87\
-\xd1 \xb0\x9d\xa3F\xd1\xc2u\xeaFI\xec8F$;\x91%[Q\xa8\xcb\xb2N\xca\x92H\x8a\
-\xc7\xf2&\x97\xdc\xf3\xbd}\xefM?\xd0\x95\xad\xf8\x10\x0b\xc8\x94%\xec\xef\
-\xe3b\xde\xfb\xfd\xff3\xf3\xc7\xce\xce\xec\x88\x7f\xf8\x8eRT\xa8P\xe1S\xd1C\
-\xd5\x97;\x84\n\x15\xbe\xbc\xe8\xc1J\x81T\xa8\xf0\x99\xe8\xe1\xc4\xe5\x0e\
-\xe1\xcaB\xa00\xb0\x91x\x17|\xeeb\xe0b\xce_\x0c\xc2F\xfb\x9d\x18\x14PV\x01<\
-\xb4/\xc4+\xf11E\t\x1fIYY(\xc4\x17\xe2\xf92\xa1\x87\xe2\x97;\x84+\x07\x81OCa\
-\x17Q\xf7\x1c\xfe\xc7\xe6\xa6\x94 M\x9d\xbc\x1b\'\x17lgF_\x84K\xe0\x0b\x8a\
-\xc1\xa3\xc9~\x8b*\xaf\xe7\x82\x18\x00tKak5tk[(\x13\xba\xa4^\r\x87\xc5\xee/\
-\x08\x94G\xd0\x0c\xc1\x98\\FZ\xde|I\x1d_F\xf4p\xa5@\xe6\x8c\xc5(M\xfas\x9c~\
-\xbd\x96\xe9\xc1\x08 @J\xa4\xae\x08\xd7\x14\x89\xd4\x17i[>\x89c-\xa2/\xf8\
-\xb78\xd4]\xf2\x18\x82\x0c\xd3T|\x99\x93?\x8b3\x9d\x0e\x80\x10 $\x00\xb1F\
-\x9be\x0f\xbeC\xd1\xa8g\x82[/\xa97\xc40\r\xf6O8\xf6\x93\x14\xb1\x85%Z\xd6\
-\x1c\xa2\x10\xbc\x9e2W\xf7\x04\xd2#Ww~\x97\x94\x90\x12$\xb4U\x08\xbf\x88\xd4\
-\x14\xc1\xb8\xc0\x08\x08\x14\x82R>\xc8\xe8II~\xb4\x99\xe5\xf7HL\xe3\xb7\xf4\
-\x87\xef\xbb`\x19"|\x0f\xe1\x96\x11\xbe\x87\x92\x1aJ7P\xf2\xd3\x97C\xc2u\x90\
-n\x19\xe0\x82\xb6!\xa5\x13\x16\xd7\xa2\xdc\x02R\xe3|\x0c H-6\t\x85:0\x83MD\
-\xe4\'\xdf\xe3\xeb&J\xd3\x91N\x11\x84\xc47\xac\xd9\x02\xbb\x88S\xa0\x88\xfbE\
-\xc2\xf9\xa5HJd\xd31\xae\x8bZ\xd4\x85\xc6\xc9\xc8\x8f&\xd0\x9c\xf2S\xea#\xbf\
-\x19\x98uze|\xdd\x9au\x95\xed\xd9ff\xe0\x93\xcf\x00\xbe\x19\xbc \xe6/\x1a\
-\xbd\xca\x1c\x987\xd9\x95\x8e\xa5\x1c0\xd6a\xe8\xef\x10K\xb9\xdc\xf8G\xb7\
-\xa0\x85\x82\xa0|\xcay\x9b\x81C=\x8c\x1cOsn\x7f\x8a\xeb\xee\x8a\xe2\x18g(\
-\x88 By\x98\x99n\xccL7^\xa1\x84@\xcd~\xf9\x04\x02\xd8\xa9\xa58U\xcd\xf0a!\t\
-\xbf\x8c5\xd3\x831y\x16e;\x80\x9a\xfd\x820\x02\x14koD\x0bW#\x03\xb7`Y;\xd1R.\
-7>\xb1\x11#\x12\x04\xc0.+&\x8d\x082 \x89\xf9=\x98Sg\xb0f\xbaQ\xb6\x8bR\n\xcc\
- ^\xb0\x1a\xb3\x98F)p\xe2\xad\x94R\x1d\x17u\x86\x85N\xb57Cnj\x19\xb8\x9d\x08\
-\rJ\x85\x95,\xb2F\x192\xa0$\x8d\xb9\xe5\xa7|\x02\xe9\x03\x18\xb94\xd2\x90\
-\xb8\xe1\x06\xb4\xc2\x18\xbe]F\x98\x16\x8e^\x8b\xcc\x8e#\xa4\xc0^\xb8\x02/Z\
-\x0b\x80\x91>\x8115\x00BQ\x8e7Sn\\:oc\xaeG89o\xb2+\x1dC\xe8\x08\xb3\n]\xe6\
-\xd0\x83\x02#\x96"c\x15\xf0\x00+\x14\xa6\xed\x8e\xb5x\xb9\xed\xe4\x86\xbb)d\
-\xae!a\x8d\xa0\x9b3D\xb2\xa7\xd1\xcb\x19\x86NL2~$\x8b\xe7\xfa\xe8A\x9d\xc6\r\
-\t\x1abC\x14\x8b\x0b(\x04\x17"\x95G$w\n\x95\x9d\xa6\xff\x9dar\x836B\x033bP}C\
-\x94\xda\xd0\x08vh=\xc2H\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18%\
-\xa2\x86\x88\xe6\xba\xa04\xcd\xf0\xa1q2\xddy\x00\x1a7$\x897\x87\x18=:\x8d\
-\x1e\xd6\xa9Y\x95!\xe7;\x84r\xdd\x9f\xe9\xac\x0bO`Vmbx\xdf)\x06\xf7\xecC\xf9\
-\x1eJ\nNm\xfb%K\x1fy\x80\x84\xd6\x0f\xce\x919\xe5\xa7\xab\x12\xb1\xc0q\xba\
-\x7f\x95&Tk\x91\xbc~\x98\x89\xae,\xe3\xc7fX\xf2`\x92\x90\xf7S\xfa~\x13&\xde\
-\xee\x90\xa8z\x1b;\xb2\x15\xe9e\t\xb8/\x93>\x1c\xc4\xac\xf2\x88w\x08\x1c\xf5\
-\'(a\xcc\xcb\x98\xeba\xf6\xcc\x8b\xe8j@#\x89\xe0Nt&\x11B T\x08\x93\xdf\xe01\
-\x89\xd2$\x9ew\x1b\x0bVw\xd0\xb3\xfd\xdf\xb1\xc7\x86\x88\xa5b$\xca#\x88B\x03\
-\xa7\x7f\xbc\x9f\xc2\xd8(\x81x\x0ci\x9a8\xf9)\x86w\xa7)\xa6\xdbh\xf9\xfar\
-\x0c\xf3\x04\xba\x93D\xb3[\xe8\xfa\xd9\x8f)\x8e\x8dbF#\x18\xe10\x08\x87|\x8f\
-K\xe3\xcaMh\xfe\x00\x82\x16t&\xf0\xec"\xf6\xc44F\xd0\xc2\x14\x1aZ FI\xdf\x07\
-^\x8e\x80\xdb\xc6\xa9W_!?<L \x11GZ\x16\xe3\x07\xce1\xba\xd7\xc6w\xcb\x84\xea\
-\xeb\tn\xb8\x13\xdd\xce ?\xcf\xb9\xeaN\x94\x82`U\x84\xaaZI~\xa4\x0f!%\xe1\
-\xf8"\xf4@\x0cC\xa5\xf1\xe7\x94\xdfq\x94\xf40\x8d\xd5\xf8\xd3]\x8c\x9e\x1dc\
-\xea\xfd\x10\xc1\xea$\x0b\xd7\xb6RU\xb3\x14\x9c0\x86\x7f\x94\xfc\x07\x1a\x0b\
-W\xb4P\xf0\x0e K>\xba\xd6Ay\xf4(\xf1\x9a:\xe2U\r\xe4\xd9\xc7|\x9dn\xeb!v\xcd\
-\x93\xea\xcaG\xb0\x08\xc1\xbd\xe8b\x1c!A\x88 \x01\xdeC\xd1\x0b\x80\xd4l\x82\
-\xd5\x0f\x10\xb0\x86\xb0\xc7\x0f\xa2\xb1\x12Ct\xd0\xb7\xe7E\xcac\x07Yx\xebV\
-\xean\xde\x02\xaa\x8c[,2\xb0\xe3\xdf(\xf4\xee\xa4\x90^N\xa4}\x01\xf85\x0c\
-\xec\xfe\x1f\xdc\x89\xf7i\xb9\xe31\x12\x1d\xeb\x90\x01\x1fM\x8b\xe39E\x94>\
-\x89\xa9w"\xdcM\xe8b\x0c7{\x86\xb3\xff\xf5\x0c\xd2\x94\x08M\xd2\xb8\xf1i\xa2\
-K\x96\xa0\xbc,\x99S]8\xa3\x87Xx\xdbC\xd4\xdd\xbc\x05\xa1\xfb\xf86\x0c\xbe\
-\xf5"\xd3\xa7\xf7b\xe8\x1a\xc2\xacGw\xa3\x0c\xec~\xf9s\x9d\xca\xdaA\xec\xda\
-\xbb\x88\xb5=\xcd\x99\x97\x9eA\xe8\x1e\xed\xf7?\x85\xb0&\x91Z\x1d}{~~\xf1\
-\xfc\xda\xeaQ\xd6v\x84\xb9\t]Na\xca!Z6\xff\x05\xb1\xf6\x15\xf8\xa2\x17\x15x\
-\x0frK\xa8_c\xd2\xf7\xc6\x7fS\x9a\xfe:\xc1`\x11\xe5%\x99\xea\xe9Bg\x88\xd4\
-\xb2G \xd4OP\xbc\t\xf3T"z`\xf4\xea\xdf\xcb\xbed\xe8\x1a^ \x82fK\xa4\x14\xe0G\
-\xb0&5pg\xfbPYq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\x05\x1b\xa9[\xf7\
-(Zy;\xd2\xdb\x8f4\x1f\xa2n\xf5\xc3\x0ct\x9f\xa0\xd4\xd3Cl\xf1\xe3x\x9e\xc0\
-\xee>K(PG\xcd\xaa\x87\x90\xeeO\x91\x85= \x13hB\x07g\nJI<\x13\xb4\x12\xe8E\
-\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7\xf7\x08\x05\xea\xa9[\xbb\x15\xdd\
-\xf9\x05\xa2t\x04\xdfz\x92\x9a\xe5\xf7Q<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\xe2\
-\xce\xdc\x0c\xe8\x19<\xeb[\x98*\x82T\x02M\xafB\xb3_\xc13\x9e\x9cS~U-[\xd1\n\
-\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\xf9>8G \xeb\xa1\xf4\x12UK6\
-\x13\xb0\xded\xb2\xf3\x00M[\xff\x1c\xcf\xcf\x93=\xfc\x12\x89\xa6\x95\x98\xc9\
-\xc5\xc8\xfc\x0e\xc8\x02\xf3t\x06\xa3\xb3s\xf1\xbc\x88\xae\nb\xb5\xb0~\x041\
-\x1c\x04\t\xd8#\xb0\xaf\x16\xa6\x15\x18\x16j\xdd:J}\xef\xa1N\x86\xb0\xda[\
-\x91\xd3\x13x"\x85wZ\xa0\xc7\x1a\xa1\x10@\x1e\x18\x84B\x10\xad1\x8d\xd5p\x1b\
-\xdap#\x8c\xc5P\x85\x04\xaaX\xc4\xfd\x00\x8cD=\xfe\x8c\x81~h\x02\n\x1f\xdf*\
-\xae\x86X\r\xacI#\x86\x03XN;\xad[\xff\n-\x1a\x01\xdf\xc7\x1f\x1fD\x1e9\x83\
-\xd3\xbc\x00\xe7x\t#\xd9\x88(\'\x10\xfb\xa6!\x17D\xb6\x0c`\xd4\xdf\x846T\x8f\
-\xf0\x92\xe0%P9uq\xe7\xffy\xd7\x0e"\x87\x03\x08)\xa0\x94\x86\xae$\xfeb9\xa7\
-\xfc\xc8\'\xe0H\x13\xac\x8b\xc3plv\x89\xea\xa7\xa03\x02\x99f\x00D\xa0\x8c\
-\xbc9J$~3\xd9\xdd\xefa\xdfT\xc0N\xa7)\x1fu\xa9\xbf\xed^\x18\xce\xc3\xbe\x00\
-\xf8\xf37g\xf5\xc1\xe7\x9e\x9c7\xd9\x95\x8e\xd1*Ht\x8cS8\xb9\x08\x89\x86\x9f\
-\x9fdz\xeff\x90\ns\xb5\x8f\x9eu\x19\xfc\xee\x10\x85S\xb7P\xf3@#\xc5\xc36\xe6\
-\x8a<\xaa\xb4\x81\xec\xe9\x0c^v\n\'\xf48\xf6\xfb.\xa1%\x163\x9d\xfdL\xef\xea\
- \xd8\xd0\x80?5\x85\x08\x01\xe5[\xc9\xec\x1a\xc1yt\x84\x92\xfa\x03\xec].z\
-\x93\x8eq\x8d\x86}\xa8\x8c\x97.\x92X::\x1b\x83\xd0@\x14\xc8\xfc\xb3\xc0\xed\
-\x17\xb8\x835h\r\r$\xff\xbe\x84\x97YK\xa1+Gyb\x18\'\xf0\x08\xc5\xbd6\xe1%\
-\x01f\xf6\xf40\xbd\xab\x83\xd05)\xfcB\x1a!\xfd\x8b:K{l\x8cE>\x89\xeb\xc7\xc9\
-\x1fkG \xf1\xf3cd^_C\xd5\xd3\x859\xe5\xe7\x8eg\x99\xdc\xf6U\xe27\x0cQ\xe8j\
-\x9a\xdd\xe6\xcd\x0f3\xf1\xa3\xbb(w\x97\xcf\xf7q\xa8/@l\xf5\xc3\x0c>?\xc3\
-\x89?\xdb\x8e*\xbaX\rwa-\\O\xe6\xbbC\x14\x7f\xfd\x87\xf3:\xe6\xfa\xab\xab\
-\xd6\xcf\xab\xf0J\xa6\xba~\x86{\xd9\xcd\xb9T5NQR;8\x08\xf7[\xe4\'!;\xec\xd0\
-\xfd\x1d\x9bL.\xc5u\x7f\\\x8f\xb1\xb4\xcc[\xdb\x9a\xb9!\xd6O\xf4\x89v\x0e\
-\xff\xe3i\x86\x9f\xddM\xdb\x9d\x0b\x90+\x83\x94\x8e\xe79\xf5f\x86bk;u\x1b\
-\xe3t\xf5:$RY\xc2\x8f\xb5q\xe8\x9f|\xc6~\xd0I\xdb\x1d\xf5\xa8\xbb\xa2\xe8\
-\x16\xe8\x86K\xf2\x1b\x11\xf6\xefh\xe5v\xb9\x83s\xa9$H\x8dv\x06y3r\x1f\x13\
-\xc9$$Aj\x8a\xaf\xf5\xedG\x7f\xa0\x95\xc3?\xec\xa3\xf0\xa3\xfd4\xae\xad\xc5_\
-o2\xf0\xa13\xd7\xd4F\xb2\xce\xa2\xd5\xed#;e\\\xd4\xf9Nt%\x02\x9b{\xc5k\xf4\
-\xd4T\xa3\xa4A\xabH\xf3\xeb\xe4*V\xf5\xf6\xce-\xbf\x01\x97S\x8b\x97p\x8f:@_2\
-\x86\x90\x92kU?;\xaf[\xcbD<|\xbe\x8fc3\x82-\xcd.\x93\xb7\xafe\xe4\xf8\x10\
-\x84tV?\xbc\x91\xe9\\\x15\xaf:q\xecU\xf3\xfb\xe7s\xfd\x94_\x98W\xe1\x95L\xa3\
-?\x8dm\xf72\xee\x94\x98\x18\xd3\xe9\xffv\x1a4\x1d\xdb1PB\x03!Y\xb4\xcc\xa5\
-\xe3\xf7\xf3\x1c<\xd2\xc6\xdb=!F\xf50O<8\xca\xc2\xcd\x06\x87\x7f\x99\xe3\xe4\
-\xf3gQR\xc3\x17\x06\xe1\x84d\xd9=\x12\xb3f\x84\xd7\xb7-\xa3\xb1\xd6\xe7\xe1-\
-c\xd4}E\xe3\xd4\xde<\'_\xe8=\xdf\xb6\xbaIr\xdf\xdf\x18\x8ckA\xec\xd2\x19\xc6\
-\xcba\xac\xa8\xc4\xb1G9[\xce1\xe2\x7fx\xb0\xe6\x83\xdb\x99\xe0\xd1-9\xc2+$\
-\x87\xf6\x8c\xb3\xff\xdd\x0cJjDk\r\x16\\\'\x19*I\x82\x91<v\xf1,\xef\x1e^\xc1\
-\xefm\xfc|\xe7\x90\xde\x84\xe3\xf8\x94\n\xdd\x0c\xdb\xd5\x04c\x0ee{\x9c\xd3\
-\xa5<\xd3G\xe6\x96\xdf\x1b\xdb\x96!\xe54N\xe94\x93N\x01\xab\xca\xa0l\x9f\xe1\
-l\xf9ZF\xfc\x8f\x1dV\x8eA\xd3\xc9\x19\xea66q\xfc\xc4 \xa1\x84I\xc3\xfa\x08\
-\x9d\xefMr$\x17\x9c\xf71\xd7\x07\x06*\x07\x85s%\x9f\xcdS\xcaw\xd3~\x93\xa0\
-\xdc\x19\xc2v\x0c|\xa1\x13IHj\x9b\x1dZ\x96\xda4/-\xb1\xa7\xb3\x8d\x97^m\xa2X\
-J\x93\x1eTH/\xc8\xfd\x9b\x0fQ\xddjp\xe6`\x90bN\xc3\x8a\nn\xfcj\x96p5\xbc\xf0\
-\x9f\xf7p\xb4+\x8b\xa1k([\xe7\xc1\xc7\xbb\xb8\xe6\x16\x8d\xa3\xbb#L\x8d[\xc4\
-\xea\x15+\xbe\x92\xa5\xa77\xc5\xfeCK\xf8\xda\xean\x16\xad\x8cPU\xeb\x93\x1e\
-\xb08vb\x06\xdb)\x9d\x8f3\x9dVTG`\xf3S\xa79w4\xc0\xf1wCh\xa6`\xcd\xe6,\xcd\
-\xd7\xe4\xd9\xb7#I4\xe9q\xf6L\x15\xdb^_Ov\xf2"\xce\x839bUY\x8a\x85\x1eZ\x96O\
-\xd2\xd0V\xa4\xfbl\x94\xf7\x8f\xe5\x110\xe7\xfcjS\x19\xec\xc2!\x9a\xd7\xe8\
-\xc4\xea|\x06\xfa\xc79v|\x12\xdb\xc9^\xd0\xcf{\xf7\xbb<\xb8\xc9!\xef\x94hjO \
-\xe48o\xee,10 \xe7y\xc4A\xac_\xffF\xe5\xc2\xd4\x1c\x11\x02\xb6l\xec\xe2\xf65\
-=\xa4\x92E\x84\x9c\xed\xbal\xd6$3c1:\x19\xe1W\xbf]\xc2\xd9s\xd5\x94]y\xc1sK\
-\xdb\xa7\xd9\xb0l\x88\x96\xc6\x19\x94\xa7\xf0\xd1\xe8\xeaI\xb0\xffx\x1d=\xfd\
-\x91\xf3m\xa5T,\xbfv\x92\x8d\xab\x07I\xc5\x0b\x94\xcb\x12%u\xde\xff\xa0\x9a\
-\x9d\x9d\x8d\xe4\xf2\x06w\xdf>\xc4\xfa\x8eI\xca\xbe\xc6ko7r\xf8d\xd5\'b\rX\
-\x1e\xb7\xae\x1d\xe5\xa6\xe5CH\xdfEj0\x92\x89p\xe6\\\x15\x1b\x96\r\x01\x82\
-\xd7\xde^\xcc\xe1\x93\xd5\x17ufs\x06B\xc0\xdd\xb7\x8f\xb0\xaec\x02\xd7\x97\
-\x17x\xe7\x9a\xdf\xec;z\xd9\xd01D\xd9\xd7x\xf5\xed6\x0e\x9f\xbc\xf0\xbe\x85\
-\xa1\xc3\xdf}3G\xb9\x7f\x887\xbe\xdf\xcb7\xfe\xa5\x83\x9e\xb1(\xdf~6\xc2\xe5\
-\xb8\xda\'\x16,\xf8A\xa5@\xfe\x9f\x08\x01\xa1\xe0G\xdd\xe6\xba`;\x95\xed\xf2\
-K\xc1\xbaUe~\xf8\xec\x14\xcf\xfd\xf5\x00\xae\'\xf8\xcb\x7f]\xc0S\xdf\x8c\xf3\
-\xce\xde\xf9\xb9J\xf0\xbb\xe8\x83\x83\x83\x97E\\\xa1\xc2\xa7q\xc3\xd6\t\xa6\
-\x862\x1c;\x98\xe7\xb1g\x02t\x9d\xb0yc\xfb\x02f\xb2\xf3\xbf\xbc\x82\xd9\xdd\
-\xfc\n\x15\xbe4\x84\x836\xd1h\x9e\x07\xfe\x146\xdem\xf3\xe2\xcb\xa1\xcbV\x1c\
-\x00\xfae3W\xa8\xf0)<\xff\x1f\x8d\x04\xcd:\xaac>\xcf\xbe y\xe5\xe7_\xcc\xed\
-\xc8\xb9"\xe0[\x95\xdf \x15*|\x06\x95%V\x85\n\x9fC\xa5@*T\xf8\x1c\xfe\x17\
-\x17.\x96sS\xb0\xcaT\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory013Bitmap():
- return wxBitmapFromImage(getDocFactory013Image())
-
-def getDocFactory013Image():
- stream = cStringIO.StringIO(getDocFactory013Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory013')
-catalog['DocFactory013'] = ImageClass()
-catalog['DocFactory013'].getData = getDocFactory013Data
-catalog['DocFactory013'].getImage = getDocFactory013Image
-catalog['DocFactory013'].getBitmap = getDocFactory013Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory014Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r`\
-IDATx\x9c\xed\x9bip]\xd5}\xc0\x7f\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\
-\xb6\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em?\xe4c\xa6\x93\xe9L\
-\xa7\x0b\xd3L\x06\xd2$e:\xedPR\x1a\'\x81\x10&6$\xc6\x06\xc7\x917\x8cW\x19\
-\xdb\x92\xac\xe5i\x97\x9e\xf4\xd6{\xdf\xbd\xf7\xf4\x83(\xe0\x12\x90\xda\x82\
-\x84\x87\xf7\xfb\xf8\xe6\xdc\xf7\xfb\xff\xcf9\xff\xb9\xe7\x9d\xf3\x8e\xf8\
-\x9bo)E\x85\n\x15~#z\xa8z\xb1C\xa8P\xe1\xf3\x8b\x1e\xac\x14H\x85\n\x1f\x8b\
-\x1eN,v\x08W\x06\x02\x85\x81\x8d\xc4\xbb\xecs\x17\x03\x17s\xe1b\x106\xda\xff\
-\x88A\x01e\x15\xc0C\xfbL\xbc\x12\x1fS\x94\xf0\x91\x94\x95\x85B|&\x9e\xcf#z(\
-\xbe\xd8!|\xfe\x11\xf84\x14\xf6\x11u/\xe1\x7fhnJ\t\xd2\xd4\xc9\xbbqr\xc1vf\
-\xf4e\xb8\x04>\xa3\x18<\x9a\xec\xd7\xa9\xf2z.\x8b\x01@\xb7\x14\xb6VC\xb7\xb6\
-\x832\xa1O\xd5\xab\xe1\xb0\xdc\xfd\x19\x81\xf2\x08\x9a!\x18\x93\xabH\xcb\x1b\
-?U\xc7\xe7\x19=\\)\x909\xb1\x18\xa5I\x7f\x86\xf3\xaf\xd42=\x18\x01\x04H\x89\
-\xd4\x15\xe1\x9a"\x91\xfa"m\xab\'q\xace\xf4\x05\xff\x12\x87\xbaO=\x86 \xc34\
-\x15_\xe0\xecO\xe2L\xa7\x03 \x04\x08\t@\xac\xd1f\xd5\xfdoR4\xea\x99\xe0\xe6O\
-\xd5\x1bb\x98\x06\xfbG\x9c\xfaQ\x8a\xd8\xd2\x12-\x1b\x8eQ\x08^K\x99/\xc6\xc4\
-\xd1#_\x8c<\xff_\x84\x94 \xa1\xadC\xf8E\xa4\xa6\x08\xc6\x05F@\xa0\x10\x94\
-\xf2AF\xcfJ\xf2\xa3\xcd\xac\xbeKb\x1a\xbf\xa6?|\xcfe\xcb\x10\xe1{\x08\xb7\
-\x8c\xf0=\x94\xd4P\xba\x81\x92\xbfy9$\\\x07\xe9\x96\x01.k\x1bR:aq5\xca- 5\
-\xde\x8f\x01\x04\xa9\xe5&\xa1P\x07f\xb0\x89\x88\xfc\xe8\xf7\xf8\xba\x89\xd2t\
-\xa4S\x04!\xf1\rk\xb6\xc0\xe6p\n\x14q\xbfH8\xbf\x12I\x89l:\xc65Q\x8b\xba\xd0\
-8\x19\xf9\xc1\xc4\x99W~J}\xe07\x03\xb3N\xaf\x8c\xaf[\xb3\xae\xb2=\xdb\xcc\
-\x0c|\xf4\x19\xc07\x83\x97\xc5\xbcP\xe8U\xe6\xc0\x82K\xaf4,\xe5\x80\xb1\tC\
-\x7f\x93X\xca\xe5\xfa\xdf\xbb\t-\x14\x04\xe5S\xce\xdb\x0c\x1c\xeba\xe4t\x9aK\
-\x87S\\sG\x14\xc7\xb8@A\x04\x11\xca\xc3\xcctcf\xba\xf1\n%\x04j\xf6\xe5\x13\
-\x08`\xa7V\xe2T5\xc3{\x85$\xfc2\xd6L\x0f\xc6\xe4E\x94\xed\x00j\xf6\x05a\x04(\
-\xd6^\x8f\x16\xaeF\x06n\xc2\xb2\xf6\xa2\xa5\\\xae\x7fl+F$\x08\x80]VL\x1a\x11\
-d@\x12\xf3{0\xa7.`\xcdt\xa3l\x17\xa5\x14\x98A\xbc`5f1\x8dR\xe0\xc4[)\xa5:\
-\xe6t\x86\x85N\xb57Cnj\x15\xb8\x9d\x08\rJ\x85\xb5,\xb3F\x192\xa0$\x8d\xf9\
-\xe5\xa7|\x02\xe9#\x18\xb94\xd2\x90\xb8\xe1\x06\xb4\xc2\x18\xbe]F\x98\x16\
-\x8e^\x8b\xcc\x8e#\xa4\xc0^\xba\x06/Z\x0b\x80\x91>\x8315\x00BQ\x8e7Sn\\\xb9\
-\xe0c\xafG8\xbb\xe0\xd2+\rC\xe8\x08\xb3\n]\xe6\xd0\x83\x02#\x96"c\x15\xf0\
-\x00+\x14\xa6\xed\xb6\x8dx\xb9\xdd\xe4\x86\xbb)d\xae"a\x8d\xa0\x9b3D\xb2\xe7\
-\xd1\xcb\x19\x86\xceL2~"\x8b\xe7\xfa\xe8A\x9d\xc6-\t\x1abC\x14\x8bK(\x04\x97\
-"\x95G$w\x0e\x95\x9d\xa6\xff\xcdar\x836B\x033bP}]\x94\xda\xd0\x08vh3\xc2H\
-\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18%\xa2\x86\x88\xe6\xba\xa04\
-\xcd\xf0\xb1q2\xddy\x00\x1a\xb7$\x897\x87\x18=9\x8d\x1e\xd6\xa9Y\x97!\xe7;\
-\x84r\xdd\x1f\xeb\xac\x0bO`Vmc\xf8\xd09\x06\x0f\x1cB\xf9\x1eJ\n\xce\xed\xfa9\
-+\x1f\xba\x8f\x84\xd6\x0f\xce\x89y\xe5\xa7\xab\x12\xb1\xc0i\xba\x7f\x91&Tk\
-\x91\xbcv\x98\x89\xae,\xe3\xa7fXq\x7f\x92\x90\xf7c\xfa~\x15&\xde\xee\x90\xa8\
-z\x03;\xb2\x13\xe9e\t\xb8/\x90>\x1e\xc4\xac\xf2\x88w\x08\x1c\xf5\x07(a,\xe8\
-\xd8\xeba\x0e,\xa8\xf0JD#\x89\xe0vt&\x11B T\x08\x93_\xe11\x89\xd2$\x9ew\x0bK\
-\xd6w\xd0\xb3\xfb_\xb0\xc7\x86\x88\xa5b$\xca#\x88B\x03\xe7\x7fx\x98\xc2\xd8(\
-\x81x\x0ci\x9a8\xf9)\x86\xf7\xa7)\xa6\xdbh\xf9\xeaj\x0c\xf3\x0c\xba\x93D\xb3\
-[\xe8\xfa\xc9\x0f)\x8e\x8dbF#\x18\xe10\x08\x87|\x8fK\xe3\xdamh\xfe\x00\x82\
-\x16t&\xf0\xec"\xf6\xc44F\xd0\xc2\x14\x1aZ FI?\x04^\x8e\x80\xdb\xc6\xb9\x97^\
-$?<L \x11GZ\x16\xe3G.1z\xd0\xc6w\xcb\x84\xea\xeb\tn\xb9\x1d\xdd\xce ?\xc9\
-\xb9\xeev\x94\x82`U\x84\xaaZI~\xa4\x0f!%\xe1\xf82\xf4@\x0cC\xa5\xf1\xe7\x95\
-\xdfi\x94\xf40\x8d\xf5\xf8\xd3]\x8c^\x1cc\xea\x9d\x10\xc1\xea$K7\xb6RU\xb3\
-\x12\x9c0\x86\x7f\x92\xfc\xbb\x1aK\xd7\xb4P\xf0\x8e K>\xba\xd6Ay\xf4$\xf1\
-\x9a:\xe2U\r\xe49\xc4B\x9fj\xeb!\xf6-\xb0\xf2\xcaC\xb0\x0c\xc1\xdd\xe8b\x1c!\
-A\x88 \x01\xdeF\xd1\x0b\x80\xd4l\x82\xd5\xf7\x11\xb0\x86\xb0\xc7\x8f\xa2\xb1\
-\x16Ct\xd0w\xe09\xcacGYz\xf3N\xean\xdc\x01\xaa\x8c[,2\xb0\xe7\x9f)\xf4\xee\
-\xa5\x90^M\xa4}\t\xf85\x0c\xec\xffO\xdc\x89wh\xb9\xed\x11\x12\x1d\x9b\x90\
-\x01\x1fM\x8b\xe39E\x94>\x89\xa9w"\xdcm\xe8b\x0c7{\x81\x8b\xff\xfe\x14\xd2\
-\x94\x08M\xd2\xb8\xf5I\xa2+V\xa0\xbc,\x99s]8\xa3\xc7Xz\xcb\x03\xd4\xdd\xb8\
-\x03\xa1\xfb\xf86\x0c\xbe\xfe\x1c\xd3\xe7\x0fb\xe8\x1a\xc2\xacGw\xa3\x0c\xec\
-\x7f\xe1\x13\x9d\xca\xdaC\xec\xea;\x88\xb5=\xc9\x85\xe7\x9fB\xe8\x1e\xed\xf7\
->\x81\xb0&\x91Z\x1d}\x07~:w~m\xf5(k7\xc2\xdc\x86.\xa70\xe5\x10-\xdb\xff\x84X\
-\xfb\x1a|\xd1\x8b\n\xbc\r\xb9\x15\xd4o0\xe9{\xf5?(M\x7f\x95`\xb0\x88\xf2\x92\
-L\xf5t\xa13Dj\xd5C\x10\xea\'(^\x83\x05.\x11=0\xfa\xc5\xd9\xd3\xfe?\xa3kx\x81\
-\x08\x9a-\x91R\x80\x1f\xc1\x9a\xd4\xc0\x9d\xed;e\xc5q\xfd0fI`za\x84\x8aA\xd9\
-\xc7\xee\xed#\x14l\xa4n\xd3\xc3h\xe5\xddH\xef0\xd2|\x80\xba\xf5\x0f2\xd0}\
-\x86RO\x0f\xb1\xe5\x8f\xe2y\x02\xbb\xfb"\xa1@\x1d5\xeb\x1e@\xba?F\x16\x0e\
-\x80L\xa0\t\x1d\x9c)(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\
-\xd7E\xc9V2\x9d\xffD(PO\xdd\xc6\x9d\xe8\xce\xcf\x10\xa5\x13\xf8\xd6\xe3\xd4\
-\xac\xbe\x87\xe2\x99\xc3\xe8\x8e\x8eP\t\xf0\x02s;s3\xa0g\xf0\xaco`\xaa\x08R\
-\t4\xbd\n\xcd~\x11\xcfx|^\xf9U\xb5\xecD+\xec\xc7\xb3bh\xb6F(\xbc\x94X\xeb6t\
-\xe7\xbb\xe0\x9c\x80\xac\x87\xd2KT\xad\xd8N\xc0z\x8d\xc9\xce#4\xed\xfcc<?O\
-\xf6\xf8\xf3$\x9a\xd6b&\x97#\xf3{ \x0b,\xf0\x19\x8c\xce\xde\xe5\x0b*\xbc"\
-\x89\xd5\xc2\xe6\x11\xc4p\x10$`\x8f\xc0\xa1Z\x98V`X\xa8M\x9b(\xf5\xbd\x8d:\
-\x1b\xc2joENO\xe0\x89\x14\xdey\x81\x1ek\x84B\x00yd\x10\nA\xb4\xc64V\xc3-h\
-\xc3\x8d0\x16C\x15\x12\xa8b\x11\xf7]0\x12\xf5\xf83\x06\xfa\xb1\t(|x\xab\xb8\
-\x1ab5\xb0!\x8d\x18\x0e`9\xed\xb4\xee\xfc3\xb4h\x04|\x1f\x7f|\x10y\xe2\x02N\
-\xf3\x12\x9c\xd3%\x8cd#\xa2\x9c@\x1c\x9a\x86\\\x10\xd92\x80Q\x7f\x03\xdaP=\
-\xc2K\x82\x97@\xe5\xd4\xdc\xce\xff\xf6n\x1cD\x0e\x07\x10R@)\r]I\xfc\xe5r^\
-\xf9\x91O\xc0\x89&\xd8\x14\x87\xe1\xd8\xec\x12\xd5OAg\x042\xcd\x00\x88@\x19y\
-c\x94H\xfcF\xb2\xfb\xdf\xc6\xbe\xa1\x80\x9dNS>\xe9R\x7f\xcb\xdd0\x9c\x87C\
-\x01\xf0\x17~\xae\xea\x83\xcf<\xbe\xe0\xd2+\r\xa3U\x90\xe8\x18\xa7pv\x19\x12\
-\r??\xc9\xf4\xc1\xed \x15\xe6z\x1f=\xeb2\xf8\xed!\n\xe7n\xa2\xe6\xbeF\x8a\
-\xc7m\xcc5yTi\x0b\xd9\xf3\x19\xbc\xec\x14N\xe8Q\xecw\\B+,f:\xfb\x99\xde\xd7A\
-\xb0\xa1\x01\x7fj\n\x11\x02\xca7\x93\xd97\x82\xf3\xf0\x08%\xf5;\xd8\xfb\\\
-\xf4&\x1d\xe3*\r\xfbX\x19/]$\xb1rt6\x06\xa1\x81(\x90\xf9{\x81\xdb/p\x07k\xd0\
-\x1a\x1aH\xfeu\t/\xb3\x91BW\x8e\xf2\xc40N\xe0!\x8a\x07m\xc2+\x02\xcc\x1c\xe8\
-az_\x07\xa1\xabR\xf8\x854B\xfas:K\x07l\x8ce>\x89k\xc7\xc9\x9fjG \xf1\xf3cd^\
-\xd9@\xd5\x93\x85y\xe5\xe7\x8eg\x99\xdc\xf5e\xe2\xd7\rQ\xe8j\x9a\xdd\xe6\xcd\
-\x0f3\xf1\x83;(w\x97\xdf\xef\xe3P_\x80\xd8\xfa\x07\x19|v\x863\x7f\xb4\x1bUt\
-\xb1\x1a\xee\xc0Z\xba\x99\xcc\xb7\x87(\xfe\xf2w\x17e\xec\xf5\x97\xd6m^\x14\
-\xf1\x95Du\xfd\x0cw\xb3\x9fK\xa9j\x9c\xa2\xa4vp\x10\xee\xb5\xc8OBv\xd8\xa1\
-\xfb[6\x99\\\x8ak~\xbf\x1ece\x99\xd7w5s]\xac\x9f\xe8c\xed\x1c\xff\xdb\xf3\
-\x0c?\xbd\x9f\xb6\xdb\x97 \xd7\x06)\x9d\xces\xee\xb5\x0c\xc5\xd6v\xea\xb6\
-\xc6\xe9\xeauH\xa4\xb2\x84\x1fi\xe3\xd8\xdf\xf9\x8c}\xaf\x93\xb6\xdb\xeaQwD\
-\xd1-\xd0\r\x97\xe4\xd7"\x1c\xde\xd3\xca\xadr\x0f\x97RI\x90\x1a\xed\x0c\xf2Z\
-\xe4\x1e&\x92IH\x82\xd4\x14_\xe9;\x8c~_+\xc7\xbf\xdfG\xe1\x07\x87i\xdcX\x8b\
-\xbf\xd9d\xe0=g\xae\xa9\x8dd\x9dE\xab\xdbGv\xca\x98\xd3\xf9ft-\x02\x9b\xbb\
-\xc5\xcb\xf4\xd4T\xa3\xa4A\xabH\xf3\xcb\xe4:\xd6\xf5\xf6\xce/\xbf\x01\x97s\
-\xcbWp\x97:B_2\x86\x90\x92\xabU?{\xaf\xd9\xc8D<\xfc~\x1f\xc7f\x04;\x9a]&o\
-\xdd\xc8\xc8\xe9!\x08\xe9\xac\x7fp+\xd3\xb9*^r\xe2\xd8\xeb\x16\xe7O\xe7\xfa9\
-\xbf\xb0(\xe2+\x89F\x7f\x1a\xdb\xeee\xdc)11\xa6\xd3\xff\xcd4h:\xb6c\xa0\x84\
-\x06B\xb2l\x95K\xc7o\xe79z\xa2\x8d7zB\x8c\xeaa\x1e\xbb\x7f\x94\xa5\xdb\r\x8e\
-\xff<\xc7\xd9g/\xa2\xa4\x86/\x0c\xc2\t\xc9\xaa\xbb$f\xcd\x08\xaf\xecZEc\xad\
-\xcf\x83;\xc6\xa8\xfb\x92\xc6\xb9\x83y\xce~\xa7\xf7\xfd\xb6\xd5M\x92{\xfe\
-\xc2`\\\x0bb\x97.0^\x0ecE%\x8e=\xca\xc5r\x8e\x11\xff\xbd\x835\x1f\xdc\xce\
-\x04\x0f\xef\xc8\x11^#9v`\x9c\xc3oePR#Zk\xb0\xe4\x1a\xc9PI\x12\x8c\xe4\xb1\
-\x8b\x17y\xeb\xf8\x1a~k\xeb\';\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\xae&\x18s(\xdb\
-\xe3\x9c/\xe5\x99>1\xbf\xfc^\xdd\xb5\n)\xa7qJ\xe7\x99t\nXU\x06e\xfb\x02\x17\
-\xcbW3\xe2\x7f\xe8\xb0r\x0c\x9a\xce\xceP\xb7\xb5\x89\xd3g\x06\t%L\x1a6G\xe8|\
-{\x92\x13\xb9\xe0"\x8d<\xe8\x03\x03\x95\x83\xc2\xb9\xc8g\xf3\x94\xf2\xdd\xb4\
-\xdf (w\x86\xb0\x1d\x03_\xe8D\x12\x92\xdaf\x87\x96\x956\xcd+K\x1c\xe8l\xe3\
-\xf9\x97\x9a(\x96\xd2\xa4\x07\x15\xd2\x0br\xef\xf6cT\xb7\x1a\\8\x1a\xa4\x98\
-\xd3\xb0\xa2\x82\xeb\xbf\x9c%\\\r\xdf\xf9\xb7\xbb8\xd9\x95\xc5\xd05\x94\xads\
-\xff\xa3]\\u\x93\xc6\xc9\xfd\x11\xa6\xc6-b\xf5\x8a5_\xca\xd2\xd3\x9b\xe2\xf0\
-\xb1\x15|e}7\xcb\xd6F\xa8\xaa\xf5I\x0fX\x9c:3\x83\xed\x94\xde\x8f3\x9dVTG`\
-\xfb\x13\xe7\xb9t2\xc0\xe9\xb7Bh\xa6`\xc3\xf6,\xcdW\xe59\xb4\'I4\xe9q\xf1B\
-\x15\xbb^\xd9Lvr\x0e\xe7\xd1\x1c\xb1\xaa,\xc5B\x0f-\xab\'ih+\xd2}1\xca;\xa7\
-\xf2\x08\x98w~\xb5\xa9\x0cv\xe1\x18\xcd\x1btbu>\x03\xfd\xe3\x9c:=\x89\xedd/\
-\xeb\xe7\x83\x87]\xee\xdf\xe6\x90wJ4\xb5\'\x10r\x9c\xd7\xf6\x96\x18\x18\x90\
-\x0b<\xe2\x1f 6o~\xb5raj\x0e\x84\x80\x1d[\xbb\xb8uC\x0f\xa9d\x11!g\xbb,\x9b5\
-\xc9\xccX\x8cNF\xf8\xc5\xafWp\xf1R5eW^\xf6\xdc\xca\xf6i\xb6\xac\x1a\xa2\xa5q\
-\x06\xe5)|4\xbaz\x12\x1c>]GO\x7f\xe4\xfd\xb6R*V_=\xc9\xd6\xf5\x83\xa4\xe2\
-\x05\xcae\x89\x92:\xef\xbc[\xcd\xde\xceFry\x83;o\x1dbs\xc7$e_\xe3\xe57\x1a9~\
-\xb6\xea#\xb1\x06,\x8f\x9b7\x8er\xc3\xea!\xa4\xef"5\x18\xc9D\xb8p\xa9\x8a-\
-\xab\x86\x00\xc1\xcbo,\xe7\xf8\xd9\xea9\x9d\xd9\x9c\x81\x10p\xe7\xad#l\xea\
-\x98\xc0\xf5\xe5e\xde\xf9\xe67\xfb\x1d\xbdl\xe9\x18\xa2\xeck\xbc\xf4F\x1b\
-\xc7\xcf^~\xcf\xc2\xd0\xe1\xaf\xbe\x9e\xa3\xdc?\xc4\xab\xdf\xed\xe5k\xff\xd0\
-A\xcfX\x94o>\x1da1\xaf\xf4\x89%K\xbeW)\x90y"\x04\x84\x82\x1ft\x97\xeb\x82\
-\xedT\xb6\xc9?\r6\xad+\xf3\xfd\xa7\xa7x\xe6\xcf\x07p=\xc1\x9f\xfe\xe3\x12\
-\x9e\xf8z\x9c7\x0f.\xccU\x82\x8fC\x1f\x1c\x1c\\\xd4\x00*T\x00\xb8n\xe7\x04SC\
-\x19N\x1d\xcd\xf3\xc8S\x01\xba\xce\xd8\xbc\xba{\t3\xd9\xc5[^\xc1\xec\xae~\
-\x85\n\x8bN8h\x13\x8d\xe6\xb9\xef\x0fa\xeb\x9d6\xcf\xbd\x10Z\xf4\xe2\x00\xd0\
-\x17;\x80\n\x15\x00\x9e\xfd\xd7F\x82f\x1d\xd51\x9f\xa7\xbf#y\xf1\xa7\x9f\xcd\
-\xed\xc8\xff-\x02\xbeQ\xf9\rR\xa1\xc2\xc7\xb0\xf8\xef\xb0\n\x15>\xc7T\n\xa4B\
-\x85O\xe0\xbf\x00\xfb\xb3\x96s\xe4!\xad\xbd\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory014Bitmap():
- return wxBitmapFromImage(getDocFactory014Image())
-
-def getDocFactory014Image():
- stream = cStringIO.StringIO(getDocFactory014Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory014')
-catalog['DocFactory014'] = ImageClass()
-catalog['DocFactory014'].getData = getDocFactory014Data
-catalog['DocFactory014'].getImage = getDocFactory014Image
-catalog['DocFactory014'].getBitmap = getDocFactory014Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory015Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rb\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda\xe3\xb1g\
-\xc6\x80al\xe3\xdd\xacN\x0c\t\xb5Y\xca\xe6\xb2\xb4PU\xad\xa2\xaa\xa0V\xb4\
-\xfd#\x7fFUT\xa9\xea\x82\x1aE\x90\xad\xa8jEIi\x9c\x04BPlH\x8c\r\x8e3\xde0^\
-\xc7\xd8\x9e\x19\xcf\xf2f\x9fy3o\xbd\xf7\xdd{O\xff\x18\n\xb8\xc4xZ\x01o\x10\
-\xef\xf3\xe7\xd3\xbd\xef\xf3\xfd\x9d{\x8e\xeey\xe7\xbc#\xfe\xee[JQ\xa5J\x95\
-\xdf\x8a\x1e\xaa\xadt\x84*U\x16.z\xb0:@\xaaT\xb9,z8Q\xe9\x08\x0b\x1b\x81\xc2\
-\xc0F\xe2]\xf2\xb9\x8b\x81\x8b\xf9\xd9e\x106\xda\xff\xca\xa0\x80\xb2\n\xe0\
-\xa1}*^\x89\x8f)J\xf8H\xca\xcaB!>\x15\xcfBF\x0f\xc5+\x1da\xe1"\xf0i*\xec%\
-\xea^\xc4\xffP\xdf\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\x1d\xcc\xeaKq\t|J\x19<Z\
-\xec\xd7\xa9\xf1z/\xc9\x00\xa0[\n[\xab\xa3G\xdbN\x99\xd0\'\xea\xd5pX\xe6\xfe\
-\x9c@y\x14\xcd\x10\x8c\xcb\x95\xa4\xe5\x8d\x9f\xa8\xe3\xf3\x80\x1e\xae\x0e\
-\x90\xcbb1F\x8b\xfe\x0c\xe7^\xa9gf(\x02\x08\x90\x12\xa9+\xc2uE"\x8dE\xdaWM\
-\xe1XK\xe9\x0f\xfe5\x0e\r\x9fx\x86 #\xb4\x14_\xe0\xccO\xe3\xcc\xa4\x03 \x04\
-\x08\t@\xac\xd9f\xe5\xfdoR4\x1a\x99\xe4\xe6O\xd4\x1bb\x84&\xfb\xc7\x9c\xfcq\
-\x8a\xd8\xe2\x12\xad\xeb\x8fR\x08^K\x99/V\x87\xd1#_\xacz\xffO\x84\x94 \xa1\
-\xadE\xf8E\xa4\xa6\x08\xc6\x05F@\xa0\x10\x94\xf2A\xc6\xceH\xf2cKXu\x97\xc44~\
-\xc3@\xf8\x9eK\xa6!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%\x7f\xfbtH\xb8\x0e\
-\xd2-\x03\\rmH\xe9\x84\xc5\xd5(\xb7\x80\xd4x?\x03\x08R\xcbLB\xa1N\xcc`\x0b\
-\x11\xf9\xd1\xef\xf1u\x13\xa5\xe9H\xa7\x08B\xe2\x1b\xd6\xdc\x00\xbb\x82S\xa0\
-\x88\xfbE\xc2\xf9\x15HJd\xd31\xae\x89Z4\x84&\xc8\xc8\x0f:\xcc\xbc\xeaS\xea\
-\x03\xbf\x19\x98sze|\xdd\x9as\x95\xed\xb9\xcb\xcc\xc0G\xef\x01|3xI\xe6\xcf\
-\x1a\xbd\xc6\x1c\xac\x98|\xa1c)\x07\x8c\x8d\x18\xfa\x9b\xc4R.\xd7\xff\xc1Mh\
-\xa1 (\x9fr\xdef\xf0h/\xa3\xa7\xd2\\<\x94\xe2\x9a;\xa28\xc6y\n"\x88P\x1ef\
-\xa6\x073\xd3\x83W(!Ps/\x9f@\x00;\xb5\x02\xa7f\t\xbc7\x90\x84_\xc6\x9a\xed\
-\xc5\x98\xba\x80\xb2\x1d@\xcd\xbd \x8c\x00\xc5\xfa\xeb\xd1\xc2\xb5\xc8\xc0MX\
-\xd6\x1e\xb4\x94\xcb\xf5\x8fm\xc1\x88\x04\x01\xb0\xcb\x8a)#\x82\x0cHb~/\xe6\
-\xf4y\xac\xd9\x1e\x94\xed\xa2\x94\x023\x88\x17\xac\xc5,\xa6Q\n\x9cx\x1b\xa5T\
-\xe7\x15\x9da\xa1S\xeb\xcd\x92\x9b^\tn\x17B\x83Ra\rK\xad1\x86\r(Ic~\xf5)\x9f\
-@\xfa0F.\x8d4$n\xb8\t\xad0\x8eo\x97\x11\xa6\x85\xa3\xd7#\xb3\x13\x08)\xb0\
-\x17\xaf\xc6\x8b\xd6\x03`\xa4OcL\x0f\x82P\x94\xe3K(7\xaf\xa8\xc0\xd3\x9fC\
-\x8fp\xa6b\xf2\x85\x8e!t\x84Y\x83.s\xe8A\x81\x11K\x91\xb1\nx\x80\x15\n\xd3~\
-\xdb\x06\xbc\xdc.r#=\x142W\x91\xb0F\xd1\xcdY"\xd9s\xe8\xe5\x0c\xc3\xa7\xa7\
-\x988\x9e\xc5s}\xf4\xa0N\xf3\xe6\x04M\xb1a\x8a\xc5E\x14\x82\x8b\x91\xca#\x92\
-;\x8b\xca\xce0\xf0\xe6\x08\xb9!\x1b\xa1\x81\x191\xa8\xbd.J}h\x14;\xb4\ta\xa4\
-\xd0e\x1e=\x08F4E!P\xc2\xc5\xc3\r\xba8\x8c\x11Q\xc3Ds\xddP\x9aa\xe4\xe8\x04\
-\x99\x9e<\x00\xcd\x9b\x93\xc4\x97\x84\x18;1\x83\x1e\xd6\xa9[\x9b!\xe7;\x84r=\
-\x97u6\x84\'1k\xb62r\xf0,C\xfb\x0f\xa2|\x0f%\x05gw\xfe\x82\x15\x0f\xddGB\x1b\
-\x00\xe7\xf8\xbc\xea\xd3U\x89X\xe0\x14=\xbfL\x13\xaa\xb7H^;\xc2dw\x96\x89\
-\x93\xb3,\xbf?I\xc8\xfb\t\xfd\xbf\x0e\x13\xefpH\xd4\xbc\x81\x1d\xd9\x81\xf4\
-\xb2\x04\xdc\x17H\x1f\x0bb\xd6x\xc4;\x05\x8e\xfa#\x940*\xd2\x07\xf40\xfb+"\
-\xfe<\xa0\x91Dp;:S\x08!\x10*\x84\xc9\xaf\xf1\x98Bi\x12\xcf\xbb\x85E\xeb:\xe9\
-\xdd\xf5\xaf\xd8\xe3\xc3\xc4R1\x12\xe5QD\xa1\x89s?:Da|\x8c@<\x864M\x9c\xfc4#\
-\xfb\xd2\x14\xd3\xed\xb4~u\x15\x86y\x1a\xddI\xa2\xd9\xadt\xff\xf4G\x14\xc7\
-\xc70\xa3\x11\x8cp\x18\x84C\xbe\xd7\xa5y\xcdV4\x7f\x10A+:\x93xv\x11{r\x06#ha\
-\n\r-\x10\xa3\xa4\x1f\x04/G\xc0m\xe7\xecK/\x92\x1f\x19!\x90\x88#-\x8b\x89\
-\xc3\x17\x19;`\xe3\xbbeB\x8d\x8d\x047\xdf\x8eng\x90\x1f\xe7\\{;JA\xb0&BM\xbd\
-$?\xda\x8f\x90\x92p|)z \x86\xa1\xd2\xf8\xf3\xaa\xef\x14Jz\x98\xc6:\xfc\x99n\
-\xc6.\x8c3\xfdN\x88`m\x92\xc5\x1b\xda\xa8\xa9[\x01N\x18\xc3?A\xfe]\x8d\xc5\
-\xab[)x\x87\x91%\x1f]\xeb\xa4<v\x82x]\x03\xf1\x9a&\xf2\x1c\xa4R\xbb\xd9z\x88\
-\xbd\x15R/|\x04K\x11\xdc\x8d.&\x10\x12\x84\x08\x12\xe0m\x14}\x00H\xcd&X{\x1f\
-\x01k\x18{\xe2\x08\x1ak0D\'\xfd\xfb\x9f\xa3<~\x84\xc57\xef\xa0\xe1\xc6\xed\
-\xa0\xca\xb8\xc5"\x83\xbb\xff\x85B\xdf\x1e\n\xe9UD:\x16\x81_\xc7\xe0\xbe\xff\
-\xc2\x9d|\x87\xd6\xdb\x1e!\xd1\xb9\x11\x19\xf0\xd1\xb48\x9eSD\xe9S\x98z\x17\
-\xc2\xdd\x8a.\xc6q\xb3\xe7\xb9\xf0\x1fO!M\x89\xd0$\xcd[\x9e$\xba|9\xca\xcb\
-\x929\xdb\x8d3v\x94\xc5\xb7<@\xc3\x8d\xdb\x11\xba\x8fo\xc3\xd0\xeb\xcf1s\xee\
-\x00\x86\xae!\xccFt7\xca\xe0\xbe\x17>\xd6\xa9\xac\xdd\xc4\xae\xbe\x83X\xfb\
-\x93\x9c\x7f\xfe)\x84\xee\xd1q\xef\x13\x08k\n\xa95\xd0\xbf\xffgW\xae\xaf\xbd\
-\x11e\xedB\x98[\xd1\xe54\xa6\x1c\xa6u\xdb\x9f\x11\xebX\x8d/\xfaP\x81\xb7!\
-\xb7\x9c\xc6\xf5&\xfd\xaf\xfe\'\xa5\x99\xaf\x12\x0c\x16Q^\x92\xe9\xdent\x86I\
-\xad|\x08B\x03\x04\xc5kP\xa1!\xa2\x07\xc6\xbexk\xdb\xf3F\xd7\xf0\x02\x114["\
-\xa5\x00?\x825\xa5\x81;\xd7f\xca\x8a\xe3\xfaa\xcc\x92\xc0\xf4\xc2\x08\x15\
-\x83\xb2\x8f\xdd\xd7O(\xd8L\xc3\xc6\x87\xd1\xca\xbb\x90\xde!\xa4\xf9\x00\r\
-\xeb\x1ed\xb0\xe74\xa5\xde^b\xcb\x1e\xc5\xf3\x04v\xcf\x05B\x81\x06\xea\xd6>\
-\x80t\x7f\x82,\xec\x07\x99@\x13:8\xd3PJ\xe2\x99\xa0\x95@/\x82\x15J\xa0[Q\xa4\
-\xa1a\x05Sh\xae\x8b\x92md\xba\xbeK(\xd0H\xc3\x86\x1d\xe8\xce\xcf\x11\xa5\xe3\
-\xf8\xd6\xe3\xd4\xad\xba\x87\xe2\xe9C\xe8\x8e\x8eP\t\xf0\x02Wv\xe6fA\xcf\xe0\
-Y\xdf\xc0T\x11\xa4\x12hz\r\x9a\xfd"\x9e\xf1\xf8\xbc\xea\xabi\xdd\x81V\xd8\
-\x87g\xc5\xd0l\x8dPx1\xb1\xb6\xad\xe8\xce\xf7\xc09\x0eY\x0f\xa5\x97\xa8Y\xbe\
-\x8d\x80\xf5\x1aS]\x87i\xd9\xf1\xa7x~\x9e\xec\xb1\xe7I\xb4\xac\xc1L.C\xe6wC\
-\x16\xa8\xd0\x1e\x8c\xce\x9ee\x15\x11\x7f.\x88\xd5\xc3\xa6Q\xc4H\x10$`\x8f\
-\xc2\xc1z\x98Q`X\xa8\x8d\x1b)\xf5\xbf\x8d:\x13\xc2\xeahC\xceL\xe2\x89\x14\
-\xde9\x81\x1ek\x86B\x00yx\x08\nA\xb4\xe64V\xd3-h#\xcd0\x1eC\x15\x12\xa8b\x11\
-\xf7]0\x12\x8d\xf8\xb3\x06\xfa\xd1I(|x\xa9\xb8\x16bu\xb0>\x8d\x18\t`9\x1d\
-\xb4\xed\xf8\x0b\xb4h\x04|\x1f\x7fb\x08y\xfc<\xce\x92E8\xa7J\x18\xc9fD9\x818\
-8\x03\xb9 \xb2u\x10\xa3\xf1\x06\xb4\xe1F\x84\x97\x04/\x81\xca\xa9+;\xff\xc7\
-\xbba\x089\x12@H\x01\xa54t\'\xf1\x97\xc9y\xd5G>\x01\xc7[`c\x1cFbsST?\x05]\
-\x11\xc8,\x01@\x04\xca\xc8\x1b\xa3D\xe27\x92\xdd\xf76\xf6\r\x05\xect\x9a\xf2\
-\t\x97\xc6[\xee\x86\x91<\x1c\x0c\x80_\xb9>\xaa\x0f=\xf3x\xc5\xe4\x0b\x1d\xa3\
-M\x90\xe8\x9c\xa0pf)\x12\r??\xc5\xcc\x81m \x15\xe6:\x1f=\xeb2\xf4\xeda\ngo\
-\xa2\xee\xbef\x8a\xc7l\xcc\xd5yTi3\xd9s\x19\xbc\xec4N\xe8Q\xecw\\B\xcb-f\xbb\
-\x06\x98\xd9\xdbI\xb0\xa9\t\x7fz\x1a\x11\x02\xca7\x93\xd9;\x8a\xf3\xf0(%\xf5\
-{\xd8{]\xf4\x16\x1d\xe3*\r\xfbh\x19/]$\xb1bl.\x83\xd0@\x14\xc8\xfc\xa3\xc0\
-\x1d\x10\xb8CuhMM$\xff\xb6\x84\x97\xd9@\xa1;Gyr\x04\'\xf0\x10\xc5\x036\xe1\
-\xe5\x01f\xf7\xf72\xb3\xb7\x93\xd0U)\xfcB\x1a!\xfd+:K\xfbm\x8c\xa5>\x89k\'\
-\xc8\x9f\xec@ \xf1\xf3\xe3d^YO\xcd\x93\x85y\xd5\xe7Nd\x99\xda\xf9e\xe2\xd7\r\
-S\xe8n\x99[\xe6\xcd\x8f0\xf9\xc3;(\xf7\x94\xdfo\xe3P\x7f\x80\xd8\xba\x07\x19\
-zv\x96\xd3\x7f\xb2\x0bUt\xb1\x9a\xee\xc0Z\xbc\x89\xcc\xb7\x87)\xfe\xea\xf7+\
-\xd7\x01\x00\xfd\xa5\xb5\x9b*\x1a`!S\xdb8\xcb\xdd\xec\xe3b\xaa\x16\xa7(\xa9\
-\x1f\x1a\x82{-\xf2S\x90\x1dq\xe8\xf9\x96M&\x97\xe2\x9a?l\xc4XQ\xe6\xf5\x9dK\
-\xb8.6@\xf4\xb1\x0e\x8e\xfd\xfd9F\x9e\xdeG\xfb\xed\x8b\x90k\x82\x94N\xe59\
-\xfbZ\x86b[\x07\r[\xe2t\xf79$RY\xc2\x8f\xb4s\xf4\x1f|\xc6\xbf\xdfE\xfbm\x8d\
-\xa8;\xa2\xe8\x16\xe8\x86K\xf2k\x11\x0e\xedn\xe3V\xb9\x9b\x8b\xa9$H\x8d\x0e\
-\x86x-r\x0f\x93\xc9$$Aj\x8a\xaf\xf4\x1fB\xbf\xaf\x8dc?\xe8\xa7\xf0\xc3C4o\
-\xa8\xc7\xdfd2\xf8\x9e3\xd7\xd2N\xb2\xc1\xa2\xcd\xed\';m\\\xd1\xf9ft\r\x02\
-\x9b\xbb\xc5\xcb\xf4\xd6\xd5\xa2\xa4A\x9bH\xf3\xab\xe4Z\xd6\xf6\xf5\xcd\xaf\
-\xbeA\x97\xb3\xcb\x96s\x97:L\x7f2\x86\x90\x92\xab\xd5\x00{\xae\xd9\xc0d<\xfc\
-~\x1b\xc7f\x05\xdb\x97\xb8L\xdd\xba\x81\xd1S\xc3\x10\xd2Y\xf7\xe0\x16fr5\xbc\
-\xe4\xc4\xb1\xd7V\xf6\xcf\xe6\xfaY\xbfP\xd1\x00\x0b\x99f\x7f\x06\xdb\xeec\
-\xc2)19\xae3\xf0\xcd4h:\xb6c\xa0\x84\x06B\xb2t\xa5K\xe7\xef\xe69r\xbc\x9d7zC\
-\x8c\xe9a\x1e\xbb\x7f\x8c\xc5\xdb\x0c\x8e\xfd"\xc7\x99g/\xa0\xa4\x86/\x0c\
-\xc2\t\xc9\xca\xbb$f\xdd(\xaf\xec\\Is\xbd\xcf\x83\xdb\xc7i\xf8\x92\xc6\xd9\
-\x03y\xce|\xa7\xef\xfdkk[$\xf7\xfc\x95\xc1\x84\x16\xc4.\x9dg\xa2\x1c\xc6\x8a\
-J\x1c{\x8c\x0b\xe5\x1c\xa3\xfe{\x1bk>\xb8]\t\x1e\xde\x9e#\xbcZrt\xff\x04\x87\
-\xde\xca\xa0\xa4F\xb4\xde`\xd15\x92\xe1\x92$\x18\xc9c\x17/\xf0\xd6\xb1\xd5\
-\xfc\xce\x96\x8fw\x0e\xeb-8\x8eO\xa9\xd0\xc3\x88]K0\xe6P\xb6\'8W\xca3s|~\xf5\
-\xbd\xbas%R\xce\xe0\x94\xce1\xe5\x14\xb0j\x0c\xca\xf6y.\x94\xaff\xd4\xff\xd0\
-f\xe58\xb4\x9c\x99\xa5aK\x0b\xa7N\x0f\x11J\x984m\x8a\xd0\xf5\xf6\x14\xc7s\
-\xc1\n=\xf9\x0f\xd0\x07\x07\xab\x1b\x85\x97#\x9f\xcdS\xca\xf7\xd0q\x83\xa0\
-\xdc\x15\xc2v\x0c|\xa1\x13IH\xea\x978\xb4\xae\xb0Y\xb2\xa2\xc4\xfe\xaev\x9e\
-\x7f\xa9\x85b)MzH!\xbd \xf7n;Jm\x9b\xc1\xf9#A\x8a9\r+*\xb8\xfe\xcbY\xc2\xb5\
-\xf0\x9d\x7f\xbf\x8b\x13\xddY\x0c]C\xd9:\xf7?\xda\xcdU7i\x9c\xd8\x17az\xc2"\
-\xd6\xa8X\xfd\xa5,\xbd})\x0e\x1d]\xceW\xd6\xf5\xb0tM\x84\x9az\x9f\xf4\xa0\
-\xc5\xc9\xd3\xb3\xd8N\xe9\xfd\x9c\xe9\xb4\xa26\x02\xdb\x9e8\xc7\xc5\x13\x01N\
-\xbd\x15B3\x05\xeb\xb7eYrU\x9e\x83\xbb\x93D\x93\x1e\x17\xce\xd7\xb0\xf3\x95M\
-d\xa7\xae\xe0<\x92#V\x93\xa5X\xe8\xa5u\xd5\x14M\xedEz.Dy\xe7d\x1e\x01\xf3\
-\xae\xaf>\x95\xc1.\x1ce\xc9z\x9dX\x83\xcf\xe0\xc0\x04\'OMa;\xd9K\xda\xf9\xc0\
-!\x97\xfb\xb7:\xe4\x9d\x12-\x1d\t\x84\x9c\xe0\xb5=%\x06\x07\xe5g\xfc\xc4?\
-\x8a\xd8\xb4\xe9\xd5\xea\x81\xa9\xcb \x04l\xdf\xd2\xcd\xad\xeb{I%\x8b\x089\
-\xd7T\xd9\xacIf\xd6bl*\xc2/\x7f\xb3\x9c\x0b\x17k)\xbb\xf2\x92\xfbVt\xcc\xb0y\
-\xe50\xad\xcd\xb3(O\xe1\xa3\xd1\xdd\x9b\xe0\xd0\xa9\x06z\x07"\xef_+\xa5b\xd5\
-\xd5SlY7D*^\xa0\\\x96(\xa9\xf3\xce\xbb\xb5\xec\xe9j&\x977\xb8\xf3\xd6a6uNQ\
-\xf65^~\xa3\x99cgj>\x925`y\xdc\xbca\x8c\x1bV\r#}\x17\xa9\xc1h&\xc2\xf9\x8b5l\
-^9\x0c\x08^~c\x19\xc7\xce\xd4^\xd1\x99\xcd\x19\x08\x01w\xde:\xca\xc6\xceI\\_\
-^\xe2\x9do}s\xdf\xd1\xc7\xe6\xcea\xca\xbe\xc6Ko\xb4s\xec\xcc\xa5\xe7+\x0c\
-\x1d\xfe\xe6\xeb9\xca\x03\xc3\xbc\xfa\xbd>\xbe\xf6O\x9d\xf4\x8eG\xf9\xe6\xd3\
-\x11\x16\xc2Q>\xb1h\xd1\xf7\x17@\x8c\x85\x8d\x10\x10\n~\xd0L\xae\x0b\xb6S]\
-\x1e\xff$\xd8\xb8\xb6\xcc\x0f\x9e\x9e\xe6\x99\xbf\x1c\xc4\xf5\x04\x7f\xfe\
-\xcf\x8bx\xe2\xebq\xde<\xf0\xd9\x1c%\xb8\x12\xfa\xd0\xd0P\xa53T\xf9\x02s\xdd\
-\x8eI\xa6\x873\x9c<\x92\xe7\x91\xa7\x02t\x9f\xb6yu\xd7"f\xb3\x95\x9f^\xc1\
-\xdc\xea~\x95*\x15#\x1c\xb4\x89F\xf3\xdc\xf7\xc7\xb0\xe5N\x9b\xe7^\x08-\x98\
-\xc1\x01\xa0W:@\x95/6\xcf\xfe[3A\xb3\x81\xda\x98\xcf\xd3\xdf\x91\xbc\xf8\xb3\
-O\xe7t\xe4\xff\x17\x01\xdf\xa8\xfe\x06\xa9R\xe52,\x9cwY\x95*\x0b\x90\xea\x00\
-\xa9R\xe5c\xf8o\xe0G\x96s<\x06!\xc2\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory015Bitmap():
- return wxBitmapFromImage(getDocFactory015Image())
-
-def getDocFactory015Image():
- stream = cStringIO.StringIO(getDocFactory015Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory015')
-catalog['DocFactory015'] = ImageClass()
-catalog['DocFactory015'].getData = getDocFactory015Data
-catalog['DocFactory015'].getImage = getDocFactory015Image
-catalog['DocFactory015'].getBitmap = getDocFactory015Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory016Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rf\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfbG\xfe\
-\x8c\xaa\xa8R\xd5\x055\x8a\x80,EU+JJ\xe3$\x10\x82bCblp\x9c\xf1\x86\xf16cl\
-\xcf\x8cgy\xb3\xcf\xbc\x99\xb7\xde\xfb\xee\xbd\xa7\x7f\x0c58\x04<R\x817\x11\
-\xf3\xf9\xf3\xe9\xdc\xf7\xfd~\xcf=?\x9ds\xcf\xd1\x11\xff\xf0-\xa5Xd\x91E~+z\
-\xa8\xba\xd2\x16\x16Yd\xe1\xa2\x07\x17\x0bd\x91E>\x16=\x9c\xa8\xb4\x85\x85\
-\x89@a`#\xf1.\xfb\xdd\xc5\xc0\xc5\xfc\xfc<\x08\x1b\xed7<(\xa0\xac\x02xh\x9f\
-\x89\xae\xc4\xc7\x14%|$ee\xa1\x10\x9f\x89\xce\xef\x02z(^i\x0b\x0b\x0f\x81OCa\
-\x1fQ\xf7"\xfe\x87\xc6\xa6\x94 M\x9d\xbc\x1b\'\x17lgV_\x86K\xe03\xf2\xe0\xd1\
-d\xbfA\x95\xd7{\x99\x07\x00\xddR\xd8Z\r=\xda\x0e\xca\x84>U]\r\x87\xe5\xee\
-\xcf\x08\x94G\xd1\x0c\xc1\xb8\\EZ\xde\xf8\xa9j\xfc.\xa1\x87\x17\x0b\xe4#X\
-\x8c\xd1\xa4?\xc3\xb9Wk\x99\x19\x8a\x00\x02\xa4D\xea\x8apM\x91H}\x91\xb6\xd5\
-S8\xd62\xfa\x83\x7f\x8bC\xdd\xa7\xee!\xc8\x08M\xc5\x17\xe9\xfaI\x9c\x99t\x00\
-\x84\x00!\x01\x885\xda\xac\xba\xff-\x8aF=\x93\xdc\xfc\xa9\xea\x86\x18\xa1\
-\xc1\xfe\x11\xa7~\x94"\xb6\xb4D\xcb\x86c\x14\x82\xd7R\xe6\x8b9P\xf4\xc8\x173\
-\xf7\'\x12R\x82\x84\xb6\x0e\xe1\x17\x91\x9a"\x18\x17\x18\x01\x81BP\xca\x07\
-\x19\xeb\x92\xe4\xc7\x9aY}\x97\xc44~\xcd@\xf8\x9e\xcb\x96!\xc2\xf7\x10n\x19\
-\xe1{(\xa9\xa1t\x03%\x7f\xfbrH\xb8\x0e\xd2-\x03\\\xd66\xa4t\xc2\xe2j\x94[@j\
-\\\xf2\x00\x82\xd4r\x93P\xa8\x033\xd8DD~\xf4\x7f|\xddDi:\xd2)\x82\x90\xf8\
-\x865W`W\xd0\x14(\xe2~\x91p~%\x92\x12\xd9t\x8ck\xa2\x16u\xa1\t2\xf2\x83\x812\
-\xaf|J}\xa0o\x06\xe64\xbd2\xben\xcdi\x95\xed\xb9ff\xe0\xa3\xcf\x00\xbe\x19\
-\xbc\xccs\xa5\xd0\xab\xcc\xc1J{XpX\xca\x01c\x13\x86\xfe\x16\xb1\x94\xcb\xf5\
-\x7ft\x13Z(\x08\xca\xa7\x9c\xb7\x19<\xd6\xcb\xe8\xe94\x17\x0f\xa7\xb8\xe6\
-\x8e(\x8eq\x9e\x82\x08"\x94\x87\x99\xe9\xc1\xcc\xf4\xe0\x15J\x08\xd4\xdc\xe4\
-\x13\x08`\xa7V\xe2T5\xc3\xfb\x85$\xfc2\xd6l/\xc6\xd4\x05\x94\xed\x00jn\x820\
-\x02\x14k\xafG\x0bW#\x037aY{\xd1R.\xd7?\xb6\x15#\x12\x04\xc0.+\xa6\x8c\x082 \
-\x89\xf9\xbd\x98\xd3\xe7\xb1f{P\xb6\x8bR\n\xcc ^\xb0\x1a\xb3\x98F)p\xe2\xad\
-\x94R\x1dW\xd4\x0c\x0b\x9djo\x96\xdc\xf4*p;\x11\x1a\x94\nkYf\x8d1l@I\x1a\xf3\
-\xcb\xa7|\x02\xe9#\x18\xb94\xd2\x90\xb8\xe1\x06\xb4\xc28\xbe]F\x98\x16\x8e^\
-\x8b\xccN \xa4\xc0^\xba\x06/Z\x0b\x80\x91>\x831=\x08BQ\x8e7Sn\\Y\x81\xb7\x7f\
-9z\x84\xaeJ{Xp\x18BG\x98U\xe82\x87\x1e\x14\x18\xb1\x14\x19\xab\x80\x07X\xa10\
-m\xb7m\xc4\xcb\xed&7\xd2C!s\x15\tk\x14\xdd\x9c%\x92=\x87^\xce0|f\x8a\x89\x13\
-Y<\xd7G\x0f\xea4nI\xd0\x10\x1b\xa6X\\B!\xb8\x14\xa9<"\xb9\xb3\xa8\xec\x0c\
-\x03o\x8d\x90\x1b\xb2\x11\x1a\x98\x11\x83\xea\xeb\xa2\xd4\x86F\xb1C\x9b\x11F\
-\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc3\x18\x115L4\xd7\r\xa5\x19F\x8e\
-M\x90\xe9\xc9\x03\xd0\xb8%I\xbc9\xc4\xd8\xc9\x19\xf4\xb0N\xcd\xba\x0c9\xdf!\
-\x94\xeb\xf9X\xcd\xba\xf0$f\xd56F\x0e\x9de\xe8\xc0!\x94\xef\xa1\xa4\xe0\xec\
-\xae\x9f\xb3\xf2\xa1\xfbHh\x03\xe0\x9c\x98W>]\x95\x88\x05N\xd3\xf3\x8b4\xa1Z\
-\x8b\xe4\xb5#Lvg\x9985\xcb\x8a\xfb\x93\x84\xbc\x1f\xd3\xff\xab0\xf1v\x87D\
-\xd5\x9b\xd8\x91\x9dH/K\xc0}\x91\xf4\xf1 f\x95G\xbcC\xe0\xa8?A\t\xa3\xa2cA\
-\x0fs\xa0\xa2\x06\x16"\x1aI\x04\xb7\xa33\x85\x10\x02\xa1B\x98\xfc\n\x8f)\x94\
-&\xf1\xbc[X\xb2\xbe\x83\xde\xdd\xff\x8e=>L,\x15#Q\x1eE\x14\x1a8\xf7\xc3\xc3\
-\x14\xc6\xc7\x08\xc4cH\xd3\xc4\xc9O3\xb2?M1\xddF\xcbWWc\x98g\xd0\x9d$\x9a\
-\xddB\xf7O~Hq|\x0c3\x1a\xc1\x08\x87A8\xe4{]\x1a\xd7nC\xf3\x07\x11\xb4\xa03\
-\x89g\x17\xb1\'g0\x82\x16\xa6\xd0\xd0\x021J\xfa!\xf0r\x04\xdc6\xce\xbe\xfc\
-\x12\xf9\x91\x11\x02\x898\xd2\xb2\x988r\x91\xb1\x836\xbe[&T_Op\xcb\xed\xe8v\
-\x06\xf9I\x9a\xebnG)\x08VE\xa8\xaa\x95\xe4G\xfb\x11R\x12\x8e/C\x0f\xc40T\x1a\
-\x7f^\xf9N\xa3\xa4\x87i\xac\xc7\x9f\xe9f\xec\xc28\xd3\xef\x86\x08V\'Y\xba\
-\xb1\x95\xaa\x9a\x95\xe0\x841\xfc\x93\xe4\xdf\xd3X\xba\xa6\x85\x82w\x04Y\xf2\
-\xd1\xb5\x0e\xcac\'\x89\xd7\xd4\x11\xafj \xcf!*}\x8a\xad\x87\xd8Wa\x0b\x0b\
-\x0f\xc12\x04w\xa3\x8b\t\x84\x04!\x82\x04x\x07E\x1f\x00R\xb3\tV\xdfG\xc0\x1a\
-\xc6\x9e8\x8a\xc6Z\x0c\xd1A\xff\x81\xe7)\x8f\x1fe\xe9\xcd;\xa9\xbbq\x07\xa82\
-n\xb1\xc8\xe0\x9e\x7f\xa3\xd0\xb7\x97Bz5\x91\xf6%\xe0\xd70\xb8\xff\x7fp\'\
-\xdf\xa5\xe5\xb6GHtlB\x06|4-\x8e\xe7\x14Q\xfa\x14\xa6\xde\x89p\xb7\xa1\x8bq\
-\xdc\xecy.\xfc\xd7SHS"4I\xe3\xd6\'\x89\xaeX\x81\xf2\xb2d\xcev\xe3\x8c\x1dc\
-\xe9-\x0fPw\xe3\x0e\x84\xee\xe3\xdb0\xf4\xc6\xf3\xcc\x9c;\x88\xa1k\x08\xb3\
-\x1e\xdd\x8d2\xb8\xff\xc5O\xd4T\xd6\x1ebW\xdfA\xac\xedI\xce\xbf\xf0\x14B\xf7\
-h\xbf\xf7\t\x845\x85\xd4\xea\xe8?\xf0\xd3+\xe7k\xabGY\xbb\x11\xe66t9\x8d)\
-\x87i\xd9\xfe\x17\xc4\xda\xd7\xe0\x8b>T\xe0\x1d\xc8\xad\xa0~\x83I\xffk\xffMi\
-\xe6\xab\x04\x83E\x94\x97d\xba\xb7\x1b\x9daR\xab\x1e\x82\xd0\x00A\xf1:T\xb8D\
-\xf4\xc0X\xe5?\x84\x16\x1c\xba\x86\x17\x88\xa0\xd9\x12)\x05\xf8\x11\xac)\r\
-\xdc\xb9\xbeRV\x1c\xd7\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\xbe~B\xc1F\xea\
-6=\x8cV\xde\x8d\xf4\x0e#\xcd\x07\xa8[\xff \x83=g(\xf5\xf6\x12[\xfe(\x9e\'\
-\xb0{.\x10\n\xd4Q\xb3\xee\x01\xa4\xfbcd\xe1\x00\xc8\x04\x9a\xd0\xc1\x99\x86R\
-\x12\xcf\x04\xad\x04z\x11\xacP\x02\xdd\x8a"\r\r+\x98Bs]\x94l%\xd3\xf9\x1dB\
-\x81z\xea6\xeeDw~\x86(\x9d\xc0\xb7\x1e\xa7f\xf5=\x14\xcf\x1cFwt\x84J\x80\x17\
-\xb8\xb2fn\x16\xf4\x0c\x9e\xf5\rL\x15A*\x81\xa6W\xa1\xd9/\xe1\x19\x8f\xcf+_U\
-\xcbN\xb4\xc2~<+\x86fk\x84\xc2K\x89\xb5nCw\xbe\x0b\xce\t\xc8z(\xbdD\xd5\x8a\
-\xed\x04\xac\xd7\x99\xea<B\xd3\xce?\xc7\xf3\xf3d\x8f\xbf@\xa2i-fr92\xbf\x07\
-\xb2@\x85\xcf`t\xf6.\xaf\xa8\x81\x05I\xac\x166\x8f"F\x82 \x01{\x14\x0e\xd5\
-\xc2\x8c\x02\xc3Bm\xdaD\xa9\xff\x1dTW\x08\xab\xbd\x1593\x89\'Rx\xe7\x04z\xac\
-\x11\n\x01\xe4\x91!(\x04\xd1\x1a\xd3X\r\xb7\xa0\x8d4\xc2x\x0cUH\xa0\x8aE\xdc\
-\xf7\xc0H\xd4\xe3\xcf\x1a\xe8\xc7&\xa1\xf0\xe1\xad\xe2j\x88\xd5\xc0\x864b$\
-\x80\xe5\xb4\xd3\xba\xf3\xaf\xd0\xa2\x11\xf0}\xfc\x89!\xe4\x89\xf38\xcdKpN\
-\x970\x92\x8d\x88r\x02qh\x06rAd\xcb F\xfd\rh\xc3\xf5\x08/\t^\x02\x95SW\xd6\
-\xfc?\xdd\x8dC\xc8\x91\x00B\n(\xa5\xa1;\x89\xbf\\\xce+\x1f\xf9\x04\x9ch\x82M\
-q\x18\x89\xcd-Q\xfd\x14tF \xd3\x0c\x80\x08\x94\x917F\x89\xc4o$\xbb\xff\x1d\
-\xec\x1b\n\xd8\xe94\xe5\x93.\xf5\xb7\xdc\r#y8\x14\x00\xbf\xf2cS\x1fz\xe6\xf1\
-J{Xp\x18\xad\x82D\xc7\x04\x85\xaeeH4\xfc\xfc\x143\x07\xb7\x83T\x98\xeb}\xf4\
-\xac\xcb\xd0\xb7\x87)\x9c\xbd\x89\x9a\xfb\x1a)\x1e\xb71\xd7\xe4Q\xa5-d\xcfe\
-\xf0\xb2\xd38\xa1G\xb1\xdfu\t\xad\xb0\x98\xed\x1c`f_\x07\xc1\x86\x06\xfc\xe9\
-iD\x08(\xdfLf\xdf(\xce\xc3\xa3\x94\xd4\x1f`\xefs\xd1\x9bt\x8c\xab4\xecce\xbc\
-t\x91\xc4\xca\xb19\x0fB\x03Q \xf3\xcf\x02w@\xe0\x0e\xd5\xa054\x90\xfc\xfb\
-\x12^f#\x85\xee\x1c\xe5\xc9\x11\x9c\xc0C\x14\x0f\xda\x84W\x04\x98=\xd0\xcb\
-\xcc\xbe\x0eBW\xa5\xf0\x0bi\x84\xf4\xaf\xa8Y:`c,\xf3I\\;A\xfeT;\x02\x89\x9f\
-\x1f\'\xf3\xea\x06\xaa\x9e,\xcc+\x9f;\x91ej\xd7\x97\x89_7L\xa1\xbbin\x9b7?\
-\xc2\xe4\x0f\xee\xa0\xdcS\xbe\xd4\xc7\xa1\xfe\x00\xb1\xf5\x0f2\xf4\xec,g\xfe\
-l7\xaa\xe8b5\xdc\x81\xb5t3\x99o\x0fS\xfc\xe5\x1fVn\x00|\x08\xfd\xe5u\x9b+\
-\xeda\xc1Q]?\xcb\xdd\xec\xe7b\xaa\x1a\xa7(\xa9\x1d\x1a\x82{-\xf2S\x90\x1dq\
-\xe8\xf9\x96M&\x97\xe2\x9a?\xae\xc7XY\xe6\x8d]\xcd\\\x17\x1b \xfaX;\xc7\xff\
-\xf1\x1c#O\xef\xa7\xed\xf6%\xc8\xb5AJ\xa7\xf3\x9c}=C\xb1\xb5\x9d\xba\xadq\
-\xba\xfb\x1c\x12\xa9,\xe1G\xda8\xf6O>\xe3\xdf\xeb\xa4\xed\xb6z\xd4\x1dQt\x0b\
-t\xc3%\xf9\xb5\x08\x87\xf7\xb4r\xab\xdc\xc3\xc5T\x12\xa4F;C\xbc\x1e\xb9\x87\
-\xc9d\x12\x92 5\xc5W\xfa\x0f\xa3\xdf\xd7\xca\xf1\xef\xf7S\xf8\xc1a\x1a7\xd6\
-\xe2o6\x19|_3\xd7\xd4F\xb2\xce\xa2\xd5\xed\';m\\Q\xf3\xad\xe8Z\x046w\x8bW\
-\xe8\xad\xa9FI\x83V\x91\xe6\x97\xc9u\xac\xeb\xeb\x9b_\xbeA\x97\xb3\xcbWp\x97\
-:B\x7f2\x86\x90\x92\xab\xd5\x00{\xaf\xd9\xc8d<|\xa9\x8fc\xb3\x82\x1d\xcd.S\
-\xb7nd\xf4\xf40\x84t\xd6?\xb8\x95\x99\\\x15/;q\xecu\x95\xfe<\x9fC?\xeb\x17*\
-\xeda\xc1\xd1\xe8\xcf`\xdb}L8%&\xc7u\x06\xbe\x99\x06M\xc7v\x0c\x94\xd0@H\x96\
-\xadr\xe9\xf8\xfd<GO\xb4\xf1fo\x881=\xccc\xf7\x8f\xb1t\xbb\xc1\xf1\x9f\xe7\
-\xe8z\xf6\x02Jj\xf8\xc2 \x9c\x90\xac\xbaKb\xd6\x8c\xf2\xea\xaeU4\xd6\xfa<\
-\xb8c\x9c\xba/i\x9c=\x98\xa7\xeb\xb9\xbeKm\xab\x9b$\xf7\xfc\x8d\xc1\x84\x16\
-\xc4.\x9dg\xa2\x1c\xc6\x8aJ\x1c{\x8c\x0b\xe5\x1c\xa3\xfe\xfb\x07k>\xb8\x9d\t\
-\x1e\xde\x91#\xbcFr\xec\xc0\x04\x87\xdf\xce\xa0\xa4F\xb4\xd6`\xc95\x92\xe1\
-\x92$\x18\xc9c\x17/\xf0\xf6\xf15\xfc\xde\xd6O\xd6\x1c\xd6\x9bp\x1c\x9fR\xa1\
-\x87\x11\xbb\x9a`\xcc\xa1lOp\xae\x94g\xe6\xc4\xfc\xf2\xbd\xb6k\x15R\xce\xe0\
-\x94\xce1\xe5\x14\xb0\xaa\x0c\xca\xf6y.\x94\xaff\xd4\xff\xd0a\xe584u\xcdR\
-\xb7\xb5\x89\xd3g\x86\x08%L\x1a6G\xe8|g\x8a\x13\xb9`\x85\xde\xfcG\xd1\x07\
-\x07\x17\x0f\n\x7f\x93|6O)\xdfC\xfb\r\x82rg\x08\xdb1\xf0\x85N$!\xa9mvhYi\xd3\
-\xbc\xb2\xc4\x81\xce6^x\xb9\x89b)MzH!\xbd \xf7n?Fu\xab\xc1\xf9\xa3A\x8a9\r+*\
-\xb8\xfe\xcbY\xc2\xd5\xf0\xdc\x7f\xde\xc5\xc9\xee,\x86\xae\xa1l\x9d\xfb\x1f\
-\xed\xe6\xaa\x9b4N\xee\x8f0=a\x11\xabW\xac\xf9R\x96\xde\xbe\x14\x87\x8f\xad\
-\xe0+\xeb{X\xb66BU\xadOz\xd0\xe2\xd4\x99Yl\xa7t\xc9g:\xad\xa8\x8e\xc0\xf6\'\
-\xceq\xf1d\x80\xd3o\x87\xd0L\xc1\x86\xedY\x9a\xaf\xcashO\x92h\xd2\xe3\xc2\
-\xf9*v\xbd\xba\x99\xec\xd4\x154\x8f\xe6\x88Ue)\x16ziY=EC[\x91\x9e\x0bQ\xde=\
-\x95G\xc0\xbc\xf3\xd5\xa62\xd8\x85c4o\xd0\x89\xd5\xf9\x0c\x0eLp\xea\xf4\x14\
-\xb6\x93\xbd\xac\x9f\x0f\x1ev\xb9\x7f\x9bC\xde)\xd1\xd4\x9e@\xc8\t^\xdf[bpP~\
-\xceo\xfc\xe3\x11\x9b7\xbf\xb60\xe6\xb2\x05\x84\x10\xb0ck7\xb7n\xe8%\x95,"\
-\xe4\\\x17e\xb3&\x99Y\x8b\xb1\xa9\x08\xbf\xf8\xf5\n.\\\xac\xa6\xec\xca\xcb\
-\x9e[\xd9>\xc3\x96U\xc3\xb44\xce\xa2<\x85\x8fFwo\x82\xc3\xa7\xeb\xe8\x1d\x88\
-\\j+\xa5b\xf5\xd5Sl]?D*^\xa0\\\x96(\xa9\xf3\xee{\xd5\xec\xedl$\x977\xb8\xf3\
-\xd6a6wLQ\xf65^y\xb3\x91\xe3]U\x1f\xf1\x1a\xb0<n\xde8\xc6\r\xab\x87\x91\xbe\
-\x8b\xd4`4\x13\xe1\xfc\xc5*\xb6\xac\x1a\x06\x04\xaf\xbc\xb9\x9c\xe3]\xd5W\
-\xd4\xcc\xe6\x0c\x84\x80;o\x1deS\xc7$\xae//\xd3\x9do\xbe\xb9\xff\xe8cK\xc70e\
-_\xe3\xe57\xdb8\xdeu\xf9\xbd\nC\x87\xbf\xfbz\x8e\xf2\xc00\xaf}\xb7\x8f\xaf\
-\xfdK\x07\xbd\xe3Q\xbe\xf9t\x84\x85t\x85O,Y\xf2\xbd\x05dga!\x04\x84\x82\x1ft\
-\x8f\xeb\x82\xed,n\x8b\x7f\x1alZW\xe6\xfbOO\xf3\xcc_\x0f\xe2z\x82\xbf\xfc\
-\xd7%<\xf1\xf58o\x1d\xfc|\xae\x12\xcc\x17}hh\xa8\xd2\x1e\x16\xf9\x02r\xdd\
-\xceI\xa6\x873\x9c:\x9a\xe7\x91\xa7\x02t\x9f\xb1ym\xf7\x12f\xb3\x0bgy\x05s\
-\xbb\xfc\x8b,\xf2\xb9\x13\x0e\xdaD\xa3y\xee\xfbS\xd8z\xa7\xcd\xf3/\x86\x16\\\
-q\x00\xe8\x956\xb0\xc8\x17\x93g\xff\xa3\x91\xa0YGu\xcc\xe7\xe9\xe7$/\xfd\xf4\
-\xb3\xb9\x1d\xf9\xffE\xc07\x16\xbfA\x16Y\xe4cXxs\xda"\x8b, \x16\x0bd\x91E>\
-\x81\xff\x05\xc4\xdb\x96s\xad\x0c>\xba\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory016Bitmap():
- return wxBitmapFromImage(getDocFactory016Image())
-
-def getDocFactory016Image():
- stream = cStringIO.StringIO(getDocFactory016Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory016')
-catalog['DocFactory016'] = ImageClass()
-catalog['DocFactory016'].getData = getDocFactory016Data
-catalog['DocFactory016'].getImage = getDocFactory016Image
-catalog['DocFactory016'].getBitmap = getDocFactory016Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory017Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ri\
-IDATx\x9c\xed\x9byl]U~\xc7?\xe7\xdc\xed\xad~\x8b\x9f\xd7\xc4vb;@\xc0I\xc8\
-\x1e\xd6\xcc\x04fh\xc2R\xb6\x94\xa5\x85\xaaj5\xaa\njE\xdb?\xe6\xcfQ5\xaaTuA\
-\x1d\x8d\x80Y\x8a\xaaV\x0c3t230\x0c\x9a\x04fB\x02\x99\x8c\xe3$\x84\xac\x0eIl\
-\xc7\xcb\xf3n?\xfb\xad\xf7\xbe{\xef\xe9\x1f\x86@\xca\x92T\x02\xfc\x10\xfe\
-\xfc\xf9t\xee\xfb~\xbf\xe7\x9e\x9f\xce\xb9\xe7\xe8\x88\x7f\xfa\x8eR,\xb0\xc0\
-\x02\x1f\x89\x1e\xaa\x9eo\x0b\x0b,P\xb9\xe8\xc1\x85\x02Y`\x81\x8fE\x0f\'\xe6\
-\xdbBe!P\x18\xd8H\xbc\x8b~w1p1??\x0f\xc2F\xfb?\x1e\x14PV\x01<\xb4\xcfDW\xe2c\
-\x8a\x12>\x92\xb2\xb2P\x88\xcfD\xe7\x8b\x84\x1e\x8a\xcf\xb7\x85\xcaA\xe0\xd3\
-P\xd8C\xd4=\x8f\xff\x81\xb1)%HS\'\xef\xc6\xc9\x05\xdb\x99\xd5\x97\xe0\x12\
-\xf8\x8c<x4\xd9\xafQ\xe5\xf5^\xe4\x01@\xb7\x14\xb6VC\x8f\xb6\x8d2\xa1OUW\xc3\
-a\xa9\xfb+\x02\xe5Q4C0.W\x90\x96\xd7\x7f\xaa\x1a_D\xf4\xf0B\x81\\\xc0b\x8c&\
-\xfd)\xce\xbc\\\xcb\xccP\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4\xad\x9c\xc2\xb1\
-\x96\xd0\x1f\xfc{\x1c\xea>u\x0fAFh*>\xcf\xa9_\xc4\x99I\x07@\x08\x10\x12\x80X\
-\xa3\xcd\x8a{\xdf\xa0h\xd43\xc9\x8d\x9f\xaan\x88\x11\x1a\xec\x9fq\xfcg)b\x8b\
-K\xb4\xac;L!x5e\xbe\xdc\x03D\x8f|\xb9\xf3_DH\t\x12\xda\x1a\x84_Dj\x8a`\\`\
-\x04\x04\nA)\x1fd\xec\x94$?\xd6\xcc\xca;$\xa6\xf1{\x06\xc2w]\xb4\x0c\x11\xbe\
-\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\xd1\xcb!\xe1:H\xb7\x0cpQ\xdb\x90\xd2\t\
-\x8b+Qn\x01\xa9q\xc1\x03\x08RKMB\xa1\x0e\xcc`\x13\x11\xf9\xe1\xff\xf1u\x13\
-\xa5\xe9H\xa7\x08B\xe2\x1b\xd6\\\x81]BS\xa0\x88\xfbE\xc2\xf9\xe5HJd\xd31\xae\
-\x8aZ\xd4\x85&\xc8\xc8\xf7\x07\xc8e\xe5S\xea}}30\xa7\xe9\x95\xf1ukN\xabl\xcf\
-53\x03\x1f~\x06\xf0\xcd\xe0E\x9e\xe7\x1b\xbd\xca\x1c\x9co\x0f\x15\x83\xa5\
-\x1c06`\xe8o\x10K\xb9\\\xfb\'7\xa0\x85\x82\xa0|\xcay\x9b\xc1\xc3\xbd\x8c\x9e\
-Hs\xbe+\xc5U\xb7Eq\x8c\xb3\x14D\x10\xa1<\xccL\x0ff\xa6\x07\xafPB\xa0\xe6&\
-\x9f@\x00;\xb5\x1c\xa7\xaa\x19\xde-$\xe1\x97\xb1f{1\xa6\xce\xa1l\x07Ps\x13\
-\x84\x11\xa0X{-Z\xb8\x1a\x19\xb8\x01\xcb\xda\x8d\x96r\xb9\xf6\x91\xcd\x18\
-\x91 \x00vY1eD\x90\x01I\xcc\xef\xc5\x9c>\x8b5\xdb\x83\xb2]\x94R`\x06\xf1\x82\
-\xd5\x98\xc54J\x81\x13o\xa5\x94\xea\xb8\xa4fX\xe8T{\xb3\xe4\xa6W\x80\xdb\x89\
-\xd0\xa0TX\xcd\x12k\x8ca\x03J\xd2\xb8\xbc|\xca\'\x90>\x88\x91K#\r\x89\x1bn@+\
-\x8c\xe3\xdbe\x84i\xe1\xe8\xb5\xc8\xec\x04B\n\xec\xc5\xab\xf0\xa2\xb5\x00\
-\x18\xe9\x93\x18\xd3\x83 \x14\xe5x3\xe5\xc6\xe5\xf3\xf0\xf6?\x1a=\xc2\xa9\
-\xf9\xf6P1\x18BG\x98U\xe82\x87\x1e\x14\x18\xb1\x14\x19\xab\x80\x07X\xa10m\
-\xb7\xac\xc7\xcb\xed$7\xd2C!s\x05\tk\x14\xdd\x9c%\x92=\x83^\xce0|r\x8a\x89\
-\xa3Y<\xd7G\x0f\xea4nJ\xd0\x10\x1b\xa6X\\D!\xb8\x18\xa9<"\xb9\xd3\xa8\xec\
-\x0c\x03o\x8c\x90\x1b\xb2\x11\x1a\x98\x11\x83\xeak\xa2\xd4\x86F\xb1C\x1b\x11\
-F\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc3\x18\x115L4\xd7\r\xa5\x19F\
-\x0eO\x90\xe9\xc9\x03\xd0\xb8)I\xbc9\xc4\xd8\xb1\x19\xf4\xb0N\xcd\x9a\x0c9\
-\xdf!\x94\xeb\xf9X\xcd\xba\xf0$f\xd5\x16F\x0e\x9cfh\xdf\x01\x94\xef\xa1\xa4\
-\xe0\xf4\x8e_\xb3\xfc\x81{Hh\x03\xe0\x1c\xbd\xac|\xba*\x11\x0b\x9c\xa0\xe77i\
-B\xb5\x16\xc9\xabG\x98\xec\xce2q|\x96e\xf7&\ty?\xa7\xffwa\xe2\xed\x0e\x89\
-\xaa\xd7\xb1#\xdb\x91^\x96\x80\xfb<\xe9#A\xcc*\x8fx\x87\xc0Q\x7f\x86\x12\xc6\
-\xfc\x0e\x86w\xd1\xc3\xec\x9bo\x0f\x15\x83F\x12\xc1\xad\xe8L!\x84@\xa8\x10&\
-\xbf\xc3c\n\xa5I<\xef&\x16\xad\xed\xa0w\xe7\x7fb\x8f\x0f\x13K\xc5H\x94G\x11\
-\x85\x06\xce\xfc\xb4\x8b\xc2\xf8\x18\x81x\x0ci\x9a8\xf9iF\xf6\xa6)\xa6\xdbh\
-\xf9\xfaJ\x0c\xf3$\xba\x93D\xb3[\xe8\xfe\xc5O)\x8e\x8faF#\x18\xe10\x08\x87|\
-\xafK\xe3\xea-h\xfe \x82\x16t&\xf1\xec"\xf6\xe4\x0cF\xd0\xc2\x14\x1aZ FI?\
-\x00^\x8e\x80\xdb\xc6\xe9\x17_ ?2B \x11GZ\x16\x13\x07\xcf3\xb6\xdf\xc6w\xcb\
-\x84\xea\xeb\tn\xba\x15\xdd\xce ?Is\xcd\xad(\x05\xc1\xaa\x08U\xb5\x92\xfch?B\
-J\xc2\xf1%\xe8\x81\x18\x86J\xe3_V\xbe\x13(\xe9a\x1ak\xf1g\xba\x19;7\xce\xf4\
-\xdb!\x82\xd5I\x16\xafo\xa5\xaaf98a\x0c\xff\x18\xf9w4\x16\xafj\xa1\xe0\x1dD\
-\x96|t\xad\x83\xf2\xd81\xe25u\xc4\xab\x1a\xc8s\x80J9\xbd\xd6C\xec\x99o\x0f\
-\x15\x83`\t\x82;\xd1\xc5\x04B\x82\x10A\x02\xbc\x85\xa2\x0f\x00\xa9\xd9\x04\
-\xab\xef!`\rcO\x1cBc5\x86\xe8\xa0\x7f\xdf\xb3\x94\xc7\x0f\xb1\xf8\xc6\xed\
-\xd4]\xbf\rT\x19\xb7Xdp\xd7\x7fP\xe8\xdbM!\xbd\x92H\xfb"\xf0k\x18\xdc\xfb?\
-\xb8\x93o\xd3r\xcbC$:6 \x03>\x9a\x16\xc7s\x8a(}\nS\xefD\xb8[\xd0\xc58n\xf6,\
-\xe7~\xf4\x04\xd2\x94\x08M\xd2\xb8\xf9q\xa2\xcb\x96\xa1\xbc,\x99\xd3\xdd8c\
-\x87Y|\xd3}\xd4]\xbf\r\xa1\xfb\xf86\x0c\xbd\xf6,3g\xf6c\xe8\x1a\xc2\xacGw\
-\xa3\x0c\xee}\xfe\x135\x95\xb5\x8b\xd8\x95\xb7\x11k{\x9c\xb3\xcf=\x81\xd0=\
-\xda\xef~\x0caM!\xb5:\xfa\xf7\xfd\xf2\xd2\xf9\xda\xeaQ\xd6N\x84\xb9\x05]Nc\
-\xcaaZ\xb6\xfe\x15\xb1\xf6U\xf8\xa2\x0f\x15x\x0br\xcb\xa8_g\xd2\xff\xcaO(\
-\xcd|\x9d`\xb0\x88\xf2\x92L\xf7v\xa33Lj\xc5\x03\x10\x1a (^\x85\n)\x11=0V9\
-\x1fD\xf3\x8e\xae\xe1\x05"h\xb6DJ\x01~\x04kJ\x03w\xae\x8f\x94\x15\xc7\xf5\
-\xc3\x98%\x81\xe9\x85\x11*\x06e\x1f\xbb\xaf\x9fP\xb0\x91\xba\r\x0f\xa2\x95w"\
-\xbd.\xa4y\x1fuk\xefg\xb0\xe7$\xa5\xde^bK\x1f\xc6\xf3\x04v\xcf9B\x81:j\xd6\
-\xdc\x87t\x7f\x8e,\xec\x03\x99@\x13:8\xd3PJ\xe2\x99\xa0\x95@/\x82\x15J\xa0[Q\
-\xa4\xa1a\x05Sh\xae\x8b\x92\xadd:\xbfG(PO\xdd\xfa\xed\xe8\xce\xaf\x10\xa5\
-\xa3\xf8\xd6\xa3\xd4\xac\xbc\x8b\xe2\xc9.tGG\xa8\x04x\x81Kk\xe6fA\xcf\xe0Y\
-\xdf\xc2T\x11\xa4\x12hz\x15\x9a\xfd\x02\x9e\xf1\xe8e\xe5\xabj\xd9\x8eV\xd8\
-\x8bg\xc5\xd0l\x8dPx1\xb1\xd6-\xe8\xce\xf7\xc19\nY\x0f\xa5\x97\xa8Z\xb6\x95\
-\x80\xf5*S\x9d\x07i\xda\xfe\x97x~\x9e\xec\x91\xe7H4\xad\xc6L.E\xe6wA\x16\xa8\
-\x903\x18\x9d\xddK\xe7\xdbC\xe5\x10\xab\x85\x8d\xa3\x88\x91 H\xc0\x1e\x85\
-\x03\xb50\xa3\xc0\xb0P\x1b6P\xea\x7f\x0bu*\x84\xd5\xde\x8a\x9c\x99\xc4\x13)\
-\xbc3\x02=\xd6\x08\x85\x00\xf2\xe0\x10\x14\x82h\x8di\xac\x86\x9b\xd0F\x1aa<\
-\x86*$P\xc5"\xee;`$\xea\xf1g\r\xf4\xc3\x93P\xf8\xe0Vq5\xc4j`]\x1a1\x12\xc0r\
-\xdai\xdd\xfe7h\xd1\x08\xf8>\xfe\xc4\x10\xf2\xe8Y\x9c\xe6E8\'J\x18\xc9FD9\
-\x8180\x03\xb9 \xb2e\x10\xa3\xfe:\xb4\xe1z\x84\x97\x04/\x81\xca\xa9Kk\xbe\
-\xa7\xbb~\x089\x12@H\x01\xa54t\'\xf1\x97\xca\xcb\xcaG>\x01G\x9b`C\x1cFbsKT?\
-\x05\x9d\x11\xc84\x03 \x02e\xe4\xf5Q"\xf1\xeb\xc9\xee}\x0b\xfb\xba\x02v:M\
-\xf9\x98K\xfdMw\xc2H\x1e\x0e\x04\xc0\xaf\x9c1\xa9\x0f=\xf5\xe8|{\xa8\x18\x8c\
-VA\xa2c\x82\xc2\xa9%H4\xfc\xfc\x143\xfb\xb7\x82T\x98k}\xf4\xac\xcb\xd0w\x87)\
-\x9c\xbe\x81\x9a{\x1a)\x1e\xb11W\xe5Q\xa5Md\xcfd\xf0\xb2\xd38\xa1\x87\xb1\
-\xdfv\t-\xb3\x98\xed\x1c`fO\x07\xc1\x86\x06\xfc\xe9iD\x08(\xdfHf\xcf(\xce\
-\x83\xa3\x94\xd4\x1fa\xefq\xd1\x9bt\x8c+4\xec\xc3e\xbct\x91\xc4\xf2\xb19\x0f\
-B\x03Q \xf3\xaf\x02w@\xe0\x0e\xd5\xa054\x90\xfc\xc7\x12^f=\x85\xee\x1c\xe5\
-\xc9\x11\x9c\xc0\x03\x14\xf7\xdb\x84\x97\x05\x98\xdd\xd7\xcb\xcc\x9e\x0eBW\
-\xa4\xf0\x0bi\x84\xf4/\xa9Y\xdagc,\xf1I\\=A\xfex;\x02\x89\x9f\x1f\'\xf3\xf2:\
-\xaa\x1e/\\V>w"\xcb\xd4\x8e\xaf\x12\xbff\x98Bw\xd3\xdc6o~\x84\xc9\x1f\xdfF\
-\xb9\xa7|\xa1\x8fC\xfd\x01bk\xefg\xe8\xe9YN\xfe\xc5NT\xd1\xc5j\xb8\rk\xf1F2\
-\xdf\x1d\xa6\xf8\xdb?\x9e\xbf\x01\xf0\x11\xe8/\xae\xd98\xdf\x1e*\x86\xea\xfa\
-Y\xeed/\xe7S\xd58EI\xed\xd0\x10\xdcm\x91\x9f\x82\xec\x88C\xcfwl2\xb9\x14W\
-\xfdi=\xc6\xf22\xaf\xedh\xe6\x9a\xd8\x00\xd1G\xda9\xf2\xcfg\x18yr/m\xb7.B\
-\xae\x0eR:\x91\xe7\xf4\xab\x19\x8a\xad\xed\xd4m\x8e\xd3\xdd\xe7\x90He\t?\xd4\
-\xc6\xe1\x7f\xf1\x19\xffA\'m\xb7\xd4\xa3n\x8b\xa2[\xa0\x1b.\xc9oD\xe8\xda\
-\xd5\xca\xcdr\x17\xe7SI\x90\x1a\xed\x0c\xf1j\xe4.&\x93IH\x82\xd4\x14_\xeb\
-\xefB\xbf\xa7\x95#?\xec\xa7\xf0\xe3.\x1a\xd7\xd7\xe2o4\x19|W3\xd7\xd4F\xb2\
-\xce\xa2\xd5\xed\';m\\R\xf3\x8d\xe8j\x046w\x8a\x97\xe8\xad\xa9FI\x83V\x91\
-\xe6\xb7\xc95\xac\xe9\xeb\xbb\xbc|\x83.\xa7\x97.\xe3\x0eu\x90\xfed\x0c!%W\
-\xaa\x01v_\xb5\x9e\xc9x\xf8B\x1f\xc7f\x05\xdb\x9a]\xa6n^\xcf\xe8\x89a\x08\
-\xe9\xac\xbd\x7f33\xb9*^t\xe2\xd8k*\xe3\xdb\xe3=\xf4\xd3~a\xbe=T\x0c\x8d\xfe\
-\x0c\xb6\xdd\xc7\x84Sbr\\g\xe0\xdbi\xd0tl\xc7@\t\r\x84d\xc9\n\x97\x8e?\xccs\
-\xe8h\x1b\xaf\xf7\x86\x18\xd3\xc3<r\xef\x18\x8b\xb7\x1a\x1c\xf9u\x8eSO\x9fCI\
-\r_\x18\x84\x13\x92\x15wH\xcc\x9aQ^\xde\xb1\x82\xc6Z\x9f\xfb\xb7\x8dS\xf7\
-\x15\x8d\xd3\xfb\xf3\x9cz\xa6\xefB\xdb\xea&\xc9]\x7fg0\xa1\x05\xb1Kg\x99(\
-\x87\xb1\xa2\x12\xc7\x1e\xe3\\9\xc7\xa8\xff\xee\xc1\x9a\x0fng\x82\x07\xb7\
-\xe5\x08\xaf\x92\x1c\xde7A\xd7\x9b\x19\x94\xd4\x88\xd6\x1a,\xbaJ2\\\x92\x04#\
-y\xec\xe29\xde<\xb2\x8a?\xd8\xfc\xc9\x9a\xc3z\x13\x8e\xe3S*\xf40bW\x13\x8c9\
-\x94\xed\t\xce\x94\xf2\xcc\x1c\xbd\xbc|\xaf\xecX\x81\x9438\xa53L9\x05\xac*\
-\x83\xb2}\x96s\xe5+\x19\xf5?pX9\x0eM\xa7f\xa9\xdb\xdc\xc4\x89\x93C\x84\x12&\
-\r\x1b#t\xbe5\xc5\xd1\\p\x9e\xde\xfc\xc7\xa3\x0f\x0e.\x1c\x14\xbeG>\x9b\xa7\
-\x94\xef\xa1\xfd:A\xb93\x84\xed\x18\xf8B\'\x92\x90\xd46;\xb4,\xb7i^^b_g\x1b\
-\xcf\xbd\xd8D\xb1\x94&=\xa4\x90^\x90\xbb\xb7\x1e\xa6\xba\xd5\xe0\xec\xa1 \
-\xc5\x9c\x86\x15\x15\\\xfb\xd5,\xe1jx\xe6\xbf\xef\xe0Xw\x16C\xd7P\xb6\xce\
-\xbd\x0fws\xc5\r\x1a\xc7\xf6F\x98\x9e\xb0\x88\xd5+V}%Ko_\x8a\xae\xc3\xcb\xf8\
-\xda\xda\x1e\x96\xac\x8ePU\xeb\x93\x1e\xb48~r\x16\xdb)]\xf0\x99N+\xaa#\xb0\
-\xf5\xb13\x9c?\x16\xe0\xc4\x9b!4S\xb0nk\x96\xe6+\xf2\x1c\xd8\x95$\x9a\xf48w\
-\xb6\x8a\x1d/o$;u\t\xcdC9bUY\x8a\x85^ZVN\xd1\xd0V\xa4\xe7\\\x94\xb7\x8f\xe7\
-\x11p\xd9\xf9jS\x19\xec\xc2a\x9a\xd7\xe9\xc4\xea|\x06\x07&8~b\n\xdb\xc9^\xd4\
-\xcf\xfb\xbb\\\xee\xdd\xe2\x90wJ4\xb5\'\x10r\x82Ww\x97\x18\x1c\x94\x9f\xf3\
-\x1b\xbf4b\xe3\xc6W*kN\x9bG\x84\x80m\x9b\xbb\xb9y]/\xa9d\x11!\xe7\xba&\x9b5\
-\xc9\xccZ\x8cME\xf8\xcd\xef\x97q\xee|5eW^\xf4\xdc\xf2\xf6\x196\xad\x18\xa6\
-\xa5q\x16\xe5)|4\xba{\x13t\x9d\xa8\xa3w r\xa1\xad\x94\x8a\x95WN\xb1y\xed\x10\
-\xa9x\x81rY\xa2\xa4\xce\xdb\xefT\xb3\xbb\xb3\x91\\\xde\xe0\xf6\x9b\x87\xd9\
-\xd81E\xd9\xd7x\xe9\xf5F\x8e\x9c\xaa\xfa\x90\xd7\x80\xe5q\xe3\xfa1\xae[9\x8c\
-\xf4]\xa4\x06\xa3\x99\x08g\xcfW\xb1i\xc50 x\xe9\xf5\xa5\x1c9U}I\xcdl\xce@\
-\x08\xb8\xfd\xe6Q6tL\xe2\xfa\xf2"\xdd\xcb\xcd7\xf7\x1f}l\xea\x18\xa6\xeck\
-\xbc\xf8z\x1bGN]|\x9f\xc2\xd0\xe1\x1f\xbe\x99\xa3<0\xcc+\xdf\xef\xe3\x1b\xff\
-\xd6A\xefx\x94o?\x19\xa1\x12\xaf\xee\x89E\x8b~P\x81\xb6\xe6\x17! \x14|\xbf[\
-\\\x17l\xa72\xb6\x1d\xbf\xe8lXS\xe6\x87ON\xf3\xd4\xdf\x0e\xe2z\x82\xbf\xfe\
-\xf7E<\xf6\xcd8o\xec\xff|\xae\x12\xfc\x7f\xd1\x87\x86\x86\xe6\xdb\xc3\x02_"\
-\xae\xd9>\xc9\xf4p\x86\xe3\x87\xf2<\xf4D\x80\xee\x936\xaf\xec\\\xc4l\xb6\xf2\
-\x96W0\xb7\xdb\xbf\xc0\x02\x9f\x1b\xe1\xa0M4\x9a\xe7\x9e?\x87\xcd\xb7\xdb<\
-\xfb|\xa8b\x8b\x03@\x9fo\x03\x0b|\xb9x\xfa\xbf\x1a\t\x9auT\xc7|\x9e|F\xf2\
-\xc2/?\x9b\xdb\x91\x9f\x16\x02\xbe\xb5\xf0\r\xb2\xc0\x02\x1fC\xe5\xcem\x0b,P\
-\x01,\x14\xc8\x02\x0b|\x02\xff\x0b\xa9o\x96s\xa0\x18\xcc\xe5\x00\x00\x00\x00\
-IEND\xaeB`\x82'
-
-def getDocFactory017Bitmap():
- return wxBitmapFromImage(getDocFactory017Image())
-
-def getDocFactory017Image():
- stream = cStringIO.StringIO(getDocFactory017Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory017')
-catalog['DocFactory017'] = ImageClass()
-catalog['DocFactory017'].getData = getDocFactory017Data
-catalog['DocFactory017'].getImage = getDocFactory017Image
-catalog['DocFactory017'].getBitmap = getDocFactory017Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory018Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rd\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0v\x93\xd4(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\n\xb5Y\xd6JY\x12Iq\
-\xb9\xdc\xc9K\xde\xf5\x9c{\xce\x99\xfe\xa0#[q,\x11\x85\xadK#|~\x1e\xcc9\xef\
-\xfb}3\x1ff\xce\x0cF\xfc\xc3\xb7\x94b\x81\x05\x16\xf8\xad\xe8\xa1\xeaJ[X`\
-\x81\xf9\x8b\x1e\\(\x90\x05\x16\xf8T\xf4p\xa2\xd2\x16\xe6\x07\x02\x85\x81\
-\x8d\xc4\xbb\xe4\xb9\x8b\x81\x8by\xf5<\x08\x1b\xed7<(\xa0\xac\x02xh\x9f\x8b\
-\xae\xc4\xc7\x14%|$ee\xa1\x10\x9f\x8b\xce\x17\x11=\x14\xaf\xb4\x85\xca#\xf0i\
-(\xec!\xea^\xc0\xff\xd8\xd8\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xed\xcc\xe8Kp\t\
-|N\x1e<\x9a\xec\xb7\xa8\xf2z.\xf1\x00\xa0[\n[\xab\xa1[\xdbF\x99\xd0g\xaa\xab\
-\xe1\xb0\xd4\xfd)\x81\xf2\x08\x9a!\x18\x93+H\xcb\x9b?S\x8d/2zx\xa1@\xb0\x18\
-\xa5I\x7f\x8e\xb3\xaf\xd72=\x18\x01\x04H\x89\xd4\x15\xe1\x9a"\x91\xfa"m+\'q\
-\xac%\xf4\x05\xff\x16\x87\xba\xcf\xdcC\x90a\x9a\x8a/s\xfa\xc7q\xa6\xd3\x01\
-\x10\x02\x84\x04 \xd6h\xb3\xe2\xc1w(\x1a\xf5Lp\xebg\xaa\x1bb\x98\x06\xfb\x87\
-\x9c\xf8a\x8a\xd8\xe2\x12-\xeb\x8eP\x08^O\x99\x85\x81\x01\xa0G\x16\xf2@H\t\
-\x12\xda\x1a\x84_Dj\x8a`\\`\x04\x04\nA)\x1fd\xf4\xb4$?\xda\xcc\xca{$\xa6\xf1\
-+\xfa\xc3\xf7]\xb2\x0c\x11\xbe\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\xdb\x97C\
-\xc2u\x90n\x19\xe0\x92\xb6!\xa5\x13\x16\xd7\xa2\xdc\x02R\xe3\xa2\x07\x10\xa4\
-\x96\x9a\x84B\x1d\x98\xc1&"\xf2\x93\xdf\xf1u\x13\xa5\xe9H\xa7\x08B\xe2\x1b\
-\xd6l\x81]AS\xa0\x88\xfbE\xc2\xf9\xe5HJd\xd31\xae\x8bZ\xd4\x85\xc6\xc9\xc8\
-\x8f\x06\xc6\x9c\xe2S\xea#}30\xab\xe9\x95\xf1ukV\xabl\xcf63\x03\x9f|\x07\xf0\
-\xcd\xe0%\x9e\xe7\x0bz\x959Pi\x0f\x15\xc7R\x0e\x18\x1b0\xf4w\x88\xa5\\n\xfc\
-\xa3[\xd0BAP>\xe5\xbc\xcd\xc0\x91\x1eFN\xa6\xb9p0\xc5uwEq\x8cs\x14D\x10\xa1<\
-\xccL7f\xa6\x1b\xafPB\xa0f\'\x9f@\x00;\xb5\x1c\xa7\xaa\x19>,$\xe1\x97\xb1fz0\
-&\xcf\xa3l\x07P\xb3\x13\x84\x11\xa0X{#Z\xb8\x1a\x19\xb8\x05\xcb\xda\x8d\x96r\
-\xb9\xf1\x89\xcd\x18\x91 \x00vY1iD\x90\x01I\xcc\xef\xc1\x9c:\x875\xd3\x8d\
-\xb2]\x94R`\x06\xf1\x82\xd5\x98\xc54J\x81\x13o\xa5\x94\xea\xb8\xa2fX\xe8T{3\
-\xe4\xa6V\x80\xdb\x89\xd0\xa0TX\xcd\x12k\x94!\x03J\xd2\x98[|\xca\'\x90>\x84\
-\x91K#\r\x89\x1bn@+\x8c\xe1\xdbe\x84i\xe1\xe8\xb5\xc8\xec8B\n\xec\xc5\xab\
-\xf0\xa2\xb5\x00\x18\xe9S\x18S\x03 \x14\xe5x3\xe5\xc6\xe5\x15\xe8\xfd\xcb\
-\xa3G8]i\x0f\x15\xc7\x10:\xc2\xacB\x979\xf4\xa0\xc0\x88\xa5\xc8X\x05<\xc0\n\
-\x85i\xbbc=^n\'\xb9\xe1n\n\x99kHX#\xe8\xe6\x0c\x91\xecY\xf4r\x86\xa1S\x93\
-\x8c\x1f\xcb\xe2\xb9>zP\xa7qS\x82\x86\xd8\x10\xc5\xe2"\n\xc1\xc5H\xe5\x11\
-\xc9\x9dAe\xa7\xe9\x7fg\x98\xdc\xa0\x8d\xd0\xc0\x8c\x18T\xdf\x10\xa564\x82\
-\x1d\xda\x880R\xe82\x8f\x1e\x04#\x9a\xa2\x10(\xe1\xe2\xe1\x06]\x1cF\x89\xa8!\
-\xa2\xb9.(M3|d\x9cLw\x1e\x80\xc6MI\xe2\xcd!F\x8fO\xa3\x87uj\xd6d\xc8\xf9\x0e\
-\xa1\\\xf7\xa7j\xd6\x85\'0\xab\xb60|\xe0\x0c\x83\xfb\x0e\xa0|\x0f%\x05gv\xfc\
-\x8c\xe5\x8f<@B\xeb\x07\xe7\xd8\x9c\xe2\xd3U\x89X\xe0$\xdd?O\x13\xaa\xb5H^?\
-\xccDW\x96\xf1\x133,{0I\xc8\xfb\x11}\xbf\x0c\x13owHT\xbd\x8d\x1d\xd9\x8e\xf4\
-\xb2\x04\xdc\x97I\x1f\rbVy\xc4;\x04\x8e\xfa\x13\x940*;\x18~\x03=\xcc\xbeJ{\
-\xa88\x1aI\x04w\xa23\x89\x10\x02\xa1B\x98\xfc\x12\x8fI\x94&\xf1\xbc\xdbX\xb4\
-\xb6\x83\x9e\x9d\xff\x81=6D,\x15#Q\x1eA\x14\x1a8\xfb\x83\x83\x14\xc6F\t\xc4c\
-H\xd3\xc4\xc9O1\xbc7M1\xddF\xcbWWb\x98\xa7\xd0\x9d$\x9a\xddB\xd7\x8f\x7f@ql\
-\x143\x1a\xc1\x08\x87A8\xe4{\\\x1aWoA\xf3\x07\x10\xb4\xa03\x81g\x17\xb1\'\
-\xa61\x82\x16\xa6\xd0\xd0\x021J\xfa\x01\xf0r\x04\xdc6\xce\xbc\xfa\n\xf9\xe1a\
-\x02\x898\xd2\xb2\x18?t\x81\xd1\xfd6\xbe[&T_Op\xd3\x9d\xe8v\x06y9\xcd5w\xa2\
-\x14\x04\xab"T\xd5J\xf2#}\x08)\t\xc7\x97\xa0\x07b\x18*\x8d?\xa7\xf8N\xa2\xa4\
-\x87i\xac\xc5\x9f\xeeb\xf4\xfc\x18S\xef\x87\x08V\'Y\xbc\xbe\x95\xaa\x9a\xe5\
-\xe0\x841\xfc\xe3\xe4?\xd0X\xbc\xaa\x85\x82w\x08Y\xf2\xd1\xb5\x0e\xca\xa3\
-\xc7\x89\xd7\xd4\x11\xafj \xcf\x01\xe6\xdb\xa9\xb5\x1ebO\xa5=T\x1c\xc1\x12\
-\x04\xf7\xa2\x8bq\x84\x04!\x82\x04x\x0fE/\x00R\xb3\tV?@\xc0\x1a\xc2\x1e?\x8c\
-\xc6j\x0c\xd1A\xdf\xbe\x17)\x8f\x1df\xf1\xad\xdb\xa9\xbby\x1b\xa82n\xb1\xc8\
-\xc0\xae\x7f\xa7\xd0\xbb\x9bBz%\x91\xf6E\xe0\xd70\xb0\xf7\x7fq\'\xde\xa7\xe5\
-\x8e\xc7Htl@\x06|4-\x8e\xe7\x14Q\xfa$\xa6\xde\x89p\xb7\xa0\x8b1\xdc\xec9\xce\
-\xff\xf73HS"4I\xe3\xe6\xa7\x89.[\x86\xf2\xb2d\xcet\xe1\x8c\x1ea\xf1m\x0fQw\
-\xf36\x84\xee\xe3\xdb0\xf8\xd6\x8bL\x9f\xdd\x8f\xa1k\x08\xb3\x1e\xdd\x8d2\
-\xb0\xf7\xe5\xcbj*k\x17\xb1k\xef"\xd6\xf64\xe7^z\x06\xa1{\xb4\xdf\xff\x14\
-\xc2\x9aDju\xf4\xed\xfb\xc9\x95\xe3k\xabGY;\x11\xe6\x16t9\x85)\x87h\xd9\xfa\
-\x17\xc4\xdaW\xe1\x8b^T\xe0=\xc8-\xa3~\x9dI\xdf\x1b\xffCi\xfa\xab\x04\x83E\
-\x94\x97d\xaa\xa7\x0b\x9d!R+\x1e\x81P?A\xf1&\xcc\xb3\x12\xd1\x03\xa3\xf3\xef\
-\xc7\xe8\xaa\xa3kx\x81\x08\x9a-\x91R\x80\x1f\xc1\x9a\xd4\xc0\x9d\xcd\x8d\xb2\
-\xe2\xb8~\x18\xb3$0\xbd0B\xc5\xa0\xecc\xf7\xf6\x11\n6R\xb7\xe1Q\xb4\xf2N\xa4\
-w\x10i>D\xdd\xda\x87\x19\xe8>E\xa9\xa7\x87\xd8\xd2\xc7\xf1<\x81\xdd}\x9eP\
-\xa0\x8e\x9a5\x0f!\xdd\x1f!\x0b\xfb@&\xd0\x84\x0e\xce\x14\x94\x92x&h%\xd0\
-\x8b`\x85\x12\xe8V\x14ihX\xc1\x14\x9a\xeb\xa2d+\x99\xce\x7f#\x14\xa8\xa7n\
-\xfdvt\xe7\xa7\x88\xd21|\xebIjV\xdeG\xf1\xd4AtGG\xa8\x04x\x81+k\xe6f@\xcf\
-\xe0Y\xdf\xc0T\x11\xa4\x12hz\x15\x9a\xfd\n\x9e\xf1\xe4\x9c\xe2\xabj\xd9\x8eV\
-\xd8\x8bg\xc5\xd0l\x8dPx1\xb1\xd6-\xe8\xcew\xc09\x06Y\x0f\xa5\x97\xa8Z\xb6\
-\x95\x80\xf5&\x93\x9d\x87h\xda\xfe\xe7x~\x9e\xec\xd1\x97H4\xad\xc6L.E\xe6wA\
-\x16\x98gg0:\xbb\x97V\xdaC\xe5\x89\xd5\xc2\xc6\x11\xc4p\x10$`\x8f\xc0\x81Z\
-\x98V`X\xa8\r\x1b(\xf5\xbd\x87:\x1d\xc2joENO\xe0\x89\x14\xdeY\x81\x1ek\x84B\
-\x00yh\x10\nA\xb4\xc64V\xc3mh\xc3\x8d0\x16C\x15\x12\xa8b\x11\xf7\x030\x12\
-\xf5\xf83\x06\xfa\x91\t(||\xab\xb8\x1ab5\xb0.\x8d\x18\x0e`9\xed\xb4n\xff+\
-\xb4h\x04|\x1f\x7f|\x10y\xec\x1cN\xf3"\x9c\x93%\x8cd#\xa2\x9c@\x1c\x98\x86\\\
-\x10\xd92\x80Q\x7f\x13\xdaP=\xc2K\x82\x97@\xe5\xd4\x955\x7f\xad\xbb~\x109\
-\x1c@H\x01\xa54t%\xf1\x97\xca9\xc5G>\x01\xc7\x9a`C\x1c\x86c\xb3KT?\x05\x9d\
-\x11\xc84\x03 \x02e\xe4\xcdQ"\xf1\x9b\xc9\xee}\x0f\xfb\xa6\x02v:M\xf9\xb8K\
-\xfdm\xf7\xc2p\x1e\x0e\x04\xc0\x9f\x7fcQ\x1f|\xee\xc9J{\xa88F\xab \xd11N\xe1\
-\xf4\x12$\x1a~~\x92\xe9\xfd[A*\xcc\xb5>z\xd6e\xf0\xdbC\x14\xce\xdcB\xcd\x03\
-\x8d\x14\x8f\xda\x98\xab\xf2\xa8\xd2&\xb2g3x\xd9)\x9c\xd0\xe3\xd8\xef\xbb\
-\x84\x96Y\xcct\xf63\xbd\xa7\x83`C\x03\xfe\xd4\x14"\x04\x94o%\xb3g\x04\xe7\
-\xd1\x11J\xea\x0f\xb0\xf7\xb8\xe8M:\xc65\x1a\xf6\x912^\xbaHb\xf9\xe8\xac\x07\
-\xa1\x81(\x90\xf9g\x81\xdb/p\x07k\xd0\x1a\x1aH\xfe}\t/\xb3\x9eBW\x8e\xf2\xc4\
-0N\xe0\x11\x8a\xfbm\xc2\xcb\x02\xcc\xec\xebazO\x07\xa1kR\xf8\x854B\xfaW\xd4,\
-\xed\xb31\x96\xf8$\xae\x1f\'\x7f\xa2\x1d\x81\xc4\xcf\x8f\x91y}\x1dUO\x17\xe6\
-\x14\x9f;\x9eer\xc7\x97\x89\xdf0D\xa1\xabiv\x9b7?\xcc\xc4\xf7\xef\xa2\xdc]\
-\xbe\x98\xe3P_\x80\xd8\xda\x87\x19|~\x86S\x7f\xb6\x13Ut\xb1\x1a\xee\xc2Z\xbc\
-\x91\xcc\xb7\x87(\xfe\xe2\x0f+7\x00.\x83\xfe\xea\x9a\x8d\x95\xf6Pq\xaa\xebg\
-\xb8\x97\xbd\\HU\xe3\x14%\xb5\x83\x83p\xbfE~\x12\xb2\xc3\x0e\xdd\xdf\xb2\xc9\
-\xe4R\\\xf7\xc7\xf5\x18\xcb\xcb\xbc\xb5\xa3\x99\x1bb\xfdD\x9fh\xe7\xe8?\x9ee\
-\xf8\xd9\xbd\xb4\xdd\xb9\x08\xb9:H\xe9d\x9e3of(\xb6\xb6S\xb79NW\xafC"\x95%\
-\xfcX\x1bG\xfe\xc9g\xec\xbb\x9d\xb4\xddQ\x8f\xba+\x8an\x81n\xb8$\xbf\x16\xe1\
-\xe0\xaeVn\x97\xbb\xb8\x90J\x82\xd4hg\x907#\xf71\x91LB\x12\xa4\xa6\xf8J\xdfA\
-\xf4\x07Z9\xfa\xbd>\n\xdf?H\xe3\xfaZ\xfc\x8d&\x03\x1fj\xe6\x9a\xdaH\xd6Y\xb4\
-\xba}d\xa7\x8c+j\xbe\x13]\x8d\xc0\xe6^\xf1\x1a=5\xd5(i\xd0*\xd2\xfc"\xb9\x86\
-5\xbd\xbds\x8bo\xc0\xe5\xcc\xd2e\xdc\xa3\x0e\xd1\x97\x8c!\xa4\xe4Z\xd5\xcf\
-\xee\xeb\xd63\x11\x0f_\xccqlF\xb0\xad\xd9e\xf2\xf6\xf5\x8c\x9c\x1c\x82\x90\
-\xce\xda\x8773\x9d\xab\xe2U\'\x8e\xbdf~\xfd{\xfc\x1a\xfd\x8c_\xa8\xb4\x87\
-\x8a\xd3\xe8Oc\xdb\xbd\x8c;%&\xc6t\xfa\xbf\x99\x06M\xc7v\x0c\x94\xd0@H\x96\
-\xacp\xe9\xf8\xfd<\x87\x8f\xb5\xf1vO\x88Q=\xcc\x13\x0f\x8e\xb2x\xab\xc1\xd1\
-\x9f\xe58\xfd\xfcy\x94\xd4\xf0\x85A8!Yq\x8f\xc4\xac\x19\xe1\xf5\x1d+h\xac\
-\xf5yx\xdb\x18u_\xd28\xb3?\xcf\xe9\x17z/\xb6\xadn\x92\xdc\xf77\x06\xe3Z\x10\
-\xbbt\x8e\xf1r\x18+*q\xecQ\xce\x97s\x8c\xf8\x1f\x1e\xac\xf9\xe0v&xt[\x8e\xf0\
-*\xc9\x91}\xe3\x1c|7\x83\x92\x1a\xd1Z\x83E\xd7I\x86J\x92`$\x8f]<\xcf\xbbGW\
-\xf1{\x9b/\xaf9\xa47\xe18>\xa5B7\xc3v5\xc1\x98C\xd9\x1e\xe7l)\xcf\xf4\xb1\
-\xb9\xc5\xf7\xc6\x8e\x15H9\x8dS:\xcb\xa4S\xc0\xaa2(\xdb\xe78_\xbe\x96\x11\
-\xffc\x87\x95c\xd0tz\x86\xba\xcdM\x9c<5H(a\xd2\xb01B\xe7{\x93\x1c\xcb\x05+\
-\xd4\xf3WF\x1f\x18X8(\xccg\xf3\x94\xf2\xdd\xb4\xdf$(w\x86\xb0\x1d\x03_\xe8D\
-\x12\x92\xdaf\x87\x96\xe56\xcd\xcbK\xec\xebl\xe3\xa5W\x9b(\x96\xd2\xa4\x07\
-\x15\xd2\x0br\xff\xd6#T\xb7\x1a\x9c;\x1c\xa4\x98\xd3\xb0\xa2\x82\x1b\xbf\x9c\
-%\\\r/\xfc\xd7=\x1c\xef\xcab\xe8\x1a\xca\xd6y\xf0\xf1.\xae\xb9E\xe3\xf8\xde\
-\x08S\xe3\x16\xb1z\xc5\xaa/e\xe9\xe9Mq\xf0\xc82\xbe\xb2\xb6\x9b%\xab#T\xd5\
-\xfa\xa4\x07,N\x9c\x9a\xc1vJ\x17}\xa6\xd3\x8a\xea\x08l}\xea,\x17\x8e\x078\
-\xf9n\x08\xcd\x14\xac\xdb\x9a\xa5\xf9\x9a<\x07v%\x89&=\xce\x9f\xabb\xc7\xeb\
-\x1b\xc9N^A\xf3p\x8eXU\x96b\xa1\x87\x96\x95\x934\xb4\x15\xe9>\x1f\xe5\xfd\
-\x13y\x04\xcc9\xbe\xdaT\x06\xbbp\x84\xe6u:\xb1:\x9f\x81\xfeqN\x9c\x9c\xc4v\
-\xb2\x97\xe4y\xffA\x97\x07\xb78\xe4\x9d\x12M\xed\t\x84\x1c\xe7\xcd\xdd%\x06\
-\x06\xe4U\xee\xf1\xb9#6n|c~\xcemW\x11!`\xdb\xe6.n_\xd7C*YD\xc8\xd9\x94d\xb3&\
-\x99\x19\x8b\xd1\xc9\x08?\xff\xd52\xce_\xa8\xa6\xec\xcaK\xde[\xde>\xcd\xa6\
-\x15C\xb44\xce\xa0<\x85\x8fFWO\x82\x83\'\xeb\xe8\xe9\x8f\\l+\xa5b\xe5\xb5\
-\x93l^;H*^\xa0\\\x96(\xa9\xf3\xfe\x07\xd5\xec\xeel$\x977\xb8\xfb\xf6!6vLR\
-\xf65^{\xbb\x91\xa3\xa7\xab>\xe15`y\xdc\xba~\x94\x9bV\x0e!}\x17\xa9\xc1H&\
-\xc2\xb9\x0bUlZ1\x04\x08^{{)GOW_Q3\x9b3\x10\x02\xee\xbe}\x84\r\x1d\x13\xb8\
-\xbe\xbcDw\xae\xf1\xcd~\xa3\x97M\x1dC\x94}\x8dW\xdfn\xe3\xe8\xe9K\xefQ\x18:\
-\xfc\xdd\xd7s\x94\xfb\x87x\xe3;\xbd|\xed_:\xe8\x19\x8b\xf2\xcdg#\xcc\xe7+{b\
-\xd1\xa2\xef\xcec{W\x17! \x14\xfc(\x1d\xae\x0b\xb63\xbf\xb6\x1d\xbf\xa8lXS\
-\xe6{\xcfN\xf1\xdc_\x0f\xe0z\x82\xbf\xfc\xd7E<\xf5\xf58\xef\xec\xbf:W\t\xfe\
-\xbf\xe8\x83\x83\x83\x95\xf6\xb0\xc0\xef\x007l\x9f`j(\xc3\x89\xc3y\x1e{&@\
-\xd7)\x9b7v.b&;\x7f\x97W0\xbb\xeb\xbf\xc0\x02\x9f;\xe1\xa0M4\x9a\xe7\x81?\
-\x85\xcdw\xdb\xbc\xf8rh\xde\x17\x07\x80^i\x03\x0b\xfcn\xf0\xfc\x7f6\x124\xeb\
-\xa8\x8e\xf9<\xfb\x82\xe4\x95\x9f|>\xb7#?k\x04|c\xe1\x1fd\x81\x05>\x85\xf9?\
-\xc7-\xb0@\x05Y(\x90\x05\x16\xb8\x0c\xff\x07\x8e\x03\x96sM\x85\xe7\xa0\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory018Bitmap():
- return wxBitmapFromImage(getDocFactory018Image())
-
-def getDocFactory018Image():
- stream = cStringIO.StringIO(getDocFactory018Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory018')
-catalog['DocFactory018'] = ImageClass()
-catalog['DocFactory018'].getData = getDocFactory018Data
-catalog['DocFactory018'].getImage = getDocFactory018Image
-catalog['DocFactory018'].getBitmap = getDocFactory018Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory019Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rj\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0v\x93\xd4(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\n\xb5Y\xd6JY\x12Iq\
-\xb9\xdc\xc9K\xde\xf5\x9c{\xce\x99\xfe\xa0#[\xf5"\x16\xb5|%\x9b\xcf\xcf\x839\
-\xe7}\xbfo\xe6\xc3\xcc\x99\xc1\x88\xbf\xfb\x8eR\xcc3\xcf<\x1f\x8b\x1e\xaa\
-\xae\xb4\x85y\xe6\xb9|\xd1\x83\xf3\x052\xcf<\x9f\x88\x1eNT\xdaBe\x11(\x0cl$\
-\xde\x05\xcf]\x0c\\\xcc\xcf\xcf\x83\xb0\xd1\xfe\x97\x07\x05\x94U\x00\x0f\xed\
-\x92\xe8J|LQ\xc2GRV\x16\nqIt\xaed\xf4P\xbc\xd2\x16*\x87\xc0\xa7\xa1\xb0\x8b\
-\xa8{\x0e\xffCcSJ\x90\xa6N\xde\x8d\x93\x0b\xb63\xa3/\xc2%p\x89<x4\xd9oP\xe5\
-\xf5\\\xe0\x01@\xb7\x14\xb6VC\xb7\xb6\x852\xa1\xcfTW\xc3a\xb1\xfbs\x02\xe5\
-\x114C0&\x97\x91\x967~\xa6\x1a_\x04\xf4\xf0\x97\xb8@,Fi\xd2\x9f\xe1\xf4\xab\
-\xb5L\x0fF\x00\x01R"uE\xb8\xa6H\xa4\xbeH\xdb\xf2I\x1ck\x11}\xc1\xbf\xc6\xa1\
-\xee3\xf7\x10d\x98\xa6\xe2\x8b\x9c\xfci\x9c\xe9t\x00\x84\x00!\x01\x885\xda,\
-\xbb\xff-\x8aF=\x13\xdc\xfc\x99\xea\x86\x18\xa6\xc1\xfe1\xc7~\x9c"\xb6\xb0D\
-\xcb\x9aC\x14\x82\xd7R\xe6K< >\x06=\xf2%\xceGH\t\x12\xda*\x84_Dj\x8a`\\`\x04\
-\x04\nA)\x1fd\xf4\xa4$?\xda\xcc\xf2\xbb$\xa6\xf1\x1b\xfa\xc3\xf7\\\xb0\x0c\
-\x11\xbe\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\xf1\xcb!\xe1:H\xb7\x0cpA\xdb\x90\
-\xd2\t\x8b\xabQn\x01\xa9q\xde\x03\x08R\x8bMB\xa1\x0e\xcc`\x13\x11\xf9\xd1\
-\xef\xf8\xba\x89\xd2t\xa4S\x04!\xf1\rk\xb6\xc0.\xa2)P\xc4\xfd"\xe1\xfcR$%\
-\xb2\xe9\x18\xd7D-\xeaB\xe3d\xe4\x07\x03bN\xf1)\xf5\x81\xbe\x19\x98\xd5\xf4\
-\xca\xf8\xba5\xabU\xb6g\x9b\x99\x81\x8f\xbe\x03\xf8f\xf0\x02\xcf\x97\x1bz\
-\x959Pi\x0f\x15\xc3R\x0e\x18\xeb0\xf4\xb7\x88\xa5\\\xae\xff\x83\x9b\xd0BAP>\
-\xe5\xbc\xcd\xc0\xa1\x1eF\x8e\xa79\xb7?\xc55wDq\x8c3\x14D\x10\xa1<\xccL7f\
-\xa6\x1b\xafPB\xa0f\'\x9f@\x00;\xb5\x14\xa7\xaa\x19\xde/$\xe1\x97\xb1fz0&\
-\xcf\xa2l\x07P\xb3\x13\x84\x11\xa0X{=Z\xb8\x1a\x19\xb8\t\xcb\xda\x89\x96r\
-\xb9\xfe\xb1\x8d\x18\x91 \x00vY1iD\x90\x01I\xcc\xef\xc1\x9c:\x835\xd3\x8d\
-\xb2]\x94R`\x06\xf1\x82\xd5\x98\xc54J\x81\x13o\xa5\x94\xea\xb8\xa8fX\xe8T{3\
-\xe4\xa6\x96\x81\xdb\x89\xd0\xa0TX\xc9"k\x94!\x03J\xd2\x98[|\xca\'\x90>\x80\
-\x91K#\r\x89\x1bn@+\x8c\xe1\xdbe\x84i\xe1\xe8\xb5\xc8\xec8B\n\xec\x85+\xf0\
-\xa2\xb5\x00\x18\xe9\x13\x18S\x03 \x14\xe5x3\xe5\xc6\xa5\x15\xe8\xfd\xb9\xa1\
-G8Yi\x0f\x15\xc3\x10:\xc2\xacB\x979\xf4\xa0\xc0\x88\xa5\xc8X\x05<\xc0\n\x85i\
-\xbbm-^n;\xb9\xe1n\n\x99\xabHX#\xe8\xe6\x0c\x91\xeci\xf4r\x86\xa1\x13\x93\
-\x8c\x1f\xc9\xe2\xb9>zP\xa7qC\x82\x86\xd8\x10\xc5\xe2\x02\n\xc1\x85H\xe5\x11\
-\xc9\x9dBe\xa7\xe9\x7fk\x98\xdc\xa0\x8d\xd0\xc0\x8c\x18T_\x17\xa564\x82\x1dZ\
-\x8f0R\xe82\x8f\x1e\x04#\x9a\xa2\x10(\xe1\xe2\xe1\x06]\x1cF\x89\xa8!\xa2\xb9\
-.(M3|h\x9cLw\x1e\x80\xc6\rI\xe2\xcd!F\x8fN\xa3\x87ujVe\xc8\xf9\x0e\xa1\\\xf7\
-\'j\xd6\x85\'0\xab61\xbc\xef\x14\x83{\xf6\xa1|\x0f%\x05\xa7\xb6\xfd\x82\xa5\
-\x0f\xddGB\xeb\x07\xe7\xc8\x9c\xe2\xd3U\x89X\xe08\xdd\xbfL\x13\xaa\xb5H^;\
-\xccDW\x96\xf1c3,\xb9?I\xc8\xfb\t}\xbf\x0e\x13owHT\xbd\x89\x1d\xd9\x8a\xf4\
-\xb2\x04\xdc\x17I\x1f\x0ebVy\xc4;\x04\x8e\xfa#\x940*;\x18>\x01=\xcc\x9eJ{\
-\xa8\x18\x1aI\x04\xb7\xa33\x89\x10\x02\xa1B\x98\xfc\x1a\x8fI\x94&\xf1\xbc[X\
-\xb0\xba\x83\x9e\xed\xff\x86=6D,\x15#Q\x1eA\x14\x1a8\xfd\xa3\xfd\x14\xc6F\t\
-\xc4cH\xd3\xc4\xc9O1\xbc;M1\xddF\xcb\xd7\x97c\x98\'\xd0\x9d$\x9a\xddB\xd7O\
-\x7fDql\x143\x1a\xc1\x08\x87A8\xe4{\\\x1aWnB\xf3\x07\x10\xb4\xa03\x81g\x17\
-\xb1\'\xa61\x82\x16\xa6\xd0\xd0\x021J\xfa>\xf0r\x04\xdc6N\xbd\xfc\x12\xf9\
-\xe1a\x02\x898\xd2\xb2\x18?p\x8e\xd1\xbd6\xbe[&T_Op\xc3\xed\xe8v\x06\xf9i\
-\x9a\xabnG)\x08VE\xa8\xaa\x95\xe4G\xfa\x10R\x12\x8e/B\x0f\xc40T\x1a\x7fN\xf1\
-\x1dGI\x0f\xd3X\x8d?\xdd\xc5\xe8\xd91\xa6\xde\r\x11\xacN\xb2pm+U5K\xc1\tc\
-\xf8G\xc9\xbf\xa7\xb1pE\x0b\x05\xef\x00\xb2\xe4\xa3k\x1d\x94G\x8f\x12\xaf\
-\xa9#^\xd5@\x9e}\\\xae\xa7\xd5z\x88]\x95\xf6P1\x04\x8b\x10\xdc\x8d.\xc6\x11\
-\x12\x84\x08\x12\xe0\x1d\x14\xbd\x00H\xcd&X}\x1f\x01k\x08{\xfc \x1a+1D\x07}{\
-\x9e\xa7<v\x90\x857o\xa5\xee\xc6-\xa0\xca\xb8\xc5"\x03;\xfe\x95B\xefN\n\xe9\
-\xe5D\xda\x17\x80_\xc3\xc0\xee\xff\xc6\x9dx\x97\x96\xdb\x1e!\xd1\xb1\x0e\x19\
-\xf0\xd1\xb48\x9eSD\xe9\x93\x98z\'\xc2\xdd\x84.\xc6p\xb3g8\xfb\x9fO!M\x89\
-\xd0$\x8d\x1b\x9f$\xbad\t\xca\xcb\x929\xd5\x853z\x88\x85\xb7<@\xdd\x8d[\x10\
-\xba\x8fo\xc3\xe0\x1b\xcf3}z/\x86\xae!\xcczt7\xca\xc0\xee\x17?USY;\x88]}\x07\
-\xb1\xb6\'9\xf3\xc2S\x08\xdd\xa3\xfd\xde\'\x10\xd6$R\xab\xa3o\xcf\xcf.\x1e_[\
-=\xca\xda\x8e07\xa1\xcb)L9D\xcb\xe6?#\xd6\xbe\x02_\xf4\xa2\x02\xef@n\t\xf5kL\
-\xfa^\xfb/J\xd3_\'\x18,\xa2\xbc$S=]\xe8\x0c\x91Z\xf6\x10\x84\xfa\t\x8a\xd7\
-\xe12-\x11=0z\xf9\xfe ]rt\r/\x10A\xb3%R\n\xf0#X\x93\x1a\xb8\xb39QV\x1c\xd7\
-\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\xde>B\xc1F\xea\xd6=\x8cV\xde\x8e\xf4\
-\xf6#\xcd\x07\xa8[\xfd \x03\xdd\'(\xf5\xf4\x10[\xfc(\x9e\'\xb0\xbb\xcf\x12\n\
-\xd4Q\xb3\xea\x01\xa4\xfb\x13da\x0f\xc8\x04\x9a\xd0\xc1\x99\x82R\x12\xcf\x04\
-\xad\x04z\x11\xacP\x02\xdd\x8a"\r\r+\x98Bs]\x94l%\xd3\xf9/\x84\x02\xf5\xd4\
-\xad\xdd\x8a\xee\xfc\x1cQ:\x82o=N\xcd\xf2{(\x9e\xd8\x8f\xee\xe8\x08\x95\x00/\
-pq\xcd\xdc\x0c\xe8\x19<\xeb[\x98*\x82T\x02M\xafB\xb3_\xc23\x1e\x9fS|U-[\xd1\
-\n\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\xf9\x1e8G \xeb\xa1\xf4\x12U\
-K6\x13\xb0^g\xb2\xf3\x00M[\xff\x14\xcf\xcf\x93=\xfc\x02\x89\xa6\x95\x98\xc9\
-\xc5\xc8\xfc\x0e\xc8\x02\x97\xe9\x19\x8c\xce\xce\xc5\x95\xf6P9b\xb5\xb0~\x04\
-1\x1c\x04\t\xd8#\xb0\xaf\x16\xa6\x15\x18\x16j\xdd:J}\xef\xa0N\x86\xb0\xda[\
-\x91\xd3\x13x"\x85wZ\xa0\xc7\x1a\xa1\x10@\x1e\x18\x84B\x10\xad1\x8d\xd5p\x0b\
-\xdap#\x8c\xc5P\x85\x04\xaaX\xc4}\x0f\x8cD=\xfe\x8c\x81~h\x02\n\x1f\xde*\xae\
-\x86X\r\xacI#\x86\x03XN;\xad[\xff\x02-\x1a\x01\xdf\xc7\x1f\x1fD\x1e9\x83\xd3\
-\xbc\x00\xe7x\t#\xd9\x88(\'\x10\xfb\xa6!\x17D\xb6\x0c`\xd4\xdf\x806T\x8f\xf0\
-\x92\xe0%P9uq\xcd\xdf\xea\xae\x1dD\x0e\x07\x10R@)\r]I\xfc\xc5rN\xf1\x91O\xc0\
-\x91&X\x17\x87\xe1\xd8\xec\x12\xd5OAg\x042\xcd\x00\x88@\x19yc\x94H\xfcF\xb2\
-\xbb\xdf\xc1\xbe\xa1\x80\x9dNS>\xeaR\x7f\xcb\xdd0\x9c\x87}\x01\xf0/\xdf1\xa8\
-\x0f>\xf3x\xa5=T\x0c\xa3U\x90\xe8\x18\xa7pr\x11\x12\r??\xc9\xf4\xde\xcd \x15\
-\xe6j\x1f=\xeb2\xf8\xdd!\n\xa7n\xa2\xe6\xbeF\x8a\x87m\xcc\x15yTi\x03\xd9\xd3\
-\x19\xbc\xec\x14N\xe8Q\xecw]BK,f:\xfb\x99\xde\xd5A\xb0\xa1\x01\x7fj\n\x11\
-\x02\xca7\x93\xd95\x82\xf3\xf0\x08%\xf5{\xd8\xbb\\\xf4&\x1d\xe3*\r\xfbP\x19/\
-]$\xb1tt\xd6\x83\xd0@\x14\xc8\xfc\xa3\xc0\xed\x17\xb8\x835h\r\r$\xff\xb6\x84\
-\x97YK\xa1+Gyb\x18\'\xf0\x10\xc5\xbd6\xe1%\x01f\xf6\xf40\xbd\xab\x83\xd0U)\
-\xfcB\x1a!\xfd\x8bj\x96\xf6\xd8\x18\x8b|\x12\xd7\x8e\x93?\xd6\x8e@\xe2\xe7\
-\xc7\xc8\xbc\xba\x86\xaa\'\x0bs\x8a\xcf\x1d\xcf2\xb9\xed\xab\xc4\xaf\x1b\xa2\
-\xd0\xd54\xbb\xcd\x9b\x1ff\xe2\x87wP\xee.\x9f\xcfq\xa8/@l\xf5\x83\x0c>;\xc3\
-\x89?\xd9\x8e*\xbaX\rw`-\\O\xe6\xbbC\x14\x7f\xf5\xfb\x95\x1b\x00s@\x7fy\xd5\
-\xfaJ{\xa8\x18\xd5\xf53\xdc\xcdn\xce\xa5\xaaq\x8a\x92\xda\xc1A\xb8\xd7"?\t\
-\xd9a\x87\xee\xef\xd8dr)\xae\xf9\xc3z\x8c\xa5e\xde\xd8\xd6\xccu\xb1~\xa2\x8f\
-\xb5s\xf8\xefO3\xfc\xf4n\xdan_\x80\\\x19\xa4t<\xcf\xa9\xd73\x14[\xdb\xa9\xdb\
-\x18\xa7\xab\xd7!\x91\xca\x12~\xa4\x8dC\xff\xe03\xf6\xfdN\xdan\xabG\xdd\x11E\
-\xb7@7\\\x92\xdf\x88\xb0\x7fG+\xb7\xca\x1d\x9cK%Aj\xb43\xc8\xeb\x91{\x98H&!\
-\tRS|\xado?\xfa}\xad\x1c\xfeA\x1f\x85\x1f\xee\xa7qm-\xfez\x93\x81\xf75sMm$\
-\xeb,Z\xdd>\xb2S\xc6E5\xdf\x8a\xaeD`s\xb7x\x85\x9e\x9aj\x944h\x15i~\x95\\\
-\xc5\xaa\xde\xde\xb9\xc57\xe0rj\xf1\x12\xeeR\x07\xe8K\xc6\x10Rr\xb5\xeag\xe7\
-5k\x99\x88\x87\xcf\xe786#\xd8\xd2\xec2y\xebZF\x8e\x0fAHg\xf5\x83\x1b\x99\xce\
-U\xf1\xb2\x13\xc7^uy\xfe{\xfc\x16\xfd\x94_\xa8\xb4\x87\x8a\xd1\xe8Oc\xdb\xbd\
-\x8c;%&\xc6t\xfa\xbf\x9d\x06M\xc7v\x0c\x94\xd0@H\x16-s\xe9\xf8\xdd<\x07\x8f\
-\xb4\xf1fO\x88Q=\xccc\xf7\x8f\xb2p\xb3\xc1\xe1_\xe48\xf9\xecY\x94\xd4\xf0\
-\x85A8!Yv\x97\xc4\xac\x19\xe1\xd5m\xcbh\xac\xf5yp\xcb\x18u_\xd18\xb57\xcf\
-\xc9\xe7z\xcf\xb7\xadn\x92\xdc\xf3W\x06\xe3Z\x10\xbbt\x86\xf1r\x18+*q\xecQ\
-\xce\x96s\x8c\xf8\xef\x1f\xac\xf9\xe0v&xxK\x8e\xf0\n\xc9\xa1=\xe3\xec\x7f;\
-\x83\x92\x1a\xd1Z\x83\x05\xd7H\x86J\x92`$\x8f]<\xcb\xdb\x87W\xf0;\x1b?]sHo\
-\xc2q|J\x85n\x86\xedj\x821\x87\xb2=\xce\xe9R\x9e\xe9#s\x8b\xef\xb5m\xcb\x90r\
-\x1a\xa7t\x9aI\xa7\x80UeP\xb6\xcfp\xb6|5#\xfe\x87\x0e+\xc7\xa0\xe9\xe4\x0cu\
-\x1b\x9b8~b\x90P\xc2\xa4a}\x84\xcew&9\x92\x0bV\xa8\xe7\xe7\x8e>0\xf0\xe5=(\
-\xccg\xf3\x94\xf2\xdd\xb4\xdf (w\x86\xb0\x1d\x03_\xe8D\x12\x92\xdaf\x87\x96\
-\xa56\xcdKK\xec\xe9l\xe3\x85\x97\x9b(\x96\xd2\xa4\x07\x15\xd2\x0br\xef\xe6CT\
-\xb7\x1a\x9c9\x18\xa4\x98\xd3\xb0\xa2\x82\xeb\xbf\x9a%\\\r\xcf\xfd\xc7]\x1c\
-\xed\xcab\xe8\x1a\xca\xd6\xb9\xff\xd1.\xae\xbaI\xe3\xe8\xee\x08S\xe3\x16\xb1\
-z\xc5\x8a\xafd\xe9\xe9M\xb1\xff\xd0\x12\xbe\xb6\xba\x9bE+#T\xd5\xfa\xa4\x07,\
-\x8e\x9d\x98\xc1vJ\xe7}\xa6\xd3\x8a\xea\x08l~\xe24\xe7\x8e\x068\xfev\x08\xcd\
-\x14\xac\xd9\x9c\xa5\xf9\xaa<\xfbv$\x89&=\xce\x9e\xa9b\xdb\xab\xeb\xc9N^D\
-\xf3`\x8eXU\x96b\xa1\x87\x96\xe5\x934\xb4\x15\xe9>\x1b\xe5\xddcy\x04\xcc9\
-\xbe\xdaT\x06\xbbp\x88\xe65:\xb1:\x9f\x81\xfeq\x8e\x1d\x9f\xc4v\xb2\x17\xe4y\
-\xef~\x97\xfb79\xe4\x9d\x12M\xed\t\x84\x1c\xe7\xf5\x9d%\x06\x06\xe4\xe7\xdc\
-\xe3\xffw\xc4\xfa\xf5\xaf]\xdes\xdc%D\x08\xd8\xb2\xb1\x8b[\xd7\xf4\x90J\x16\
-\x11r6\x15\xd9\xacIf\xc6bt2\xc2/\x7f\xb3\x84\xb3\xe7\xaa)\xbb\xf2\x82\xf7\
-\x96\xb6O\xb3a\xd9\x10-\x8d3(O\xe1\xa3\xd1\xd5\x93`\xff\xf1:z\xfa#\xe7\xdbJ\
-\xa9X~\xf5$\x1bW\x0f\x92\x8a\x17(\x97%J\xea\xbc\xfb^5;;\x1b\xc9\xe5\r\xee\
-\xbcu\x88\xf5\x1d\x93\x94}\x8dW\xdel\xe4\xf0\xc9\xaa\x8fx\rX\x1e7\xaf\x1d\
-\xe5\x86\xe5CH\xdfEj0\x92\x89p\xe6\\\x15\x1b\x96\r\x01\x82W\xde\\\xcc\xe1\
-\x93\xd5\x17\xd5\xcc\xe6\x0c\x84\x80;o\x1da]\xc7\x04\xae//\xd0\x9dk|\xb3\xdf\
-\xe8eC\xc7\x10e_\xe3\xe57\xdb8|\xf2\xc2\xfb\x13\x86\x0e\x7f\xf3\xcd\x1c\xe5\
-\xfe!^\xfb^/\xdf\xf8\xa7\x0ez\xc6\xa2|\xfb\xe9\x08W\xc2U=\xb1`\xc1\xf7\xaf\
-\x00\x9b\x97\x16! \x14\xfc \r\xae\x0b\xb6syn;^i\xac[U\xe6\x07OO\xf1\xcc_\x0e\
-\xe0z\x82?\xff\xe7\x05<\xf1\xcd8o\xed\xfd|\xae\x12\xfc\x7f\xd1\x07\x07\x07+\
-\xeda\x9e/0\xd7m\x9d`j(\xc3\xb1\x83y\x1ey*@\xd7\t\x9b\xd7\xb6/`&{\xf9/\xaf`v\
-\xf7\x7f\x9ey.\x19\xe1\xa0M4\x9a\xe7\xbe?\x86\x8dw\xda<\xffb\xe8\x8a)\x0e\
-\x00\xbd\xd2\x06\xe6\xf9b\xf3\xec\xbf7\x124\xeb\xa8\x8e\xf9<\xfd\x9c\xe4\xa5\
-\x9f]\x9a\xdb\x91\x97\n\x01\xdf\xfa\xd2\xff\x83\xcc3\xcf\'q\xe5\xccu\xf3\xcc\
-S\x01\xe6\x0bd\x9ey>\x85\xff\x01r\x97\x96s\xecS\xe3\x03\x00\x00\x00\x00IEND\
-\xaeB`\x82'
-
-def getDocFactory019Bitmap():
- return wxBitmapFromImage(getDocFactory019Image())
-
-def getDocFactory019Image():
- stream = cStringIO.StringIO(getDocFactory019Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory019')
-catalog['DocFactory019'] = ImageClass()
-catalog['DocFactory019'].getData = getDocFactory019Data
-catalog['DocFactory019'].getImage = getDocFactory019Image
-catalog['DocFactory019'].getBitmap = getDocFactory019Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory020Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rl\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1n\xcc\xe2\xc4\x90P\x9b\xa5l.K\x0b\x9dN;\x99Na\xda\xa1\xed\x1f\xf93\xd3\
-\xc9t\xa6\xd3\x85i&\x03d)\xd3i\x87\x92\xd28\t\x840\xb1!168\x8e\xbca\xbc\xca\
-\xd8\x96d-O\xbb\xf4\xa4\xb7\xde\xfb\xee\xbd\xa7\x7f\x88\x18\\\x12,:F\xb2A\
-\x9f?\xef\x9c{\xbf\xdf\xef\xb9\xe77\xe7\xdc{\xe6\x88\x7f\xf8\x96R\xcc3\xcf<\
-\xbf\x15=T9\xd7\x16\xe6\x99\xe7\xcaE\x0f\xce\x17\xc8<\xf3\xfcN\xf4pb\xae-\
-\xcc\r\x02\x85\x81\x8d\xc4\xbb\xe8\xba\x8b\x81\x8b9{\x1e\x84\x8d\xf6\x7f<(\
-\xa0\xac\x02xh\x9f\x89\xae\xc4\xc7\x14%|$ee\xa1\x10\x9f\x89\xce\xe7\x01=\x14\
-\x9fk\x0b\xb3\x8f\xc0\xa7\xae\xb0\x9b\xa8{\x1e\xff#cSJ\x90\xa6N\xde\x8d\x93\
-\x0b\xb62\xa5/\xc2%\xf0\x19y\xf0h\xb0\xdf\xa4\xc2\xeb\xba\xc8\x03\x80n)l\xad\
-\x8aNm+eB\x97UW\xc3a\xb1\xfb3\x02\xe5!4C0"\x97\x91\x96\x1b/\xab\xc6\xe7\t=\
-\xfc\x05,\x10\x8ba\x1a\xf4g9\xf3Z5\x93\xfd\x11@\x80\x94H]\x11\xae*\x12\xa9-\
-\xd2\xb2|\x1c\xc7ZDO\xf0oq\xa8\xb9\xec\x1e\x82\x0c\xd2P|\x89S?\x893\x99\x0e\
-\x80\x10 $\x00\xb1z\x9be\x0f\xbcM\xd1\xa8e\x8c[.\xabn\x88A\xea\xec\x1fq\xfcG\
-)b\x0bK4\xad9L!x=e\xbe\x80\x03a\x06\xe8\x91/`\xbf\x84\x94 \xa1\xadB\xf8E\xa4\
-\xa6\x08\xc6\x05F@\xa0\x10\x94\xf2A\x86OI\xf2\xc3\x8d,\xbf[b\x1a\xbf\xa67|\
-\xefE\xcb\x10\xe1{\x08\xb7\x8c\xf0=\x94\xd4P\xba\x81\x92\xbf}9$\\\x07\xe9\
-\x96\x01.j\x1bR:aq-\xca- 5.x\x00Aj\xb1I(\xd4\x86\x19l "?\xfe\x1c_7Q\x9a\x8et\
-\x8a $\xbeaM\x17\xd8%4\x05\x8a\xb8_$\x9c_\x8a\xa4D6\x1d\xe3\xba\xa8EMh\x94\
-\x8c\xfcp \xcc(\x9fR\x1f\xea\x9b\x81iM\xaf\x8c\xaf[\xd3Ze{\xba\x99\x19\xf8\
-\xf8=\x80o\x06/\xf2|\xa5\xa2W\x98}s\xeda\xd6\xb1\x94\x03\xc6:\x0c\xfdmb)\x97\
-\x1b\xff\xe8f\xb4P\x10\x94O9o\xd3w\xb8\x8b\xa1\x13i\xce\x1fHq\xdd\x9dQ\x1c\
-\xe3,\x05\x11D(\x0f3\xd3\x89\x99\xe9\xc4+\x94\x10\xa8\xe9\xc9\'\x10\xc0N-\
-\xc5\xa9h\x84\x0f\nI\xf8e\xac\xa9.\x8c\xf1s(\xdb\x01\xd4\xf4\x04a\x04(V\xdf\
-\x88\x16\xaeD\x06n\xc6\xb2v\xa1\xa5\\n||\x13F$\x08\x80]V\x8c\x1b\x11d@\x12\
-\xf3\xbb0\'\xcebMu\xa2l\x17\xa5\x14\x98A\xbc`%f1\x8dR\xe0\xc4\x9b)\xa5\xda.\
-\xa9\x19\x16:\x95\xde\x14\xb9\x89e\xe0\xb6#4(\x15V\xb2\xc8\x1af\xc0\x80\x924\
-f\x96O\xf9\x04\xd2\x071ri\xa4!q\xc3uh\x85\x11|\xbb\x8c0-\x1c\xbd\x1a\x99\x1d\
-EH\x81\xbdp\x05^\xb4\x1a\x00#}\x12c\xa2\x0f\x84\xa2\x1co\xa4\\\xbft\x0e\xde\
-\xfe\xa7C\x8fpj\xae=\xcc:\x86\xd0\x11f\x05\xba\xcc\xa1\x07\x05F,E\xc6*\xe0\
-\x01V(L\xcb\xedk\xf1r;\xc8\rvR\xc8\\C\xc2\x1aB7\xa7\x88d\xcf\xa0\x973\x0c\
-\x9c\x1cg\xf4h\x16\xcf\xf5\xd1\x83:\xf5\x1b\x12\xd4\xc5\x06(\x16\x17P\x08.D*\
-\x8fH\xee4*;I\xef\xdb\x83\xe4\xfam\x84\x06f\xc4\xa0\xf2\x86(\xd5\xa1!\xec\
-\xd0z\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\x17\x0f7\xe8\xe20LD\r\x10\xcdu@i\
-\x92\xc1\xc3\xa3d:\xf3\x00\xd4oH\x12o\x0c1|l\x12=\xacS\xb5*C\xcew\x08\xe5:\
-\x7f\xa7fMx\x0c\xb3b3\x83\xfbO\xd3\xbfw?\xca\xf7PRpz\xfb\xcfY\xfa\xf0\xfd$\
-\xb4^p\x8e\xce(\x9f\xaeJ\xc4\x02\'\xe8\xfcE\x9aP\xb5E\xf2\xfaA\xc6:\xb2\x8c\
-\x1e\x9fb\xc9\x03IB\xde\x8f\xe9\xf9U\x98x\xabC\xa2\xe2-\xec\xc86\xa4\x97%\
-\xe0\xbeD\xfaH\x10\xb3\xc2#\xde&p\xd4\x9f\xa0\x841\xb7\x83\xe1\x12\xe8a\xf6\
-\xce\xb5\x87YG#\x89\xe0\x0et\xc6\x11B T\x08\x93_\xe11\x8e\xd2$\x9ew+\x0bV\
-\xb7\xd1\xb5\xe3\xdf\xb1G\x06\x88\xa5b$\xcaC\x88B\x1dg~x\x80\xc2\xc80\x81x\
-\x0ci\x9a8\xf9\t\x06\xf7\xa4)\xa6[h\xfa\xear\x0c\xf3$\xba\x93D\xb3\x9b\xe8\
-\xf8\xc9\x0f)\x8e\x0ccF#\x18\xe10\x08\x87|\x97K\xfd\xca\xcdh~\x1f\x82&t\xc6\
-\xf0\xec"\xf6\xd8$F\xd0\xc2\x14\x1aZ FI\xdf\x0f^\x8e\x80\xdb\xc2\xe9W^&?8H \
-\x11GZ\x16\xa3\x07\xcf3\xbc\xcf\xc6w\xcb\x84jk\tn\xb8\x03\xdd\xce ?Is\xd5\
-\x1d(\x05\xc1\x8a\x08\x15\xd5\x92\xfcP\x0fBJ\xc2\xf1E\xe8\x81\x18\x86J\xe3\
-\xcf(\xdf\t\x94\xf40\x8d\xd5\xf8\x93\x1d\x0c\x9f\x1ba\xe2\xbd\x10\xc1\xca$\
-\x0b\xd76SQ\xb5\x14\x9c0\x86\x7f\x8c\xfc\xfb\x1a\x0bW4Q\xf0\x0e"K>\xba\xd6Fy\
-\xf8\x18\xf1\xaa\x1a\xe2\x15u\xe4\xd9\xcf\x95\xbeK\xad\x87\xd8=\xd7\x1ef\x1d\
-\xc1"\x04\xf7\xa0\x8bQ\x84\x04!\x82\x04x\x17E7\x00R\xb3\tV\xdeO\xc0\x1a\xc0\
-\x1e=\x84\xc6J\x0c\xd1F\xcf\xde\x17(\x8f\x1cb\xe1-\xdb\xa8\xd9\xb8\x15T\x19\
-\xb7X\xa4o\xe7\xbfQ\xe8\xdeE!\xbd\x9cH\xeb\x02\xf0\xab\xe8\xdb\xf3?\xb8c\xef\
-\xd1t\xfb\xa3$\xda\xd6!\x03>\x9a\x16\xc7s\x8a(}\x1cSoG\xb8\x9b\xd1\xc5\x08n\
-\xf6,\xe7\xfe\xebi\xa4)\x11\x9a\xa4~\xd3SD\x97,AyY2\xa7;p\x86\x0f\xb3\xf0\
-\xd6\x07\xa9\xd9\xb8\x15\xa1\xfb\xf86\xf4\xbf\xf9\x02\x93g\xf6a\xe8\x1a\xc2\
-\xacEw\xa3\xf4\xedy\xe9\x135\x95\xb5\x93\xd8\xb5w\x12ky\x8a\xb3/>\x8d\xd0=Z\
-\xef{\x12a\x8d#\xb5\x1az\xf6\xfe\xf4\xd2\xf9ZjQ\xd6\x0e\x84\xb9\x19]N`\xca\
-\x01\x9a\xb6\xfc\x05\xb1\xd6\x15\xf8\xa2\x1b\x15x\x17rK\xa8]c\xd2\xf3\xfa\
-\x7fS\x9a\xfc*\xc1`\x11\xe5%\x99\xe8\xea@g\x80\xd4\xb2\x87!\xd4KP\xbc\x01Wx\
-\x89\xe8\x81\xe1+\xffC\xe9\xb2\xa3kx\x81\x08\x9a-\x91R\x80\x1f\xc1\x1a\xd7\
-\xc0\x9d\xee\x0be\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\xee!\x14\xac\xa7f\xdd#\
-h\xe5\x1dH\xef\x00\xd2|\x90\x9a\xd5\x0f\xd1\xd7y\x92RW\x17\xb1\xc5\x8f\xe1y\
-\x02\xbb\xf3\x1c\xa1@\rU\xab\x1eD\xba?F\x16\xf6\x82L\xa0\t\x1d\x9c\t(%\xf1L\
-\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9f2\xed\xdf!\x14\xa8\
-\xa5f\xed6t\xe7g\x88\xd2Q|\xeb\t\xaa\x96\xdfK\xf1\xe4\x01tGG\xa8\x04x\x81Kk\
-\xe6\xa6@\xcf\xe0Y\xdf\xc0T\x11\xa4\x12hz\x05\x9a\xfd2\x9e\xf1\xc4\x8c\xf2U4\
-mC+\xec\xc1\xb3bh\xb6F(\xbc\x90X\xf3ft\xe7\xbb\xe0\x1c\x85\xac\x87\xd2KT,\
-\xd9B\xc0z\x83\xf1\xf6\x834l\xfbs<?O\xf6\xc8\x8b$\x1aVb&\x17#\xf3;!\x0b\\\
-\xe1{0:\xbb\x16\xcf\xb5\x87\xd9\'V\r\xeb\x87\x10\x83A\x90\x80=\x04\xfb\xabaR\
-\x81a\xa1\xd6\xad\xa3\xd4\xf3.\xeaT\x08\xab\xb5\x1999\x86\'Rxg\x04z\xac\x1e\
-\n\x01\xe4\xc1~(\x04\xd1\xea\xd3Xu\xb7\xa2\r\xd6\xc3H\x0cUH\xa0\x8aE\xdc\xf7\
-\xc1H\xd4\xe2O\x19\xe8\x87\xc7\xa0\xf0\xd1_\xc5\x95\x10\xab\x825i\xc4`\x00\
-\xcbi\xa5y\xdb_\xa1E#\xe0\xfb\xf8\xa3\xfd\xc8\xa3gq\x1a\x17\xe0\x9c(a$\xeb\
-\x11\xe5\x04b\xff$\xe4\x82\xc8\xa6>\x8c\xda\x9b\xd0\x06j\x11^\x12\xbc\x04*\
-\xa7.\xad\xf9\x1b\xdd\xb5\xfd\xc8\xc1\x00B\n(\xa5\xa1#\x89\xbfX\xce(\x1f\xf9\
-\x04\x1cm\x80uq\x18\x8cM/Q\xfd\x14\xb4G \xd3\x08\x80\x08\x94\x91\x1b\xa3D\
-\xe2\x1b\xc9\xeey\x17\xfb\xa6\x02v:M\xf9\x98K\xed\xad\xf7\xc0`\x1e\xf6\x07\
-\xc0\xbf\xf2\xc7\x9e\xde\xff\xec\x13s\xeda\xd61\x9a\x05\x89\xb6Q\n\xa7\x16!\
-\xd1\xf0\xf3\xe3L\xee\xdb\x02Ra\xae\xf6\xd1\xb3.\xfd\xdf\x1e\xa0p\xfaf\xaa\
-\xee\xaf\xa7x\xc4\xc6\\\x91G\x956\x90=\x93\xc1\xcbN\xe0\x84\x1e\xc3~\xcf%\
-\xb4\xc4b\xaa\xbd\x97\xc9\xddm\x04\xeb\xea\xf0\'&\x10!\xa0|\x0b\x99\xddC8\
-\x8f\x0cQR\x7f\x80\xbd\xdbEo\xd01\xae\xd1\xb0\x0f\x97\xf1\xd2E\x12K\x87\xa7=\
-\x08\rD\x81\xcc?\x0b\xdc^\x81\xdb_\x85VWG\xf2\xefKx\x99\xb5\x14:r\x94\xc7\
-\x06q\x02\x0fS\xdcg\x13^\x12`jo\x17\x93\xbb\xdb\x08]\x93\xc2/\xa4\x11\xd2\
-\xbf\xa4fi\xaf\x8d\xb1\xc8\'q\xfd(\xf9\xe3\xad\x08$~~\x84\xcckk\xa8x\xaa0\
-\xa3|\xeeh\x96\xf1\xed_&~\xc3\x00\x85\x8e\x86\xe9\xdf\xbc\xf9A\xc6~p\'\xe5\
-\xce\xf2\x85>\x0e\xf5\x04\x88\xad~\x88\xfe\xe7\xa68\xf9g;PE\x17\xab\xeeN\xac\
-\x85\xeb\xc9|{\x80\xe2/\xffp\xee\x06\xc0\xa7@\x7fe\xd5\xfa\xb9\xf60\xebT\xd6\
-Nq\x0f{8\x9f\xaa\xc4)J\xaa\xfb\xfb\xe1>\x8b\xfc8d\x07\x1d:\xbfe\x93\xc9\xa5\
-\xb8\xee\x8fk1\x96\x96ys{#7\xc4z\x89>\xde\xca\x91\x7f<\xc3\xe03{h\xb9c\x01re\
-\x90\xd2\x89<\xa7\xdf\xc8Pln\xa5fS\x9c\x8en\x87D*K\xf8\xd1\x16\x0e\xff\x93\
-\xcf\xc8\xf7\xdai\xb9\xbd\x16ug\x14\xdd\x02\xddpI~-\xc2\x81\x9d\xcd\xdc&wr>\
-\x95\x04\xa9\xd1J?oD\xeee,\x99\x84$HM\xf1\x95\x9e\x03\xe8\xf77s\xe4\xfb=\x14\
-~p\x80\xfa\xb5\xd5\xf8\xebM\xfa>\xd0\xcc5\xb4\x90\xac\xb1hv{\xc8N\x18\x97\
-\xd4|;\xba\x12\x81\xcd=\xe2U\xba\xaa*Q\xd2\xa0Y\xa4\xf9er\x15\xab\xba\xbbg\
-\x96\xaf\xcf\xe5\xf4\xe2%\xdc\xad\x0e\xd2\x93\x8c!\xa4\xe4Z\xd5\xcb\xae\xeb\
-\xd62\x16\x0f_\xe8\xe3\xd8\x94`k\xa3\xcb\xf8mk\x19:1\x00!\x9d\xd5\x0fmb2W\
-\xc1+N\x1c{\xd5\x95\xfd\xed\xf1\x1b\xf4\xd3~a\xae=\xcc:\xf5\xfe$\xb6\xdd\xcd\
-\xa8SblD\xa7\xf7\x9bi\xd0tl\xc7@\t\r\x84d\xd12\x97\xb6\xdf\xcfs\xe8h\x0bou\
-\x85\x18\xd6\xc3<\xfe\xc00\x0b\xb7\x18\x1c\xf9y\x8eS\xcf\x9dCI\r_\x18\x84\
-\x13\x92ewK\xcc\xaa!^\xdb\xbe\x8c\xfaj\x9f\x87\xb6\x8eP\xf3%\x8d\xd3\xfb\xf2\
-\x9cz\xbe\xfbB\xdb\xca\x06\xc9\xbd\x7fc0\xaa\x05\xb1Kg\x19-\x87\xb1\xa2\x12\
-\xc7\x1e\xe6\\9\xc7\x90\xff\xc1\xc6\x9a\x0fn{\x82G\xb6\xe6\x08\xaf\x90\x1c\
-\xde;\xca\x81w2(\xa9\x11\xad6Xp\x9dd\xa0$\tF\xf2\xd8\xc5s\xbcsd\x05\xbf\xb7\
-\xe9\x935\x07\xf4\x06\x1c\xc7\xa7T\xe8d\xd0\xae$\x18s(\xdb\xa3\x9c)\xe5\x99<\
-:\xb3|\xafo_\x86\x94\x938\xa53\x8c;\x05\xac\n\x83\xb2}\x96s\xe5k\x19\xf2?\
-\xb2Y9\x02\r\xa7\xa6\xa8\xd9\xd4\xc0\x89\x93\xfd\x84\x12&u\xeb#\xb4\xbf;\xce\
-\xd1\\p\x8e\xde\xfc\xa7G\xef\xeb\xfb\xe2m\x14\xe6\xb3yJ\xf9NZo\x12\x94\xdbC\
-\xd8\x8e\x81/t"\tIu\xa3C\xd3R\x9b\xc6\xa5%\xf6\xb6\xb7\xf0\xe2+\r\x14Ki\xd2\
-\xfd\n\xe9\x05\xb9o\xcba*\x9b\r\xce\x1e\nR\xcciXQ\xc1\x8d_\xce\x12\xae\x84\
-\xe7\xff\xf3n\x8eud1t\re\xeb<\xf0X\x07\xd7\xdc\xacqlO\x84\x89Q\x8bX\xadb\xc5\
-\x97\xb2tu\xa78px\t_Y\xdd\xc9\xa2\x95\x11*\xaa}\xd2}\x16\xc7ONa;\xa5\x0b>\
-\xd3iEe\x04\xb6<y\x86\xf3\xc7\x02\x9cx\'\x84f\n\xd6l\xc9\xd2xM\x9e\xfd;\x93D\
-\x93\x1e\xe7\xceV\xb0\xfd\xb5\xf5d\xc7/\xa1y(G\xac"K\xb1\xd0E\xd3\xf2q\xeaZ\
-\x8at\x9e\x8b\xf2\xde\xf1<\x02f\x9c\xaf:\x95\xc1.\x1c\xa6q\x8dN\xac\xc6\xa7\
-\xafw\x94\xe3\'\xc6\xb1\x9d\xecE\xfd\xbc\xef\x80\xcb\x03\x9b\x1d\xf2N\x89\
-\x86\xd6\x04B\x8e\xf2\xc6\xae\x12}}r\x96\xdf\xf8\xff\x1f\xb1~\xfd\xebW\xc7\\\
-w\x19\x11\x02\xb6n\xea\xe0\xb65]\xa4\x92E\x84\x9c\xee\x82l\xd6$3e1<\x1e\xe1\
-\x17\xbf^\xc2\xb9\xf3\x95\x94]y\xd1}K[\'\xd9\xb0l\x80\xa6\xfa)\x94\xa7\xf0\
-\xd1\xe8\xe8Jp\xe0D\r]\xbd\x91\x0bm\xa5T,\xbfv\x9cM\xab\xfbI\xc5\x0b\x94\xcb\
-\x12%u\xde{\xbf\x92]\xed\xf5\xe4\xf2\x06w\xdd6\xc0\xfa\xb6q\xca\xbe\xc6\xabo\
-\xd5s\xe4T\xc5\xc7\xbc\x06,\x8f[\xd6\x0es\xd3\xf2\x01\xa4\xef"5\x18\xcaD8{\
-\xbe\x82\r\xcb\x06\x00\xc1\xabo-\xe6\xc8\xa9\xcaKjfs\x06B\xc0]\xb7\r\xb1\xae\
-m\x0c\xd7\x97\x17\xe9\xce4\xdf\xf43\xba\xd9\xd06@\xd9\xd7x\xe5\xad\x16\x8e\
-\x9c\xba\xf8\xdc\x84\xa1\xc3\xdf}=G\xb9w\x80\xd7\xbf\xdb\xcd\xd7\xfe\xa5\x8d\
-\xae\x91(\xdf|&\xc2\xd5tDO,X\xf0\xbd\xab\xc8\xee\xe5E\x08\x08\x05?\x8c\xef\
-\xba`;W\xf6o\xc7\xab\x85u\xab\xca|\xff\x99\t\x9e\xfd\xeb>\\O\xf0\x97\xff\xba\
-\x80\'\xbf\x1e\xe7\xed}\xb3s\x94\xe0r\xa1\xf7\xf7\xf7\xcf\xb5\x87y>\x87\xdc\
-\xb0m\x8c\x89\x81\x0c\xc7\x0f\xe5y\xf4\xe9\x00\x1d\'m^\xdf\xb1\x80\xa9\xec\
-\xd5\xb3\xbc\x82\xe9]\x80y\xe6\xb9\xec\x84\x836\xd1h\x9e\xfb\xff\x146\xdde\
-\xf3\xc2K\xa1\xab\xae8\x00\xf4\xb960\xcf\xe7\x93\xe7\xfe\xa3\x9e\xa0YCe\xcc\
-\xe7\x99\xe7%/\xff\xf4\xb39\x1d\xf9Y#\xe0\x1b_\xd8o\x90y\xe6\xb9\x14W\xdf\
-\x9c7\xcf<\xb3\xc8|\x81\xcc3\xcf\'\xf0\xbfW+\x96s\x12b\xdf\x03\x00\x00\x00\
-\x00IEND\xaeB`\x82'
-
-def getDocFactory020Bitmap():
- return wxBitmapFromImage(getDocFactory020Image())
-
-def getDocFactory020Image():
- stream = cStringIO.StringIO(getDocFactory020Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory020')
-catalog['DocFactory020'] = ImageClass()
-catalog['DocFactory020'].getData = getDocFactory020Data
-catalog['DocFactory020'].getImage = getDocFactory020Image
-catalog['DocFactory020'].getBitmap = getDocFactory020Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory021Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rk\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19H\x93\x94\xe9\xb4CIi\x9c\x04B\x98\xd8\x90\x18\x1b\x1cG\xde0^elK\xb2\
-\x96\xa7]z\xd2[\xef}\xf7\xde\xd3?D\x0c.\t\xd6\x80\x91\x10\xe8\xf3\xe7\x9ds\
-\xef\xf7\xfb=\xf7\xfc\xe6\x9c{\xcf\x1c\xf1\x0f\xdfR\x8a\x05\x16X\xe0\xb7\xa2\
-\x87*\xe7\xda\xc2\x02\x0b|v\xd1\x83\x0b\x05\xb2\xc0\x02\xbf\x13=\x9c\x98k\
-\x0b\xb3\x8b@a`#\xf1.\xb9\xeeb\xe0b\xce\x9e\x07a\xa3\xfd?\x0f\n(\xab\x00\x1e\
-\xda\xa7\xa2+\xf11E\t\x1fIYY(\xc4\xa7\xa2\xf3yB\x0f\xc5\xe7\xda\xc2\xec!\xf0\
-\xa9+\xec!\xea^\xc0\xff\xc0\xd8\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xadL\xe9Kp\
-\t|J\x1e<\x1a\xec\xd7\xa9\xf0\xba.\xf1\x00\xa0[\n[\xab\xa2S\xdbF\x99\xd0\x15\
-\xd5\xd5pX\xea\xfe\x8c@y\x08\xcd\x10\x8c\xc8\x15\xa4\xe5\x8dWT\xe3\xf3\x88\
-\x1e\xfe\x02\x15\x88\xc50\r\xfa3\x9c}\xa5\x9a\xc9\xfe\x08 @J\xa4\xae\x08W\
-\x15\x89\xd4\x16iY9\x8ec-\xa1\'\xf8\xb78\xd4\\q\x0fA\x06i(\xbe\xc0\xe9\x9f\
-\xc4\x99L\x07@\x08\x10\x12\x80X\xbd\xcd\x8a\xfb\xdf\xa4h\xd42\xc6\xcdWT7\xc4\
- u\xf6\x8f8\xf1\xa3\x14\xb1\xc5%\x9a\xd6\x1d\xa1\x10\xbc\x962_\xa0\x01\xf01\
-\xd0#_\xa0\xfe\t)AB[\x83\xf0\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x0c\x9f\
-\x96\xe4\x87\x1bYy\x97\xc44~Mo\xf8\x9eK\x96!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\
-\x03%\x7f\xfbrH\xb8\x0e\xd2-\x03\\\xd26\xa4t\xc2\xe2j\x94[@j\\\xf4\x00\x82\
-\xd4R\x93P\xa8\r3\xd8@D~\xf89\xben\xa24\x1d\xe9\x14AH|\xc3\x9a.\xb0\xcbh\n\
-\x14q\xbfH8\xbf\x1cI\x89l:\xc65Q\x8b\x9a\xd0(\x19\xf9\xfe\x00\x98Q>\xa5\xde\
-\xd77\x03\xd3\x9a^\x19_\xb7\xa6\xb5\xca\xf6t33\xf0\xe1{\x00\xdf\x0c^\xe2\xf9\
-\xb3\x8e^a\xf6\xcd\xb5\x87Y\xc3R\x0e\x18\x1b0\xf47\x89\xa5\\\xae\xff\xa3\x9b\
-\xd0BAP>\xe5\xbcM\xdf\x91.\x86N\xa6\xb9p0\xc55wDq\x8cs\x14D\x10\xa1<\xccL\'f\
-\xa6\x13\xafPB\xa0\xa6\'\x9f@\x00;\xb5\x1c\xa7\xa2\x11\xde+$\xe1\x97\xb1\xa6\
-\xba0\xc6\xcf\xa3l\x07P\xd3\x13\x84\x11\xa0X}=Z\xb8\x12\x19\xb8\t\xcb\xda\
-\x8d\x96r\xb9\xfe\xb1\xcd\x18\x91 \x00vY1nD\x90\x01I\xcc\xef\xc2\x9c8\x875\
-\xd5\x89\xb2]\x94R`\x06\xf1\x82\x95\x98\xc54J\x81\x13o\xa6\x94j\xbb\xacfX\
-\xe8TzS\xe4&V\x80\xdb\x8e\xd0\xa0TX\xcd\x12k\x98\x01\x03J\xd2\x98Y>\xe5\x13H\
-\x1f\xc2\xc8\xa5\x91\x86\xc4\r\xd7\xa1\x15F\xf0\xed2\xc2\xb4p\xf4jdv\x14!\
-\x05\xf6\xe2Ux\xd1j\x00\x8c\xf4)\x8c\x89>\x10\x8ar\xbc\x91r\xfd\xf29x\xfb\
-\x1f\x0f=\xc2\xe9\xb9\xf60k\x18BG\x98\x15\xe82\x87\x1e\x14\x18\xb1\x14\x19\
-\xab\x80\x07X\xa10-\xb7\xad\xc7\xcb\xed$7\xd8I!s\x15\tk\x08\xdd\x9c"\x92=\
-\x8b^\xce0pj\x9c\xd1cY<\xd7G\x0f\xea\xd4oJP\x17\x1b\xa0X\\D!\xb8\x18\xa9<"\
-\xb93\xa8\xec$\xbdo\x0e\x92\xeb\xb7\x11\x1a\x98\x11\x83\xca\xeb\xa2T\x87\x86\
-\xb0C\x1b\x11F\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc30\x115@4\xd7\x01\
-\xa5I\x06\x8f\x8c\x92\xe9\xcc\x03P\xbf)I\xbc1\xc4\xf0\xf1I\xf4\xb0N\xd5\x9a\
-\x0c9\xdf!\x94\xeb\xfc\x9d\x9a5\xe11\xcc\x8a-\x0c\x1e8C\xff\xbe\x03(\xdfCI\
-\xc1\x99\x1d?g\xf9C\xf7\x91\xd0z\xc196\xa3|\xba*\x11\x0b\x9c\xa4\xf3\x17iB\
-\xd5\x16\xc9k\x07\x19\xeb\xc82zb\x8ae\xf7\'\ty?\xa6\xe7Wa\xe2\xad\x0e\x89\
-\x8a7\xb0#\xdb\x91^\x96\x80\xfb\x02\xe9\xa3A\xcc\n\x8fx\x9b\xc0Q\x7f\x82\x12\
-\xc6\xdc\x0e\x86\x19\xa2\x87\xd97\xd7\x1ef\r\x8d$\x82\xdb\xd1\x19G\x08\x81P!\
-L~\x85\xc78J\x93x\xde-,Z\xdbF\xd7\xce\xff\xc0\x1e\x19 \x96\x8a\x91(\x0f!\nu\
-\x9c\xfd\xe1A\n#\xc3\x04\xe21\xa4i\xe2\xe4\'\x18\xdc\x9b\xa6\x98n\xa1\xe9\
-\xab+1\xccS\xe8N\x12\xcdn\xa2\xe3\'?\xa482\x8c\x19\x8d`\x84\xc3 \x1c\xf2].\
-\xf5\xab\xb7\xa0\xf9}\x08\x9a\xd0\x19\xc3\xb3\x8b\xd8c\x93\x18A\x0bShh\x81\
-\x18%\xfd\x00x9\x02n\x0bg^z\x91\xfc\xe0 \x81D\x1ciY\x8c\x1e\xba\xc0\xf0~\x1b\
-\xdf-\x13\xaa\xad%\xb8\xe9vt;\x83\xfc(\xcd5\xb7\xa3\x14\x04+"TTK\xf2C=\x08)\
-\t\xc7\x97\xa0\x07b\x18*\x8d?\xa3|\'Q\xd2\xc34\xd6\xe2Ov0|~\x84\x89wB\x04+\
-\x93,^\xdfLE\xd5rp\xc2\x18\xfeq\xf2\xefj,^\xd5D\xc1;\x84,\xf9\xe8Z\x1b\xe5\
-\xe1\xe3\xc4\xabj\x88W\xd4\x91\xe7\x00\xf3ewZ\x0f\xb1g\xae=\xcc\x1a\x82%\x08\
-\xeeF\x17\xa3\x08\tB\x04\t\xf06\x8an\x00\xa4f\x13\xac\xbc\x8f\x805\x80=z\x18\
-\x8d\xd5\x18\xa2\x8d\x9e}\xcfQ\x1e9\xcc\xe2\x9b\xb7Ss\xe36Pe\xdcb\x91\xbe]\
-\xffN\xa1{7\x85\xf4J"\xad\x8b\xc0\xaf\xa2o\xef\xff\xe2\x8e\xbdC\xd3m\x8f\x90\
-h\xdb\x80\x0c\xf8hZ\x1c\xcf)\xa2\xf4qL\xbd\x1d\xe1nA\x17#\xb8\xd9s\x9c\xff\
-\xef\xa7\x90\xa6Dh\x92\xfa\xcdO\x12]\xb6\x0c\xe5e\xc9\x9c\xe9\xc0\x19>\xc2\
-\xe2[\x1e\xa0\xe6\xc6m\x08\xdd\xc7\xb7\xa1\xff\xf5\xe7\x98<\xbb\x1fC\xd7\x10\
-f-\xba\x1b\xa5o\xef\x0b\x1f\xa9\xa9\xac]\xc4\xae\xbe\x83X\xcb\x93\x9c{\xfe)\
-\x84\xee\xd1z\xef\x13\x08k\x1c\xa9\xd5\xd0\xb3\xef\xa7\x97\xcf\xd7R\x8b\xb2v\
-"\xcc-\xe8r\x02S\x0e\xd0\xb4\xf5/\x88\xb5\xae\xc2\x17\xdd\xa8\xc0\xdb\x90[F\
-\xed:\x93\x9eW\xff\x87\xd2\xe4W\t\x06\x8b(/\xc9DW\x07:\x03\xa4V<\x04\xa1^\
-\x82\xe25\x98\'%\xa2\x07\x86\xe7\xcf\x07\xd3\'F\xd7\xf0\x02\x114["\xa5\x00?\
-\x825\xae\x81;\xdd\x07\xca\x8a\xe3\xfaa\xcc\x92\xc0\xf4\xc2\x08\x15\x83\xb2\
-\x8f\xdd\xddC(XO\xcd\x86\x87\xd1\xca;\x91\xdeA\xa4\xf9\x005k\x1f\xa4\xaf\xf3\
-\x14\xa5\xae.bK\x1f\xc5\xf3\x04v\xe7yB\x81\x1a\xaa\xd6<\x80t\x7f\x8c,\xec\
-\x03\x99@\x13:8\x13PJ\xe2\x99\xa0\x95@/\x82\x15J\xa0[Q\xa4\xa1a\x05Sh\xae\
-\x8b\x92\xcdd\xda\xff\x8dP\xa0\x96\x9a\xf5\xdb\xd1\x9d\x9f!J\xc7\xf0\xad\xc7\
-\xa9Zy\x0f\xc5S\x07\xd1\x1d\x1d\xa1\x12\xe0\x05.\xaf\x99\x9b\x02=\x83g}\x03S\
-E\x90J\xa0\xe9\x15h\xf6\x8bx\xc6\xe33\xcaW\xd1\xb4\x1d\xad\xb0\x17\xcf\x8a\
-\xa1\xd9\x1a\xa1\xf0bb\xcd[\xd0\x9d\xef\x82s\x0c\xb2\x1eJ/Q\xb1l+\x01\xeb5\
-\xc6\xdb\x0f\xd1\xb0\xfd\xcf\xf1\xfc<\xd9\xa3\xcf\x93hX\x8d\x99\\\x8a\xcc\
-\xef\x82,0O\xf6`tv/\x9dk\x0f\xb3G\xac\x1a6\x0e!\x06\x83 \x01{\x08\x0eT\xc3\
-\xa4\x02\xc3Bm\xd8@\xa9\xe7m\xd4\xe9\x10Vk3rr\x0cO\xa4\xf0\xce\n\xf4X=\x14\
-\x02\xc8C\xfdP\x08\xa2\xd5\xa7\xb1\xeanA\x1b\xac\x87\x91\x18\xaa\x90@\x15\
-\x8b\xb8\xef\x82\x91\xa8\xc5\x9f2\xd0\x8f\x8cA\xe1\x83\xbf\x8a+!V\x05\xeb\
-\xd2\x88\xc1\x00\x96\xd3J\xf3\xf6\xbfB\x8bF\xc0\xf7\xf1G\xfb\x91\xc7\xce\xe1\
-4.\xc29Y\xc2H\xd6#\xca\t\xc4\x81I\xc8\x05\x91M}\x18\xb57\xa0\r\xd4"\xbc$x\tT\
-N]^\xf37\xba\xeb\xfb\x91\x83\x01\x84\x14PJCG\x12\x7f\xa9\x9cQ>\xf2\t8\xd6\
-\x00\x1b\xe20\x18\x9b^\xa2\xfa)h\x8f@\xa6\x11\x00\x11(#o\x8c\x12\x89\xdfHv\
-\xef\xdb\xd87\x14\xb0\xd3i\xca\xc7]jo\xb9\x1b\x06\xf3p \x00\xfe\xfc\x19sz\
-\xff3\x8f\xcf\xb5\x87Y\xc3h\x16$\xdaF)\x9c^\x82D\xc3\xcf\x8f3\xb9\x7f+H\x85\
-\xb9\xd6G\xcf\xba\xf4\x7f{\x80\xc2\x99\x9b\xa8\xba\xaf\x9e\xe2Q\x1bsU\x1eU\
-\xdaD\xf6l\x06/;\x81\x13z\x14\xfb\x1d\x97\xd02\x8b\xa9\xf6^&\xf7\xb4\x11\xac\
-\xab\xc3\x9f\x98@\x84\x80\xf2\xcdd\xf6\x0c\xe1<<DI\xfd\x01\xf6\x1e\x17\xbdA\
-\xc7\xb8J\xc3>R\xc6K\x17I,\x1f\x9e\xf6 4\x10\x052\xff,p{\x05n\x7f\x15Z]\x1d\
-\xc9\xbf/\xe1e\xd6S\xe8\xc8Q\x1e\x1b\xc4\t<Dq\xbfMxY\x80\xa9}]L\xeei#tU\n\
-\xbf\x90FH\xff\xb2\x9a\xa5}6\xc6\x12\x9f\xc4\xb5\xa3\xe4O\xb4"\x90\xf8\xf9\
-\x112\xaf\xac\xa3\xe2\xc9\xc2\x8c\xf2\xb9\xa3Y\xc6w|\x99\xf8u\x03\x14:\x1a\
-\xa6\x7f\xf3\xe6\x07\x19\xfb\xc1\x1d\x94;\xcb\x17\xfb8\xd4\x13 \xb6\xf6A\xfa\
-\x9f\x9d\xe2\xd4\x9f\xedD\x15]\xac\xba;\xb0\x16o$\xf3\xed\x01\x8a\xbf\xfc\
-\xc3\xb9\x1b\x00\x1f\x03\xfd\xa55\x1b\xe7\xda\xc3\xacQY;\xc5\xdd\xec\xe5B\
-\xaa\x12\xa7(\xa9\xee\xef\x87{-\xf2\xe3\x90\x1dt\xe8\xfc\x96M&\x97\xe2\x9a?\
-\xae\xc5X^\xe6\xf5\x1d\x8d\\\x17\xeb%\xfaX+G\xff\xf1,\x83O\xef\xa5\xe5\xf6E\
-\xc8\xd5AJ\'\xf3\x9cy-C\xb1\xb9\x95\x9a\xcdq:\xba\x1d\x12\xa9,\xe1GZ8\xf2O>#\
-\xdfk\xa7\xe5\xb6Z\xd4\x1dQt\x0bt\xc3%\xf9\xb5\x08\x07w5s\xab\xdc\xc5\x85T\
-\x12\xa4F+\xfd\xbc\x16\xb9\x87\xb1d\x12\x92 5\xc5Wz\x0e\xa2\xdf\xd7\xcc\xd1\
-\xef\xf7P\xf8\xc1A\xea\xd7W\xe3o4\xe9{O3\xd7\xd0B\xb2\xc6\xa2\xd9\xed!;a\\V\
-\xf3\xcd\xe8j\x046w\x8b\x97\xe9\xaa\xaaDI\x83f\x91\xe6\x97\xc95\xac\xe9\xee\
-\x9eY\xbe>\x973K\x97q\x97:DO2\x86\x90\x92\xabU/\xbb\xafY\xcfX<|\xb1\x8fcS\
-\x82m\x8d.\xe3\xb7\xaeg\xe8\xe4\x00\x84t\xd6>\xb8\x99\xc9\\\x05/9q\xec5\xf3\
-\xe3\xdb\xe37\xe8g\xfc\xc2\\{\x985\xea\xfdIl\xbb\x9bQ\xa7\xc4\xd8\x88N\xef7\
-\xd3\xa0\xe9\xd8\x8e\x81\x12\x1a\x08\xc9\x92\x15.m\xbf\x9f\xe7\xf0\xb1\x16\
-\xde\xe8\n1\xac\x87y\xec\xfea\x16o58\xfa\xf3\x1c\xa7\x9f=\x8f\x92\x1a\xbe0\
-\x08\'$+\xee\x92\x98UC\xbc\xb2c\x05\xf5\xd5>\x0fn\x1b\xa1\xe6K\x1ag\xf6\xe79\
-\xfd\x9d\xee\x8bm+\x1b$\xf7\xfc\x8d\xc1\xa8\x16\xc4.\x9dc\xb4\x1c\xc6\x8aJ\
-\x1c{\x98\xf3\xe5\x1cC\xfe{\x1bk>\xb8\xed\t\x1e\xde\x96#\xbcJrd\xdf(\x07\xdf\
-\xca\xa0\xa4F\xb4\xda`\xd15\x92\x81\x92$\x18\xc9c\x17\xcf\xf3\xd6\xd1U\xfc\
-\xde\xe6\x8f\xd6\x1c\xd0\x1bp\x1c\x9fR\xa1\x93A\xbb\x92`\xcc\xa1l\x8fr\xb6\
-\x94g\xf2\xd8\xcc\xf2\xbd\xbac\x05RN\xe2\x94\xce2\xee\x14\xb0*\x0c\xca\xf69\
-\xce\x97\xaff\xc8\xff\xc0f\xe5\x084\x9c\x9e\xa2fs\x03\'O\xf5\x13J\x98\xd4m\
-\x8c\xd0\xfe\xf68\xc7r\xc19z\xf3\x1f\x1f\xbd\xaf\xef\x8b\xb3Q\x98\xcf\xe6)\
-\xe5;i\xbdAPn\x0fa;\x06\xbe\xd0\x89$$\xd5\x8d\x0eM\xcbm\x1a\x97\x97\xd8\xd7\
-\xde\xc2\xf3/5P,\xa5I\xf7+\xa4\x17\xe4\xde\xadG\xa8l68w8H1\xa7aE\x05\xd7\x7f\
-9K\xb8\x12\xbe\xf3_wq\xbc#\x8b\xa1k([\xe7\xfeG;\xb8\xea&\x8d\xe3{#L\x8cZ\xc4\
-j\x15\xab\xbe\x94\xa5\xab;\xc5\xc1#\xcb\xf8\xca\xdaN\x96\xac\x8ePQ\xed\x93\
-\xee\xb38qj\n\xdb)]\xf4\x99N+*#\xb0\xf5\x89\xb3\\8\x1e\xe0\xe4[!4S\xb0nk\x96\
-\xc6\xab\xf2\x1c\xd8\x95$\x9a\xf48\x7f\xae\x82\x1d\xafl$;~\x19\xcd\xc39b\x15\
-Y\x8a\x85.\x9aV\x8eS\xd7R\xa4\xf3|\x94wN\xe4\x110\xe3|\xd5\xa9\x0cv\xe1\x08\
-\x8d\xebtb5>}\xbd\xa3\x9c89\x8e\xedd/\xe9\xe7\xfd\x07]\xee\xdf\xe2\x90wJ4\
-\xb4&\x10r\x94\xd7v\x97\xe8\xeb\x93\xb3\xfc\xc6?9b\xe3\xc6W\xe7\xd7\x9c\xf7\
-\t\x10\x02\xb6m\xee\xe0\xd6u]\xa4\x92E\x84\x9c\x8e\x9e\xcd\x9ad\xa6,\x86\xc7\
-#\xfc\xe2\xd7\xcb8\x7f\xa1\x92\xb2+/\xb9oy\xeb$\x9bV\x0c\xd0T?\x85\xf2\x14>\
-\x1a\x1d]\t\x0e\x9e\xac\xa1\xab7r\xb1\xad\x94\x8a\x95W\x8f\xb3ym?\xa9x\x81rY\
-\xa2\xa4\xce;\xefV\xb2\xbb\xbd\x9e\\\xde\xe0\xce[\x07\xd8\xd86N\xd9\xd7x\xf9\
-\x8dz\x8e\x9e\xae\xf8\x90\xd7\x80\xe5q\xf3\xfaanX9\x80\xf4]\xa4\x06C\x99\x08\
-\xe7.T\xb0i\xc5\x00 x\xf9\x8d\xa5\x1c=]yY\xcdl\xce@\x08\xb8\xf3\xd6!6\xb4\
-\x8d\xe1\xfa\xf2\x12\xdd\x99\xe6\x9b~F7\x9b\xda\x06(\xfb\x1a/\xbd\xd1\xc2\
-\xd1\xd3\x97\x9e\x970t\xf8\xbb\xaf\xe7(\xf7\x0e\xf0\xeaw\xbb\xf9\xda\xbf\xb4\
-\xd15\x12\xe5\x9bOG\x98\x8fG\xf3\xc4\xa2E\xdf\x9b\x87\xb6?\x19B@(\xf8~l\xd7\
-\x05\xdb\x99\x1f\xbf\x1d?\xeblXS\xe6\xfbOO\xf0\xcc_\xf7\xe1z\x82\xbf\xfc\xd7\
-E<\xf1\xf58o\xee\x9f\x9d\xa3\x04W\x1a\xbd\xbf\xbf\x7f\xae=,\xf09\xe2\xba\xed\
-cL\x0cd8q8\xcf#O\x05\xe88e\xf3\xea\xceELe\xe7\xdf\xf2\n\xa6w\x03\x16X\xe0\
-\x8a\x11\x0e\xdaD\xa3y\xee\xfbS\xd8|\xa7\xcds/\x84\xe6mq\x00\xe8sm`\x81\xcf\
-\x17\xcf\xfeg=A\xb3\x86\xca\x98\xcf\xd3\xdf\x91\xbc\xf8\xd3O\xe7t\xe4l!\xe0\
-\x1b_\xb8o\x90\x05\x16\x98)\xf3w\xee[`\x81Y`\xa1@\x16X\xe0#\xf8?;\xbf\x96s\
-\x031\xa3\xd0\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory021Bitmap():
- return wxBitmapFromImage(getDocFactory021Image())
-
-def getDocFactory021Image():
- stream = cStringIO.StringIO(getDocFactory021Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory021')
-catalog['DocFactory021'] = ImageClass()
-catalog['DocFactory021'].getData = getDocFactory021Data
-catalog['DocFactory021'].getImage = getDocFactory021Image
-catalog['DocFactory021'].getBitmap = getDocFactory021Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory022Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rk\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19\xa0I\xcat\xda\xa1\xa44N\x02!LlH\x8c\r\x8e#o\x18o\x92\xb1-\xc9Z\x9ev\
-\xe9Io\xbd\xf7\xdd{O\xff\x101\xb8$\xd8\x0c\x16\x8a@\x9f?\xdf\x9c\xfb\xbe\xdf\
-\xef9\xe77\xe7\xdc{\xe6\x88\x7f\xf8\x96R,\xb0\xc0\x02\xbf\x11=T9\xd7\x16\x16\
-X\xe0w\x17=\xb8P \x0b,\xf0[\xd1\xc3\x89\xb9\xb6\xf0\xd9 P\x18\xd8H\xbc\x8b~w\
-1p1?;\x0f\xc2F\xfb\x7f\x1e\x14PV\x01<\xb4Y\xd1\x95\xf8\x98\xa2\x84\x8f\xa4\
-\xac,\x14bVt>\x8f\xe8\xa1\xf8\\[\x98}\x04>u\x85=D\xdd\xf3\xf8\x1f\x9a\x9bR\
-\x824u\xf2n\x9c\\\xb0\x95i}\t.\x81Y\xf2\xe0\xd1`\xbfA\x85\xd7}\x91\x07\x00\
-\xddR\xd8Z\x15]\xda6\xca\x84\xae\xa8\xae\x86\xc3R\xf7\xa7\x04\xca\xc3h\x86`T\
-\xae -o\xbc\xa2\x1a\x9fg\xf4\xf0\x17\xa0@,Fh\xd0\x9f\xe1\xcc\xab\xd5L\rD\x00\
-\x01R"uE\xb8\xaaH\xa4\xb6H\xcb\xca\t\x1ck\t\xbd\xc1\xbf\xc5\xa1\xe6\x8a{\x08\
-2DC\xf1E:~\x1cg*\x1d\x00!@H\x00b\xf56+\xee\x7f\x8b\xa2Q\xcb87_Q\xdd\x10C\xd4\
-\xd9?\xe4\xc4\x0fS\xc4\x16\x97hZw\x84B\xf0Z\xca|\x01\x06\xfe\n\xa0G\xbe\x00\
-\xfd\x14R\x82\x84\xb6\x06\xe1\x17\x91\x9a"\x18\x17\x18\x01\x81BP\xca\x07\x19\
-\xe9\x90\xe4G\x1aYy\x97\xc44~E_\xf8\x9e\x8b\xb6!\xc2\xf7\x10n\x19\xe1{(\xa9\
-\xa1t\x03%\x7f\xf3vH\xb8\x0e\xd2-\x03\\\xd46\xa4t\xc2\xe2j\x94[@j\\\xf0\x00\
-\x82\xd4R\x93P\xa8\r3\xd8@D~\xf4\x7f|\xddDi:\xd2)\x82\x90\xf8\x865S`\x97\xd0\
-\x14(\xe2~\x91p~9\x92\x12\xd9t\x8ck\xa2\x165\xa112\xf2\x83\x81\xbf\xac|J}\
-\xa0o\x06f4\xbd2\xben\xcdh\x95\xed\x99ff\xe0\xa3\xcf\x00\xbe\x19\xbc\xc8\xf3\
-|A\xaf0\xfb\xe7\xda\xc3\xacc)\x07\x8c\r\x18\xfa[\xc4R.\xd7\xff\xd1Mh\xa1 (\
-\x9fr\xde\xa6\xffH7\xc3\'\xd3\x9c?\x98\xe2\x9a;\xa28\xc6Y\n"\x88P\x1ef\xa6\
-\x0b3\xd3\x85W(!P3\x8bO \x80\x9dZ\x8eS\xd1\x08\xef\x17\x92\xf0\xcbX\xd3\xdd\
-\x18\x13\xe7P\xb6\x03\xa8\x99\x05\xc2\x08P\xac\xbe\x1e-\\\x89\x0c\xdc\x84e\
-\xedFK\xb9\\\xff\xd8f\x8cH\x10\x00\xbb\xac\x980"\xc8\x80$\xe6wcN\x9e\xc5\x9a\
-\xeeB\xd9.J)0\x83x\xc1J\xccb\x1a\xa5\xc0\x897SJ\xb5]R3,t*\xbdir\x93+\xc0mGhP\
-*\xacf\x895\xc2\xa0\x01%i\\^>\xe5\x13H\x1f\xc2\xc8\xa5\x91\x86\xc4\r\xd7\xa1\
-\x15F\xf1\xed2\xc2\xb4p\xf4jdv\x0c!\x05\xf6\xe2Ux\xd1j\x00\x8c\xf4)\x8c\xc9~\
-\x10\x8ar\xbc\x91r\xfd\xf29\x18\xfdO\x87\x1e\xa1c\xae=\xcc:\x86\xd0\x11f\x05\
-\xba\xcc\xa1\x07\x05F,E\xc6*\xe0\x01V(L\xcbm\xeb\xf1r;\xc9\ruQ\xc8\\E\xc2\
-\x1aF7\xa7\x89d\xcf\xa0\x973\x0c\x9e\x9a`\xecX\x16\xcf\xf5\xd1\x83:\xf5\x9b\
-\x12\xd4\xc5\x06)\x16\x17Q\x08.F*\x8fH\xee4*;E\xdf[C\xe4\x06l\x84\x06f\xc4\
-\xa0\xf2\xba(\xd5\xa1a\xec\xd0F\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\x17\
-\x0f7\xe8\xe20BD\r\x12\xcduBi\x8a\xa1#cd\xba\xf2\x00\xd4oJ\x12o\x0c1r|\n=\
-\xacS\xb5&C\xcew\x08\xe5\xba~\xabfMx\x1c\xb3b\x0bC\x07N3\xb0\xef\x00\xca\xf7\
-PRpz\xc7\xcfX\xfe\xd0}$\xb4>p\x8e]V>]\x95\x88\x05N\xd2\xf5\xf34\xa1j\x8b\xe4\
-\xb5C\x8cwf\x19;1\xcd\xb2\xfb\x93\x84\xbc\x1f\xd1\xfb\xcb0\xf1V\x87D\xc5\x9b\
-\xd8\x91\xedH/K\xc0}\x91\xf4\xd1 f\x85G\xbcM\xe0\xa8?A\tcn\'\xc3\'D\x0f\xb3o\
-\xae=\xcc:\x1aI\x04\xb7\xa33\x81\x10\x02\xa1B\x98\xfc\x12\x8f\t\x94&\xf1\xbc\
-[X\xb4\xb6\x8d\xee\x9d\xff\x81=:H,\x15#Q\x1eF\x14\xea8\xf3\x83\x83\x14FG\x08\
-\xc4cH\xd3\xc4\xc9O2\xb47M1\xddB\xd3WWb\x98\xa7\xd0\x9d$\x9a\xddD\xe7\x8f\
-\x7f@qt\x043\x1a\xc1\x08\x87A8\xe4\xbb]\xeaWoA\xf3\xfb\x114\xa13\x8eg\x17\
-\xb1\xc7\xa70\x82\x16\xa6\xd0\xd0\x021J\xfa\x01\xf0r\x04\xdc\x16N\xbf\xfc\
-\x12\xf9\xa1!\x02\x898\xd2\xb2\x18;t\x9e\x91\xfd6\xbe[&T[Kp\xd3\xed\xe8v\x06\
-\xf9q\x9aknG)\x08VD\xa8\xa8\x96\xe4\x87{\x11R\x12\x8e/A\x0f\xc40T\x1a\xff\
-\xb2\xf2\x9dDI\x0f\xd3X\x8b?\xd5\xc9\xc8\xb9Q&\xdf\r\x11\xacL\xb2x}3\x15U\
-\xcb\xc1\tc\xf8\xc7\xc9\xbf\xa7\xb1xU\x13\x05\xef\x10\xb2\xe4\xa3km\x94G\x8e\
-\x13\xaf\xaa!^QG\x9e\x03\xcc\xb7Si=\xc4\x9e\xb9\xf60\xeb\x08\x96 \xb8\x1b]\
-\x8c!$\x08\x11$\xc0;(z\x00\x90\x9aM\xb0\xf2>\x02\xd6 \xf6\xd8a4Vc\x886z\xf7=\
-Oy\xf40\x8bo\xdeN\xcd\x8d\xdb@\x95q\x8bE\xfaw\xfd;\x85\x9e\xdd\x14\xd2+\x89\
-\xb4.\x02\xbf\x8a\xfe\xbd\xff\x8b;\xfe.M\xb7=B\xa2m\x032\xe0\xa3iq<\xa7\x88\
-\xd2\'0\xf5v\x84\xbb\x05]\x8c\xe2f\xcfr\xee\xbf\x9fB\x9a\x12\xa1I\xea7?It\
-\xd92\x94\x97%s\xba\x13g\xe4\x08\x8boy\x80\x9a\x1b\xb7!t\x1f\xdf\x86\x817\
-\x9eg\xea\xcc~\x0c]C\x98\xb5\xe8n\x94\xfe\xbd/~\xac\xa6\xb2v\x11\xbb\xfa\x0e\
-b-Or\xf6\x85\xa7\x10\xbaG\xeb\xbdO \xac\t\xa4VC\xef\xbe\x9f\\:_K-\xca\xda\
-\x890\xb7\xa0\xcbIL9H\xd3\xd6\xbf \xd6\xba\n_\xf4\xa0\x02\xef@n\x19\xb5\xebL\
-z_\xfb\x1fJS_%\x18,\xa2\xbc$\x93\xdd\x9d\xe8\x0c\x92Z\xf1\x10\x84\xfa\x08\
-\x8a\xd7a\x9e\x95\x88\x1e\x18\x99\x7f/N\x9f\x18]\xc3\x0bD\xd0l\x89\x94\x02\
-\xfc\x08\xd6\x84\x06\xeeLve\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\xe9%\x14\xac\
-\xa7f\xc3\xc3h\xe5\x9dH\xef \xd2|\x80\x9a\xb5\x0f\xd2\xdfu\x8aRw7\xb1\xa5\
-\x8f\xe2y\x02\xbb\xeb\x1c\xa1@\rUk\x1e@\xba?B\x16\xf6\x81L\xa0\t\x1d\x9cI(%\
-\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9f2\xed\xffF(PK\
-\xcd\xfa\xed\xe8\xceO\x11\xa5c\xf8\xd6\xe3T\xad\xbc\x87\xe2\xa9\x83\xe8\x8e\
-\x8eP\t\xf0\x02\x97\xd6\xccM\x83\x9e\xc1\xb3\xbe\x81\xa9"H%\xd0\xf4\n4\xfb%<\
-\xe3\xf1\xcb\xcaW\xd1\xb4\x1d\xad\xb0\x17\xcf\x8a\xa1\xd9\x1a\xa1\xf0bb\xcd[\
-\xd0\x9d\xef\x80s\x0c\xb2\x1eJ/Q\xb1l+\x01\xebu&\xda\x0f\xd1\xb0\xfd\xcf\xf1\
-\xfc<\xd9\xa3/\x90hX\x8d\x99\\\x8a\xcc\xef\x82,0\xcf\xce`tv/\x9dk\x0f\xb3O\
-\xac\x1a6\x0e#\x86\x82 \x01{\x18\x0eT\xc3\x94\x02\xc3Bm\xd8@\xa9\xf7\x1dTG\
-\x08\xab\xb5\x1995\x8e\'Rxg\x04z\xac\x1e\n\x01\xe4\xa1\x01(\x04\xd1\xea\xd3X\
-u\xb7\xa0\r\xd5\xc3h\x0cUH\xa0\x8aE\xdc\xf7\xc0H\xd4\xe2O\x1b\xe8G\xc6\xa1\
-\xf0\xe1O\xc5\x95\x10\xab\x82ui\xc4P\x00\xcbi\xa5y\xfb_\xa1E#\xe0\xfb\xf8c\
-\x03\xc8cgq\x1a\x17\xe1\x9c,a$\xeb\x11\xe5\x04\xe2\xc0\x14\xe4\x82\xc8\xa6~\
-\x8c\xda\x1b\xd0\x06k\x11^\x12\xbc\x04*\xa7.\xad\xf9k\xdd\xf5\x03\xc8\xa1\
-\x00B\n(\xa5\xa13\x89\xbfT^V>\xf2\t8\xd6\x00\x1b\xe20\x14\x9b\xd9\xa2\xfa)h\
-\x8f@\xa6\x11\x00\x11(#o\x8c\x12\x89\xdfHv\xef;\xd87\x14\xb0\xd3i\xca\xc7]jo\
-\xb9\x1b\x86\xf2p \x00\xfe\xfc\x9bk\xfa\xc03\x8f\xcf\xb5\x87Y\xc7h\x16$\xda\
-\xc6(t,A\xa2\xe1\xe7\'\x98\xda\xbf\x15\xa4\xc2\\\xeb\xa3g]\x06\xbe=H\xe1\xf4\
-MT\xddWO\xf1\xa8\x8d\xb9*\x8f*m"{&\x83\x97\x9d\xc4\t=\x8a\xfd\xaeKh\x99\xc5t\
-{\x1fS{\xda\x08\xd6\xd5\xe1ON"B@\xf9f2{\x86q\x1e\x1e\xa6\xa4\xfe\x00{\x8f\
-\x8b\xde\xa0c\\\xa5a\x1f)\xe3\xa5\x8b$\x96\x8f\xccx\x10\x1a\x88\x02\x99\x7f\
-\x16\xb8}\x02w\xa0\n\xad\xae\x8e\xe4\xdf\x97\xf02\xeb)t\xe6(\x8f\x0f\xe1\x04\
-\x1e\xa2\xb8\xdf&\xbc,\xc0\xf4\xben\xa6\xf6\xb4\x11\xba*\x85_H#\xa4\x7fI\xcd\
-\xd2>\x1bc\x89O\xe2\xda1\xf2\'Z\x11H\xfc\xfc(\x99W\xd7Q\xf1d\xe1\xb2\xf2\xb9\
-cY&v|\x99\xf8u\x83\x14:\x1bf>\xf3\xe6\x87\x18\xff\xfe\x1d\x94\xbb\xca\x17\
-\xfa8\xd4\x1b \xb6\xf6A\x06\x9e\x9d\xe6\xd4\x9f\xedD\x15]\xac\xba;\xb0\x16o$\
-\xf3\xedA\x8a\xbf\xf8\xc3\xb9\x9b\x00\x9f\x02\xfd\xe55\x1b\xe7\xda\xc3\xacSY\
-;\xcd\xdd\xec\xe5|\xaa\x12\xa7(\xa9\x1e\x18\x80{-\xf2\x13\x90\x1dr\xe8\xfa\
-\x96M&\x97\xe2\x9a?\xae\xc5X^\xe6\x8d\x1d\x8d\\\x17\xeb#\xfaX+G\xff\xf1\x0cC\
-O\xef\xa5\xe5\xf6E\xc8\xd5AJ\'\xf3\x9c~=C\xb1\xb9\x95\x9a\xcdq:{\x1c\x12\xa9\
-,\xe1GZ8\xf2O>\xa3\xdfm\xa7\xe5\xb6Z\xd4\x1dQt\x0bt\xc3%\xf9\xb5\x08\x07w5s\
-\xab\xdc\xc5\xf9T\x12\xa4F+\x03\xbc\x1e\xb9\x87\xf1d\x12\x92 5\xc5Wz\x0f\xa2\
-\xdf\xd7\xcc\xd1\xef\xf5R\xf8\xfeA\xea\xd7W\xe3o4\xe9\x7f_3\xd7\xd0B\xb2\xc6\
-\xa2\xd9\xed%;i\\R\xf3\xad\xe8j\x046w\x8bW\xe8\xae\xaaDI\x83f\x91\xe6\x17\
-\xc95\xac\xe9\xe9\xb9\xbc|\xfd.\xa7\x97.\xe3.u\x88\xded\x0c!%W\xab>v_\xb3\
-\x9e\xf1x\xf8B\x1f\xc7\xa6\x05\xdb\x1a]&n]\xcf\xf0\xc9A\x08\xe9\xac}p3S\xb9\
-\n^v\xe2\xd8k\xe6\xd7\xbb\xc7\xaf\xd1O\xfb\x85\xb9\xf60\xeb\xd4\xfbS\xd8v\
-\x0fcN\x89\xf1Q\x9d\xbeo\xa6A\xd3\xb1\x1d\x03%4\x10\x92%+\\\xda~?\xcf\xe1c-\
-\xbc\xd9\x1dbD\x0f\xf3\xd8\xfd#,\xdejp\xf4g9:\x9e=\x87\x92\x1a\xbe0\x08\'$+\
-\xee\x92\x98U\xc3\xbc\xbac\x05\xf5\xd5>\x0fn\x1b\xa5\xe6K\x1a\xa7\xf7\xe7\
-\xe9x\xae\xe7B\xdb\xca\x06\xc9=\x7fc0\xa6\x05\xb1Kg\x19+\x87\xb1\xa2\x12\xc7\
-\x1e\xe1\\9\xc7\xb0\xff\xfe\xc1\x9a\x0fn{\x82\x87\xb7\xe5\x08\xaf\x92\x1c\
-\xd97\xc6\xc1\xb73(\xa9\x11\xad6Xt\x8dd\xb0$\tF\xf2\xd8\xc5s\xbc}t\x15\xbf\
-\xb7\xf9\xe35\x07\xf5\x06\x1c\xc7\xa7T\xe8b\xc8\xae$\x18s(\xdbc\x9c)\xe5\x99\
-:vy\xf9^\xdb\xb1\x02)\xa7pJg\x98p\nX\x15\x06e\xfb,\xe7\xcaW3\xec\x7f\xe8\xb0\
-r\x14\x1a:\xa6\xa9\xd9\xdc\xc0\xc9S\x03\x84\x12&u\x1b#\xb4\xbf3\xc1\xb1\\p\
-\x8eF\xfe\xd3\xa3\xf7\xf7\x7f\xfe\x0f\n\xf3\xd9<\xa5|\x17\xad7\x08\xca\xed!l\
-\xc7\xc0\x17:\x91\x84\xa4\xba\xd1\xa1i\xb9M\xe3\xf2\x12\xfb\xda[x\xe1\xe5\
-\x06\x8a\xa54\xe9\x01\x85\xf4\x82\xdc\xbb\xf5\x08\x95\xcd\x06g\x0f\x07)\xe64\
-\xac\xa8\xe0\xfa/g\tW\xc2s\xffu\x17\xc7;\xb3\x18\xba\x86\xb2u\xee\x7f\xb4\
-\x93\xabn\xd28\xbe7\xc2\xe4\x98E\xacV\xb1\xeaKY\xba{R\x1c<\xb2\x8c\xaf\xac\
-\xedb\xc9\xea\x08\x15\xd5>\xe9~\x8b\x13\xa7\xa6\xb1\x9d\xd2\x05\x9f\xe9\xb4\
-\xa22\x02[\x9f8\xc3\xf9\xe3\x01N\xbe\x1dB3\x05\xeb\xb6fi\xbc*\xcf\x81]I\xa2I\
-\x8fsg+\xd8\xf1\xeaF\xb2\x13\x97\xd0<\x9c#V\x91\xa5X\xe8\xa6i\xe5\x04u-E\xba\
-\xceEy\xf7D\x1e\x01\x97\x9d\xaf:\x95\xc1.\x1c\xa1q\x9dN\xac\xc6\xa7\xbfo\x8c\
-\x13\'\'\xb0\x9d\xecE\xfd\xbc\xff\xa0\xcb\xfd[\x1c\xf2N\x89\x86\xd6\x04B\x8e\
-\xf1\xfa\xee\x12\xfd\xfd\xf23\x1e\xf1+\x87\xd8\xb8\xf1\xb5\xf9\xb9\xf6}\x02\
-\x84\x80m\x9b;\xb9u]7\xa9d\x11!g"g\xb3&\x99i\x8b\x91\x89\x08?\xff\xd52\xce\
-\x9d\xaf\xa4\xec\xca\x8b\x9e[\xde:\xc5\xa6\x15\x834\xd5O\xa3<\x85\x8fFgw\x82\
-\x83\'k\xe8\xee\x8b\\h+\xa5b\xe5\xd5\x13l^;@*^\xa0\\\x96(\xa9\xf3\xee{\x95\
-\xecn\xaf\'\x977\xb8\xf3\xd6A6\xb6MP\xf65^y\xb3\x9e\xa3\x1d\x15\x1f\xf1\x1a\
-\xb0<n^?\xc2\r+\x07\x91\xbe\x8b\xd4`8\x13\xe1\xec\xf9\n6\xad\x18\x04\x04\xaf\
-\xbc\xb9\x94\xa3\x1d\x95\x97\xd4\xcc\xe6\x0c\x84\x80;o\x1dfC\xdb8\xae//\xd2\
-\xbd\xdc|3\xff\xd1\xc3\xa6\xb6A\xca\xbe\xc6\xcbo\xb6p\xb4\xe3\xe2{\x12\x86\
-\x0e\x7f\xf7\xf5\x1c\xe5\xbeA^\xfbN\x0f_\xfb\x976\xbaG\xa3|\xf3\xe9\x08\xf3\
-\xf9J\x9eX\xb4\xe8\xbb\xf3\xd8\xfe\'C\x08\x08\x05?\x88\xeb\xba`;\xf3\xeb\xb3\
-\xe3\xef*\x1b\xd6\x94\xf9\xde\xd3\x93<\xf3\xd7\xfd\xb8\x9e\xe0/\xffu\x11O|=\
-\xce[\xfb?\x9b\xab\x04\xb3\x85>000\xd7\x1e\x16\xf8\x1cp\xdd\xf6q&\x073\x9c8\
-\x9c\xe7\x91\xa7\x02t\x9e\xb2ym\xe7"\xa6\xb3\xf3w{\x053\xa7\x02\x0b,\xf0\xa9\
-\t\x07m\xa2\xd1<\xf7\xfd)l\xbe\xd3\xe6\xf9\x17C\xf3\xbe8\x00\xf4\xb96\xb0\
-\xc0\xe7\x83g\xff\xb3\x9e\xa0YCe\xcc\xe7\xe9\xe7$/\xfddvnG~\xd6\x08\xf8\xc6\
-\x17\xe6\x1dd\x81\x05>)\xf3\x7f\r\\`\x81Yd\xa1@\x16X\xe0c\xf8? S\x96sPy\t\
-\xae\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory022Bitmap():
- return wxBitmapFromImage(getDocFactory022Image())
-
-def getDocFactory022Image():
- stream = cStringIO.StringIO(getDocFactory022Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory022')
-catalog['DocFactory022'] = ImageClass()
-catalog['DocFactory022'].getData = getDocFactory022Data
-catalog['DocFactory022'].getImage = getDocFactory022Image
-catalog['DocFactory022'].getBitmap = getDocFactory022Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory023Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ri\
-IDATx\x9c\xed\x9bYl]\xc7}\xc6\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`g\xabQ\xb4p\x9d\xbaQ\x12;\x8e\x11\xc9Nd\xc9V\x14j\xb3\xac\x8d\x94%\
-\x91\x14\x97\xcb\x9d\xbc\xe4]\xcf\xb9\xe7\x9c\xe9\x03\x1d\xd9\xaa\x13I0D3T\
-\xf9{\xbc\x98s\xbf\xef\x9b\x99?f\xce\x19\x8c\xf8\x87o(\xc5\x02\x0b,\xf0\x1b\
-\xd1C\x95sma\x81\x05~w\xd1\x83\x0b\x05\xb2\xc0\x02\xbf\x15=\x9c\x98k\x0b\xb3\
-\x8b@a`#\xf1.\xfa\xdd\xc5\xc0\xc5\xfc\xfc<\x08\x1b\xed\xffxP@Y\x05\xf0\xd0fE\
-W\xe2c\x8a\x12>\x92\xb2\xb2P\x88Y\xd1\xb9\x96\xd1C\xf1\xb9\xb60{\x08|\xea\n{\
-\x88\xba\xe7\xf1?17\xa5\x04i\xea\xe4\xdd8\xb9`+\xd3\xfa\x12\\\x02\xb3\xe4\
-\xc1\xa3\xc1~\x9b\n\xaf\xfb"\x0f\x00\xba\xa5\xb0\xb5*\xba\xb4m\x94\t]U]\r\
-\x87\xa5\xeeO\t\x94\x87\xd1\x0c\xc1\xa8\\AZ\xdezU5\xfe?\xa0\x87\xaf\xe1\x02\
-\xb1\x18\xa1A\x7f\x813oT35\x10\x01\x04H\x89\xd4\x15\xe1\xaa"\x91\xda"-+\'p\
-\xac%\xf4\x06\xff\x16\x87\x9a\xab\xee!\xc8\x10\r\xc5W\xe8\xf8q\x9c\xa9t\x00\
-\x84\x00!\x01\x88\xd5\xdb\xacx\xf8]\x8aF-\xe3\xdc~UuC\x0cQg\xff\x90\x13?L\
-\x11[\\\xa2i\xdd\x11\n\xc1\x1b)s\r\x0f\xf8,\xa0G\xae\xe1\xfe\n)AB[\x83\xf0\
-\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8ctH\xf2#\x8d\xac\xbcOb\x1a\xbf\xa2/\
-\xfc\xc0E\xdb\x10\xe1{\x08\xb7\x8c\xf0=\x94\xd4P\xba\x81\x92\xbfy;$\\\x07\
-\xe9\x96\x01.j\x1bR:aq=\xca- 5.x\x00Aj\xa9I(\xd4\x86\x19l "?\xfd?\xben\xa24\
-\x1d\xe9\x14AH|\xc3\x9a)\xb0\xcbh\n\x14q\xbfH8\xbf\x1cI\x89l:\xc6\rQ\x8b\x9a\
-\xd0\x18\x19\xf9\xf1\x80_Q>\xa5>\xd67\x033\x9a^\x19_\xb7f\xb4\xca\xf6L33\xf0\
-\xe9g\x00\xdf\x0c^\xe4y\xbe\xa1W\x98\xfds\xeda\xd6\xb0\x94\x03\xc6\x06\x0c\
-\xfd]b)\x97\x9b\xff\xe86\xb4P\x10\x94O9o\xd3\x7f\xa4\x9b\xe1\x93i\xce\x1fLq\
-\xc3=Q\x1c\xe3,\x05\x11D(\x0f3\xd3\x85\x99\xe9\xc2+\x94\x10\xa8\x99\xc5\'\
-\x10\xc0N-\xc7\xa9h\x84\x8f\nI\xf8e\xac\xe9n\x8c\x89s(\xdb\x01\xd4\xcc\x02a\
-\x04(V\xdf\x8c\x16\xaeD\x06n\xc3\xb2v\xa3\xa5\\n~j3F$\x08\x80]VL\x18\x11d@\
-\x12\xf3\xbb1\'\xcfbMw\xa1l\x17\xa5\x14\x98A\xbc`%f1\x8dR\xe0\xc4\x9b)\xa5\
-\xda.\xab\x19\x16:\x95\xde4\xb9\xc9\x15\xe0\xb6#4(\x15V\xb3\xc4\x1aa\xd0\x80\
-\x924\xae,\x9f\xf2\t\xa4\x0fa\xe4\xd2HC\xe2\x86\xeb\xd0\n\xa3\xf8v\x19aZ8z52\
-;\x86\x90\x02{\xf1*\xbch5\x00F\xfa\x14\xc6d?\x08E9\xdeH\xb9~\xf9\x1c\x8c\xfe\
-\xd5A\x8f\xd01\xd7\x1ef\rC\xe8\x08\xb3\x02]\xe6\xd0\x83\x02#\x96"c\x15\xf0\
-\x00+\x14\xa6\xe5\xae\xf5x\xb9\x9d\xe4\x86\xba(d\xae#a\r\xa3\x9b\xd3D\xb2g\
-\xd0\xcb\x19\x06OM0v,\x8b\xe7\xfa\xe8A\x9d\xfaM\t\xeab\x83\x14\x8b\x8b(\x04\
-\x17#\x95G$w\x1a\x95\x9d\xa2\xef\xdd!r\x036B\x033bPyS\x94\xea\xd00vh#\xc2H\
-\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18!\xa2\x06\x89\xe6:\xa14\
-\xc5\xd0\x9112]y\x00\xea7%\x897\x86\x189>\x85\x1e\xd6\xa9Z\x93!\xe7;\x84r]\
-\xbfU\xb3&<\x8eY\xb1\x85\xa1\x03\xa7\x19\xd8w\x00\xe5{()8\xbd\xe3g,\x7f\xec!\
-\x12Z\x1f8\xc7\xae(\x9f\xaeJ\xc4\x02\'\xe9\xfay\x9aP\xb5E\xf2\xc6!\xc6;\xb3\
-\x8c\x9d\x98f\xd9\xc3IB\xde\x8f\xe8\xfde\x98x\xabC\xa2\xe2\x1d\xec\xc8v\xa4\
-\x97%\xe0\xbeB\xfah\x10\xb3\xc2#\xde&p\xd4\x9f\xa0\x841\xb7\x93\xe13\xa2\x87\
-\xd97\xd7\x1ef\r\x8d$\x82\xbb\xd1\x99@\x08\x81P!L~\x89\xc7\x04J\x93x\xde\x1d\
-,Z\xdbF\xf7\xce\x7f\xc7\x1e\x1d$\x96\x8a\x91(\x0f#\nu\x9c\xf9\xc1A\n\xa3#\
-\x04\xe21\xa4i\xe2\xe4\'\x19\xda\x9b\xa6\x98n\xa1\xe9\xcb+1\xccS\xe8N\x12\
-\xcdn\xa2\xf3\xc7?\xa08:\x82\x19\x8d`\x84\xc3 \x1c\xf2\xdd.\xf5\xab\xb7\xa0\
-\xf9\xfd\x08\x9a\xd0\x19\xc7\xb3\x8b\xd8\xe3S\x18A\x0bShh\x81\x18%\xfd\x00x9\
-\x02n\x0b\xa7_{\x95\xfc\xd0\x10\x81D\x1ciY\x8c\x1d:\xcf\xc8~\x1b\xdf-\x13\
-\xaa\xad%\xb8\xe9nt;\x83\xbc\x94\xe6\x9a\xbbQ\n\x82\x15\x11*\xaa%\xf9\xe1^\
-\x84\x94\x84\xe3K\xd0\x031\x0c\x95\xc6\xbf\xa2|\'Q\xd2\xc34\xd6\xe2Ou2rn\x94\
-\xc9\x0fB\x04+\x93,^\xdfLE\xd5rp\xc2\x18\xfeq\xf2\x1fj,^\xd5D\xc1;\x84,\xf9\
-\xe8Z\x1b\xe5\x91\xe3\xc4\xabj\x88W\xd4\x91\xe7\x00\xf3\xf54Z\x0f\xb1g\xae=\
-\xcc\x1a\x82%\x08\xeeG\x17c\x08\tB\x04\t\xf0>\x8a\x1e\x00\xa4f\x13\xac|\x88\
-\x805\x88=v\x18\x8d\xd5\x18\xa2\x8d\xde}/Q\x1e=\xcc\xe2\xdb\xb7Ss\xeb6Pe\xdc\
-b\x91\xfe]\xffF\xa1g7\x85\xf4J"\xad\x8b\xc0\xaf\xa2\x7f\xef\xff\xe0\x8e\x7f@\
-\xd3]O\x90h\xdb\x80\x0c\xf8hZ\x1c\xcf)\xa2\xf4\tL\xbd\x1d\xe1nA\x17\xa3\xb8\
-\xd9\xb3\x9c\xfb\xaf\xe7\x90\xa6Dh\x92\xfa\xcd\xcf\x12]\xb6\x0c\xe5e\xc9\x9c\
-\xee\xc4\x199\xc2\xe2;\x1e\xa1\xe6\xd6m\x08\xdd\xc7\xb7a\xe0\xed\x97\x98:\
-\xb3\x1fC\xd7\x10f-\xba\x1b\xa5\x7f\xef+\x97\xd4T\xd6.b\xd7\xdfC\xac\xe5Y\
-\xce\xbe\xfc\x1cB\xf7h}\xf0\x19\x845\x81\xd4j\xe8\xdd\xf7\x93\xcb\xe7k\xa9EY\
-;\x11\xe6\x16t9\x89)\x07i\xda\xfa\x17\xc4ZW\xe1\x8b\x1eT\xe0}\xc8-\xa3v\x9dI\
-\xef\x9b\xffMi\xea\xcb\x04\x83E\x94\x97d\xb2\xbb\x13\x9dAR+\x1e\x83P\x1fA\
-\xf1\x16\xcc\xd3\x12\xd1\x03#\xf3\xf7\x05\xea\xb2\xe8\x1a^ \x82fK\xa4\x14\
-\xe0G\xb0&4pg2++\x8e\xeb\x871K\x02\xd3\x0b#T\x0c\xca>vO/\xa1`=5\x1b\x1eG+\
-\xefDz\x07\x91\xe6#\xd4\xac}\x94\xfe\xaeS\x94\xba\xbb\x89-}\x12\xcf\x13\xd8]\
-\xe7\x08\x05j\xa8Z\xf3\x08\xd2\xfd\x11\xb2\xb0\x0fd\x02M\xe8\xe0LB)\x89g\x82\
-V\x02\xbd\x08V(\x81nE\x91\x86\x86\x15L\xa1\xb9.J6\x93i\xff6\xa1@-5\xeb\xb7\
-\xa3;?E\x94\x8e\xe1[OS\xb5\xf2\x01\x8a\xa7\x0e\xa2;:B%\xc0\x0b\\^37\rz\x06\
-\xcf\xfa\x1a\xa6\x8a \x95@\xd3+\xd0\xecW\xf1\x8c\xa7\xaf(_E\xd3v\xb4\xc2^<+\
-\x86fk\x84\xc2\x8b\x895oAw\xbe\x03\xce1\xc8z(\xbdD\xc5\xb2\xad\x04\xac\xb7\
-\x98h?D\xc3\xf6?\xc7\xf3\xf3d\x8f\xbeL\xa2a5fr)2\xbf\x0b\xb2\xc0<=\x83\xd1\
-\xd9\xbdt\xae=\xcc\x1e\xb1j\xd88\x8c\x18\n\x82\x04\xeca8P\rS\n\x0c\x0b\xb5a\
-\x03\xa5\xde\xf7Q\x1d!\xac\xd6f\xe4\xd48\x9eH\xe1\x9d\x11\xe8\xb1z(\x04\x90\
-\x87\x06\xa0\x10D\xabOc\xd5\xdd\x816T\x0f\xa31T!\x81*\x16q?\x04#Q\x8b?m\xa0\
-\x1f\x19\x87\xc2\'?\x15WB\xac\n\xd6\xa5\x11C\x01,\xa7\x95\xe6\xed\x7f\x85\
-\x16\x8d\x80\xef\xe3\x8f\r \x8f\x9d\xc5i\\\x84s\xb2\x84\x91\xacG\x94\x13\x88\
-\x03S\x90\x0b"\x9b\xfa1joA\x1b\xacExI\xf0\x12\xa8\x9c\xba\xbc\xe6\xafu\xd7\
-\x0f \x87\x02\x08)\xa0\x94\x86\xce$\xfeRyE\xf9\xc8\'\xe0X\x03l\x88\xc3Plf\
-\x8b\xea\xa7\xa0=\x02\x99F\x00D\xa0\x8c\xbc5J$~+\xd9\xbd\xefc\xdfR\xc0N\xa7)\
-\x1fw\xa9\xbd\xe3~\x18\xca\xc3\x81\x00\xf8\xf3w\x8e\xe9\x03/<=\xd7\x1ef\r\
-\xa3Y\x90h\x1b\xa3\xd0\xb1\x04\x89\x86\x9f\x9f`j\xffV\x90\ns\xad\x8f\x9eu\
-\x19\xf8\xe6 \x85\xd3\xb7Q\xf5P=\xc5\xa36\xe6\xaa<\xaa\xb4\x89\xec\x99\x0c^v\
-\x12\'\xf4$\xf6\x07.\xa1e\x16\xd3\xed}L\xedi#XW\x87?9\x89\x08\x01\xe5\xdb\
-\xc9\xec\x19\xc6y|\x98\x92\xfa\x03\xec=.z\x83\x8eq\x9d\x86}\xa4\x8c\x97.\x92\
-X>2\xe3Ah \nd\xfeY\xe0\xf6\t\xdc\x81*\xb4\xba:\x92\x7f_\xc2\xcb\xac\xa7\xd0\
-\x99\xa3<>\x84\x13x\x8c\xe2~\x9b\xf0\xb2\x00\xd3\xfb\xba\x99\xda\xd3F\xe8\
-\xba\x14~!\x8d\x90\xfee5K\xfbl\x8c%>\x89\x1b\xc7\xc8\x9fhE \xf1\xf3\xa3d\xde\
-XG\xc5\xb3\x85+\xca\xe7\x8ee\x99\xd8\xf1E\xe27\rR\xe8l\x98\xf9\xcc\x9b\x1fb\
-\xfc\xfb\xf7P\xee*_\xe8\xe3Po\x80\xd8\xdaG\x19xq\x9aS\x7f\xb6\x13Ut\xb1\xea\
-\xee\xc1Z\xbc\x91\xcc7\x07)\xfe\xe2\x0f\xe7n\x02\\\x05\xf4\xd7\xd6l\x9ck\x0f\
-\xb3Fe\xed4\xf7\xb3\x97\xf3\xa9J\x9c\xa2\xa4z`\x00\x1e\xb4\xc8O@v\xc8\xa1\
-\xeb\x1b6\x99\\\x8a\x1b\xfe\xb8\x16cy\x99\xb7w4rS\xac\x8f\xe8S\xad\x1c\xfd\
-\xc73\x0c=\xbf\x97\x96\xbb\x17!W\x07)\x9d\xccs\xfa\xad\x0c\xc5\xe6Vj6\xc7\
-\xe9\xecqH\xa4\xb2\x84\x9fh\xe1\xc8?\xf9\x8c~\xb7\x9d\x96\xbbjQ\xf7D\xd1-\
-\xd0\r\x97\xe4W"\x1c\xdc\xd5\xcc\x9dr\x17\xe7SI\x90\x1a\xad\x0c\xf0V\xe4\x01\
-\xc6\x93IH\x82\xd4\x14_\xea=\x88\xfeP3G\xbf\xd7K\xe1\xfb\x07\xa9__\x8d\xbf\
-\xd1\xa4\xff#\xcd\\C\x0b\xc9\x1a\x8bf\xb7\x97\xec\xa4qY\xcdw\xa3\xab\x11\xd8\
-\xdc/^\xa7\xbb\xaa\x12%\r\x9aE\x9a_$\xd7\xb0\xa6\xa7\xe7\xca\xf2\xf5\xbb\x9c\
-^\xba\x8c\xfb\xd4!z\x931\x84\x94\\\xaf\xfa\xd8}\xc3z\xc6\xe3\xe1\x0b}\x1c\
-\x9b\x16lkt\x99\xb8s=\xc3\'\x07!\xa4\xb3\xf6\xd1\xcdL\xe5*x\xcd\x89c\xaf\x99\
-\x9f\xef\x1e\xbfF?\xed\x17\xe6\xda\xc3\xacQ\xefOa\xdb=\x8c9%\xc6Gu\xfa\xbe\
-\x9e\x06M\xc7v\x0c\x94\xd0@H\x96\xacpi\xfb\xfd<\x87\x8f\xb5\xf0Nw\x88\x11=\
-\xccS\x0f\x8f\xb0x\xab\xc1\xd1\x9f\xe5\xe8x\xf1\x1cJj\xf8\xc2 \x9c\x90\xac\
-\xb8ObV\r\xf3\xc6\x8e\x15\xd4W\xfb<\xbam\x94\x9a/h\x9c\xde\x9f\xa7\xe3[=\x17\
-\xdaV6H\x1e\xf8\x1b\x831-\x88]:\xcbX9\x8c\x15\x958\xf6\x08\xe7\xca9\x86\xfd\
-\x8f\x0e\xd6|p\xdb\x13<\xbe-Gx\x95\xe4\xc8\xbe1\x0e\xbe\x97AI\x8dh\xb5\xc1\
-\xa2\x1b$\x83%I0\x92\xc7.\x9e\xe3\xbd\xa3\xab\xf8\xbd\xcd\x97\xd6\x1c\xd4\
-\x1bp\x1c\x9fR\xa1\x8b!\xbb\x92`\xcc\xa1l\x8fq\xa6\x94g\xea\xd8\x95\xe5{s\
-\xc7\n\xa4\x9c\xc2)\x9da\xc2)`U\x18\x94\xed\xb3\x9c+_\xcf\xb0\xff\x89\xc3\
-\xcaQh\xe8\x98\xa6fs\x03\'O\r\x10J\x98\xd4m\x8c\xd0\xfe\xfe\x04\xc7r\xc19\
-\x1a\xf9\xab\x87\xde\xdf\x7f\xed\x1e\x14\xe6\xb3yJ\xf9.Zo\x11\x94\xdbC\xd8\
-\x8e\x81/t"\tIu\xa3C\xd3r\x9b\xc6\xe5%\xf6\xb5\xb7\xf0\xf2k\r\x14Ki\xd2\x03\
-\n\xe9\x05yp\xeb\x11*\x9b\r\xce\x1e\x0eR\xcciXQ\xc1\xcd_\xcc\x12\xae\x84o\
-\xfd\xe7}\x1c\xef\xccb\xe8\x1a\xca\xd6y\xf8\xc9N\xae\xbbM\xe3\xf8\xde\x08\
-\x93c\x16\xb1Z\xc5\xaa/d\xe9\xeeIq\xf0\xc82\xbe\xb4\xb6\x8b%\xab#TT\xfb\xa4\
-\xfb-N\x9c\x9a\xc6vJ\x17|\xa6\xd3\x8a\xca\x08l}\xe6\x0c\xe7\x8f\x078\xf9^\
-\x08\xcd\x14\xac\xdb\x9a\xa5\xf1\xba<\x07v%\x89&=\xce\x9d\xad`\xc7\x1b\x1b\
-\xc9N\\F\xf3p\x8eXE\x96b\xa1\x9b\xa6\x95\x13\xd4\xb5\x14\xe9:\x17\xe5\x83\
-\x13y\x04\\q\xbe\xeaT\x06\xbbp\x84\xc6u:\xb1\x1a\x9f\xfe\xbe1N\x9c\x9c\xc0v\
-\xb2\x17\xf5\xf3\xfe\x83.\x0foq\xc8;%\x1aZ\x13\x089\xc6[\xbbK\xf4\xf7\xcb\
-\xcfy\xc4\xaf>b\xe3\xc67\xe7\xf7\x1ax\t\x84\x80m\x9b;\xb9s]7\xa9d\x11!g\xa2f\
-\xb3&\x99i\x8b\x91\x89\x08?\xff\xd52\xce\x9d\xaf\xa4\xec\xca\x8b\x9e[\xde:\
-\xc5\xa6\x15\x834\xd5O\xa3<\x85\x8fFgw\x82\x83\'k\xe8\xee\x8b\\h+\xa5b\xe5\
-\xf5\x13l^;@*^\xa0\\\x96(\xa9\xf3\xc1\x87\x95\xecn\xaf\'\x977\xb8\xf7\xceA6\
-\xb6MP\xf65^\x7f\xa7\x9e\xa3\x1d\x15\x9f\xf2\x1a\xb0<n_?\xc2-+\x07\x91\xbe\
-\x8b\xd4`8\x13\xe1\xec\xf9\n6\xad\x18\x04\x04\xaf\xbf\xb3\x94\xa3\x1d\x95\
-\x97\xd5\xcc\xe6\x0c\x84\x80{\xef\x1cfC\xdb8\xae//\xd2\xbd\xd2|3\xff\xd1\xc3\
-\xa6\xb6A\xca\xbe\xc6k\xef\xb4p\xb4\xe3\xe2\xfb\x11\x86\x0e\x7f\xf7\xd5\x1c\
-\xe5\xbeA\xde\xfcN\x0f_\xf9\x976\xbaG\xa3|\xfd\xf9\x08\xd7\xc2U<\xb1h\xd1w\
-\xaf\x81\x18\x97F\x08\x08\x05?\x8e\xe9\xba`;\xf3\xf3\xb3\xe3\xef\x1a\x1b\xd6\
-\x94\xf9\xde\xf3\x93\xbc\xf0\xd7\xfd\xb8\x9e\xe0/\xffu\x11\xcf|5\xce\xbb\xfb\
-?\x9f\xab\x04\xb3\x8d>000\xd7\x1e\x16\x98\xc7\xdc\xb4}\x9c\xc9\xc1\x0c\'\x0e\
-\xe7y\xe2\xb9\x00\x9d\xa7l\xde\xdc\xb9\x88\xe9\xec\xfc\xdf^\xc1\xcc\xe9\xc0\
-\x02\x0b|f\xc2A\x9bh4\xcfC\x7f\n\x9b\xef\xb5y\xe9\x95\xd05S\x1c\x00\xfa\\\
-\x1bX`~\xf3\xe2\x7f\xd4\x134k\xa8\x8c\xf9<\xff-\xc9\xab?\x99\x9d\xdb\x91s\
-\x85\x80\xaf]\xf3\xef \x0b,\xf0Y\xb9v\xd6\xc2\x05\x16\x98\x05\x16\nd\x81\x05\
-.\xc1\xff\x02\x04\xe7\x96s]oO\x1d\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory023Bitmap():
- return wxBitmapFromImage(getDocFactory023Image())
-
-def getDocFactory023Image():
- stream = cStringIO.StringIO(getDocFactory023Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory023')
-catalog['DocFactory023'] = ImageClass()
-catalog['DocFactory023'].getData = getDocFactory023Data
-catalog['DocFactory023'].getImage = getDocFactory023Image
-catalog['DocFactory023'].getBitmap = getDocFactory023Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory024Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rj\
-IDATx\x9c\xed\x9bYl]\xc7}\xc6\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`;K\x8d\xa2\x85\xe3\xc4\x8d\x92\xd8q\x8cHv"K\xb6\xa2P\x0b-k\xa5,\
-\x89\xa4\xb8\\\xee\xe4%\xefz\xce=\xe7L\x1f\xe8\xc8V\x9dX,B\x99\x91\xc2\xdf\
-\xe3\xc5\x9c\xfb}\xdf\xcc\xfc1s\xce`\xc4?}M)\x16X`\x81_\x8b\x1e\xaa\x9co\x0b\
-\x0b,\xf0\xbb\x8b\x1e\\(\x90\x05\x16\xf8\x8d\xe8\xe1\xc4|[\xb8<\x08\x14\x066\
-\x12\xef\xa2\xdf]\x0c\\\xcc\xcf\xce\x83\xb0\xd1\xfe\x8f\x07\x05\x94U\x00\x0f\
-\xed\xb2\xe8J|LQ\xc2GRV\x16\nqYt~\x1f\xd0C\xf1\xf9\xb60\xf7\x08|\xea\n{\x88\
-\xba\xe7\xf1?67\xa5\x04i\xea\xe4\xdd8\xb9`+\xd3\xfa\x12\\\x02\x97\xc9\x83G\
-\x83\xfd\x16\x15^\xf7E\x1e\x00tKakUti\xdb(\x13\x9aS]\r\x87\xa5\xeeO\x08\x94\
-\x87\xd1\x0c\xc1\xa8\\AZ\xde<\xa7\x1a\xbfO\xe8\xe1\xab\xb0@,Fh\xd0\x9f\xe3\
-\xcc\xeb\xd5L\rD\x00\x01R"uE\xb8\xaaH\xa4\xb6H\xcb\xca\t\x1ck\t\xbd\xc1\xbf\
-\xc7\xa1f\xce=\x04\x19\xa2\xa1\xf82\xa7~\x14g*\x1d\x00!@H\x00b\xf56+\x1e|\
-\x87\xa2Q\xcb8\xb7\xce\xa9n\x88!\xea\xec\x1fp\xfc\x07)b\x8bK4\xad\xeb\xa0\
-\x10\xbc\x9e2W\xe1@\x7f\x06\xe8\x91\xab\xb0\xdfBJ\x90\xd0\xd6 \xfc"RS\x04\
-\xe3\x02# P\x08J\xf9 #\xa7$\xf9\x91FV\xde#1\x8d_\xd2\x17\xbe\xef\xa2m\x88\
-\xf0=\x84[F\xf8\x1eJj(\xdd@\xc9_\xbf\x1d\x12\xae\x83t\xcb\x00\x17\xb5\r)\x9d\
-\xb0\xb8\x16\xe5\x16\x90\x1a\x17<\x80 \xb5\xd4$\x14j\xc3\x0c6\x10\x91\x9f\
-\xfc\x1f_7Q\x9a\x8et\x8a $\xbea\xcd\x14\xd8%4\x05\x8a\xb8_$\x9c_\x8e\xa4D6\
-\x1d\xe3\xba\xa8EMh\x8c\x8c\xfch\xa0g\x95O\xa9\x8f\xf4\xcd\xc0\x8c\xa6W\xc6\
-\xd7\xad\x19\xad\xb2=\xd3\xcc\x0c|\xf2\x19\xc07\x83\x17y\xbeR\xd1+\xcc\xfe\
-\xf9\xf60\xe7X\xca\x01c\x03\x86\xfe\x0e\xb1\x94\xcb\x8d\x7fr\x0bZ(\x08\xca\
-\xa7\x9c\xb7\xe9\xef\xe8f\xf8D\x9a\xf3\x07S\\wW\x14\xc78KA\x04\x11\xca\xc3\
-\xcctaf\xba\xf0\n%\x04jf\xf1\t\x04\xb0S\xcbq*\x1a\xe1\xc3B\x12~\x19k\xba\x1b\
-c\xe2\x1c\xcav\x005\xb3@\x18\x01\x8a\xd57\xa2\x85+\x91\x81[\xb0\xac\xddh)\
-\x97\x1b\x9f\xd8\x8c\x11\t\x02`\x97\x15\x13F\x04\x19\x90\xc4\xfcn\xcc\xc9\
-\xb3X\xd3](\xdbE)\x05f\x10/X\x89YL\xa3\x148\xf1fJ\xa9\xb6Kj\x86\x85N\xa57Mnr\
-\x05\xb8\xed\x08\rJ\x85\xd5,\xb1F\x184\xa0$\x8d\xd9\xe5S>\x81\xf4!\x8c\\\x1a\
-iH\xdcp\x1dZa\x14\xdf.#L\x0bG\xafFf\xc7\x10R`/^\x85\x17\xad\x06\xc0H\x9f\xc4\
-\x98\xec\x07\xa1(\xc7\x1b)\xd7/\x9f\x87\xd1\x9f[\xf4\x08\xa7\xe6\xdb\xc3\x9c\
-c\x08\x1daV\xa0\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\xc2\xb4\xdc\xb1\x1e/\xb7\
-\x93\xdcP\x17\x85\xcc5$\xacats\x9aH\xf6\x0cz9\xc3\xe0\xc9\t\xc6\x8ef\xf1\\\
-\x1f=\xa8S\xbf)A]l\x90bq\x11\x85\xe0b\xa4\xf2\x88\xe4N\xa3\xb2S\xf4\xbd3Dn\
-\xc0Fh`F\x0c*o\x88R\x1d\x1a\xc6\x0emD\x18)t\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\
-\x83.\x0e#D\xd4 \xd1\\\'\x94\xa6\x18\xea\x18#\xd3\x95\x07\xa0~S\x92xc\x88\
-\x91cS\xe8a\x9d\xaa5\x19r\xbeC(\xd7\xf5\x1b5k\xc2\xe3\x98\x15[\x18:p\x9a\x81\
-}\x07P\xbe\x87\x92\x82\xd3;~\xca\xf2G\x1e \xa1\xf5\x81stV\xf9tU"\x168A\xd7\
-\xcf\xd2\x84\xaa-\x92\xd7\x0f1\xde\x99e\xec\xf84\xcb\x1eL\x12\xf2~H\xef/\xc2\
-\xc4[\x1d\x12\x15ocG\xb6#\xbd,\x01\xf7e\xd2G\x82\x98\x15\x1e\xf16\x81\xa3\
-\xfe\x0c%\x8c\xf9\x9d\x0c\xbf%z\x98}\xf3\xeda\xce\xd1H"\xb8\x13\x9d\t\x84\
-\x10\x08\x15\xc2\xe4\x17xL\xa04\x89\xe7\xdd\xc6\xa2\xb5mt\xef\xfcO\xec\xd1Ab\
-\xa9\x18\x89\xf20\xa2P\xc7\x99\xef\x1f\xa40:B \x1eC\x9a&N~\x92\xa1\xbdi\x8a\
-\xe9\x16\x9a\xbe\xb8\x12\xc3<\x89\xee$\xd1\xec&:\x7f\xf4}\x8a\xa3#\x98\xd1\
-\x08F8\x0c\xc2!\xdf\xedR\xbfz\x0b\x9a\xdf\x8f\xa0\t\x9dq<\xbb\x88=>\x85\x11\
-\xb40\x85\x86\x16\x88Q\xd2\x0f\x80\x97#\xe0\xb6p\xfa\xd5W\xc8\x0f\r\x11H\xc4\
-\x91\x96\xc5\xd8\xa1\xf3\x8c\xec\xb7\xf1\xdd2\xa1\xdaZ\x82\x9b\xeeD\xb73\xc8\
-O\xd3\\s\'JA\xb0"BE\xb5$?\xdc\x8b\x90\x92p|\tz \x86\xa1\xd2\xf8\xb3\xcaw\x02\
-%=Lc-\xfeT\'#\xe7F\x99|?D\xb02\xc9\xe2\xf5\xcdTT-\x07\'\x8c\xe1\x1f#\xff\x81\
-\xc6\xe2UM\x14\xbcC\xc8\x92\x8f\xae\xb5Q\x1e9F\xbc\xaa\x86xE\x1dy\x0ep\xa5\
-\x9fB\xeb!\xf6\xcc\xb7\x879G\xb0\x04\xc1\xbd\xe8b\x0c!A\x88 \x01\xdeC\xd1\
-\x03\x80\xd4l\x82\x95\x0f\x10\xb0\x06\xb1\xc7\x0e\xa3\xb1\x1aC\xb4\xd1\xbb\
-\xefE\xca\xa3\x87Y|\xebvjn\xde\x06\xaa\x8c[,\xd2\xbf\xeb?(\xf4\xec\xa6\x90^I\
-\xa4u\x11\xf8U\xf4\xef\xfd\x1f\xdc\xf1\xf7i\xba\xe31\x12m\x1b\x90\x01\x1fM\
-\x8b\xe39E\x94>\x81\xa9\xb7#\xdc-\xe8b\x147{\x96s\xdfy\x06iJ\x84&\xa9\xdf\
-\xfc4\xd1e\xcbP^\x96\xcc\xe9N\x9c\x91\x0e\x16\xdf\xf6\x1057oC\xe8>\xbe\r\x03\
-o\xbd\xc8\xd4\x99\xfd\x18\xba\x860k\xd1\xdd(\xfd{_\xfeTMe\xed"v\xed]\xc4Z\
-\x9e\xe6\xecK\xcf t\x8f\xd6\xfb\x9fBX\x13H\xad\x86\xde}?\xbet\xbe\x96Z\x94\
-\xb5\x13anA\x97\x93\x98r\x90\xa6\xad\x7fE\xacu\x15\xbe\xe8A\x05\xde\x83\xdc2\
-j\xd7\x99\xf4\xbe\xf1=JS_$\x18,\xa2\xbc$\x93\xdd\x9d\xe8\x0c\x92Z\xf1\x08\
-\x84\xfa\x08\x8a7\xe1\n/\x11=0r\xe5\xbfH}\x02]\xc3\x0bD\xd0l\x89\x94\x02\xfc\
-\x08\xd6\x84\x06\xeeLVe\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\xe9%\x14\xac\xa7\
-f\xc3\xa3h\xe5\x9dH\xef \xd2|\x88\x9a\xb5\x0f\xd3\xdfu\x92Rw7\xb1\xa5\x8f\
-\xe3y\x02\xbb\xeb\x1c\xa1@\rUk\x1eB\xba?D\x16\xf6\x81L\xa0\t\x1d\x9cI(%\xf1L\
-\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9f2\xed\xdf \x14\xa8\
-\xa5f\xfdvt\xe7\'\x88\xd2Q|\xebI\xaaV\xdeG\xf1\xe4AtGG\xa8\x04x\x81Kk\xe6\
-\xa6A\xcf\xe0Y_\xc1T\x11\xa4\x12hz\x05\x9a\xfd\n\x9e\xf1\xe4\xac\xf2U4mG+\
-\xec\xc5\xb3bh\xb6F(\xbc\x98X\xf3\x16t\xe7\x9b\xe0\x1c\x85\xac\x87\xd2KT,\
-\xdbJ\xc0z\x93\x89\xf6C4l\xffK<?O\xf6\xc8K$\x1aVc&\x97"\xf3\xbb \x0b\\\xe1g0\
-:\xbb\x97\xce\xb7\x87\xb9\'V\r\x1b\x87\x11CA\x90\x80=\x0c\x07\xaaaJ\x81a\xa1\
-6l\xa0\xd4\xfb\x1e\xeaT\x08\xab\xb5\x1995\x8e\'Rxg\x04z\xac\x1e\n\x01\xe4\
-\xa1\x01(\x04\xd1\xea\xd3Xu\xb7\xa1\r\xd5\xc3h\x0cUH\xa0\x8aE\xdc\x0f\xc0H\
-\xd4\xe2O\x1b\xe8\x1d\xe3P\xf8\xf8\xa7\xe2J\x88U\xc1\xba4b(\x80\xe5\xb4\xd2\
-\xbc\xfdo\xd0\xa2\x11\xf0}\xfc\xb1\x01\xe4\xd1\xb38\x8d\x8bpN\x940\x92\xf5\
-\x88r\x02q`\nrAdS?F\xedMh\x83\xb5\x08/\t^\x02\x95S\x97\xd6\xfc\x95\xee\xfa\
-\x01\xe4P\x00!\x05\x94\xd2\xd0\x99\xc4_*g\x95\x8f|\x02\x8e6\xc0\x868\x0c\xc5\
-f\xb6\xa8~\n\xda#\x90i\x04@\x04\xca\xc8\x9b\xa3D\xe27\x93\xdd\xfb\x1e\xf6M\
-\x05\xect\x9a\xf21\x97\xda\xdb\xee\x85\xa1<\x1c\x08\x80\x7f\xe5\xcf-}\xe0\
-\xb9\'\xe7\xdb\xc3\x9cc4\x0b\x12mc\x14N-A\xa2\xe1\xe7\'\x98\xda\xbf\x15\xa4\
-\xc2\\\xeb\xa3g]\x06\xbe>H\xe1\xf4-T=PO\xf1\x88\x8d\xb9*\x8f*m"{&\x83\x97\
-\x9d\xc4\t=\x8e\xfd\xbeKh\x99\xc5t{\x1fS{\xda\x08\xd6\xd5\xe1ON"B@\xf9V2{\
-\x86q\x1e\x1d\xa6\xa4\xfe\x08{\x8f\x8b\xde\xa0c\\\xa3aw\x94\xf1\xd2E\x12\xcb\
-Gf<\x08\rD\x81\xcc\xbf\n\xdc>\x81;P\x85VWG\xf2\x1fKx\x99\xf5\x14:s\x94\xc7\
-\x87p\x02\x8fP\xdco\x13^\x16`z_7S{\xda\x08]\x93\xc2/\xa4\x11\xd2\xbf\xa4fi\
-\x9f\x8d\xb1\xc4\'q\xfd\x18\xf9\xe3\xad\x08$~~\x94\xcc\xeb\xeb\xa8x\xba0\xab\
-|\xeeX\x96\x89\x1d\x9f\'~\xc3 \x85\xce\x86\x99\xcf\xbc\xf9!\xc6\xbf{\x17\xe5\
-\xae\xf2\x85>\x0e\xf5\x06\x88\xad}\x98\x81\xe7\xa79\xf9\x17;QE\x17\xab\xee.\
-\xac\xc5\x1b\xc9|}\x90\xe2\xcf\xffx\xfe&\xc0\x1c\xa2\xbf\xbaf\xe3|{\x98s*k\
-\xa7\xb9\x97\xbd\x9cOU\xe2\x14%\xd5\x03\x03p\xbfE~\x02\xb2C\x0e]_\xb3\xc9\
-\xe4R\\\xf7\xa7\xb5\x18\xcb\xcb\xbc\xb5\xa3\x91\x1bb}D\x9fh\xe5\xc8?\x9fa\
-\xe8\xd9\xbd\xb4\xdc\xb9\x08\xb9:H\xe9D\x9e\xd3of(6\xb7R\xb39Ng\x8fC"\x95%\
-\xfcX\x0b\x1d\xff\xe23\xfa\xadvZ\xee\xa8E\xdd\x15E\xb7@7\\\x92_\x8appW3\xb7\
-\xcb]\x9cO%Aj\xb42\xc0\x9b\x91\xfb\x18O&!\tRS|\xa1\xf7 \xfa\x03\xcd\x1c\xf9v\
-/\x85\xef\x1e\xa4~}5\xfeF\x93\xfe\x0f5s\r-$k,\x9a\xdd^\xb2\x93\xc6%5\xdf\x89\
-\xaeF`s\xafx\x8d\xee\xaaJ\x944h\x16i~\x9e\\\xc3\x9a\x9e\x9e\xd9\xe5\xebw9\
-\xbdt\x19\xf7\xa8C\xf4&c\x08)\xb9V\xf5\xb1\xfb\xba\xf5\x8c\xc7\xc3\x17\xfa86\
--\xd8\xd6\xe82q\xfbz\x86O\x0cBHg\xed\xc3\x9b\x99\xcaU\xf0\xaa\x13\xc7^se\xbf\
-{\xfc\n\xfd\xb4_\x98o\x0fsN\xbd?\x85m\xf70\xe6\x94\x18\x1f\xd5\xe9\xfbj\x1a4\
-\x1d\xdb1PB\x03!Y\xb2\xc2\xa5\xed\x0f\xf3\x1c>\xda\xc2\xdb\xdd!F\xf40O<8\xc2\
-\xe2\xad\x06G~\x9a\xe3\xd4\xf3\xe7PR\xc3\x17\x06\xe1\x84d\xc5=\x12\xb3j\x98\
-\xd7w\xac\xa0\xbe\xda\xe7\xe1m\xa3\xd4|N\xe3\xf4\xfe<\xa7^\xe8\xb9\xd0\xb6\
-\xb2Ar\xdf\xdf\x19\x8ciA\xec\xd2Y\xc6\xcaa\xac\xa8\xc4\xb1G8W\xce1\xec\x7fx\
-\xb0\xe6\x83\xdb\x9e\xe0\xd1m9\xc2\xab$\x1d\xfb\xc68\xf8n\x06%5\xa2\xd5\x06\
-\x8b\xae\x93\x0c\x96$\xc1H\x1e\xbbx\x8ew\x8f\xac\xe2\x0f6\x7f\xba\xe6\xa0\
-\xde\x80\xe3\xf8\x94\n]\x0c\xd9\x95\x04c\x0ee{\x8c3\xa5<SGg\x97\xef\x8d\x1d+\
-\x90r\n\xa7t\x86\t\xa7\x80UaP\xb6\xcfr\xae|-\xc3\xfe\xc7\x0e+G\xa1\xe1\xd445\
-\x9b\x1b8qr\x80P\xc2\xa4nc\x84\xf6\xf7&8\x9a\x0b\xce\xd3\xc8\xcf=z\x7f\xff\
-\xd5wP\x98\xcf\xe6)\xe5\xbbh\xbdIPn\x0fa;\x06\xbe\xd0\x89$$\xd5\x8d\x0eM\xcb\
-m\x1a\x97\x97\xd8\xd7\xde\xc2K\xaf6P,\xa5I\x0f(\xa4\x17\xe4\xfe\xad\x1dT6\
-\x1b\x9c=\x1c\xa4\x98\xd3\xb0\xa2\x82\x1b?\x9f%\\\t/\xfc\xf7=\x1c\xeb\xccb\
-\xe8\x1a\xca\xd6y\xf0\xf1N\xae\xb9E\xe3\xd8\xde\x08\x93c\x16\xb1Z\xc5\xaa\
-\xcfe\xe9\xeeIq\xb0c\x19_X\xdb\xc5\x92\xd5\x11*\xaa}\xd2\xfd\x16\xc7ONc;\xa5\
-\x0b>\xd3iEe\x04\xb6>u\x86\xf3\xc7\x02\x9cx7\x84f\n\xd6m\xcd\xd2xM\x9e\x03\
-\xbb\x92D\x93\x1e\xe7\xceV\xb0\xe3\xf5\x8dd\'.\xa1y8G\xac"K\xb1\xd0M\xd3\xca\
-\t\xeaZ\x8at\x9d\x8b\xf2\xfe\xf1<\x02f\x9d\xaf:\x95\xc1.t\xd0\xb8N\'V\xe3\
-\xd3\xdf7\xc6\xf1\x13\x13\xd8N\xf6\xa2~\xde\x7f\xd0\xe5\xc1-\x0ey\xa7DCk\x02\
-!\xc7xsw\x89\xfe~\xf9\x19\x8f\xf8\xe5Cl\xdc\xf8\xc6\xd5\xb1\x16~\x0c!`\xdb\
-\xe6Nn_\xd7M*YD\xc8\x99\x88\xd9\xacIf\xdabd"\xc2\xcf~\xb9\x8cs\xe7+)\xbb\xf2\
-\xa2\xe7\x96\xb7N\xb1i\xc5 M\xf5\xd3(O\xe1\xa3\xd1\xd9\x9d\xe0\xe0\x89\x1a\
-\xba\xfb"\x17\xdaJ\xa9Xy\xed\x04\x9b\xd7\x0e\x90\x8a\x17(\x97%J\xea\xbc\xffA\
-%\xbb\xdb\xeb\xc9\xe5\r\xee\xbe}\x90\x8dm\x13\x94}\x8d\xd7\xde\xae\xe7\xc8\
-\xa9\x8aOx\rX\x1e\xb7\xae\x1f\xe1\xa6\x95\x83H\xdfEj0\x9c\x89p\xf6|\x05\x9bV\
-\x0c\x02\x82\xd7\xde^\xca\x91S\x95\x97\xd4\xcc\xe6\x0c\x84\x80\xbbo\x1ffC\
-\xdb8\xae//\xd2\x9dm\xbe\x99\xff\xe8aS\xdb e_\xe3\xd5\xb7[8r\xea\xe2{\x11\
-\x86\x0e\xff\xf0\xe5\x1c\xe5\xbeA\xde\xf8f\x0f_\xfa\xb76\xbaG\xa3|\xf5\xd9\
-\x08W\xd3\x15<\xb1h\xd1\xb7\xae\xa28\x17#\x04\x84\x82\x1f\xc5s]\xb0\x9d+\xfb\
-\xb3\xe3\xef\n\x1b\xd6\x94\xf9\xf6\xb3\x93<\xf7\xb7\xfd\xb8\x9e\xe0\xaf\xff}\
-\x11O}9\xce;\xfb?\x9b\xab\x04\x9f\x15\xfa\xc0\xc0\xc0|{X\xe0\n\xe4\x86\xed\
-\xe3L\x0ef8~8\xcfc\xcf\x04\xe8<i\xf3\xc6\xceELg\xaf\x9e\xed\x15\xcc\x9c\x12,\
-\xb0\xc0\xff\x9bp\xd0&\x1a\xcd\xf3\xc0\x9f\xc3\xe6\xbbm^|9t\xd5\x15\x07\x80>\
-\xdf\x06\x16\xb82y\xfe\xbf\xea\t\x9a5T\xc6|\x9e}A\xf2\xca\x8f/\xcf\xed\xc8\
-\xf9F\xc0W\xae\xdaw\x90\x05\x16\xf8m\xb9\xfa\xd6\xc4\x05\x16\x98C\x16\nd\x81\
-\x05>\x85\xff\x05\xe9l\x96s2)\xef7\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory024Bitmap():
- return wxBitmapFromImage(getDocFactory024Image())
-
-def getDocFactory024Image():
- stream = cStringIO.StringIO(getDocFactory024Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory024')
-catalog['DocFactory024'] = ImageClass()
-catalog['DocFactory024'].getData = getDocFactory024Data
-catalog['DocFactory024'].getImage = getDocFactory024Image
-catalog['DocFactory024'].getBitmap = getDocFactory024Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory025Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rc\
-IDATx\x9c\xed\x9bYl]\xc7}\xc6\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`\xbbIj\x14-\\\'N\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xa2$\xcbZ)K").\
-\x97;y\xc9\xbb\x9es\xcf9\xd3\x07:\xb2U\'\x16\x1f(3f\xf8{\xbc\x98s\xbf\xef\
-\x9b\x99?f\xce\x19\x8c\xf8\xa7o(\xc5"\x8b,\xf2\x1b\xd1C\x95\xf3ma\x91E~w\xd1\
-\x83\x8b\x05\xb2\xc8"\xbf\x15=\x9c\x98o\x0bs\x8b@a`#\xf1.\xfb\xdd\xc5\xc0\
-\xc5\xfc\xec<\x08\x1b\xed\xffyP@Y\x05\xf0\xd0\xae\x8a\xae\xc4\xc7\x14%|$ee\
-\xa1\x10WE\xe7\xf7\t=\x14\x9fo\x0bs\x87\xc0\xa7\xae\xb0\x8f\xa8{\x11\xffcsSJ\
-\x90\xa6N\xde\x8d\x93\x0b\xb62\xad/\xc3%p\x95<x4\xd8oQ\xe1u_\xe6\x01@\xb7\
-\x14\xb6VE\x97\xb6\x832\xa19\xd5\xd5pX\xee\xfe\x94@y\x18\xcd\x10\x8c\xcaU\
-\xa4\xe5\xcds\xaa\xf1\xfb\x88\x1e^@\x05b1B\x83\xfe\x1c\xe7^\xaffj \x02\x08\
-\x90\x12\xa9+\xc2UE"\xb5EZVO\xe0X\xcb\xe8\r\xfe=\x0e5s\xee!\xc8\x10\r\xc5\
-\x979\xf3\xe38S\xe9\x00\x08\x01B\x02\x10\xab\xb7Y\xf5\xe0;\x14\x8dZ\xc6\xb9u\
-NuC\x0cQg\xff\x90\x93?L\x11[Z\xa2i\xc3Q\n\xc1\xeb)\xb3\x80\x06x\x1e\xd0#\x0b\
-\xa8\xffBJ\x90\xd0\xd6!\xfc"RS\x04\xe3\x02# P\x08J\xf9 #g$\xf9\x91FV\xdf#1\
-\x8d_\xd1\x17\xbe\xef\xb2m\x88\xf0=\x84[F\xf8\x1eJj(\xdd@\xc9\xdf\xbc\x1d\
-\x12\xae\x83t\xcb\x00\x97\xb5\r)\x9d\xb0\xb8\x16\xe5\x16\x90\x1a\x97<\x80 \
-\xb5\xdc$\x14j\xc3\x0c6\x10\x91\x9f\xfc\x1f_7Q\x9a\x8et\x8a $\xbea\xcd\x14\
-\xd8\x154\x05\x8a\xb8_$\x9c_\x89\xa4D6\x1d\xe3\xba\xa8EMh\x8c\x8c\xfch\x80g\
-\x95O\xa9\x8f\xf4\xcd\xc0\x8c\xa6W\xc6\xd7\xad\x19\xad\xb2=\xd3\xcc\x0c|\xf2\
-\x19\xc07\x83\x97y\xfe\xbc\xa3W\x98\xfd\xf3\xeda\xce\xb0\x94\x03\xc6&\x0c\
-\xfd\x1db)\x97\x1b\xff\xe4\x16\xb4P\x10\x94O9o\xd3\x7f\xb4\x9b\xe1Si.v\xa4\
-\xb8\xee\xae(\x8eq\x9e\x82\x08"\x94\x87\x99\xe9\xc2\xcct\xe1\x15J\x08\xd4\
-\xcc\xe2\x13\x08`\xa7V\xe2T4\xc2\x87\x85$\xfc2\xd6t7\xc6\xc4\x05\x94\xed\x00\
-jf\x810\x02\x14\xaboD\x0bW"\x03\xb7`Y{\xd1R.7>\xb1\x15#\x12\x04\xc0.+&\x8c\
-\x082 \x89\xf9\xdd\x98\x93\xe7\xb1\xa6\xbbP\xb6\x8bR\n\xcc ^\xb0\x12\xb3\x98\
-F)p\xe2\xcd\x94RmW\xd4\x0c\x0b\x9dJo\x9a\xdc\xe4*p\xdb\x11\x1a\x94\nkYf\x8d0\
-h@I\x1a\xb3\xcb\xa7|\x02\xe9\xc3\x18\xb94\xd2\x90\xb8\xe1:\xb4\xc2(\xbe]F\
-\x98\x16\x8e^\x8d\xcc\x8e!\xa4\xc0^\xba\x06/Z\r\x80\x91>\x8d1\xd9\x0fBQ\x8e7\
-R\xae_9\x0f\xa3\x7fu\xd0#\x9c\x99o\x0fs\x86!t\x84Y\x81.s\xe8A\x81\x11K\x91\
-\xb1\nx\x80\x15\n\xd3r\xc7F\xbc\xdcnrC]\x142\xd7\x90\xb0\x86\xd1\xcdi"\xd9s\
-\xe8\xe5\x0c\x83\xa7\'\x18;\x9e\xc5s}\xf4\xa0N\xfd\x96\x04u\xb1A\x8a\xc5%\
-\x14\x82K\x91\xca#\x92;\x8b\xcaN\xd1\xf7\xce\x10\xb9\x01\x1b\xa1\x81\x191\
-\xa8\xbc!Juh\x18;\xb4\x19a\xa4\xd0e\x1e=\x08F4E!P\xc2\xc5\xc3\r\xba8\x8c\x10\
-Q\x83Ds\x9dP\x9ab\xe8\xe8\x18\x99\xae<\x00\xf5[\x92\xc4\x1bC\x8c\x9c\x98B\
-\x0f\xebT\xad\xcb\x90\xf3\x1dB\xb9\xae\xdf\xaaY\x13\x1e\xc7\xac\xd8\xc6\xd0\
-\xa1\xb3\x0c\x1c8\x84\xf2=\x94\x14\x9c\xdd\xf53V>\xf2\x00\t\xad\x0f\x9c\xe3\
-\xb3\xca\xa7\xab\x12\xb1\xc0)\xba~\x9e&Tm\x91\xbc~\x88\xf1\xce,c\'\xa7Y\xf1`\
-\x92\x90\xf7#z\x7f\x19&\xde\xea\x90\xa8x\x1b;\xb2\x13\xe9e\t\xb8/\x93>\x16\
-\xc4\xac\xf0\x88\xb7\t\x1c\xf5g(a\xcc\xefd\x98#\xf40\x07\xe6\xdb\xc3\x9c\xa1\
-\x91Dp\':\x13\x08!\x10*\x84\xc9/\xf1\x98@i\x12\xcf\xbb\x8d%\xeb\xdb\xe8\xde\
-\xfd_\xd8\xa3\x83\xc4R1\x12\xe5aD\xa1\x8es?\xe8\xa00:B \x1eC\x9a&N~\x92\xa1\
-\xfdi\x8a\xe9\x16\x9a\xbe\xbc\x1a\xc3<\x8d\xee$\xd1\xec&:\x7f\xfc\x03\x8a\
-\xa3#\x98\xd1\x08F8\x0c\xc2!\xdf\xedR\xbfv\x1b\x9a\xdf\x8f\xa0\t\x9dq<\xbb\
-\x88=>\x85\x11\xb40\x85\x86\x16\x88Q\xd2\x0f\x81\x97#\xe0\xb6p\xf6\xd5W\xc8\
-\x0f\r\x11H\xc4\x91\x96\xc5\xd8\xe1\x8b\x8c\x1c\xb4\xf1\xdd2\xa1\xdaZ\x82[\
-\xeeD\xb73\xc8O\xd3\\w\'JA\xb0"BE\xb5$?\xdc\x8b\x90\x92p|\x19z \x86\xa1\xd2\
-\xf8\xb3\xcaw\n%=Lc=\xfeT\'#\x17F\x99|?D\xb02\xc9\xd2\x8d\xcdTT\xad\x04\'\
-\x8c\xe1\x9f \xff\x81\xc6\xd25M\x14\xbc\xc3\xc8\x92\x8f\xae\xb5Q\x1e9A\xbc\
-\xaa\x86xE\x1dy\x0e\xb1PN\x9f\xf5\x10\xfb\xe6\xdb\xc3\x9c!X\x86\xe0^t1\x86\
-\x90 D\x90\x00\xef\xa1\xe8\x01@j6\xc1\xca\x07\x08X\x83\xd8cG\xd0X\x8b!\xda\
-\xe8=\xf0"\xe5\xd1#,\xbdu\'57\xef\x00U\xc6-\x16\xe9\xdf\xf3\x9f\x14z\xf6RH\
-\xaf&\xd2\xba\x04\xfc*\xfa\xf7\x7f\x1fw\xfc}\x9a\xeex\x8cD\xdb&d\xc0G\xd3\
-\xe2xN\x11\xa5O`\xea\xed\x08w\x1b\xba\x18\xc5\xcd\x9e\xe7\xc2\xff>\x834%B\
-\x93\xd4o}\x9a\xe8\x8a\x15(/K\xe6l\'\xce\xc8Q\x96\xde\xf6\x1057\xef@\xe8>\
-\xbe\r\x03o\xbd\xc8\xd4\xb9\x83\x18\xba\x860k\xd1\xdd(\xfd\xfb_\xfeTMe\xed!v\
-\xed]\xc4Z\x9e\xe6\xfcK\xcf t\x8f\xd6\xfb\x9fBX\x13H\xad\x86\xde\x03?\xb9r\
-\xbe\x96Z\x94\xb5\x1banC\x97\x93\x98r\x90\xa6\xed\x7fE\xacu\r\xbe\xe8A\x05\
-\xde\x83\xdc\nj7\x98\xf4\xbe\xf1=JS_&\x18,\xa2\xbc$\x93\xdd\x9d\xe8\x0c\x92Z\
-\xf5\x08\x84\xfa\x08\x8a7a\x81\x94\x88\x1e\x18Y8/T\xe8\x1a^ \x82fK\xa4\x14\
-\xe0G\xb0&4pg2*+\x8e\xeb\x871K\x02\xd3\x0b#T\x0c\xca>vO/\xa1`=5\x9b\x1eE+\
-\xefFz\x1dH\xf3!j\xd6?L\x7f\xd7iJ\xdd\xdd\xc4\x96?\x8e\xe7\t\xec\xae\x0b\x84\
-\x025T\xad{\x08\xe9\xfe\x08Y8\x002\x81&tp&\xa1\x94\xc43A+\x81^\x04+\x94@\xb7\
-\xa2HC\xc3\n\xa6\xd0\\\x17%\x9b\xc9\xb4\xff\x07\xa1@-5\x1bw\xa2;?E\x94\x8e\
-\xe3[OR\xb5\xfa>\x8a\xa7;\xd0\x1d\x1d\xa1\x12\xe0\x05\xae\xac\x99\x9b\x06=\
-\x83g}\rSE\x90J\xa0\xe9\x15h\xf6+x\xc6\x93\xb3\xcaW\xd1\xb4\x13\xad\xb0\x1f\
-\xcf\x8a\xa1\xd9\x1a\xa1\xf0Rb\xcd\xdb\xd0\x9do\x81s\x1c\xb2\x1eJ/Q\xb1b;\
-\x01\xebM&\xda\x0f\xd3\xb0\xf3/\xf1\xfc<\xd9c/\x91hX\x8b\x99\\\x8e\xcc\xef\
-\x81,\xb0@\xce`t\xf6.\x9fo\x0fsG\xac\x1a6\x0f#\x86\x82 \x01{\x18\x0eU\xc3\
-\x94\x02\xc3Bm\xdaD\xa9\xf7=\xd4\x99\x10Vk3rj\x1cO\xa4\xf0\xce\t\xf4X=\x14\
-\x02\xc8\xc3\x03P\x08\xa2\xd5\xa7\xb1\xeanC\x1b\xaa\x87\xd1\x18\xaa\x90@\x15\
-\x8b\xb8\x1f\x80\x91\xa8\xc5\x9f6\xd0\x8f\x8eC\xe1\xe3\x9f\x8a+!V\x05\x1b\
-\xd2\x88\xa1\x00\x96\xd3J\xf3\xce\xbfA\x8bF\xc0\xf7\xf1\xc7\x06\x90\xc7\xcf\
-\xe34.\xc19U\xc2H\xd6#\xca\t\xc4\xa1)\xc8\x05\x91M\xfd\x18\xb57\xa1\r\xd6"\
-\xbc$x\tTN]Y\xf3\xd7\xba\x1b\x07\x90C\x01\x84\x14PJCg\x12\x7f\xb9\x9cU>\xf2\
-\t8\xde\x00\x9b\xe20\x14\x9b\xd9\xa2\xfa)h\x8f@\xa6\x11\x00\x11(#o\x8e\x12\
-\x89\xdfLv\xff{\xd87\x15\xb0\xd3i\xca\'\\jo\xbb\x17\x86\xf2p(\x00\xfe\xc2\
-\x99S\xfa\xc0sO\xce\xb7\x879\xc3h\x16$\xda\xc6(\x9cY\x86D\xc3\xcfO0up;H\x85\
-\xb9\xdeG\xcf\xba\x0c|s\x90\xc2\xd9[\xa8z\xa0\x9e\xe21\x1bsM\x1eU\xdaB\xf6\\\
-\x06/;\x89\x13z\x1c\xfb}\x97\xd0\n\x8b\xe9\xf6>\xa6\xf6\xb5\x11\xac\xab\xc3\
-\x9f\x9cD\x84\x80\xf2\xadd\xf6\r\xe3<:LI\xfd\x11\xf6>\x17\xbdA\xc7\xb8F\xc3>\
-Z\xc6K\x17I\xac\x1c\x99\xf1 4\x10\x052\xff*p\xfb\x04\xee@\x15Z]\x1d\xc9\x7f,\
-\xe1e6R\xe8\xccQ\x1e\x1f\xc2\t<B\xf1\xa0MxE\x80\xe9\x03\xddL\xedk#tM\n\xbf\
-\x90FH\xff\x8a\x9a\xa5\x036\xc62\x9f\xc4\xf5c\xe4O\xb6"\x90\xf8\xf9Q2\xafo\
-\xa0\xe2\xe9\xc2\xac\xf2\xb9cY&v}\x91\xf8\r\x83\x14:\x1bf>\xf3\xe6\x87\x18\
-\xff\xee]\x94\xbb\xca\x97\xfa8\xd4\x1b \xb6\xfea\x06\x9e\x9f\xe6\xf4_\xecF\
-\x15]\xac\xba\xbb\xb0\x96n&\xf3\xcdA\x8a\xbf\xf8\xe3\xf9\x9b\x00W\x01\xfd\
-\xd5u\x9b\xe7\xdb\xc3\x9cQY;\xcd\xbd\xec\xe7b\xaa\x12\xa7(\xa9\x1e\x18\x80\
-\xfb-\xf2\x13\x90\x1dr\xe8\xfa\x86M&\x97\xe2\xba?\xad\xc5XY\xe6\xad]\x8d\xdc\
-\x10\xeb#\xfaD+\xc7\xfe\xf9\x1cC\xcf\xee\xa7\xe5\xce%\xc8\xb5AJ\xa7\xf2\x9c}\
-3C\xb1\xb9\x95\x9a\xadq:{\x1c\x12\xa9,\xe1\xc7Z8\xfa/>\xa3\xdfn\xa7\xe5\x8eZ\
-\xd4]Qt\x0bt\xc3%\xf9\x95\x08\x1d{\x9a\xb9]\xee\xe1b*\tR\xa3\x95\x01\xde\x8c\
-\xdc\xc7x2\tI\x90\x9a\xe2K\xbd\x1d\xe8\x0f4s\xec;\xbd\x14\xbe\xdbA\xfd\xc6j\
-\xfc\xcd&\xfd\x1fj\xe6\x1aZH\xd6X4\xbb\xbdd\'\x8d+j\xbe\x13]\x8b\xc0\xe6^\
-\xf1\x1a\xddU\x95(i\xd0,\xd2\xfc"\xb9\x8eu==\xb3\xcb\xd7\xefrv\xf9\n\xeeQ\
-\x87\xe9M\xc6\x10Rr\xad\xeac\xefu\x1b\x19\x8f\x87/\xf5qlZ\xb0\xa3\xd1e\xe2\
-\xf6\x8d\x0c\x9f\x1a\x84\x90\xce\xfa\x87\xb72\x95\xab\xe0U\'\x8e\xbdna\xbc{\
-\xfc\x1a\xfd\xac_\x98o\x0fsF\xbd?\x85m\xf70\xe6\x94\x18\x1f\xd5\xe9\xfbz\x1a\
-4\x1d\xdb1PB\x03!Y\xb6\xca\xa5\xed\x0f\xf3\x1c9\xde\xc2\xdb\xdd!F\xf40O<8\
-\xc2\xd2\xed\x06\xc7~\x96\xe3\xcc\xf3\x17PR\xc3\x17\x06\xe1\x84d\xd5=\x12\
-\xb3j\x98\xd7w\xad\xa2\xbe\xda\xe7\xe1\x1d\xa3\xd4|A\xe3\xec\xc1<g^\xe8\xb9\
-\xd4\xb6\xb2Ar\xdf\xdf\x19\x8ciA\xec\xd2y\xc6\xcaa\xac\xa8\xc4\xb1G\xb8P\xce\
-1\xec\x7fx\xb0\xe6\x83\xdb\x9e\xe0\xd1\x1d9\xc2k$G\x0f\x8c\xd1\xf1n\x06%5\
-\xa2\xd5\x06K\xae\x93\x0c\x96$\xc1H\x1e\xbbx\x81w\x8f\xad\xe1\x0f\xb6~\xba\
-\xe6\xa0\xde\x80\xe3\xf8\x94\n]\x0c\xd9\x95\x04c\x0ee{\x8cs\xa5<S\xc7g\x97\
-\xef\x8d]\xab\x90r\n\xa7t\x8e\t\xa7\x80UaP\xb6\xcfs\xa1|-\xc3\xfe\xc7\x0e+G\
-\xa1\xe1\xcc45[\x1b8uz\x80P\xc2\xa4ns\x84\xf6\xf7&8\x9e\x0b\xce\xd3\xc8_=\
-\xf4\xfe\xfe\x85sP\x98\xcf\xe6)\xe5\xbbh\xbdIPn\x0fa;\x06\xbe\xd0\x89$$\xd5\
-\x8d\x0eM+m\x1aW\x968\xd0\xde\xc2K\xaf6P,\xa5I\x0f(\xa4\x17\xe4\xfe\xedG\xa9\
-l68\x7f$H1\xa7aE\x057~1K\xb8\x12^\xf8\x9f{8\xd1\x99\xc5\xd05\x94\xad\xf3\xe0\
-\xe3\x9d\\s\x8b\xc6\x89\xfd\x11&\xc7,b\xb5\x8a5_\xc8\xd2\xdd\x93\xa2\xe3\xe8\
-\n\xbe\xb4\xbe\x8bek#TT\xfb\xa4\xfb-N\x9e\x9e\xc6vJ\x97|\xa6\xd3\x8a\xca\x08\
-l\x7f\xea\x1c\x17O\x048\xf5n\x08\xcd\x14l\xd8\x9e\xa5\xf1\x9a<\x87\xf6$\x89&\
-=.\x9c\xaf`\xd7\xeb\x9b\xc9N\\A\xf3H\x8eXE\x96b\xa1\x9b\xa6\xd5\x13\xd4\xb5\
-\x14\xe9\xba\x10\xe5\xfd\x93y\x04\xcc:_u*\x83]8J\xe3\x06\x9dX\x8dO\x7f\xdf\
-\x18\'OM`;\xd9\xcb\xfa\xf9`\x87\xcb\x83\xdb\x1c\xf2N\x89\x86\xd6\x04B\x8e\
-\xf1\xe6\xde\x12\xfd\xfd\xf23\x1e\xf1\xab\x8f\xd8\xbc\xf9\x8d\x05\xb3&\n\x01\
-;\xb6vr\xfb\x86nR\xc9"B\xceD\xcbfM2\xd3\x16#\x13\x11~\xfe\xab\x15\\\xb8XI\
-\xd9\x95\x97=\xb7\xb2u\x8a-\xab\x06i\xaa\x9fFy\n\x1f\x8d\xce\xee\x04\x1d\xa7\
-j\xe8\xee\x8b\\j+\xa5b\xf5\xb5\x13l]?@*^\xa0\\\x96(\xa9\xf3\xfe\x07\x95\xecm\
-\xaf\'\x977\xb8\xfb\xf6A6\xb7MP\xf65^{\xbb\x9ecg*>\xe15`y\xdc\xbaq\x84\x9bV\
-\x0f"}\x17\xa9\xc1p&\xc2\xf9\x8b\x15lY5\x08\x08^{{9\xc7\xceT^Q3\x9b3\x10\x02\
-\xee\xbe}\x98Mm\xe3\xb8\xbe\xbcLw\xb6\xf9f\xfe\xa3\x87-m\x83\x94}\x8dW\xdfn\
-\xe1\xd8\x99\xcb\xefC\x18:\xfc\xc3Ws\x94\xfb\x06y\xe3[=|\xe5\xdf\xda\xe8\x1e\
-\x8d\xf2\xf5g#,\xc4\xabwb\xc9\x92o/\xb8XB@(\xf8Q,\xd7\x05\xdbY\x18\x9f\x1d\
-\xe7\x9bM\xeb\xca|\xe7\xd9I\x9e\xfb\xdb~\\O\xf0\xd7\xff\xbe\x84\xa7\xbe\x1a\
-\xe7\x9d\x83\x9f\xcdU\x82\xcf\x1a}```\xbe=,\xf29\xe2\x86\x9d\xe3L\x0ef8y$\
-\xcfc\xcf\x04\xe8<m\xf3\xc6\xee%Lg\x17\xde\xf6\nfN\x0b\x16Yd\xd6\x84\x836\
-\xd1h\x9e\x07\xfe\x1c\xb6\xdem\xf3\xe2\xcb\xa1\x05[\x1c\x00\xfa|\x1bX\xe4\
-\xf3\xc5\xf3\xff]O\xd0\xac\xa12\xe6\xf3\xec\x0b\x92W~runG\xfe\xae \xe0k\x0b\
-\xee\x1dd\x91E\xe6\x8a\x85\xbb6.\xb2\xc8\x1c\xb0X \x8b,\xf2)\xfc\x1f\xce\x00\
-\x96s5\xe9\x04\xb0\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory025Bitmap():
- return wxBitmapFromImage(getDocFactory025Image())
-
-def getDocFactory025Image():
- stream = cStringIO.StringIO(getDocFactory025Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory025')
-catalog['DocFactory025'] = ImageClass()
-catalog['DocFactory025'].getData = getDocFactory025Data
-catalog['DocFactory025'].getImage = getDocFactory025Image
-catalog['DocFactory025'].getBitmap = getDocFactory025Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory026Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\re\
-IDATx\x9c\xed\x9bYl]\xc7}\xc6\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`g\xabQ\xb4p\x9d\xbaQ\x12;\x8e\x11\xc9Nd\xc9V\x14j\xa1e\xad\x94%.\
-\xe2r\xb9\x93\x97\xbc\xeb9\xf7\x9c3}\xa0#[qb\t\x90d\xda\x0c\x7f\x8f\x17s\xee\
-\xf7}3\xf3\xc7\xcc9\x83\x11\xff\xf4\r\xa5X`\x81\x05~+z\xa8r\xae-,\xb0\xc0g\
-\x17=\xb8P \x0b,\xf0;\xd1\xc3\x89\xb9\xb6pe\x10(\x0cl$\xde\x05\xbf\xbb\x18\
-\xb8\x98\x9f\x9e\x07a\xa3\xfd\x86\x07\x05\x94U\x00\x0f\xed\xaa\xe8J|LQ\xc2GR\
-V\x16\nqUt~\x1f\xd1C\xf1\xb9\xb6p\xf9\x08|\xea\n{\x88\xba\xe7\xf0?27\xa5\x04\
-i\xea\xe4\xdd8\xb9`+3\xfa\x12\\\x02W\xc9\x83G\x83\xfd&\x15^\xcf\x05\x1e\x00t\
-KakUtk\xdb(\x13\xba\xa2\xba\x1a\x0eK\xdd\x9f\x12(\x8f\xa0\x19\x821\xb9\x82\
-\xb4\xbc\xf9\x8aj\xfc>\xa3\x87\xe7A\x81X\x8c\xd2\xa0?\xc7\x99\xd7\xaa\x99\
-\x1e\x8c\x00\x02\xa4D\xea\x8apU\x91Hm\x91\x96\x95\x938\xd6\x12\xfa\x82\x7f\
-\x8fC\xcd\x15\xf7\x10d\x98\x86\xe2K\x9c\xfaq\x9c\xe9t\x00\x84\x00!\x01\x88\
-\xd5\xdb\xacx\xf0m\x8aF-\x13\xdczEuC\x0cSg\xff\x90\xe3?L\x11[\\\xa2i]\x07\
-\x85\xe0\xf5\x94\x99\x07\x03\xfb\x19@\x8f\xcc\x83~\x0c)AB[\x83\xf0\x8bHM\x11\
-\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9e\x92\xe4G\x1bYy\x8f\xc44~E\x7f\xf8\xbe\
-\x0b\xb6!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%\x7f\xfbvH\xb8\x0e\xd2-\x03\\\
-\xd06\xa4t\xc2\xe2Z\x94[@j\x9c\xf7\x00\x82\xd4R\x93P\xa8\r3\xd8@D~\xfc\x7f|\
-\xddDi:\xd2)\x82\x90\xf8\x865[`\x17\xd1\x14(\xe2~\x91p~9\x92\x12\xd9t\x8c\
-\xeb\xa2\x165\xa1q2\xf2\xc3\x81\xbd\xa4|J}\xa8o\x06f5\xbd2\xben\xcdj\x95\xed\
-\xd9ff\xe0\xe3\xcf\x00\xbe\x19\xbc\xc0\xf3|A\xaf0\x07\xe6\xda\xc3ec)\x07\x8c\
-\r\x18\xfa\xdb\xc4R.7\xfe\xc9-h\xa1 (\x9fr\xdef\xa0\xa3\x87\x91\x13i\xce\x1d\
-Lq\xdd]Q\x1c\xe3,\x05\x11D(\x0f3\xd3\x8d\x99\xe9\xc6+\x94\x10\xa8\xd9\xc5\'\
-\x10\xc0N-\xc7\xa9h\x84\x0f\nI\xf8e\xac\x99\x1e\x8c\xc9.\x94\xed\x00jv\x810\
-\x02\x14\xaboD\x0bW"\x03\xb7`Y\xbb\xd1R.7>\xb1\x19#\x12\x04\xc0.+&\x8d\x082 \
-\x89\xf9=\x98Sg\xb1f\xbaQ\xb6\x8bR\n\xcc ^\xb0\x12\xb3\x98F)p\xe2\xcd\x94Rm\
-\x17\xd5\x0c\x0b\x9dJo\x86\xdc\xd4\np\xdb\x11\x1a\x94\n\xabYb\x8d2d@I\x1a\
-\x97\x96O\xf9\x04\xd2\x870ri\xa4!q\xc3uh\x851|\xbb\x8c0-\x1c\xbd\x1a\x99\x1d\
-GH\x81\xbdx\x15^\xb4\x1a\x00#}\x12cj\x00\x84\xa2\x1co\xa4\\\xbf|\x0eF\xff\
-\xea\xa2G85\xd7\x1e.\x1bC\xe8\x08\xb3\x02]\xe6\xd0\x83\x02#\x96"c\x15\xf0\
-\x00+\x14\xa6\xe5\x8e\xf5x\xb9\x9d\xe4\x86\xbb)d\xae!a\x8d\xa0\x9b3D\xb2g\
-\xd0\xcb\x19\x86NN2~4\x8b\xe7\xfa\xe8A\x9d\xfaM\t\xeabC\x14\x8b\x8b(\x04\x17\
-#\x95G$w\x1a\x95\x9d\xa6\xff\xedar\x836B\x033bPyC\x94\xea\xd0\x08vh#\xc2H\
-\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18%\xa2\x86\x88\xe6:\xa14\
-\xcdp\xc78\x99\xee<\x00\xf5\x9b\x92\xc4\x1bC\x8c\x1e\x9bF\x0f\xebT\xad\xc9\
-\x90\xf3\x1dB\xb9\xee\xdf\xa9Y\x13\x9e\xc0\xac\xd8\xc2\xf0\x81\xd3\x0c\xee;\
-\x80\xf2=\x94\x14\x9c\xde\xf13\x96?\xf2\x00\t\xad\x1f\x9c\xa3\x97\x94OW%b\
-\x81\x13t\xff<M\xa8\xda"y\xfd0\x13\x9dY\xc6\x8f\xcf\xb0\xec\xc1$!\xefG\xf4\
-\xfd2L\xbc\xd5!Q\xf1\x16vd;\xd2\xcb\x12p_"}$\x88Y\xe1\x11o\x138\xea\xcfP\xc2\
-\x98\xdb\xc9p\x85\xd1\xc3\xec\x9bk\x0f\x97\x8dF\x12\xc1\x9d\xe8L"\x84@\xa8\
-\x10&\xbf\xc4c\x12\xa5I<\xef6\x16\xadm\xa3g\xe7\x7fb\x8f\r\x11K\xc5H\x94G\
-\x10\x85:\xce\xfc\xe0 \x85\xb1Q\x02\xf1\x18\xd24q\xf2S\x0c\xefMSL\xb7\xd0\
-\xf4\xe5\x95\x18\xe6It\'\x89f7\xd1\xf9\xe3\x1fP\x1c\x1b\xc5\x8cF0\xc2a\x10\
-\x0e\xf9\x1e\x97\xfa\xd5[\xd0\xfc\x01\x04M\xe8L\xe0\xd9E\xec\x89i\x8c\xa0\
-\x85)4\xb4@\x8c\x92~\x00\xbc\x1c\x01\xb7\x85\xd3\xaf\xbcL~x\x98@"\x8e\xb4,\
-\xc6\x0f\x9dct\xbf\x8d\xef\x96\t\xd5\xd6\x12\xdct\'\xba\x9dA~\x92\xe6\x9a;Q\
-\n\x82\x15\x11*\xaa%\xf9\x91>\x84\x94\x84\xe3K\xd0\x031\x0c\x95\xc6\xbf\xa4|\
-\'P\xd2\xc34\xd6\xe2Ow2\xda5\xc6\xd4{!\x82\x95I\x16\xafo\xa6\xa2j98a\x0c\xff\
-\x18\xf9\xf75\x16\xafj\xa2\xe0\x1dB\x96|t\xad\x8d\xf2\xe81\xe2U5\xc4+\xea\
-\xc8s\x80\xf9v\xea\xac\x87\xd83\xd7\x1e.\x1b\xc1\x12\x04\xf7\xa2\x8bq\x84\
-\x04!\x82\x04x\x17E/\x00R\xb3\tV>@\xc0\x1a\xc2\x1e?\x8c\xc6j\x0c\xd1F\xdf\
-\xbe\x17(\x8f\x1df\xf1\xad\xdb\xa9\xb9y\x1b\xa82n\xb1\xc8\xc0\xae\xff\xa0\
-\xd0\xbb\x9bBz%\x91\xd6E\xe0W1\xb0\xf7\xffp\'\xde\xa3\xe9\x8e\xc7H\xb4m@\x06\
-|4-\x8e\xe7\x14Q\xfa$\xa6\xde\x8ep\xb7\xa0\x8b1\xdc\xecY\xba\xfe\xe7\x19\xa4\
-)\x11\x9a\xa4~\xf3\xd3D\x97-CyY2\xa7;qF;X|\xdbC\xd4\xdc\xbc\r\xa1\xfb\xf86\
-\x0c\xbe\xf9\x02\xd3g\xf6c\xe8\x1a\xc2\xacEw\xa3\x0c\xec}\xe9\x135\x95\xb5\
-\x8b\xd8\xb5w\x11ky\x9a\xb3/>\x83\xd0=Z\xef\x7f\naM"\xb5\x1a\xfa\xf6\xfd\xe4\
-\xe2\xf9ZjQ\xd6N\x84\xb9\x05]Na\xca!\x9a\xb6\xfe\x15\xb1\xd6U\xf8\xa2\x17\
-\x15x\x17r\xcb\xa8]g\xd2\xf7\xfa\xffR\x9a\xfe2\xc1`\x11\xe5%\x99\xea\xe9Dg\
-\x88\xd4\x8aG \xd4OP\xbc\x01\xf3\xacD\xf4\xc0\xe8<x\xb1\xd25\xbc@\x04\xcd\
-\x96H)\xc0\x8f`Mj\xe0\xcefSV\x1c\xd7\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\
-\xde>B\xc1zj6<\x8aV\xde\x89\xf4\x0e"\xcd\x87\xa8Y\xfb0\x03\xdd\')\xf5\xf4\
-\x10[\xfa8\x9e\'\xb0\xbb\xbb\x08\x05j\xa8Z\xf3\x10\xd2\xfd\x11\xb2\xb0\x0fd\
-\x02M\xe8\xe0LA)\x89g\x82V\x02\xbd\x08V(\x81nE\x91\x86\x86\x15L\xa1\xb9.J6\
-\x93i\xff6\xa1@-5\xeb\xb7\xa3;?E\x94\x8e\xe2[OR\xb5\xf2>\x8a\'\x0f\xa2;:B%\
-\xc0\x0b\\\\37\x03z\x06\xcf\xfa\x1a\xa6\x8a \x95@\xd3+\xd0\xec\x97\xf1\x8c\'\
-/)_E\xd3v\xb4\xc2^<+\x86fk\x84\xc2\x8b\x895oAw\xbe\x03\xceQ\xc8z(\xbdD\xc5\
-\xb2\xad\x04\xac7\x98l?D\xc3\xf6\xbf\xc4\xf3\xf3d\x8f\xbcH\xa2a5fr)2\xbf\x0b\
-\xb2\xc0<;\x83\xd1\xd9\xbdt\xae=\\>\xb1j\xd88\x82\x18\x0e\x82\x04\xec\x118P\
-\r\xd3\n\x0c\x0b\xb5a\x03\xa5\xbewQ\xa7BX\xad\xcd\xc8\xe9\t<\x91\xc2;#\xd0c\
-\xf5P\x08 \x0f\rB!\x88V\x9f\xc6\xaa\xbb\rm\xb8\x1e\xc6b\xa8B\x02U,\xe2\xbe\
-\x0fF\xa2\x16\x7f\xc6@\xef\x98\x80\xc2G?\x15WB\xac\n\xd6\xa5\x11\xc3\x01,\
-\xa7\x95\xe6\xed\x7f\x83\x16\x8d\x80\xef\xe3\x8f\x0f"\x8f\x9e\xc5i\\\x84s\
-\xa2\x84\x91\xacG\x94\x13\x88\x03\xd3\x90\x0b"\x9b\x060joB\x1b\xaaExI\xf0\
-\x12\xa8\x9c\xba\xb8\xe6\xafu\xd7\x0f"\x87\x03\x08)\xa0\x94\x86\xce$\xfeRyI\
-\xf9\xc8\'\xe0h\x03l\x88\xc3plv\x8b\xea\xa7\xa0=\x02\x99F\x00D\xa0\x8c\xbc9J\
-$~3\xd9\xbd\xefb\xdfT\xc0N\xa7)\x1fs\xa9\xbd\xed^\x18\xce\xc3\x81\x00\xf8\
-\xf3`.\xfd\x06\xfa\xe0sO\xce\xb5\x87\xcb\xc6h\x16$\xda\xc6)\x9cZ\x82D\xc3\
-\xcfO2\xbd\x7f+H\x85\xb9\xd6G\xcf\xba\x0c~s\x88\xc2\xe9[\xa8z\xa0\x9e\xe2\
-\x11\x1bsU\x1eU\xdaD\xf6L\x06/;\x85\x13z\x1c\xfb=\x97\xd02\x8b\x99\xf6~\xa6\
-\xf7\xb4\x11\xac\xab\xc3\x9f\x9aB\x84\x80\xf2\xadd\xf6\x8c\xe0<:BI\xfd\x11\
-\xf6\x1e\x17\xbdA\xc7\xb8F\xc3\xee(\xe3\xa5\x8b$\x96\x8f\xcez\x10\x1a\x88\
-\x02\x99\x7f\x15\xb8\xfd\x02w\xb0\n\xad\xae\x8e\xe4?\x96\xf02\xeb)t\xe6(O\
-\x0c\xe3\x04\x1e\xa1\xb8\xdf&\xbc,\xc0\xcc\xbe\x1e\xa6\xf7\xb4\x11\xba&\x85_\
-H#\xa4\x7fQ\xcd\xd2>\x1bc\x89O\xe2\xfaq\xf2\xc7[\x11H\xfc\xfc\x18\x99\xd7\
-\xd6Q\xf1t\xe1\x92\xf2\xb9\xe3Y&w|\x91\xf8\rC\x14:\x1bf?\xf3\xe6\x87\x99\xf8\
-\xfe]\x94\xbb\xcb\xe7\xfb8\xd4\x17 \xb6\xf6a\x06\x9f\x9f\xe1\xe4_\xecD\x15]\
-\xac\xba\xbb\xb0\x16o$\xf3\xcd!\x8a\xbf\xf8\xe3\xb9\x9b\x00W\x11\xfd\x955\
-\x1b\xe7\xda\xc3eSY;\xc3\xbd\xec\xe5\\\xaa\x12\xa7(\xa9\x1e\x1c\x84\xfb-\xf2\
-\x93\x90\x1dv\xe8\xfe\x86M&\x97\xe2\xba?\xad\xc5X^\xe6\xcd\x1d\x8d\xdc\x10\
-\xeb\'\xfaD+G\xfe\xf9\x0c\xc3\xcf\xee\xa5\xe5\xceE\xc8\xd5AJ\'\xf2\x9c~#C\
-\xb1\xb9\x95\x9a\xcdq:{\x1d\x12\xa9,\xe1\xc7Z\xe8\xf8\x17\x9f\xb1\xef\xb6\
-\xd3rG-\xea\xae(\xba\x05\xba\xe1\x92\xfcJ\x84\x83\xbb\x9a\xb9]\xee\xe2\\*\tR\
-\xa3\x95A\xde\x88\xdc\xc7D2\tI\x90\x9a\xe2K}\x07\xd1\x1fh\xe6\xc8\xf7\xfa(|\
-\xff \xf5\xeb\xab\xf17\x9a\x0c|\xa0\x99kh!Yc\xd1\xec\xf6\x91\x9d2.\xaa\xf9vt\
-5\x02\x9b{\xc5\xab\xf4TU\xa2\xa4A\xb3H\xf3\x8b\xe4\x1a\xd6\xf4\xf6^Z\xbe\x01\
-\x97\xd3K\x97q\x8f:D_2\x86\x90\x92kU?\xbb\xaf[\xcfD<|\xbe\x8fc3\x82m\x8d.\
-\x93\xb7\xafg\xe4\xc4\x10\x84t\xd6>\xbc\x99\xe9\\\x05\xaf8q\xec5\xf3\xeb\xdd\
-\xe3\xd7\xe8\xa7\xfd\xc2\\{\xb8l\xea\xfdil\xbb\x97q\xa7\xc4\xc4\x98N\xff\xd7\
-\xd3\xa0\xe9\xd8\x8e\x81\x12\x1a\x08\xc9\x92\x15.m\x7f\x98\xe7\xf0\xd1\x16\
-\xde\xea\t1\xaa\x87y\xe2\xc1Q\x16o58\xf2\xb3\x1c\xa7\x9e\xefBI\r_\x18\x84\
-\x13\x92\x15\xf7H\xcc\xaa\x11^\xdb\xb1\x82\xfaj\x9f\x87\xb7\x8dQ\xf3\x05\x8d\
-\xd3\xfb\xf3\x9c\xfaV\xef\xf9\xb6\x95\r\x92\xfb\xfe\xce`\\\x0bb\x97\xce2^\
-\x0ecE%\x8e=JW9\xc7\x88\xff\xc1\xc1\x9a\x0fn{\x82G\xb7\xe5\x08\xaf\x92t\xec\
-\x1b\xe7\xe0;\x19\x94\xd4\x88V\x1b,\xbaN2T\x92\x04#y\xecb\x17\xef\x1cY\xc5\
-\x1fl\xfed\xcd!\xbd\x01\xc7\xf1)\x15\xba\x19\xb6+\t\xc6\x1c\xca\xf68gJy\xa6\
-\x8f^Z\xbe\xd7w\xac@\xcai\x9c\xd2\x19&\x9d\x02V\x85A\xd9>KW\xf9ZF\xfc\x8f\
-\x1cV\x8eA\xc3\xa9\x19j67p\xe2\xe4 \xa1\x84I\xdd\xc6\x08\xed\xefNr4\x17\x9c\
-\xa3\x91\xbf\xfa\xe8\x03\x03\x9f\xff\x83\xc2|6O)\xdfM\xebM\x82r{\x08\xdb1\
-\xf0\x85N$!\xa9nthZn\xd3\xb8\xbc\xc4\xbe\xf6\x16^|\xa5\x81b)MzP!\xbd \xf7o\
-\xed\xa0\xb2\xd9\xe0\xec\xe1 \xc5\x9c\x86\x15\x15\xdc\xf8\xc5,\xe1J\xf8\xd6\
-\x7f\xdf\xc3\xb1\xce,\x86\xae\xa1l\x9d\x07\x1f\xef\xe4\x9a[4\x8e\xed\x8d05n\
-\x11\xabU\xac\xfaB\x96\x9e\xde\x14\x07;\x96\xf1\xa5\xb5\xdd,Y\x1d\xa1\xa2\
-\xda\'=`q\xfc\xe4\x0c\xb6S:\xef3\x9dVTF`\xebSg8w,\xc0\x89wBh\xa6`\xdd\xd6,\
-\x8d\xd7\xe49\xb0+I4\xe9\xd1u\xb6\x82\x1d\xafm$;y\x11\xcd\xc39b\x15Y\x8a\x85\
-\x1e\x9aVNR\xd7R\xa4\xbb+\xca{\xc7\xf3\x08\xb8\xe4|\xd5\xa9\x0cv\xa1\x83\xc6\
-u:\xb1\x1a\x9f\x81\xfeq\x8e\x9f\x98\xc4v\xb2\x17\xf4\xf3\xfe\x83.\x0fnq\xc8;\
-%\x1aZ\x13\x089\xce\x1b\xbbK\x0c\x0c\xc8Oy\xc4?=\xc4\xc6\x8d\xaf\x7f\xee\xd7\
-F!`\xdb\xe6Nn_\xd7C*YD\xc8\xd9H\xd9\xacIf\xc6bt2\xc2\xcf\x7f\xb5\x8c\xaes\
-\x95\x94]y\xc1s\xcb[\xa7\xd9\xb4b\x88\xa6\xfa\x19\x94\xa7\xf0\xd1\xe8\xecIp\
-\xf0D\r=\xfd\x91\xf3m\xa5T\xac\xbcv\x92\xcdk\x07I\xc5\x0b\x94\xcb\x12%u\xde{\
-\xbf\x92\xdd\xed\xf5\xe4\xf2\x06w\xdf>\xc4\xc6\xb6I\xca\xbe\xc6\xabo\xd5s\
-\xe4T\xc5\xc7\xbc\x06,\x8f[\xd7\x8fr\xd3\xca!\xa4\xef"5\x18\xc9D8{\xae\x82M+\
-\x86\x00\xc1\xabo-\xe5\xc8\xa9\xca\x8bjfs\x06B\xc0\xdd\xb7\x8f\xb0\xa1m\x02\
-\xd7\x97\x17\xe8^j\xbe\xd9\xff\xe8eS\xdb\x10e_\xe3\x95\xb7Z8r\xea\xc2{\x10\
-\x86\x0e\xff\xf0\xd5\x1c\xe5\xfe!^\xffN/_\xf9\xb76z\xc6\xa2|\xfd\xd9\x08\xf3\
-\xf9\xca\x9dX\xb4\xe8\xbb\xf3&\x9e\x10\x10\n~\x18\xc7u\xc1v\xe6\xd7g\xc7\xb9\
-b\xc3\x9a2\xdf{v\x8a\xe7\xfev\x00\xd7\x13\xfc\xf5\xbf/\xe2\xa9\xaf\xc6y{\xff\
-\xa7s\x95`\xae\xd0\x07\x07\x07\xe7\xda\xc3\x02\x9f\x03n\xd8>\xc1\xd4P\x86\
-\xe3\x87\xf3<\xf6L\x80\xce\x936\xaf\xef\\\xc4Lv\xfen\xaf`\xf6\xd4`\x81\x05.J\
-8h\x13\x8d\xe6y\xe0\xcfa\xf3\xdd6/\xbc\x14\x9a\xf7\xc5\x01\xa0\xcf\xb5\x81\
-\x05>\x1f<\xff_\xf5\x04\xcd\x1a*c>\xcf~K\xf2\xf2O\xae\xce\xed\xc8\xcf\x1a\
-\x02\xbe6o\xdeA\x16X\xe0J3\xff\xd7\xc8\x05\x16\xb8\x0c\x16\nd\x81\x05>\x81\
-\xff\x07\xb2\x94\x96s\xb0\xd3\xbf\xdb\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory026Bitmap():
- return wxBitmapFromImage(getDocFactory026Image())
-
-def getDocFactory026Image():
- stream = cStringIO.StringIO(getDocFactory026Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory026')
-catalog['DocFactory026'] = ImageClass()
-catalog['DocFactory026'].getData = getDocFactory026Data
-catalog['DocFactory026'].getImage = getDocFactory026Image
-catalog['DocFactory026'].getBitmap = getDocFactory026Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory027Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rg\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19\xc8V\xa6\xd3\x0e%\xa5q\x12\x08abCblp\x1cY\xb60^elK\xb2\x96\xa7]z\xd2\
-[\xef}\xf7\xde\xd3?D\x0c.\x01{\\la\xa3\xcf\x9fo\xce}\xdf\xef\xf7\x9c\xf3\x9b\
-s\xee=s\xc4?|K)\xe6\x99g\x9e\xdf\x89\x1e\xaa\x9ck\x0b\xf3\xcc\xf3\xf9E\x0f\
-\xce\x17\xc8<\xf3|"z81\xd7\x16\xfe\x7f\x08\x14\x066\x12\xef\x9c\xdf]\x0c\\\
-\xcc\xcb\xe7A\xd8h\xff\xc7\x83\x02\xca*\x80\x87vIt%>\xa6(\xe1#)+\x0b\x85\xb8\
-$:_d\xf4P|\xae-\\<\x02\x9f\xba\xc2.\xa2\xee\x19\xfc\x8f\xccM)A\x9a:y7N.\xd8\
-\xca\x8c\xbe\x08\x97\xc0%\xf2\xe0\xd1`\xbfI\x85\xd7s\x8e\x07\x00\xddR\xd8Z\
-\x15\xdd\xda\x16\xca\x84>S]\r\x87\xc5\xee\xcf\t\x94G\xd0\x0c\xc1\x98\\FZ\xde\
-\xfc\x99j\xcc\x03z\xf8\n.\x10\x8bQ\x1a\xf4\xe78\xf9Z5\xd3\x83\x11@\x80\x94H]\
-\x11\xae*\x12\xa9-\xd2\xb2|\x12\xc7ZD_\xf0oq\xa8\xf9\xcc=\x04\x19\xa6\xa1\
-\xf8\x12\xc7\x7f\x1ag:\x1d\x00!@H\x00b\xf56\xcb\x1e|\x9b\xa2Q\xcb\x04\xb7~\
-\xa6\xba!\x86\xa9\xb3\x7f\xcc\x91\x1f\xa7\x88-,\xd1\xb4\xa6\x93B\xf0z\xca\\\
-\xc1\x03\xfa9D\x8f\\\xc1\xfd\x19R\x82\x84\xb6\n\xe1\x17\x91\x9a"\x18\x17\x18\
-\x01\x81BP\xca\x07\x19=.\xc9\x8f6\xb2\xfc\x1e\x89i\xfc\x86\xfe\xf0}\xe7lC\
-\x84\xef!\xdc2\xc2\xf7PRC\xe9\x06J\xfe\xee\xed\x90p\x1d\xa4[\x068\xa7mH\xe9\
-\x84\xc5\xb5(\xb7\x80\xd48\xeb\x01\x04\xa9\xc5&\xa1P\x1bf\xb0\x81\x88\xfc\
-\xf8\xff\xf8\xba\x89\xd2t\xa4S\x04!\xf1\rk\xb6\xc0\xce\xa3)P\xc4\xfd"\xe1\
-\xfcR$%\xb2\xe9\x18\xd7E-jB\xe3d\xe4\x87\x03zA\xf9\x94\xfaP\xdf\x0c\xccjze|\
-\xdd\x9a\xd5*\xdb\xb3\xcd\xcc\xc0\xc7\x9f\x01|3x\x8e\xe7\xab\r\xbd\xc2\x1c\
-\x98k\x0f\x17\x8d\xa5\x1c0\xd6a\xe8o\x13K\xb9\xdc\xf8G\xb7\xa0\x85\x82\xa0|\
-\xcay\x9b\x81\xce\x1eF\x8e\xa69\xd3\x91\xe2\xba\xbb\xa28\xc6)\n"\x88P\x1ef\
-\xa6\x1b3\xd3\x8dW(!P\xb3\x8bO \x80\x9dZ\x8aS\xd1\x08\x1f\x14\x92\xf0\xcbX3=\
-\x18\x93\xa7Q\xb6\x03\xa8\xd9\x05\xc2\x08P\xac\xbe\x11-\\\x89\x0c\xdc\x82e\
-\xedDK\xb9\xdc\xf8\xc4F\x8cH\x10\x00\xbb\xac\x984"\xc8\x80$\xe6\xf7`N\x9d\
-\xc2\x9a\xe9F\xd9.J)0\x83x\xc1J\xccb\x1a\xa5\xc0\x897SJ\xb5\x9dW3,t*\xbd\x19\
-rS\xcb\xc0mGhP*\xacd\x915\xca\x90\x01%i\\X>\xe5\x13H\xef\xc7\xc8\xa5\x91\x86\
-\xc4\r\xd7\xa1\x15\xc6\xf0\xed2\xc2\xb4p\xf4jdv\x1c!\x05\xf6\xc2\x15x\xd1j\
-\x00\x8c\xf41\x8c\xa9\x01\x10\x8ar\xbc\x91r\xfd\xd29\x18\xfd\xcb\x83\x1e\xe1\
-\xf8\\{\xb8h\x0c\xa1#\xcc\nt\x99C\x0f\n\x8cX\x8a\x8cU\xc0\x03\xacP\x98\x96;\
-\xd6\xe2\xe5\xb6\x93\x1b\xee\xa6\x90\xb9\x86\x845\x82n\xce\x10\xc9\x9eD/g\
-\x18:6\xc9\xf8\xa1,\x9e\xeb\xa3\x07u\xea7$\xa8\x8b\rQ,.\xa0\x10\\\x88T\x1e\
-\x91\xdc\tTv\x9a\xfe\xb7\x87\xc9\r\xda\x08\r\xcc\x88A\xe5\rQ\xaaC#\xd8\xa1\
-\xf5\x08#\x85.\xf3\xe8A0\xa2)\n\x81\x12.\x1en\xd0\xc5a\x94\x88\x1a"\x9a\xeb\
-\x82\xd24\xc3\x9d\xe3d\xba\xf3\x00\xd4oH\x12o\x0c1zx\x1a=\xacS\xb5*C\xcew\
-\x08\xe5\xba?Q\xb3&<\x81Y\xb1\x89\xe1}\'\x18\xdc\xb3\x0f\xe5{()8\xb1\xed\x17\
-,}\xe4\x01\x12Z?8\x87.(\x9f\xaeJ\xc4\x02G\xe9\xfee\x9aP\xb5E\xf2\xfaa&\xba\
-\xb2\x8c\x1f\x99a\xc9\x83IB\xdeO\xe8\xfbu\x98x\xabC\xa2\xe2-\xec\xc8V\xa4\
-\x97%\xe0\xbeD\xfa`\x10\xb3\xc2#\xde&p\xd4\x9f\xa0\x841\xb7\x93\xe1\x12\xa1\
-\x87\xd93\xd7\x1e.\x1a\x8d$\x82;\xd1\x99D\x08\x81P!L~\x8d\xc7$J\x93x\xdem,X\
-\xddF\xcf\xf6\x7f\xc7\x1e\x1b"\x96\x8a\x91(\x8f \nu\x9c\xfcQ\x07\x85\xb1Q\
-\x02\xf1\x18\xd24q\xf2S\x0c\xefNSL\xb7\xd0\xf4\xd5\xe5\x18\xe61t\'\x89f7\xd1\
-\xf5\xd3\x1fQ\x1c\x1b\xc5\x8cF0\xc2a\x10\x0e\xf9\x1e\x97\xfa\x95\x9b\xd0\xfc\
-\x01\x04M\xe8L\xe0\xd9E\xec\x89i\x8c\xa0\x85)4\xb4@\x8c\x92\xbe\x0f\xbc\x1c\
-\x01\xb7\x85\x13\xaf\xbcL~x\x98@"\x8e\xb4,\xc6\xf7\x9fat\xaf\x8d\xef\x96\t\
-\xd5\xd6\x12\xdcp\'\xba\x9dA~\x9a\xe6\xaa;Q\n\x82\x15\x11*\xaa%\xf9\x91>\x84\
-\x94\x84\xe3\x8b\xd0\x031\x0c\x95\xc6\xbf\xa0|GQ\xd2\xc34V\xe3Ow1zz\x8c\xa9\
-\xf7B\x04+\x93,\\\xdbLE\xd5Rp\xc2\x18\xfea\xf2\xefk,\\\xd1D\xc1\xdb\x8f,\xf9\
-\xe8Z\x1b\xe5\xd1\xc3\xc4\xabj\x88W\xd4\x91g\x1fW\xebi\xb3\x1eb\xd7\\{\xb8h\
-\x04\x8b\x10\xdc\x8b.\xc6\x11\x12\x84\x08\x12\xe0]\x14\xbd\x00H\xcd&X\xf9\
-\x00\x01k\x08{\xfc\x00\x1a+1D\x1b}{^\xa0<v\x80\x85\xb7n\xa5\xe6\xe6-\xa0\xca\
-\xb8\xc5"\x03;\xfe\x8dB\xefN\n\xe9\xe5DZ\x17\x80_\xc5\xc0\xee\xff\xc1\x9dx\
-\x8f\xa6;\x1e#\xd1\xb6\x0e\x19\xf0\xd1\xb48\x9eSD\xe9\x93\x98z;\xc2\xdd\x84.\
-\xc6p\xb3\xa78\xfd_\xcf M\x89\xd0$\xf5\x1b\x9f&\xbad\t\xca\xcb\x929\xd1\x853\
-\xda\xc9\xc2\xdb\x1e\xa2\xe6\xe6-\x08\xdd\xc7\xb7a\xf0\xcd\x17\x98>\xb9\x17C\
-\xd7\x10f-\xba\x1be`\xf7K\x9f\xaa\xa9\xac\x1d\xc4\xae\xbd\x8bX\xcb\xd3\x9cz\
-\xf1\x19\x84\xee\xd1z\xffS\x08k\x12\xa9\xd5\xd0\xb7\xe7g\xe7\xcf\xd7R\x8b\
-\xb2\xb6#\xccM\xe8r\nS\x0e\xd1\xb4\xf9/\x88\xb5\xae\xc0\x17\xbd\xa8\xc0\xbb\
-\x90[B\xed\x1a\x93\xbe\xd7\xff\x9b\xd2\xf4W\t\x06\x8b(/\xc9TO\x17:C\xa4\x96=\
-\x02\xa1~\x82\xe2\r\xb8JKD\x0f\x8c^\xc1/X\xba\x86\x17\x88\xa0\xd9\x12)\x05\
-\xf8\x11\xacI\r\xdc\xd9L\xca\x8a\xe3\xfaa\xcc\x92\xc0\xf4\xc2\x08\x15\x83\
-\xb2\x8f\xdd\xdbG(XO\xcd\xbaG\xd1\xca\xdb\x91^\x07\xd2|\x88\x9a\xd5\x0f3\xd0\
-}\x8cRO\x0f\xb1\xc5\x8f\xe3y\x02\xbb\xfb4\xa1@\rU\xab\x1eB\xba?A\x16\xf6\x80\
-L\xa0\t\x1d\x9c)(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\
-\xc9f2\xed\xdf%\x14\xa8\xa5f\xedVt\xe7\xe7\x88\xd2!|\xebI\xaa\x96\xdfG\xf1X\
-\x07\xba\xa3#T\x02\xbc\xc0\xf95s3\xa0g\xf0\xaco`\xaa\x08R\t4\xbd\x02\xcd~\
-\x19\xcfx\xf2\x82\xf2U4mE+\xec\xc6\xb3bh\xb6F(\xbc\x90X\xf3&t\xe7{\xe0\x1c\
-\x82\xac\x87\xd2KT,\xd9L\xc0z\x83\xc9\xf6\xfd4l\xfds<?O\xf6\xe0\x8b$\x1aVb&\
-\x17#\xf3; \x0b\\\xa5g0:;\x17\xcf\xb5\x87\x8b\'V\r\xebG\x10\xc3A\x90\x80=\
-\x02\xfb\xaaaZ\x81a\xa1\xd6\xad\xa3\xd4\xf7.\xeax\x08\xab\xb5\x199=\x81\'Rx\
-\'\x05z\xac\x1e\n\x01\xe4\xfeA(\x04\xd1\xea\xd3Xu\xb7\xa1\r\xd7\xc3X\x0cUH\
-\xa0\x8aE\xdc\xf7\xc1H\xd4\xe2\xcf\x18\xe8\x9d\x13P\xf8\xe8\xa7\xe2J\x88U\
-\xc1\x9a4b8\x80\xe5\xb4\xd2\xbc\xf5\xaf\xd0\xa2\x11\xf0}\xfc\xf1A\xe4\xa1S8\
-\x8d\x0bp\x8e\x960\x92\xf5\x88r\x02\xb1o\x1arAd\xd3\x00F\xedMhC\xb5\x08/\t^\
-\x02\x95S\xe7\xd7\xfc\xad\xee\xdaA\xe4p\x00!\x05\x94\xd2\xd0\x95\xc4_,/(\x1f\
-\xf9\x04\x1cj\x80uq\x18\x8e\xcdnQ\xfd\x14\xb4G \xd3\x08\x80\x08\x94\x917G\
-\x89\xc4o&\xbb\xfb]\xec\x9b\n\xd8\xe94\xe5\xc3.\xb5\xb7\xdd\x0b\xc3y\xd8\x17\
-\x00\xff\n\x9eC\xe7A\x1f|\xee\xc9\xb9\xf6p\xd1\x18\xcd\x82D\xdb8\x85\xe3\x8b\
-\x90h\xf8\xf9I\xa6\xf7n\x06\xa90W\xfb\xe8Y\x97\xc1o\x0fQ8q\x0bU\x0f\xd4S<hc\
-\xae\xc8\xa3J\x1b\xc8\x9e\xcc\xe0e\xa7pB\x8fc\xbf\xe7\x12Zb1\xd3\xde\xcf\xf4\
-\xae6\x82uu\xf8SS\x88\x10P\xbe\x95\xcc\xae\x11\x9cGG(\xa9?\xc0\xde\xe5\xa27\
-\xe8\x18\xd7h\xd8\x9de\xbct\x91\xc4\xd2\xd1Y\x0fB\x03Q \xf3\xcf\x02\xb7_\xe0\
-\x0eV\xa1\xd5\xd5\x91\xfc\xfb\x12^f-\x85\xae\x1c\xe5\x89a\x9c\xc0#\x14\xf7\
-\xda\x84\x97\x04\x98\xd9\xd3\xc3\xf4\xae6B\xd7\xa4\xf0\x0bi\x84\xf4\xcf\xabY\
-\xdacc,\xf2I\\?N\xfeH+\x02\x89\x9f\x1f#\xf3\xda\x1a*\x9e.\\P>w<\xcb\xe4\xb6/\
-\x13\xbfa\x88BW\xc3\xecg\xde\xfc0\x13?\xbc\x8brw\xf9l\x1f\x87\xfa\x02\xc4V?\
-\xcc\xe0\xf33\x1c\xfb\xb3\xed\xa8\xa2\x8bUw\x17\xd6\xc2\xf5d\xbe=D\xf1W\x7f8\
-w\x13\xe02\xa0\xbf\xb2j\xfd\\{\xb8h*kg\xb8\x97\xdd\x9cIU\xe2\x14%\xd5\x83\
-\x83p\xbfE~\x12\xb2\xc3\x0e\xdd\xdf\xb2\xc9\xe4R\\\xf7\xc7\xb5\x18K\xcb\xbc\
-\xb9\xad\x91\x1bb\xfdD\x9fh\xe5\xe0?\x9ed\xf8\xd9\xdd\xb4\xdc\xb9\x00\xb92H\
-\xe9h\x9e\x13od(6\xb7R\xb31NW\xafC"\x95%\xfcX\x0b\x9d\xff\xe43\xf6\xfdvZ\xee\
-\xa8E\xdd\x15E\xb7@7\\\x92_\x8b\xd0\xb1\xa3\x99\xdb\xe5\x0e\xce\xa4\x92 5Z\
-\x19\xe4\x8d\xc8}L$\x93\x90\x04\xa9)\xbe\xd2\xd7\x81\xfe@3\x07\x7f\xd0G\xe1\
-\x87\x1d\xd4\xaf\xad\xc6_o2\xf0\x81f\xae\xa1\x85d\x8dE\xb3\xdbGv\xca8\xaf\
-\xe6\xdb\xd1\x95\x08l\xee\x15\xaf\xd2SU\x89\x92\x06\xcd"\xcd\xaf\x92\xabX\
-\xd5\xdb{a\xf9\x06\\N,^\xc2=j?}\xc9\x18BJ\xaeU\xfd\xec\xbcn-\x13\xf1\xf0\xd9\
->\x8e\xcd\x08\xb64\xbaL\xde\xbe\x96\x91\xa3C\x10\xd2Y\xfd\xf0F\xa6s\x15\xbc\
-\xe2\xc4\xb1W]\x9d\xef\x1e\xbfE?\xe1\x17\xe6\xda\xc3ES\xefOc\xdb\xbd\x8c;%&\
-\xc6t\xfa\xbf\x99\x06M\xc7v\x0c\x94\xd0@H\x16-si\xfb\xfd<\x07\x0e\xb5\xf0VO\
-\x88Q=\xcc\x13\x0f\x8e\xb2p\xb3\xc1\xc1_\xe48\xfe\xfci\x94\xd4\xf0\x85A8!Yv\
-\x8f\xc4\xac\x1a\xe1\xb5m\xcb\xa8\xaf\xf6yx\xcb\x185_\xd28\xb17\xcf\xf1\xef\
-\xf4\x9em[\xd9 \xb9\xefo\x0c\xc6\xb5 v\xe9\x14\xe3\xe50VT\xe2\xd8\xa3\x9c.\
-\xe7\x18\xf1?8X\xf3\xc1mO\xf0\xe8\x96\x1c\xe1\x15\x92\xce=\xe3t\xbc\x93AI\
-\x8dh\xb5\xc1\x82\xeb$C%I0\x92\xc7.\x9e\xe6\x9d\x83+\xf8\xbd\x8d\x9f\xae9\
-\xa47\xe08>\xa5B7\xc3v%\xc1\x98C\xd9\x1e\xe7d)\xcf\xf4\xa1\x0b\xcb\xf7\xfa\
-\xb6eH9\x8dS:\xc9\xa4S\xc0\xaa0(\xdb\xa78]\xbe\x96\x11\xff#\x87\x95c\xd0p|\
-\x86\x9a\x8d\r\x1c=6H(aR\xb7>B\xfb\xbb\x93\x1c\xca\x05\xe7h\xe4/\x1f\xfa\xc0\
-\xc0\x95{P\x98\xcf\xe6)\xe5\xbbi\xbdIPn\x0fa;\x06\xbe\xd0\x89$$\xd5\x8d\x0eM\
-Km\x1a\x97\x96\xd8\xd3\xde\xc2\x8b\xaf4P,\xa5I\x0f*\xa4\x17\xe4\xfe\xcd\x9dT\
-6\x1b\x9c:\x10\xa4\x98\xd3\xb0\xa2\x82\x1b\xbf\x9c%\\\t\xdf\xf9\xcf{8\xdc\
-\x95\xc5\xd05\x94\xad\xf3\xe0\xe3]\\s\x8b\xc6\xe1\xdd\x11\xa6\xc6-b\xb5\x8a\
-\x15_\xca\xd2\xd3\x9b\xa2\xa3s\t_Y\xdd\xcd\xa2\x95\x11*\xaa}\xd2\x03\x16G\
-\x8e\xcd`;\xa5\xb3>\xd3iEe\x046?u\x923\x87\x03\x1c}\'\x84f\n\xd6l\xce\xd2xM\
-\x9e};\x92D\x93\x1e\xa7OU\xb0\xed\xb5\xf5d\'\xcf\xa3y G\xac"K\xb1\xd0C\xd3\
-\xf2I\xeaZ\x8at\x9f\x8e\xf2\xde\x91<\x02.8_u*\x83]\xe8\xa4q\x8dN\xac\xc6g\
-\xa0\x7f\x9c#G\'\xb1\x9d\xec9\xfd\xbc\xb7\xc3\xe5\xc1M\x0ey\xa7DCk\x02!\xc7y\
-cg\x89\x81\x01y\x99G\xfc\xf2#\xd6\xaf\x7f\xfd\x8a]#\x85\x80-\x1b\xbb\xb8}M\
-\x0f\xa9d\x11!g\xa3d\xb3&\x99\x19\x8b\xd1\xc9\x08\xbf\xfc\xcd\x12N\x9f\xa9\
-\xa4\xec\xcas\x9e[\xda:\xcd\x86eC4\xd5\xcf\xa0<\x85\x8fFWO\x82\x8e\xa35\xf4\
-\xf4G\xce\xb6\x95R\xb1\xfc\xdaI6\xae\x1e$\x15/P.K\x94\xd4y\xef\xfdJv\xb6\xd7\
-\x93\xcb\x1b\xdc}\xfb\x10\xeb\xdb&)\xfb\x1a\xaf\xbeU\xcf\xc1\xe3\x15\x1f\xf3\
-\x1a\xb0<n];\xcaM\xcb\x87\x90\xbe\x8b\xd4`$\x13\xe1\xd4\x99\n6,\x1b\x02\x04\
-\xaf\xbe\xb5\x98\x83\xc7+\xcf\xab\x99\xcd\x19\x08\x01w\xdf>\xc2\xba\xb6\t\\_\
-\x9e\xa3{\xa1\xf9f\xff\xa3\x97\rmC\x94}\x8dW\xdej\xe1\xe0\xf1s\xef?\x18:\xfc\
-\xdd\xd7s\x94\xfb\x87x\xfd{\xbd|\xed_\xda\xe8\x19\x8b\xf2\xcdg#|\x11\xae\xda\
-\x89\x05\x0b\xbe\x7f\xc5\xc7\x14\x02B\xc1\x0fc\xb8.\xd8\xce\xd5\xf9\xd9\xf1r\
-\xb3nU\x99\x1f<;\xc5s\x7f=\x80\xeb\t\xfe\xf2_\x17\xf0\xd4\xd7\xe3\xbc\xbd\
-\xf7\xf2\\%\x98k\xf4\xc1\xc1\xc1\xb9\xf60\xcf\xe7\x98\x1b\xb6N05\x94\xe1\xc8\
-\x81<\x8f=\x13\xa0\xeb\x98\xcd\xeb\xdb\x170\x93\xbd\xfa\xb7W0{z0\xcf<\x9fH8h\
-\x13\x8d\xe6y\xe0Oa\xe3\xdd6/\xbc\x14\xfa\xc2\x14\x07\x80>\xd7\x06\xe6\xf9|\
-\xf3\xfc\x7f\xd4\x134k\xa8\x8c\xf9<\xfb\x1d\xc9\xcb?\xbb4\xb7#?\xaf\x08\xf8\
-\xc6\x15\xff\x0e2\xcf<\x97\x8a/\xceZ9\xcf<\x17\xc1|\x81\xcc3\xcf\xa7\xf0\xbf\
-\x97(\x96s\xce\x83$\xfb\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory027Bitmap():
- return wxBitmapFromImage(getDocFactory027Image())
-
-def getDocFactory027Image():
- stream = cStringIO.StringIO(getDocFactory027Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory027')
-catalog['DocFactory027'] = ImageClass()
-catalog['DocFactory027'].getData = getDocFactory027Data
-catalog['DocFactory027'].getImage = getDocFactory027Image
-catalog['DocFactory027'].getBitmap = getDocFactory027Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory028Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rg\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfbG\xfe\
-\x8c\xaa\xa8R\xd5\x055\x8a\x80,EU+JJ\xe3$\x10\x82bCblp\x9c\xf1\x86\xf1:\xc6\
-\x9e\xc5\xb3\xbc\xd9g\xde\xcc[\xef}\xf7\xde\xd3?\x86\x18\\\x12<\xae\xb0\x07\
-\x9b\xf9\xfc\xf9t\xee\xfb~\xbf\xe7\x9c\x9f\xce\xb9\xf7\xe8\x88\x7f\xf8\x96R\
-\xcc3\xcf<\xbf\x15=T9\xd7\x16\xe6\x99\xe7\xf3\x8b\x1e\x9c/\x90y\xe6\xf9\x9d\
-\xe8\xe1\xc4\\[\xf8\xff!P\x18\xd8H\xbc\xf3~w1p1/\x9f\x07a\xa3\xfd\x1f\x0f\n(\
-\xab\x00\x1e\xda%\xd1\x95\xf8\x98\xa2\x84\x8f\xa4\xac,\x14\xe2\x92\xe8\xcc\
-\x03z(>\xd7\x16.\x1e\x81O]a\x17Q\xf7,\xfe\xc7\xe6\xa6\x94 M\x9d\xbc\x1b\'\
-\x17leZ_\x84K\xe0\x12y\xf0h\xb0\xdf\xa2\xc2\xeb>\xcf\x03\x80n)l\xad\x8a.m\
-\x0beB\x9f\xa9\xae\x86\xc3b\xf7g\x04\xca\xc3h\x86`T.#-o\xfeL5\xe6\xf9\x08=|\
-\x05\x16\x88\xc5\x08\r\xfas\x9c~\xbd\x9a\xa9\x81\x08 @J\xa4\xae\x08W\x15\x89\
-\xd4\x16iY>\x81c-\xa27\xf8\xb78\xd4|\xe6\x1e\x82\x0c\xd1P|\x99\x93?\x893\x95\
-\x0e\x80\x10 $\x00\xb1z\x9be\x0f\xbeC\xd1\xa8e\x9c[?S\xdd\x10C\xd4\xd9?\xe2\
-\xd8\x8fR\xc4\x16\x96hZs\x88B\xf0z\xca\\\x81\x03y\x05\xa0G\xae\xc0~\r)AB[\
-\x85\xf0\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9c\x94\xe4G\x1aY~\x8f\xc4\
-4~M_\xf8\xbe\xf3\xb6!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%\x7f\xfbvH\xb8\x0e\
-\xd2-\x03\x9c\xd76\xa4t\xc2\xe2Z\x94[@j\x9c\xf3\x00\x82\xd4b\x93P\xa8\r3\xd8\
-@D~\xf2\x7f|\xddDi:\xd2)\x82\x90\xf8\x865S`\x17\xd0\x14(\xe2~\x91p~)\x92\x12\
-\xd9t\x8c\xeb\xa2\x165\xa112\xf2\xa3\x81\x9cU>\xa5>\xd27\x033\x9a^\x19_\xb7f\
-\xb4\xca\xf6L33\xf0\xc9g\x00\xdf\x0c\x9e\xe7\xf9jE\xaf0\xfb\xe7\xda\xc3Ec)\
-\x07\x8cu\x18\xfa;\xc4R.7\xfe\xd1-h\xa1 (\x9fr\xde\xa6\xffP7\xc3\xc7\xd3\x9c\
-\xdd\x9f\xe2\xba\xbb\xa28\xc6\x19\n"\x88P\x1ef\xa6\x0b3\xd3\x85W(!P3\x8bO \
-\x80\x9dZ\x8aS\xd1\x08\x1f\x16\x92\xf0\xcbX\xd3\xdd\x18\x13\x9d(\xdb\x01\xd4\
-\xcc\x02a\x04(V\xdf\x88\x16\xaeD\x06n\xc1\xb2v\xa2\xa5\\n|b#F$\x08\x80]VL\
-\x18\x11d@\x12\xf3\xbb1\'\xcf`Mw\xa1l\x17\xa5\x14\x98A\xbc`%f1\x8dR\xe0\xc4\
-\x9b)\xa5\xda.\xa8\x19\x16:\x95\xde4\xb9\xc9e\xe0\xb6#4(\x15V\xb2\xc8\x1aa\
-\xd0\x80\x924f\x97O\xf9\x04\xd2\x070ri\xa4!q\xc3uh\x85Q|\xbb\x8c0-\x1c\xbd\
-\x1a\x99\x1dCH\x81\xbdp\x05^\xb4\x1a\x00#}\x02c\xb2\x1f\x84\xa2\x1co\xa4\\\
-\xbft\x0eF\xff\xf2\xa2G89\xd7\x1e.\x1aC\xe8\x08\xb3\x02]\xe6\xd0\x83\x02#\
-\x96"c\x15\xf0\x00+\x14\xa6\xe5\x8e\xb5x\xb9\xed\xe4\x86\xba(d\xae!a\r\xa3\
-\x9b\xd3D\xb2\xa7\xd1\xcb\x19\x06OL0v$\x8b\xe7\xfa\xe8A\x9d\xfa\r\t\xeab\x83\
-\x14\x8b\x0b(\x04\x17"\x95G$w\n\x95\x9d\xa2\xef\x9d!r\x036B\x033bPyC\x94\xea\
-\xd00vh=\xc2H\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18!\xa2\x06\x89\
-\xe6:\xa04\xc5\xd0\xa112]y\x00\xea7$\x897\x86\x189:\x85\x1e\xd6\xa9Z\x95!\
-\xe7;\x84r]\xbfS\xb3&<\x8eY\xb1\x89\xa1}\xa7\x18\xd8\xb3\x0f\xe5{()8\xb5\xed\
-\xe7,}\xe4\x01\x12Z\x1f8Gf\x95OW%b\x81\xe3t\xfd"M\xa8\xda"y\xfd\x10\xe3\x1dY\
-\xc6\x8eM\xb3\xe4\xc1$!\xef\xc7\xf4\xfe*L\xbc\xd5!Q\xf16vd+\xd2\xcb\x12p_&}8\
-\x88Y\xe1\x11o\x138\xeaOP\xc2\x98\xdb\xc9p\x89\xd1\xc3\xec\x99k\x0f\x17\x8dF\
-\x12\xc1\x9d\xe8L \x84@\xa8\x10&\xbf\xc2c\x02\xa5I<\xef6\x16\xacn\xa3{\xfb\
-\xbfc\x8f\x0e\x12K\xc5H\x94\x87\x11\x85:N\xffp?\x85\xd1\x11\x02\xf1\x18\xd24\
-q\xf2\x93\x0c\xedNSL\xb7\xd0\xf4\xd5\xe5\x18\xe6\tt\'\x89f7\xd1\xf1\x93\x1fR\
-\x1c\x1d\xc1\x8cF0\xc2a\x10\x0e\xf9n\x97\xfa\x95\x9b\xd0\xfc~\x04M\xe8\x8c\
-\xe3\xd9E\xec\xf1)\x8c\xa0\x85)4\xb4@\x8c\x92\xbe\x0f\xbc\x1c\x01\xb7\x85S\
-\xaf\xbeB~h\x88@"\x8e\xb4,\xc6\x0e\x9ced\xaf\x8d\xef\x96\t\xd5\xd6\x12\xdcp\
-\'\xba\x9dA~\x9a\xe6\xaa;Q\n\x82\x15\x11*\xaa%\xf9\xe1^\x84\x94\x84\xe3\x8b\
-\xd0\x031\x0c\x95\xc6\x9fU\xbe\xe3(\xe9a\x1a\xab\xf1\xa7:\x18\xe9\x1ce\xf2\
-\xfd\x10\xc1\xca$\x0b\xd76SQ\xb5\x14\x9c0\x86\x7f\x94\xfc\x07\x1a\x0bW4Q\xf0\
-\x0e K>\xba\xd6Fy\xe4(\xf1\xaa\x1a\xe2\x15u\xe4\xd9\xc7\xd5~\xca\xac\x87\xd8\
-5\xd7\x1e.\x1a\xc1"\x04\xf7\xa2\x8b1\x84\x04!\x82\x04x\x0fE\x0f\x00R\xb3\tV>\
-@\xc0\x1a\xc4\x1e;\x88\xc6J\x0c\xd1F\xef\x9e\x17)\x8f\x1ed\xe1\xad[\xa9\xb9y\
-\x0b\xa82n\xb1H\xff\x8e\x7f\xa3\xd0\xb3\x93Bz9\x91\xd6\x05\xe0W\xd1\xbf\xfb\
-\x7fp\xc7\xdf\xa7\xe9\x8e\xc7H\xb4\xadC\x06|4-\x8e\xe7\x14Q\xfa\x04\xa6\xde\
-\x8ep7\xa1\x8bQ\xdc\xec\x19:\xff\xeb\x19\xa4)\x11\x9a\xa4~\xe3\xd3D\x97,AyY2\
-\xa7:pF\x0e\xb1\xf0\xb6\x87\xa8\xb9y\x0bB\xf7\xf1m\x18x\xebE\xa6N\xef\xc5\
-\xd05\x84Y\x8b\xeeF\xe9\xdf\xfd\xf2\xa7j*k\x07\xb1k\xef"\xd6\xf24g^z\x06\xa1\
-{\xb4\xde\xff\x14\xc2\x9a@j5\xf4\xee\xf9\xe9\x85\xf3\xb5\xd4\xa2\xac\xed\x08\
-s\x13\xba\x9c\xc4\x94\x834m\xfe\x0bb\xad+\xf0E\x0f*\xf0\x1e\xe4\x96P\xbb\xc6\
-\xa4\xf7\x8d\xff\xa64\xf5U\x82\xc1"\xcaK2\xd9\xdd\x81\xce \xa9e\x8f@\xa8\x8f\
-\xa0x\x13\xae\xf2\x12\xd1\x03#W\xe0\x8b\x96\xae\xe1\x05"h\xb6DJ\x01~\x04kB\
-\x03w&\x8b\xb2\xe2\xb8~\x18\xb3$0\xbd0B\xc5\xa0\xecc\xf7\xf4\x12\n\xd6S\xb3\
-\xeeQ\xb4\xf2v\xa4\xb7\x1fi>D\xcd\xea\x87\xe9\xef:A\xa9\xbb\x9b\xd8\xe2\xc7\
-\xf1<\x81\xdd\xd5I(PC\xd5\xaa\x87\x90\xee\x8f\x91\x85= \x13hB\x07g\x12JI<\
-\x13\xb4\x12\xe8E\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x99L\xfbw\x08\x05j\xa9Y\
-\xbb\x15\xdd\xf9\x19\xa2t\x04\xdfz\x92\xaa\xe5\xf7Q<\xb1\x1f\xdd\xd1\x11*\
-\x01^\xe0\xc2\x9a\xb9i\xd03x\xd670U\x04\xa9\x04\x9a^\x81f\xbf\x82g<9\xab|\
-\x15M[\xd1\n\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xbc\t\xdd\xf9.8G \xeb\xa1\
-\xf4\x12\x15K6\x13\xb0\xded\xa2\xfd\x00\r[\xff\x1c\xcf\xcf\x93=\xfc\x12\x89\
-\x86\x95\x98\xc9\xc5\xc8\xfc\x0e\xc8\x02W\xf9\x19\x8c\xce\xce\xc5s\xed\xe1\
-\xe2\x89U\xc3\xfaa\xc4P\x10$`\x0f\xc3\xbej\x98R`X\xa8u\xeb(\xf5\xbe\x87:\x19\
-\xc2jmFN\x8d\xe3\x89\x14\xdei\x81\x1e\xab\x87B\x00y`\x00\nA\xb4\xfa4V\xddmhC\
-\xf50\x1aC\x15\x12\xa8b\x11\xf7\x030\x12\xb5\xf8\xd3\x06\xfa\xa1q(|\xfcSq%\
-\xc4\xaa`M\x1a1\x14\xc0rZi\xde\xfaWh\xd1\x08\xf8>\xfe\xd8\x00\xf2\xc8\x19\
-\x9c\xc6\x058\xc7K\x18\xc9zD9\x81\xd87\x05\xb9 \xb2\xa9\x1f\xa3\xf6&\xb4\xc1\
-Z\x84\x97\x04/\x81\xca\xa9\x0bk\xfeFw\xed\x00r(\x80\x90\x02Ji\xe8H\xe2/\x96\
-\xb3\xcaG>\x01G\x1a`]\x1c\x86b3[T?\x05\xed\x11\xc84\x02 \x02e\xe4\xcdQ"\xf1\
-\x9b\xc9\xee~\x0f\xfb\xa6\x02v:M\xf9\xa8K\xedm\xf7\xc2P\x1e\xf6\x05\xc0\xbf\
-\x02\xe7\xceE\xa2\x0f<\xf7\xe4\\{\xb8h\x8cfA\xa2m\x8c\xc2\xc9EH4\xfc\xfc\x04\
-S{7\x83T\x98\xab}\xf4\xac\xcb\xc0\xb7\x07)\x9c\xba\x85\xaa\x07\xea)\x1e\xb61\
-W\xe4Q\xa5\rdOg\xf0\xb2\x938\xa1\xc7\xb1\xdfw\t-\xb1\x98n\xefcjW\x1b\xc1\xba\
-:\xfc\xc9ID\x08(\xdfJf\xd70\xce\xa3\xc3\x94\xd4\x1f`\xefr\xd1\x1bt\x8ck4\xec\
-Ce\xbct\x91\xc4\xd2\x91\x19\x0fB\x03Q \xf3\xcf\x02\xb7O\xe0\x0eT\xa1\xd5\xd5\
-\x91\xfc\xfb\x12^f-\x85\x8e\x1c\xe5\xf1!\x9c\xc0#\x14\xf7\xda\x84\x97\x04\
-\x98\xde\xd3\xcd\xd4\xae6B\xd7\xa4\xf0\x0bi\x84\xf4/\xa8Y\xdacc,\xf2I\\?F\
-\xfeX+\x02\x89\x9f\x1f%\xf3\xfa\x1a*\x9e.\xcc*\x9f;\x96eb\xdb\x97\x89\xdf0H\
-\xa1\xa3a\xe63o~\x88\xf1\x1f\xdcE\xb9\xab|\xae\x8fC\xbd\x01b\xab\x1ff\xe0\
-\xf9iN\xfc\xd9vT\xd1\xc5\xaa\xbb\x0bk\xe1z2\xdf\x1e\xa4\xf8\xcb?\x9c\xbb\tp\
-\x19\xd1_]\xb5~\xae=\\4\x95\xb5\xd3\xdc\xcbn\xce\xa6*q\x8a\x92\xea\x81\x01\
-\xb8\xdf"?\x01\xd9!\x87\xaeo\xd9dr)\xae\xfb\xe3Z\x8c\xa5e\xde\xda\xd6\xc8\r\
-\xb1>\xa2O\xb4r\xf8\x1fO3\xf4\xecnZ\xee\\\x80\\\x19\xa4t<\xcf\xa973\x14\x9b[\
-\xa9\xd9\x18\xa7\xa3\xc7!\x91\xca\x12~\xac\x85C\xff\xe43\xfa\xbdvZ\xee\xa8E\
-\xdd\x15E\xb7@7\\\x92_\x8b\xb0\x7fG3\xb7\xcb\x1d\x9cM%Aj\xb42\xc0\x9b\x91\
-\xfb\x18O&!\tRS|\xa5w?\xfa\x03\xcd\x1c\xfe~/\x85\x1f\xec\xa7~m5\xfez\x93\xfe\
-\x0f5s\r-$k,\x9a\xdd^\xb2\x93\xc6\x055\xdf\x89\xaeD`s\xafx\x8d\xee\xaaJ\x944\
-h\x16i~\x99\\\xc5\xaa\x9e\x9e\xd9\xe5\xebw9\xb5x\t\xf7\xa8\x03\xf4&c\x08)\
-\xb9V\xf5\xb1\xf3\xba\xb5\x8c\xc7\xc3\xe7\xfa86-\xd8\xd2\xe82q\xfbZ\x86\x8f\
-\x0fBHg\xf5\xc3\x1b\x99\xcaU\xf0\xaa\x13\xc7^uu\xbf{\xfc\x06\xfd\x94_\x98k\
-\x0f\x17M\xbd?\x85m\xf70\xe6\x94\x18\x1f\xd5\xe9\xfbf\x1a4\x1d\xdb1PB\x03!Y\
-\xb4\xcc\xa5\xed\xf7\xf3\x1c<\xd2\xc2\xdb\xdd!F\xf40O<8\xc2\xc2\xcd\x06\x87\
-\x7f\x9e\xe3\xe4\xf3\x9d(\xa9\xe1\x0b\x83pB\xb2\xec\x1e\x89Y5\xcc\xeb\xdb\
-\x96Q_\xed\xf3\xf0\x96Qj\xbe\xa4qjo\x9e\x93/\xf4\x9ck[\xd9 \xb9\xefo\x0c\xc6\
-\xb4 v\xe9\x0cc\xe50VT\xe2\xd8#t\x96s\x0c\xfb\x1f\x1e\xac\xf9\xe0\xb6\'xtK\
-\x8e\xf0\n\xc9\xa1=c\xec\x7f7\x83\x92\x1a\xd1j\x83\x05\xd7I\x06K\x92`$\x8f]\
-\xec\xe4\xdd\xc3+\xf8\xbd\x8d\x9f\xae9\xa87\xe08>\xa5B\x17Cv%\xc1\x98C\xd9\
-\x1e\xe3t)\xcf\xd4\x91\xd9\xe5{c\xdb2\xa4\x9c\xc2)\x9df\xc2)`U\x18\x94\xed3t\
-\x96\xafe\xd8\xff\xd8a\xe5(4\x9c\x9c\xa6fc\x03\xc7O\x0c\x10J\x98\xd4\xad\x8f\
-\xd0\xfe\xde\x04Gr\xc19\x1a\xf9\xcb\x8f\xde\xdf\x7f\xe5\x1d\x14\xe6\xb3yJ\
-\xf9.Zo\x12\x94\xdbC\xd8\x8e\x81/t"\tIu\xa3C\xd3R\x9b\xc6\xa5%\xf6\xb4\xb7\
-\xf0\xd2\xab\r\x14Ki\xd2\x03\n\xe9\x05\xb9\x7f\xf3!*\x9b\r\xce\x1c\x0cR\xcci\
-XQ\xc1\x8d_\xce\x12\xae\x84\x17\xfe\xf3\x1e\x8evd1t\re\xeb<\xf8x\x07\xd7\xdc\
-\xa2qtw\x84\xc91\x8bX\xadb\xc5\x97\xb2t\xf7\xa4\xd8\x7fh\t_Y\xdd\xc5\xa2\x95\
-\x11*\xaa}\xd2\xfd\x16\xc7NLc;\xa5s>\xd3iEe\x046?u\x9a\xb3G\x03\x1c\x7f7\x84\
-f\n\xd6l\xce\xd2xM\x9e};\x92D\x93\x1e\x9dg*\xd8\xf6\xfaz\xb2\x13\x17\xd0<\
-\x98#V\x91\xa5X\xe8\xa6i\xf9\x04u-E\xba:\xa3\xbc\x7f,\x8f\x80Y\xe7\xabNe\xb0\
-\x0b\x87h\\\xa3\x13\xab\xf1\xe9\xef\x1b\xe3\xd8\xf1\tl\'{^?\xef\xdd\xef\xf2\
-\xe0&\x87\xbcS\xa2\xa15\x81\x90c\xbc\xb9\xb3D\x7f\xbf\xbc\xcc#>w\x88\xf5\xeb\
-\xdf\xb8\xe2\xd6J!`\xcb\xc6\x0en_\xd3M*YD\xc8\x99\x08\xd9\xacIf\xdabd"\xc2/~\
-\xbd\x84\xce\xb3\x95\x94]y\xdesK[\xa7\xd8\xb0l\x90\xa6\xfai\x94\xa7\xf0\xd1\
-\xe8\xe8N\xb0\xffx\r\xdd}\x91sm\xa5T,\xbfv\x82\x8d\xab\x07H\xc5\x0b\x94\xcb\
-\x12%u\xde\xff\xa0\x92\x9d\xed\xf5\xe4\xf2\x06w\xdf>\xc8\xfa\xb6\t\xca\xbe\
-\xc6ko\xd7s\xf8d\xc5\'\xbc\x06,\x8f[\xd7\x8ep\xd3\xf2A\xa4\xef"5\x18\xceD8s\
-\xb6\x82\r\xcb\x06\x01\xc1ko/\xe6\xf0\xc9\xca\x0bjfs\x06B\xc0\xdd\xb7\x0f\
-\xb3\xaem\x1c\xd7\x97\xe7\xe9\xce6\xdf\xcc\x7f\xf4\xb0\xa1m\x90\xb2\xaf\xf1\
-\xea\xdb-\x1c>y\xfe\xbd\x07C\x87\xbf\xfbz\x8er\xdf o|\xb7\x87\xaf\xfdK\x1b\
-\xdd\xa3Q\xbe\xf9l\x84/\xd2\x15;\xb1`\xc1\xf7\xae\xd8\xb8B@(\xf8\x91}\xd7\
-\x05\xdb\xb9\xba?;^.\xd6\xad*\xf3\xfdg\'y\xee\xaf\xfbq=\xc1_\xfe\xeb\x02\x9e\
-\xfaz\x9cw\xf6^\x9e\xab\x04\x9f\x17\xf4\x81\x81\x81\xb9\xf60\xcf\xe7\x90\x1b\
-\xb6\x8e39\x98\xe1\xd8\xc1<\x8f=\x13\xa0\xe3\x84\xcd\x1b\xdb\x170\x9d\xfd\
-\xe2l\xaf`\xe6\x14a\x9ey>A8h\x13\x8d\xe6y\xe0Oa\xe3\xdd6/\xbe\x1c\xfa\xc2\
-\x15\x07\x80>\xd7\x06\xe6\xf9|\xf2\xfc\x7f\xd4\x134k\xa8\x8c\xf9<\xfb\x82\
-\xe4\x95\x9f^\x9a\xdb\x91\x9fw\x04|\xe3\x8a}\x07\x99g\x9eK\xcd\x17o\xcd\x9cg\
-\x9e\x8b`\xbe@\xe6\x99\xe7S\xf8_{\xbc\x96s\x8a1j\xe2\x00\x00\x00\x00IEND\xae\
-B`\x82'
-
-def getDocFactory028Bitmap():
- return wxBitmapFromImage(getDocFactory028Image())
-
-def getDocFactory028Image():
- stream = cStringIO.StringIO(getDocFactory028Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory028')
-catalog['DocFactory028'] = ImageClass()
-catalog['DocFactory028'].getData = getDocFactory028Data
-catalog['DocFactory028'].getImage = getDocFactory028Image
-catalog['DocFactory028'].getBitmap = getDocFactory028Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory029Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rg\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xdd\xb7\xe8-zZmI\xb6$\x03\x06\xd9\
-\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xd3i\'\xd3)L;\xb4\xfd#\x7ff:\x99\
-\xcet\xba0\xcdd [\x99N;\x94\x94\xc6I \x84\x89\r\x89\xb1\xc1qd\x1bc\xbc\xca\
-\xd8\x96d-O\xbb\xf4\xa4\xb7\xde\xfb\xee\xbd\xa7\x7f\x88\x18\\\x12\xacN\x01\
-\xe1Z\x9f?\xdf\x9c\xfb\xbe\xdf\xef9\xe77\xe7\xdc{\xe6\x88\xbf\xfb\x86R,\xb0\
-\xc0\x02\xbf\x11=\\=\xdf\x16\x16X\xe0\xf3\x8bn/\x14\xc8\x02\x0b\xfcV\xf4Hr\
-\xbe-\xfc\xef\x10(\x0c\x1c$\xfeE\xbf{\x18x\x98\x9f\x9d\x07\xe1\xa0\xfd\x0f\
-\x0f\n\xa8\xa8\x10>\xda\xa7\xa2+\t0E\x99\x00IEY(\xc4\xa7\xa2\xb3\xc0\x07\xe8\
-\xe1\xc4|[\x98;\x82\x80\x86\xe2\x1eb\xdey\x82\x0f\xcdM)A\x9a:\x05/A\xdengF_\
-\x82G\xe8S\xf2\xe0\xd3\xe4\xbcN\x95\xdfs\x91\x07\x00\xddR8Z\r\xdd\xda6*\x84?\
-Q]\r\x97\xa5\xdeO\tUF\xd0\x0c\xc1\x98\\AF\xde\xf8\x89j,\xf0Q\xf4\xc8eT \x16\
-\xa34\xe9\xcfp\xe6\x95Z\xa6\x07\xa3\x80\x00)\x91\xba"RS"Z_\xa2m\xe5$\xae\xb5\
-\x84>\xfb\xafq\xa9\xfb\xc4=\xd8\x0c\xd3Tz\x81S?N0\x9d\t\x81\x10 $\x00\xf1F\
-\x87\x15\xf7\xbfI\xc9\xa8g\x82\x9b?Q\xdd0\xc348?\xe4\xf8\x0f\xd3\xc4\x17\x97\
-iYw\x98\xa2}-\x15.\xa3\x01\xbc\x0c\xd1\xa3\x97Q\xff\x86\x95 \xa9\xadA\x04%\
-\xa4\xa6\xb0\x13\x02#$P\x08\xca\x05\x9b\xd1S\x92\xc2h3+\xef\x92\x98\xc6\xaf\
-\xe8\x8f\xdcs\xd16D\x04>\xc2\xab \x02\x1f%5\x94n\xa0\xe4o\xde\x0e\t\xcfEz\
-\x15\x80\x8b\xda\x86\x95ND\\\x8d\xf2\x8aH\x8d\x0b\x1e@\x90^j\x12\x0ew`\xdaMD\
-\xe5G\xff\'\xd0M\x94\xa6#\xdd\x12\x08I`X\xb3\x05v\tM\x81"\x11\x94\x88\x14\
-\x96#)\x93\xcb\xc4\xb9&fQ\x17\x1e\'+?\x18\xc09\xe5S\xea\x03}34\xab\xe9W\x08t\
-kV\xab\xe2\xcc63C\x1f}\x06\x08L\xfb"\xcf\xff\xdf\xd1\xab\xcc\x81\xf9\xf60g,\
-\xe5\x82\xb1\x01C\x7f\x93x\xda\xe3\xfa?\xb8\t-l\x83\n\xa8\x14\x1c\x06\x0e\
-\xf70r"\xc3\xf9\x83i\xae\xb9#\x86k\x9c\xa5(l\x84\xf21\xb3\xdd\x98\xd9n\xfcb\
-\x19\x81\x9a]|B!\x9c\xf4r\xdc\xaafx\xbf\x90DP\xc1\x9a\xe9\xc1\x98<\x87r\\@\
-\xcd.\x10F\x88R\xed\xf5h\x91jd\xe8&,k7Z\xda\xe3\xfa\xc76cDm\x00\x9c\x8ab\xd2\
-\x88"C\x92x\xd0\x839u\x16k\xa6\x1b\xe5x(\xa5\xc0\xb4\xf1\xedj\xccR\x06\xa5\
-\xc0M\xb4RNw\\R3"t\xaa\xfd\x19\xf2S+\xc0\xebDhP.\xaef\x895\xca\x90\x01ei\xcc\
--\x9f\n\x08e\x0ea\xe43HC\xe2E\x1a\xd0\x8ac\x04N\x05aZ\xb8z-27\x8e\x90\x02g\
-\xf1*\xfcX-\x00F\xe6$\xc6\xd4\x00\x08E%\xd1L\xa5q\xf9<\x8c\xfe\xfc\xa0G95\
-\xdf\x1e\xe6\x8c!t\x84Y\x85.\xf3\xe8\xb6\xc0\x88\xa7\xc9ZE|\xc0\nGh\xbbm=~~\
-\'\xf9\xe1n\x8a\xd9\xabHZ#\xe8\xe6\x0c\xd1\xdc\x19\xf4J\x96\xa1\x93\x93\x8c\
-\x1f\xcd\xe1{\x01\xba\xad\xd3\xb8)IC|\x88Ri\x11E{1R\xf9D\xf3\xa7Q\xb9i\xfa\
-\xdf\x1c&?\xe8 40\xa3\x06\xd5\xd7\xc5\xa8\r\x8f\xe0\x847"\x8c4\xba,\xa0\xdb`\
-\xc4\xd2\x14Ce<|<\xdb\xc3e\x94\xa8\x1a"\x96\xef\x82\xf24\xc3\x87\xc7\xc9v\
-\x17\x00h\xdc\x94"\xd1\x1cf\xf4\xd84zD\xa7fM\x96|\xe0\x12\xcew\xffV\xcd\xba\
-\xc8\x04f\xd5\x16\x86\x0f\x9cfp\xdf\x01T\xe0\xa3\xa4\xe0\xf4\x8e\x9f\xb1\xfc\
-\xa1\xfbHj\xfd\xe0\x1e\x9dS>]\x95\x89\x87N\xd0\xfd\xf3\x0c\xe1Z\x8b\xd4\xb5\
-\xc3Lt\xe5\x18?>\xc3\xb2\xfbS\x84\xfd\x1f\xd1\xf7\xcb\x08\x89v\x97d\xd5\x1b8\
-\xd1\xedH?G\xc8{\x81\xcc\x11\x1b\xb3\xca\'\xd1!p\xd5\x1f\xa1\x841\xbf\x93\
-\xe13B\x8f\xb0o\xbe=\xcc\x19\x8d\x14\x82\xdb\xd1\x99D\x08\x81PaL~\x89\xcf$J\
-\x93\xf8\xfe-,Z\xdbA\xcf\xce\x7f\xc5\x19\x1b"\x9e\x8e\x93\xac\x8c \x8a\r\x9c\
-\xf9\xc1A\x8ac\xa3\x84\x12q\xa4i\xe2\x16\xa6\x18\xde\x9b\xa1\x94i\xa3\xe5\
-\xcb+1\xcc\x93\xe8n\n\xcdi\xa1\xeb\xc7?\xa046\x8a\x19\x8bbD" \\\n=\x1e\x8d\
-\xab\xb7\xa0\x05\x03\x08Z\xd0\x99\xc0wJ8\x13\xd3\x18\xb6\x85)4\xb4P\x9c\xb2~\
-\x00\xfc<!\xaf\x8d\xd3/\xbdHax\x98P2\x81\xb4,\xc6\x0f\x9dgt\xbfC\xe0U\x08\
-\xd7\xd7co\xba\x1d\xdd\xc9"?Ns\xcd\xed(\x05vU\x94\xaaZIa\xa4\x0f!%\x91\xc4\
-\x12\xf4P\x1cCe\x08\xe6\x94\xef\x04J\xfa\x98\xc6Z\x82\xe9.F\xcf\x8d1\xf5n\
-\x18\xbb:\xc5\xe2\xf5\xadT\xd5,\x077\x82\x11\x1c\xa3\xf0\x9e\xc6\xe2U-\x14\
-\xfdC\xc8r\x80\xaeuP\x19=F\xa2\xa6\x8eDU\x03\x05\x0ep\xa5\x9c.\xeba\xf6\xcc\
-\xb7\x879#X\x82\xe0nt1\x8e\x90 \x84M\x88wP\xf4\x02 5\x07\xbb\xfa>B\xd6\x10\
-\xce\xf8\xdbh\xac\xc6\x10\x1d\xf4\xed{\x8e\xca\xd8\xdb,\xbey;u7n\x03U\xc1+\
-\x95\x18\xd8\xf5/\x14{wS\xcc\xac$\xda\xbe\x08\x82\x1a\x06\xf6\xfe\x17\xde\
-\xc4\xbb\xb4\xdc\xf6\x08\xc9\x8e\r\xc8P\x80\xa6%\xf0\xdd\x12J\x9f\xc4\xd4;\
-\x11\xde\x16t1\x86\x97;\xcb\xb9\xffx\niJ\x84&i\xdc\xfc$\xb1e\xcbP~\x8e\xec\
-\xe9.\xdc\xd1\xc3,\xbe\xe5\x01\xean\xdc\x86\xd0\x03\x02\x07\x06_\x7f\x8e\xe9\
-3\xfb1t\ra\xd6\xa3{1\x06\xf6\xbe\xf0\xb1\x9a\xca\xdaE\xfc\xea;\x88\xb7=\xc9\
-\xd9\xe7\x9fB\xe8>\xed\xf7>\x81\xb0&\x91Z\x1d}\xfb~r\xe9|m\xf5(k\'\xc2\xdc\
-\x82.\xa70\xe5\x10-[\xff\x8cx\xfb*\x02\xd1\x8b\n\xbd\x03\xf9e\xd4\xaf3\xe9{\
-\xf5?)O\x7f\x19\xdb.\xa1\xfc\x14S=]\xe8\x0c\x91^\xf1\x10\x84\xfb\xb1\xc5kp\
-\x85\x94\x88\x1e\x1a\xbd\x8c^\xb8t\r?\x14Es$R\n\x08\xa2X\x93\x1ax\xb3\x19\
-\x94\x95\xc0\x0b"\x98e\x81\xe9G\x10*\x0e\x95\x00\xa7\xb7\x8f\xb0\xddH\xdd\
-\x86\x87\xd1*;\x91\xfeA\xa4\xf9\x00uk\x1fd\xa0\xfb$\xe5\x9e\x1e\xe2K\x1f\xc5\
-\xf7\x05N\xf79\xc2\xa1:j\xd6<\x80\xf4~\x84,\xee\x03\x99D\x13:\xb8SPN\xe1\x9b\
-\xa0\x95A/\x81\x15N\xa2[1\xa4\xa1a\xd9i4\xcfC\xc9V\xb2\x9d\xdf&\x1c\xaa\xa7n\
-\xfdvt\xf7\xa7\x88\xf2Q\x02\xebqjV\xdeC\xe9\xe4AtWG\xa8$\xf8\xa1Kk\xe6g@\xcf\
-\xe2[_\xc3TQ\xa4\x12hz\x15\x9a\xf3"\xbe\xf1\xf8\x9c\xf2U\xb5lG+\xee\xc5\xb7\
-\xe2h\x8eF8\xb2\x98x\xeb\x16t\xf7;\xe0\x1e\x85\x9c\x8f\xd2\xcbT-\xdbJ\xc8z\
-\x8d\xc9\xceC4m\xffS\xfc\xa0@\xee\xc8\xf3$\x9bVc\xa6\x96"\x0b\xbb \x07\\!g0:\
-\xbb\x97\xce\xb7\x87\xb9\x13\xaf\x85\x8d#\x88a\x1b$\xe0\x8c\xc0\x81Z\x98V`X\
-\xa8\r\x1b(\xf7\xbd\x83:\x15\xc6joENO\xe0\x8b4\xfe\x19\x81\x1eo\x84b\x08yh\
-\x10\x8a6Zc\x06\xab\xe1\x16\xb4\xe1F\x18\x8b\xa3\x8aIT\xa9\x84\xf7\x1e\x18\
-\xc9z\x82\x19\x03\xfd\xf0\x04\x14?\xfc\xa9\xb8\x1a\xe25\xb0.\x83\x18\x0ea\
-\xb9\xed\xb4n\xff\x0b\xb4X\x14\x82\x80`|\x10y\xf4,n\xf3"\xdc\x13e\x8cT#\xa2\
-\x92D\x1c\x98\x86\xbc\x8dl\x19\xc0\xa8\xbf\x01m\xa8\x1e\xe1\xa7\xc0O\xa2\xf2\
-\xea\xd2\x9a\xbf\xd6]?\x88\x1c\x0e!\xa4\x80r\x06\xbaR\x04K\xe5\x9c\xf2QH\xc2\
-\xd1&\xd8\x90\x80\xe1\xf8\xec\x165HCg\x14\xb2\xcd\x00\x88P\x05yc\x8ch\xe2Fr{\
-\xdf\xc1\xb9\xa1\x88\x93\xc9P9\xe6Q\x7f\xcb\xdd0\\\x80\x03!\x08.\xa39\xf3\
-\x7fD\x1f|\xe6\xf1\xf9\xf60g\x8cVA\xb2c\x9c\xe2\xa9%H4\x82\xc2$\xd3\xfb\xb7\
-\x82T\x98k\x03\xf4\x9c\xc7\xe07\x87(\x9e\xbe\x89\x9a\xfb\x1a)\x1dq0W\x15P\
-\xe5M\xe4\xced\xf1sS\xb8\xe1Gq\xde\xf5\x08/\xb3\x98\xe9\xecgzO\x07vC\x03\xc1\
-\xd4\x14"\x0cTn&\xbbg\x04\xf7\xe1\x11\xca\xea\xf7p\xf6x\xe8M:\xc6U\x1a\xce\
-\xe1\n~\xa6Dr\xf9\xe8\xac\x07\xa1\x81(\x92\xfdG\x81\xd7/\xf0\x06k\xd0\x1a\
-\x1aH\xfdm\x19?\xbb\x9ebW\x9e\xca\xc40n\xe8!J\xfb\x1d"\xcbB\xcc\xec\xebazO\
-\x07\xe1\xab\xd2\x04\xc5\x0cB\x06\x97\xd4,\xefs0\x96\x04$\xaf\x1d\xa7p\xbc\
-\x1d\x81$(\x8c\x91}e\x1dUO\x16\xe7\x94\xcf\x1b\xcf1\xb9\xe3\x8b$\xae\x1b\xa2\
-\xd8\xd54\xfb\x99\xb70\xcc\xc4\xf7\xef\xa0\xd2]\xb9\xd0\xc7\xe1\xbe\x10\xf1\
-\xb5\x0f2\xf8\xec\x0c\'\xffd\'\xaa\xe4a5\xdc\x81\xb5x#\xd9o\x0eQ\xfa\xc5\xef\
-\xcf\xdf\x04\x98\x07\xf4\x97\xd6l\x9co\x0fs\xa6\xba~\x86\xbb\xd9\xcb\xf9t5nI\
-R;8\x08\xf7Z\x14&!7\xec\xd2\xfd\r\x87l>\xcd5\x7fX\x8f\xb1\xbc\xc2\xeb;\x9a\
-\xb9.\xdeO\xec\xb1v\x8e\xfc\xfd\x19\x86\x9f\xdeK\xdb\xed\x8b\x90\xabm\xca\'\
-\n\x9c~-K\xa9\xb5\x9d\xba\xcd\t\xbaz]\x92\xe9\x1c\x91G\xda8\xfc\x0f\x01c\xdf\
-\xed\xa4\xed\xb6z\xd4\x1d1t\x0bt\xc3#\xf5\x95(\x07w\xb5r\xab\xdc\xc5\xf9t\n\
-\xa4F;\x83\xbc\x16\xbd\x87\x89T\nR 5\xc5\x97\xfa\x0e\xa2\xdf\xd7\xca\x91\xef\
-\xf5Q\xfc\xfeA\x1a\xd7\xd7\x12l4\x19x_3\xdf\xd4F\xaa\xce\xa2\xd5\xeb#7e\\R\
-\xf3\xcd\xd8j\x04\x0ew\x8b\x97\xe9\xa9\xa9FI\x83V\x91\xe1\x17\xa95\xac\xe9\
-\xed\x9d[\xbe\x01\x8f\xd3K\x97q\x97:D_*\x8e\x90\x92\xabU?\xbb\xafY\xcfD"r\
-\xa1\x8f\xe33\x82m\xcd\x1e\x93\xb7\xaeg\xe4\xc4\x10\x84u\xd6>\xb8\x99\xe9|\
-\x15/\xb9\t\x9c5W\xc6\xbb\xc7\xaf\xd1O\x07\xc5\xf9\xf60g\x1a\x83i\x1c\xa7\
-\x97q\xb7\xcc\xc4\x98N\xff\xd73\xa0\xe98\xae\x81\x12\x1a\x08\xc9\x92\x15\x1e\
-\x1d\xbf[\xe0\xed\xa3m\xbc\xd1\x13fT\x8f\xf0\xd8\xfd\xa3,\xdejp\xe4gyN={\x0e\
-%5\x02a\x10IJV\xdc%1kFxe\xc7\n\x1ak\x03\x1e\xdc6F\xdd\x174N\xef/p\xea[\xbd\
-\x17\xdaV7I\xee\xf9+\x83q\xcd\xc6)\x9fe\xbc\x12\xc1\x8aI\\g\x94s\x95<#\xc1\
-\xfb\x07k\x01x\x9dI\x1e\xde\x96\'\xb2Jrx\xdf8\x07\xdf\xca\xa2\xa4F\xac\xd6`\
-\xd15\x92\xa1\xb2\xc4\x8e\x16pJ\xe7x\xeb\xc8*~g\xf3\xc7k\x0e\xe9M\xb8n@\xb9\
-\xd8\xcd\xb0S\x8d\x1dw\xa98\xe3\x9c)\x17\x98>:\xb7|\xaf\xeeX\x81\x94\xd3\xb8\
-\xe53L\xbaE\xac*\x83\x8as\x96s\x95\xab\x19\t>tX9\x06M\xa7f\xa8\xdb\xdc\xc4\
-\x89\x93\x83\x84\x93&\r\x1b\xa3t\xbe3\xc9\xd1\xbc=O#?\x7f\xe8\x03\x03\x97\
-\xcfAa!W\xa0\\\xe8\xa6\xfd\x06A\xa53\x8c\xe3\x1a\x04B\'\x9a\x94\xd46\xbb\xb4\
-,wh^^f_g\x1b\xcf\xbf\xd4D\xa9\x9c!3\xa8\x90\xbe\xcd\xbd[\x0fS\xddjp\xf6m\x9b\
-R^\xc3\x8a\t\xae\xffb\x8eH5|\xeb\xdf\xef\xe2XW\x0eC\xd7P\x8e\xce\xfd\x8fvq\
-\xd5M\x1a\xc7\xf6F\x99\x1a\xb7\x88\xd7+V}!GOo\x9a\x83\x87\x97\xf1\xa5\xb5\
-\xdd,Y\x1d\xa5\xaa6 3`q\xfc\xe4\x0c\x8e[\xbe\xe03\x93QTGa\xeb\x13g8\x7f,\xc4\
-\x89\xb7\xc2h\xa6`\xdd\xd6\x1c\xcdW\x158\xb0+E,\xe5s\xeel\x15;^\xd9Hn\xf2\
-\x12\x9ao\xe7\x89W\xe5(\x15{hY9IC[\x89\xees1\xde=^@\xc0\x9c\xf3\xd5\xa6\xb38\
-\xc5\xc34\xaf\xd3\x89\xd7\x05\x0c\xf4\x8fs\xfc\xc4$\x8e\x9b\xbb\xa8\x9f\xf7\
-\x1f\xf4\xb8\x7f\x8bK\xc1-\xd3\xd4\x9eD\xc8q^\xdb]f`@~\xc6#>\xff\x88\x8d\x1b\
-_\xbdl\xd6L!`\xdb\xe6.n]\xd7C:UB\xc8Y\xeb\xb9\x9cIv\xc6bt2\xca\xcf\x7f\xb5\
-\x8cs\xe7\xab\xa9x\xf2\xa2\xe7\x96\xb7O\xb3i\xc5\x10-\x8d3(_\x11\xa0\xd1\xd5\
-\x93\xe4\xe0\x89:z\xfa\xa3\x17\xdaJ\xa9Xy\xf5$\x9b\xd7\x0e\x92N\x14\xa9T$J\
-\xea\xbc\xfb^5\xbb;\x1b\xc9\x17\x0c\xee\xbcu\x88\x8d\x1d\x93T\x02\x8d\x97\
-\xdfh\xe4\xc8\xa9\xaa\x8fx\rY>7\xaf\x1f\xe5\x86\x95C\xc8\xc0Cj0\x92\x8dr\xf6\
-|\x15\x9bV\x0c\x01\x82\x97\xdfX\xca\x91S\xd5\x97\xd4\xcc\xe5\r\x84\x80;o\x1d\
-aC\xc7\x04^ /\xd2\x9dk\xbe\xd9\xff\xe8eS\xc7\x10\x95@\xe3\xa57\xda8r\xea\xe2\
-\xfb\x0e\x86\x0e\x7f\xf3\xd5<\x95\xfe!^\xfdN/_\xf9\xa7\x0ez\xc6b|\xfd\xe9(W\
-\xe2\xd5:\xb1h\xd1w/\xbb\xd8B@\xd8\xfe\xc0\xb6\xe7\x81\xe3^\x19\x9f\x1d?m6\
-\xac\xa9\xf0\xbd\xa7\xa7x\xe6/\x07\xf0|\xc1\x9f\xff\xf3"\x9e\xf8j\x827\xf7\
-\x7f6W\t>o\xe8\x83\x83\x83\xf3\xeda\x81\xcf\x11\xd7m\x9f`j(\xcb\xf1\xb7\x0b<\
-\xf2T\x88\xae\x93\x0e\xaf\xee\\\xc4L\xee\xca\xdb^\xc1\xeci\xc2\x02\x0b\\ b;\
-\xc4b\x05\xee\xfbc\xd8|\xa7\xc3s/\x84\xaf\xd8\xe2\x00\xd0\xe7\xdb\xc0\x02\
-\x9f/\x9e\xfd\xb7Fl\xb3\x8e\xeax\xc0\xd3\xdf\x92\xbc\xf8\x93O\xe7v\xe4\xe5\
-\x82\x80\xaf]v\xef \x0b,\xf0Yq\xe5\xae\x9d\x0b,0\x07\x16\nd\x81\x05>\x86\xff\
-\x06`P\x96s\xd1\x83=\xe9\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory029Bitmap():
- return wxBitmapFromImage(getDocFactory029Image())
-
-def getDocFactory029Image():
- stream = cStringIO.StringIO(getDocFactory029Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory029')
-catalog['DocFactory029'] = ImageClass()
-catalog['DocFactory029'].getData = getDocFactory029Data
-catalog['DocFactory029'].getImage = getDocFactory029Image
-catalog['DocFactory029'].getBitmap = getDocFactory029Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory030Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rb\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19\xc8V\xa6\xd3\x0e%\xa5q\x12\x08abCblp\x1cy\x11\xc6\xab\x8c\xad\xc5Z\
-\x9ev\xe9Io\xbd\xf7\xdd{O\xff\x101\xb8\x04\xa4?\x00\xd9\xb5>\x7f\xbe9\xf7}\
-\xbf\xdfs\xceo\xce\xb9\xf7\xcc\x11\xff\xf0-\xa5Xd\x91E~\'z\xa8r\xa1-,\xb2\
-\xc8\xe5\x8b\x1e\\,\x90E\x16\xf9D\xf4pb\xa1-\xcc\x0f\x81\xc2\xc0F\xe2]\xf2\
-\xbb\x8b\x81\x8b\xf9\xc5y\x106\xda\xff\xf1\xa0\x80\xb2\n\xe0\xa1}.\xba\x12\
-\x1fS\x94\xf0\x91\x94\x95\x85B|.:\x8b|\x1c=\x14_h\x0bs#\xf0\xa9+\xec#\xea^\
-\xc0\xff\xc8\xdc\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xad\xcc\xe8\xcbp\t|N\x1e<\
-\x1a\xec7\xa9\xf0z.\xf1\x00\xa0[\n[\xab\xa2[\xdbA\x99\xd0g\xaa\xab\xe1\xb0\
-\xdc\xfd9\x81\xf2\x08\x9a!\x18\x93\xabH\xcb\x9b?S\x8dE>\x19=|\x05\x14\x88\
-\xc5(\r\xfas\x9c{\xad\x9a\xe9\xc1\x08 @J\xa4\xae\x08W\x15\x89\xd4\x16iY=\x89\
-c-\xa3/\xf8\xb78\xd4|\xe6\x1e\x82\x0c\xd3P|\x893?\x8d3\x9d\x0e\x80\x10 $\x00\
-\xb1z\x9bU\x0f\xbeM\xd1\xa8e\x82[?S\xdd\x10\xc3\xd4\xd9?\xe6\xe4\x8fS\xc4\
-\x96\x96h\xda\xd0A!x=e\xae\x80\x81\xfb\x7f\x80\x1e\xb9\x02\xfa9\xa4\x04\tm\
-\x1d\xc2/"5E0.0\x02\x02\x85\xa0\x94\x0f2zF\x92\x1fmd\xf5=\x12\xd3\xf8\r\xfd\
-\xe1\xfb.\xd9\x86\x08\xdfC\xb8e\x84\xef\xa1\xa4\x86\xd2\r\x94\xfc\xdd\xdb!\
-\xe1:H\xb7\x0cpI\xdb\x90\xd2\t\x8bkQn\x01\xa9q\xd1\x03\x08R\xcbMB\xa16\xcc`\
-\x03\x11\xf9\xf1\xff\xf1u\x13\xa5\xe9H\xa7\x08B\xe2\x1b\xd6l\x81\xcd\xa1)P\
-\xc4\xfd"\xe1\xfcJ$%\xb2\xe9\x18\xd7E-jB\xe3d\xe4\x87\x037\xaf|J}\xa8o\x06f5\
-\xbd2\xben\xcdj\x95\xed\xd9ff\xe0\xe3\xcf\x00\xbe\x19\xbc\xc4\xf3\xd5\x82^a\
-\x0e,\xb4\x879\xb1\x94\x03\xc6&\x0c\xfdmb)\x97\x1b\xff\xe8\x16\xb4P\x10\x94O\
-9o3\xd0\xd1\xc3\xc8\xa94\x17\x0e\xa7\xb8\xee\xae(\x8eq\x9e\x82\x08"\x94\x87\
-\x99\xe9\xc6\xcct\xe3\x15J\x08\xd4\xec\xe2\x13\x08`\xa7V\xe2T4\xc2\x07\x85$\
-\xfc2\xd6L\x0f\xc6d\x17\xcav\x005\xbb@\x18\x01\x8a\xd57\xa2\x85+\x91\x81[\
-\xb0\xac\xbdh)\x97\x1b\x9f\xd8\x8a\x11\t\x02`\x97\x15\x93F\x04\x19\x90\xc4\
-\xfc\x1e\xcc\xa9\xf3X3\xdd(\xdbE)\x05f\x10/X\x89YL\xa3\x148\xf1fJ\xa9\xb695\
-\xc3B\xa7\xd2\x9b!7\xb5\n\xdcv\x84\x06\xa5\xc2Z\x96Y\xa3\x0c\x19P\x92\xc6\
-\xfc\xf2)\x9f@\xfa\x08F.\x8d4$n\xb8\x0e\xad0\x86o\x97\x11\xa6\x85\xa3W#\xb3\
-\xe3\x08)\xb0\x97\xae\xc1\x8bV\x03`\xa4OcL\r\x80P\x94\xe3\x8d\x94\xebW.\xc0\
-\xe8/,z\x843\x0b\xedaN\x0c\xa1#\xcc\nt\x99C\x0f\n\x8cX\x8a\x8cU\xc0\x03\xacP\
-\x98\x96;6\xe2\xe5v\x93\x1b\xee\xa6\x90\xb9\x86\x845\x82n\xce\x10\xc9\x9eC/g\
-\x18:=\xc9\xf8\xf1,\x9e\xeb\xa3\x07u\xea\xb7$\xa8\x8b\rQ,.\xa1\x10\\\x8aT\
-\x1e\x91\xdcYTv\x9a\xfe\xb7\x87\xc9\r\xda\x08\r\xcc\x88A\xe5\rQ\xaaC#\xd8\
-\xa1\xcd\x08#\x85.\xf3\xe8A0\xa2)\n\x81\x12.\x1en\xd0\xc5a\x94\x88\x1a"\x9a\
-\xeb\x84\xd24\xc3\x1d\xe3d\xba\xf3\x00\xd4oI\x12o\x0c1zb\x1a=\xacS\xb5.C\xce\
-w\x08\xe5\xba?Q\xb3&<\x81Y\xb1\x8d\xe1Cg\x19<p\x08\xe5{()8\xbb\xeb\x17\xac|\
-\xe4\x01\x12Z?8\xc7\xe7\x95OW%b\x81St\xff2M\xa8\xda"y\xfd0\x13\x9dY\xc6O\xce\
-\xb0\xe2\xc1$!\xef\'\xf4\xfd:L\xbc\xd5!Q\xf1\x16vd\'\xd2\xcb\x12p_"},\x88Y\
-\xe1\x11o\x138\xeaOP\xc2X\xd8\xc9\xf0\x05\xa3\x879\xb0\xd0\x1e\xe6D#\x89\xe0\
-Nt&\x11B T\x08\x93_\xe31\x89\xd2$\x9ew\x1bK\xd6\xb7\xd1\xb3\xfb\xdf\xb1\xc7\
-\x86\x88\xa5b$\xca#\x88B\x1d\xe7~t\x98\xc2\xd8(\x81x\x0ci\x9a8\xf9)\x86\xf7\
-\xa7)\xa6[h\xfa\xeaj\x0c\xf34\xba\x93D\xb3\x9b\xe8\xfc\xe9\x8f(\x8e\x8dbF#\
-\x18\xe10\x08\x87|\x8fK\xfd\xdamh\xfe\x00\x82&t&\xf0\xec"\xf6\xc44F\xd0\xc2\
-\x14\x1aZ FI?\x04^\x8e\x80\xdb\xc2\xd9W^&?<L \x11GZ\x16\xe3G.0z\xd0\xc6w\xcb\
-\x84jk\tn\xb9\x13\xdd\xce ?Ms\xdd\x9d(\x05\xc1\x8a\x08\x15\xd5\x92\xfcH\x1fB\
-J\xc2\xf1e\xe8\x81\x18\x86J\xe3\xcf+\xdf)\x94\xf40\x8d\xf5\xf8\xd3\x9d\x8cv\
-\x8d1\xf5^\x88`e\x92\xa5\x1b\x9b\xa9\xa8Z\tN\x18\xc3?A\xfe}\x8d\xa5k\x9a(xG\
-\x90%\x1f]k\xa3<z\x82xU\r\xf1\x8a:\xf2\x1c\xe2j;U\xd6C\xec[h\x0fs"X\x86\xe0^\
-t1\x8e\x90 D\x90\x00\xef\xa2\xe8\x05@j6\xc1\xca\x07\x08XC\xd8\xe3G\xd1X\x8b!\
-\xda\xe8;\xf0\x02\xe5\xb1\xa3,\xbdu\'57\xef\x00U\xc6-\x16\x19\xd8\xf3o\x14z\
-\xf7RH\xaf&\xd2\xba\x04\xfc*\x06\xf6\xff\x0f\xee\xc4{4\xdd\xf1\x18\x89\xb6M\
-\xc8\x80\x8f\xa6\xc5\xf1\x9c"J\x9f\xc4\xd4\xdb\x11\xee6t1\x86\x9b=O\xd7\x7f=\
-\x834%B\x93\xd4o}\x9a\xe8\x8a\x15(/K\xe6l\'\xceh\x07Ko{\x88\x9a\x9bw t\x1f\
-\xdf\x86\xc17_`\xfa\xdcA\x0c]C\x98\xb5\xe8n\x94\x81\xfd/}\xaa\xa6\xb2\xf6\
-\x10\xbb\xf6.b-Os\xfe\xc5g\x10\xbaG\xeb\xfdO!\xacI\xa4VC\xdf\x81\x9f\xcd\x9d\
-\xaf\xa5\x16e\xedF\x98\xdb\xd0\xe5\x14\xa6\x1c\xa2i\xfb_\x10k]\x83/zQ\x81w!\
-\xb7\x82\xda\r&}\xaf\xff7\xa5\xe9\xaf\x12\x0c\x16Q^\x92\xa9\x9eNt\x86H\xadz\
-\x04B\xfd\x04\xc5\x1bp\x95\x95\x88\x1e\x18\xbd\x02^\xbct\r/\x10A\xb3%R\n\xf0\
-#X\x93\x1a\xb8\xb3\xde\x95\x15\xc7\xf5\xc3\x98%\x81\xe9\x85\x11*\x06e\x1f\
-\xbb\xb7\x8fP\xb0\x9e\x9aM\x8f\xa2\x95w#\xbd\xc3H\xf3!j\xd6?\xcc@\xf7iJ==\
-\xc4\x96?\x8e\xe7\t\xec\xee.B\x81\x1a\xaa\xd6=\x84t\x7f\x82,\x1c\x00\x99@\
-\x13:8SPJ\xe2\x99\xa0\x95@/\x82\x15J\xa0[Q\xa4\xa1a\x05Sh\xae\x8b\x92\xcdd\
-\xda\xbfK(PK\xcd\xc6\x9d\xe8\xce\xcf\x11\xa5\xe3\xf8\xd6\x93T\xad\xbe\x8f\
-\xe2\xe9\xc3\xe8\x8e\x8eP\t\xf0\x02sk\xe6f@\xcf\xe0Y\xdf\xc0T\x11\xa4\x12hz\
-\x05\x9a\xfd2\x9e\xf1\xe4\xbc\xf2U4\xedD+\xec\xc7\xb3bh\xb6F(\xbc\x94X\xf36t\
-\xe7{\xe0\x1c\x87\xac\x87\xd2KT\xac\xd8N\xc0z\x83\xc9\xf6#4\xec\xfcs<?O\xf6\
-\xd8\x8b$\x1a\xd6b&\x97#\xf3{ \x0b\\eg0:{\x97/\xb4\x87\xb9\x89U\xc3\xe6\x11\
-\xc4p\x10$`\x8f\xc0\xa1j\x98V`X\xa8M\x9b(\xf5\xbd\x8b:\x13\xc2jmFNO\xe0\x89\
-\x14\xde9\x81\x1e\xab\x87B\x00yd\x10\nA\xb4\xfa4V\xddmh\xc3\xf50\x16C\x15\
-\x12\xa8b\x11\xf7}0\x12\xb5\xf83\x06z\xc7\x04\x14>\xfa\xa9\xb8\x12bU\xb0!\
-\x8d\x18\x0e`9\xad4\xef\xfc+\xb4h\x04|\x1f\x7f|\x10y\xfc<N\xe3\x12\x9cS%\x8c\
-d=\xa2\x9c@\x1c\x9a\x86\\\x10\xd94\x80Q{\x13\xdaP-\xc2K\x82\x97@\xe5\xd4\xdc\
-\x9a\xbf\xd5\xdd8\x88\x1c\x0e \xa4\x80R\x1a:\x93\xf8\xcb\xe5\xbc\xf2\x91O\
-\xc0\xf1\x06\xd8\x14\x87\xe1\xd8\xec\x16\xd5OA{\x042\x8d\x00\x88@\x19ys\x94H\
-\xfcf\xb2\xfb\xdf\xc5\xbe\xa9\x80\x9dNS>\xe1R{\xdb\xbd0\x9c\x87C\x01\xf0\xaf\
-\x80\xb9\xf2\x19\xa3\x0f>\xf7\xe4B{\x98\x13\xa3Y\x90h\x1b\xa7pf\x19\x12\r??\
-\xc9\xf4\xc1\xed \x15\xe6z\x1f=\xeb2\xf8\xed!\ngo\xa1\xea\x81z\x8a\xc7l\xcc5\
-yTi\x0b\xd9s\x19\xbc\xec\x14N\xe8q\xec\xf7\\B+,f\xda\xfb\x99\xde\xd7F\xb0\
-\xae\x0e\x7fj\n\x11\x02\xca\xb7\x92\xd97\x82\xf3\xe8\x08%\xf5\x07\xd8\xfb\\\
-\xf4\x06\x1d\xe3\x1a\r\xbb\xa3\x8c\x97.\x92X9:\xebAh \nd\xfeY\xe0\xf6\x0b\
-\xdc\xc1*\xb4\xba:\x92\x7f_\xc2\xcbl\xa4\xd0\x99\xa3<1\x8c\x13x\x84\xe2A\x9b\
-\xf0\x8a\x003\x07z\x98\xde\xd7F\xe8\x9a\x14~!\x8d\x90\xfe\x9c\x9a\xa5\x036\
-\xc62\x9f\xc4\xf5\xe3\xe4O\xb6"\x90\xf8\xf912\xafm\xa0\xe2\xe9\xc2\xbc\xf2\
-\xb9\xe3Y&w}\x99\xf8\rC\x14:\x1bf?\xf3\xe6\x87\x99\xf8\xe1]\x94\xbb\xcb\x17\
-\xfb8\xd4\x17 \xb6\xfea\x06\x9f\x9f\xe1\xf4\x9f\xedF\x15]\xac\xba\xbb\xb0\
-\x96n&\xf3\xed!\x8a\xbf\xfa\xc3\x85\x9b\x00\x0b\x88\xfe\xca\xba\xcd\x0b\xeda\
-N*kg\xb8\x97\xfd\\HU\xe2\x14%\xd5\x83\x83p\xbfE~\x12\xb2\xc3\x0e\xdd\xdf\xb2\
-\xc9\xe4R\\\xf7\xc7\xb5\x18+\xcb\xbc\xb9\xab\x91\x1bb\xfdD\x9fh\xe5\xd8?\x9e\
-c\xf8\xd9\xfd\xb4\xdc\xb9\x04\xb96H\xe9T\x9e\xb3od(6\xb7R\xb35Ng\xafC"\x95%\
-\xfcX\x0b\x1d\xff\xe43\xf6\xfdvZ\xee\xa8E\xdd\x15E\xb7@7\\\x92_\x8bpxO3\xb7\
-\xcb=\\H%Aj\xb42\xc8\x1b\x91\xfb\x98H&!\tRS|\xa5\xef0\xfa\x03\xcd\x1c\xfbA\
-\x1f\x85\x1f\x1e\xa6~c5\xfef\x93\x81\x0f4s\r-$k,\x9a\xdd>\xb2S\xc6\x9c\x9aoG\
-\xd7"\xb0\xb9W\xbcJOU%J\x1a4\x8b4\xbfJ\xaec]o\xef\xfc\xf2\r\xb8\x9c]\xbe\x82\
-{\xd4\x11\xfa\x921\x84\x94\\\xab\xfa\xd9{\xddF&\xe2\xe1\x8b}\x1c\x9b\x11\xec\
-ht\x99\xbc}##\xa7\x86 \xa4\xb3\xfe\xe1\xadL\xe7*x\xc5\x89c\xaf\xbb\xba\xde=~\
-\x8b~\xd6/,\xb4\x879\xa9\xf7\xa7\xb1\xed^\xc6\x9d\x12\x13c:\xfd\xdfL\x83\xa6\
-c;\x06Jh $\xcbV\xb9\xb4\xfd~\x9e\xa3\xc7[x\xab\'\xc4\xa8\x1e\xe6\x89\x07GY\
-\xba\xdd\xe0\xd8/r\x9cy\xbe\x0b%5|a\x10NHV\xdd#1\xabFxm\xd7*\xea\xab}\x1e\
-\xde1F\xcd\x974\xce\x1e\xccs\xe6;\xbd\x17\xdbV6H\xee\xfb\x1b\x83q-\x88]:\xcf\
-x9\x8c\x15\x958\xf6(]\xe5\x1c#\xfe\x07\x07k>\xb8\xed\t\x1e\xdd\x91#\xbcF\xd2\
-q`\x9c\xc3\xefdPR#Zm\xb0\xe4:\xc9PI\x12\x8c\xe4\xb1\x8b]\xbcsl\r\xbf\xb7\xf5\
-\xd35\x87\xf4\x06\x1c\xc7\xa7T\xe8f\xd8\xae$\x18s(\xdb\xe3\x9c+\xe5\x99>>\
-\xbf|\xaf\xefZ\x85\x94\xd38\xa5sL:\x05\xac\n\x83\xb2}\x9e\xae\xf2\xb5\x8c\
-\xf8\x1f9\xac\x1c\x83\x8633\xd4lm\xe0\xd4\xe9AB\t\x93\xba\xcd\x11\xda\xdf\
-\x9d\xe4x.\xb8@#\xbf\xf0\xe8\x03\x03\x97\xffAa>\x9b\xa7\x94\xef\xa6\xf5&A\
-\xb9=\x84\xed\x18\xf8B\'\x92\x90T7:4\xad\xb4i\\Y\xe2@{\x0b/\xbe\xd2@\xb1\x94\
-&=\xa8\x90^\x90\xfb\xb7wP\xd9lp\xfeh\x90bN\xc3\x8a\nn\xfcr\x96p%|\xe7?\xef\
-\xe1Dg\x16C\xd7P\xb6\xce\x83\x8fwr\xcd-\x1a\'\xf6G\x98\x1a\xb7\x88\xd5*\xd6|\
-)KOo\x8a\xc3\x1d+\xf8\xca\xfan\x96\xad\x8dPQ\xed\x93\x1e\xb08yz\x06\xdb)]\
-\xf4\x99N+*#\xb0\xfd\xa9s\\8\x11\xe0\xd4;!4S\xb0a{\x96\xc6k\xf2\x1c\xda\x93$\
-\x9a\xf4\xe8:_\xc1\xae\xd76\x93\x9d\x9cC\xf3h\x8eXE\x96b\xa1\x87\xa6\xd5\x93\
-\xd4\xb5\x14\xe9\xee\x8a\xf2\xde\xc9<\x02\xe6\x9d\xaf:\x95\xc1.t\xd0\xb8A\'V\
-\xe33\xd0?\xce\xc9S\x93\xd8N\xf6\x92~>x\xd8\xe5\xc1m\x0ey\xa7DCk\x02!\xc7yco\
-\x89\x81\x01\xf9\x05\x8f\xf8\xe5\x83\xd8\xbc\xf9\xf5\xcb~\xed\x14\x02vl\xed\
-\xe4\xf6\r=\xa4\x92E\x84\x9c\xb5\x9c\xcd\x9adf,F\'#\xfc\xf27+\xe8\xbaPI\xd9\
-\x95\x97<\xb7\xb2u\x9a-\xab\x86h\xaa\x9fAy\n\x1f\x8d\xce\x9e\x04\x87O\xd5\
-\xd0\xd3\x1f\xb9\xd8VJ\xc5\xeak\'\xd9\xba~\x90T\xbc@\xb9,QR\xe7\xbd\xf7+\xd9\
-\xdb^O.op\xf7\xedCln\x9b\xa4\xeck\xbc\xfaV=\xc7\xceT|\xcck\xc0\xf2\xb8u\xe3(\
-7\xad\x1eB\xfa.R\x83\x91L\x84\xf3\x17*\xd8\xb2j\x08\x10\xbc\xfa\xd6r\x8e\x9d\
-\xa9\x9cS3\x9b3\x10\x02\xee\xbe}\x84Mm\x13\xb8\xbe\xbcDw\xbe\xf9f\xff\xa3\
-\x97-mC\x94}\x8dW\xdej\xe1\xd8\x99K\xef9\x18:\xfc\xdd\xd7s\x94\xfb\x87x\xfd{\
-\xbd|\xed_\xda\xe8\x19\x8b\xf2\xcdg#\\\xcdW\xea\xc4\x92%\xdf\xbfb\xe2\x0b\
-\x01\xa1\xe0\x87v]\x17l\xe7\xea\xfa\xec\xf8y\xb1i]\x99\x1f<;\xc5s\x7f=\x80\
-\xeb\t\xfe\xf2_\x97\xf0\xd4\xd7\xe3\xbc}\xf0\x8b\xb9Jp\xb9\xa2\x0f\x0e\x0e.\
-\xb4\x87E.\x03n\xd89\xc1\xd4P\x86\x93G\xf3<\xf6L\x80\xce\xd36\xaf\xef^\xc2L\
-\xf6\xea\xdd^\xc1\xec\xa9\xc2"\x8b\x10\x0e\xdaD\xa3y\x1e\xf8S\xd8z\xb7\xcd\
-\x0b/\x85\xae\xfa\xe2\x00\xd0\x17\xda\xc0"\x97\x07\xcf\xffG=A\xb3\x86\xca\
-\x98\xcf\xb3\xdf\x91\xbc\xfc\xb3\xcf\xe7v\xe4\x95\x86\x80o\\1\xef \x8b,\xf2E\
-\xb3\xb8\x86.\xb2\xc8\xa7\xb0X \x8b,\xf2)\xfc/D\xe4\x96s\x02\xa7\xcb\xe2\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory030Bitmap():
- return wxBitmapFromImage(getDocFactory030Image())
-
-def getDocFactory030Image():
- stream = cStringIO.StringIO(getDocFactory030Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory030')
-catalog['DocFactory030'] = ImageClass()
-catalog['DocFactory030'].getData = getDocFactory030Data
-catalog['DocFactory030'].getImage = getDocFactory030Image
-catalog['DocFactory030'].getBitmap = getDocFactory030Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory031Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rb\
-IDATx\x9c\xed\x9bYl]\xc7y\xc7\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`\xa7Ij\x14-\\\xa7n\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xda,k\xa5,\
-\x89\xa4\xb8\\\xee\xe4%\xefz\xce=\xe7L\x1f\xe8\xc8V\x1dJz\xb0M\xb6\xba\xbf\
-\xc7\x839\xe7\xff\xfff\xe6\xc3\xcc\x99\x0f#\xfe\xee[JQ\xa1B\x85\xdf\x8a\x1e\
-\xaa\x9eo\x0b\x15*,\\\xf4`%A*T\x98\x13=\x9c\x98o\x0b\x97G\xa00\xb0\x91x\x97<\
-w1p1\xbf8\x0f\xc2F\xfb_\x1e\x14PV\x01<\xb4\xcfEW\xe2c\x8a\x12>\x92\xb2\xb2P\
-\x88\xcfE\xa7\xc2\xdc\xe8\xa1\xf8|[\x98\x1b\x81OCa\x0fQ\xf7\x02\xfe\'\xe6\
-\xa6\x94 M\x9d\xbc\x1b\'\x17lgF_\x82K\xe0s\xf2\xe0\xd1d\xbfM\x95\xd7s\x89\
-\x07\x00\xddR\xd8Z\r\xdd\xda6\xca\x84>S]\r\x87\xa5\xee\xcf\x08\x94G\xd0\x0c\
-\xc1\x98\\AZ\xde\xfa\x99jT\xb82zx\x01\'\x88\xc5(M\xfa\x0b\x9c}\xa3\x96\xe9\
-\xc1\x08 @J\xa4\xae\x08\xd7\x14\x89\xd4\x17i[9\x89c-\xa1/\xf8\xd78\xd4}\xe6\
-\x1e\x82\x0c\xd3T|\x85\xd3?\x893\x9d\x0e\x80\x10 $\x00\xb1F\x9b\x15\x0f\xbfK\
-\xd1\xa8g\x82\xdb?S\xdd\x10\xc34\xd8?\xe2\xc4\x8fR\xc4\x16\x97hYw\x84B\xf0F\
-\xca,\xe0\x01\xfb\x7f\x88\x1eY\xc0\xfd\x1dR\x82\x84\xb6\x06\xe1\x17\x91\x9a"\
-\x18\x17\x18\x01\x81BP\xca\x07\x19=-\xc9\x8f6\xb3\xf2>\x89i\xfc\x9a\xfe\xf0\
-\x03\x97lC\x84\xef!\xdc2\xc2\xf7PRC\xe9\x06J\xfe\xf6\xed\x90p\x1d\xa4[\x06\
-\xb8\xa4mH\xe9\x84\xc5\xf5(\xb7\x80\xd4\xb8\xe8\x01\x04\xa9\xa5&\xa1P\x07f\
-\xb0\x89\x88\xfc\xf4w|\xddDi:\xd2)\x82\x90\xf8\x865\x9b`W\xd0\x14(\xe2~\x91p\
-~9\x92\x12\xd9t\x8c\x1b\xa2\x16u\xa1q2\xf2\xe3\x01\xbb\xaa\xf8\x94\xfaX\xdf\
-\x0c\xccjze|\xdd\x9a\xd5*\xdb\xb3\xcd\xcc\xc0\xa7\xdf\x01|3x\x89\xe7k\r\xbd\
-\xca\x1c\x98o\x0fsb)\x07\x8c\r\x18\xfa\xbb\xc4R.7\xff\xc1mh\xa1 (\x9fr\xdef\
-\xe0H\x0f#\'\xd3\\8\x98\xe2\x86{\xa28\xc69\n"\x88P\x1ef\xa6\x1b3\xd3\x8dW(!P\
-\xb3\x8bO \x80\x9dZ\x8eS\xd5\x0c\x1f%\x92\xf0\xcbX3=\x18\x93\xe7Q\xb6\x03\
-\xa8\xd9\x05\xc2\x08P\xac\xbd\x19-\\\x8d\x0c\xdc\x86e\xedFK\xb9\xdc\xfc\xd4f\
-\x8cH\x10\x00\xbb\xac\x984"\xc8\x80$\xe6\xf7`N\x9d\xc3\x9a\xe9F\xd9.J)0\x83x\
-\xc1j\xccb\x1a\xa5\xc0\x89\xb7RJu\\Q3,t\xaa\xbd\x19rS+\xc0\xedDhP*\xacf\x895\
-\xca\x90\x01%i\\]|\xca\'\x90>\x84\x91K#\r\x89\x1bn@+\x8c\xe1\xdbe\x84i\xe1\
-\xe8\xb5\xc8\xec8B\n\xec\xc5\xab\xf0\xa2\xb5\x00\x18\xe9S\x18S\x03 \x14\xe5x\
-3\xe5\xc6\xe5\xf30\xfa\x0b\x03=\xc2\xe9\xf9\xf60\'\x86\xd0\x11f\x15\xba\xcc\
-\xa1\x07\x05F,E\xc6*\xe0\x01V(L\xdb]\xeb\xf1r;\xc9\rwS\xc8\\G\xc2\x1aA7g\x88\
-d\xcf\xa2\x973\x0c\x9d\x9ad\xfcX\x16\xcf\xf5\xd1\x83:\x8d\x9b\x124\xc4\x86(\
-\x16\x17Q\x08.F*\x8fH\xee\x0c*;M\xff\xbb\xc3\xe4\x06m\x84\x06f\xc4\xa0\xfa\
-\xa6(\xb5\xa1\x11\xec\xd0F\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\x17\x0f7\
-\xe8\xe20JD\r\x11\xcduAi\x9a\xe1#\xe3d\xba\xf3\x004nJ\x12o\x0e1z|\x1a=\xacS\
-\xb3&C\xcew\x08\xe5\xba\xe7\xd4\xac\x0bO`Vma\xf8\xc0\x19\x06\xf7\x1d@\xf9\
-\x1eJ\n\xce\xec\xf89\xcb\x1f{\x88\x84\xd6\x0f\xce\xb1\xab\x8aOW%b\x81\x93t\
-\xff"M\xa8\xd6"y\xe30\x13]Y\xc6O\xcc\xb0\xec\xe1$!\xef\xc7\xf4\xfd*L\xbc\xdd\
-!Q\xf5\x0evd;\xd2\xcb\x12p_!}4\x88Y\xe5\x11\xef\x108\xea\x8fP\xc2\x98\xdf\
-\xc90O\xe8a\xf6\xcd\xb7\x879\xd1H"\xb8\x1b\x9dI\x84\x10\x08\x15\xc2\xe4WxL\
-\xa24\x89\xe7\xdd\xc1\xa2\xb5\x1d\xf4\xec\xfc7\xec\xb1!b\xa9\x18\x89\xf2\x08\
-\xa2\xd0\xc0\xd9\x1f\x1e\xa406J \x1eC\x9a&N~\x8a\xe1\xbdi\x8a\xe96Z\xbe\xba\
-\x12\xc3<\x85\xee$\xd1\xec\x16\xba~\xf2C\x8ac\xa3\x98\xd1\x08F8\x0c\xc2!\xdf\
-\xe3\xd2\xb8z\x0b\x9a?\x80\xa0\x05\x9d\t<\xbb\x88=1\x8d\x11\xb40\x85\x86\x16\
-\x88Q\xd2\x0f\x80\x97#\xe0\xb6q\xe6\xb5W\xc9\x0f\x0f\x13H\xc4\x91\x96\xc5\
-\xf8\xa1\x0b\x8c\xee\xb7\xf1\xdd2\xa1\xfaz\x82\x9b\xeeF\xb73\xc8\xcbi\xae\
-\xb9\x1b\xa5 X\x15\xa1\xaaV\x92\x1f\xe9CHI8\xbe\x04=\x10\xc3Pi\xfc\xab\x8a\
-\xef$Jz\x98\xc6Z\xfc\xe9.F\xcf\x8f1\xf5A\x88`u\x92\xc5\xeb[\xa9\xaaY\x0eN\
-\x18\xc3?N\xfeC\x8d\xc5\xabZ(x\x87\x90%\x1f]\xeb\xa0<z\x9cxM\x1d\xf1\xaa\x06\
-\xf2\x1c\xe0Z\xad&\xeb!\xf6\xcc\xb7\x879\x11,Ap?\xba\x18GH\x10"H\x80\xf7Q\
-\xf4\x02 5\x9b`\xf5C\x04\xac!\xec\xf1\xc3h\xac\xc6\x10\x1d\xf4\xed{\x89\xf2\
-\xd8a\x16\xdf\xbe\x9d\xba[\xb7\x81*\xe3\x16\x8b\x0c\xec\xfaW\n\xbd\xbb)\xa4W\
-\x12i_\x04~\r\x03{\xff\x1bw\xe2\x03Z\xeez\x82D\xc7\x06d\xc0G\xd3\xe2xN\x11\
-\xa5Ob\xea\x9d\x08w\x0b\xba\x18\xc3\xcd\x9e\xe3\xfc\x7f>\x874%B\x934n~\x96\
-\xe8\xb2e(/K\xe6L\x17\xce\xe8\x11\x16\xdf\xf1\x08u\xb7nC\xe8>\xbe\r\x83o\xbf\
-\xc4\xf4\xd9\xfd\x18\xba\x860\xeb\xd1\xdd(\x03{_\xb9\xac\xa6\xb2v\x11\xbb\
-\xfe\x1ebm\xcfr\xee\xe5\xe7\x10\xbaG\xfb\x83\xcf \xacI\xa4VG\xdf\xbe\x9f^9\
-\xbe\xb6z\x94\xb5\x13anA\x97S\x98r\x88\x96\xad\x7fF\xac}\x15\xbe\xe8E\x05\
-\xde\x87\xdc2\xea\xd7\x99\xf4\xbd\xf9_\x94\xa6\xbfJ0XDyI\xa6z\xba\xd0\x19"\
-\xb5\xe21\x08\xf5\x13\x14o\xc15\x9a"z`t\x01\xff\x80\xe9\x1a^ \x82fK\xa4\x14\
-\xe0G\xb0&5pg=++\x8e\xeb\x871K\x02\xd3\x0b#T\x0c\xca>vo\x1f\xa1`#u\x1b\x1eG+\
-\xefDz\x07\x91\xe6#\xd4\xad}\x94\x81\xeeS\x94zz\x88-}\x12\xcf\x13\xd8\xdd\
-\xe7\t\x05\xea\xa8Y\xf3\x08\xd2\xfd1\xb2\xb0\x0fd\x02M\xe8\xe0LA)\x89g\x82V\
-\x02\xbd\x08V(\x81nE\x91\x86\x86\x15L\xa1\xb9.J\xb6\x92\xe9\xfc\x17B\x81z\
-\xea\xd6oGw~\x86(\x1d\xc3\xb7\x9e\xa6f\xe5\x03\x14O\x1dDwt\x84J\x80\x17\xb8\
-\xb2fn\x06\xf4\x0c\x9e\xf5\rL\x15A*\x81\xa6W\xa1\xd9\xaf\xe2\x19O_U|U-\xdb\
-\xd1\n{\xf1\xac\x18\x9a\xad\x11\n/&\xd6\xba\x05\xdd\xf9.8\xc7 \xeb\xa1\xf4\
-\x12U\xcb\xb6\x12\xb0\xdeb\xb2\xf3\x10M\xdb\xff\x14\xcf\xcf\x93=\xfa2\x89\
-\xa6\xd5\x98\xc9\xa5\xc8\xfc.\xc8\x02\xd7h\rFg\xf7\xd2\xf9\xf607\xb1Z\xd88\
-\x82\x18\x0e\x82\x04\xec\x118P\x0b\xd3\n\x0c\x0b\xb5a\x03\xa5\xbe\xf7Q\xa7CX\
-\xed\xad\xc8\xe9\t<\x91\xc2;+\xd0c\x8dP\x08 \x0f\rB!\x88\xd6\x98\xc6j\xb8\
-\x03m\xb8\x11\xc6b\xa8B\x02U,\xe2~\x08F\xa2\x1e\x7f\xc6@?2\x01\x85O\x1e\x15W\
-C\xac\x06\xd6\xa5\x11\xc3\x01,\xa7\x9d\xd6\xed\x7f\x81\x16\x8d\x80\xef\xe3\
-\x8f\x0f"\x8f\x9d\xc3i^\x84s\xb2\x84\x91lD\x94\x13\x88\x03\xd3\x90\x0b"[\x06\
-0\xeaoA\x1b\xaaGxI\xf0\x12\xa8\x9c\xba\xb2\xe6ot\xd7\x0f"\x87\x03\x08)\xa0\
-\x94\x86\xae$\xfeRyU\xf1\x91O\xc0\xb1&\xd8\x10\x87\xe1\xd8\xec\x16\xd5OAg\
-\x042\xcd\x00\x88@\x19yk\x94H\xfcV\xb2{\xdf\xc7\xbe\xa5\x80\x9dNS>\xeeR\x7f\
-\xc7\xfd0\x9c\x87\x03\x01\xf0\x17\xf0\x1c\xf9\x9c\xd1\x07_xz\xbe=\xcc\x89\
-\xd1*Ht\x8cS8\xbd\x04\x89\x86\x9f\x9fdz\xffV\x90\ns\xad\x8f\x9eu\x19\xfc\xf6\
-\x10\x853\xb7Q\xf3P#\xc5\xa36\xe6\xaa<\xaa\xb4\x89\xec\xd9\x0c^v\n\'\xf4$\
-\xf6\x07.\xa1e\x163\x9d\xfdL\xef\xe9 \xd8\xd0\x80?5\x85\x08\x01\xe5\xdb\xc9\
-\xec\x19\xc1y|\x84\x92\xfa=\xec=.z\x93\x8eq\x9d\x86}\xa4\x8c\x97.\x92X>:\xeb\
-Ah \nd\xfeQ\xe0\xf6\x0b\xdc\xc1\x1a\xb4\x86\x06\x92\x7f[\xc2\xcb\xac\xa7\xd0\
-\x95\xa3<1\x8c\x13x\x8c\xe2~\x9b\xf0\xb2\x003\xfbz\x98\xde\xd3A\xe8\xba\x14~\
-!\x8d\x90\xfe\x155K\xfbl\x8c%>\x89\x1b\xc7\xc9\x9fhG \xf1\xf3cd\xdeXG\xd5\
-\xb3\x85\xab\x8a\xcf\x1d\xcf2\xb9\xe3\xcb\xc4o\x1a\xa2\xd0\xd54{\xcc\x9b\x1f\
-f\xe2\x07\xf7P\xee._\xec\xe3P_\x80\xd8\xdaG\x19|q\x86S\x7f\xb2\x13Ut\xb1\x1a\
-\xee\xc1Z\xbc\x91\xcc\xb7\x87(\xfe\xf2\xf7\xe7o\x02,\x00\xf4\xd7\xd6l\x9co\
-\x0fsR]?\xc3\xfd\xec\xe5B\xaa\x1a\xa7(\xa9\x1d\x1c\x84\x07-\xf2\x93\x90\x1dv\
-\xe8\xfe\x96M&\x97\xe2\x86?\xac\xc7X^\xe6\xed\x1d\xcd\xdc\x14\xeb\'\xfaT;G\
-\xff\xfe,\xc3\xcf\xef\xa5\xed\xeeE\xc8\xd5AJ\'\xf3\x9cy+C\xb1\xb5\x9d\xba\
-\xcdq\xbaz\x1d\x12\xa9,\xe1\'\xda8\xf2\x0f>c\xdf\xeb\xa4\xed\xaez\xd4=Qt\x0b\
-t\xc3%\xf9\xb5\x08\x07w\xb5r\xa7\xdc\xc5\x85T\x12\xa4F;\x83\xbc\x15y\x80\x89\
-d\x12\x92 5\xc5W\xfa\x0e\xa2?\xd4\xca\xd1\xef\xf7Q\xf8\xc1A\x1a\xd7\xd7\xe2o\
-4\x19\xf8H3\xd7\xd4F\xb2\xce\xa2\xd5\xed#;e\\Q\xf3\xdd\xe8j\x046\xf7\x8b\xd7\
-\xe9\xa9\xa9FI\x83V\x91\xe6\x97\xc95\xac\xe9\xed\xbd\xba\xf8\x06\\\xce,]\xc6\
-}\xea\x10}\xc9\x18BJ\xaeW\xfd\xec\xbea=\x13\xf1\xf0\xc5>\x8e\xcd\x08\xb65\
-\xbbL\xde\xb9\x9e\x91\x93C\x10\xd2Y\xfb\xe8f\xa6sU\xbc\xe6\xc4\xb1\xd7\\\x9b\
-\xff\x1e\xbfA?\xe3\x17\xe6\xdb\xc3\x9c4\xfa\xd3\xd8v/\xe3N\x89\x891\x9d\xfeo\
-\xa6A\xd3\xb1\x1d\x03%4\x10\x92%+\\:~7\xcf\xe1cm\xbc\xd3\x13bT\x0f\xf3\xd4\
-\xc3\xa3,\xdejp\xf4\xe79N\xbfx\x1e%5|a\x10NHV\xdc\'1kFxc\xc7\n\x1ak}\x1e\xdd\
-6F\xdd\x974\xce\xec\xcfs\xfa;\xbd\x17\xdbV7I\x1e\xf8+\x83q-\x88]:\xc7x9\x8c\
-\x15\x958\xf6(\xe7\xcb9F\xfc\x8f\nk>\xb8\x9d\t\x1e\xdf\x96#\xbcJrd\xdf8\x07\
-\xdf\xcb\xa0\xa4F\xb4\xd6`\xd1\r\x92\xa1\x92$\x18\xc9c\x17\xcf\xf3\xde\xd1U\
-\xfc\xce\xe6\xcbk\x0e\xe9M8\x8eO\xa9\xd0\xcd\xb0]M0\xe6P\xb6\xc79[\xca3}\xec\
-\xea\xe2{s\xc7\n\xa4\x9c\xc6)\x9de\xd2)`U\x19\x94\xeds\x9c/_\xcf\x88\xff\x89\
-b\xe5\x184\x9d\x9e\xa1ns\x13\'O\r\x12J\x984l\x8c\xd0\xf9\xfe$\xc7r\xc1y\x1a\
-\xf9\x85\x83>0\xb0p\x0b\x85\xf9l\x9eR\xbe\x9b\xf6[\x04\xe5\xce\x10\xb6c\xe0\
-\x0b\x9dHBR\xdb\xec\xd0\xb2\xdc\xa6yy\x89}\x9dm\xbc\xfcZ\x13\xc5R\x9a\xf4\
-\xa0BzA\x1e\xdcz\x84\xeaV\x83s\x87\x83\x14s\x1aVTp\xf3\x97\xb3\x84\xab\xe1;\
-\xffq\x1f\xc7\xbb\xb2\x18\xba\x86\xb2u\x1e~\xb2\x8b\xebn\xd38\xbe7\xc2\xd4\
-\xb8E\xac^\xb1\xeaKYzzS\x1c<\xb2\x8c\xaf\xac\xedf\xc9\xea\x08U\xb5>\xe9\x01\
-\x8b\x13\xa7f\xb0\x9d\xd2E\x9f\xe9\xb4\xa2:\x02[\x9f9\xcb\x85\xe3\x01N\xbe\
-\x17B3\x05\xeb\xb6fi\xbe.\xcf\x81]I\xa2I\x8f\xf3\xe7\xaa\xd8\xf1\xc6F\xb2\
-\x93W\xd0<\x9c#V\x95\xa5X\xe8\xa1e\xe5$\rmE\xba\xcfG\xf9\xe0D\x1e\x01W\x1d_m\
-*\x83]8B\xf3:\x9dX\x9d\xcf@\xff8\'NNb;\xd9K\xfay\xffA\x97\x87\xb78\xe4\x9d\
-\x12M\xed\t\x84\x1c\xe7\xad\xdd%\x06\x06\xe4\x17<\xe2\x0b\x0f\xb1q\xe3\x9b\
-\x0bv\r\x15\x02\xb6m\xee\xe2\xceu=\xa4\x92E\x84\x9c\xb5\x9a\xcd\x9adf,F\'#\
-\xfc\xe2\xd7\xcb8\x7f\xa1\x9a\xb2+/yoy\xfb4\x9bV\x0c\xd1\xd28\x83\xf2\x14>\
-\x1a]=\t\x0e\x9e\xac\xa3\xa7?r\xb1\xad\x94\x8a\x95\xd7O\xb2y\xed \xa9x\x81rY\
-\xa2\xa4\xce\x07\x1fV\xb3\xbb\xb3\x91\\\xde\xe0\xde;\x87\xd8\xd81I\xd9\xd7x\
-\xfd\x9dF\x8e\x9e\xae\xfa\x94\xd7\x80\xe5q\xfb\xfaQnY9\x84\xf4]\xa4\x06#\x99\
-\x08\xe7.T\xb1i\xc5\x10 x\xfd\x9d\xa5\x1c=]}E\xcdl\xce@\x08\xb8\xf7\xce\x116\
-tL\xe0\xfa\xf2\x12\xdd\xab\x8do\xf6\x1b\xbdl\xea\x18\xa2\xeck\xbc\xf6N\x1bGO\
-_z\xbf\xc1\xd0\xe1o\xbe\x9e\xa3\xdc?\xc4\x9b\xdf\xed\xe5k\xff\xd4A\xcfX\x94o\
->\x1f\xa1r\x95\x0e\xc4\xa2E\xdf[\xf0\xdd \x04\x84\x82\x1f\xdbt]\xb0\x9dk\xf3\
-\xd8\xf1\xb3f\xc3\x9a2\xdf\x7f~\x8a\x17\xfer\x00\xd7\x13\xfc\xf9?/\xe2\x99\
-\xaf\xc7yw\xff\x17s\x95`\xa1\xa3\x0f\x0e\x0e\xce\xb7\x87\n\xf3\xc8M\xdb\'\
-\x98\x1a\xcap\xe2p\x9e\'\x9e\x0b\xd0u\xca\xe6\xcd\x9d\x8b\x98\xc9V\xb6W0[]\
-\xa8p\r\x13\x0e\xdaD\xa3y\x1e\xfac\xd8|\xaf\xcdK\xaf\x84*\xc9\xf1\t\xf4\xf96\
-Pa~y\xf1\xdf\x1b\t\x9auT\xc7|\x9e\xff\x8e\xe4\xd5\x9f~>\xb7#\xff\xaf"\xe0\
-\x1b\x0b\xfe\x1f\xa4B\x85\xf9\xa2\xb2\x96V\xa8p\x19*\tR\xa1\xc2e\xf8\x1f)x\
-\x96s\xfb\xc1\xd7\xb6\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory031Bitmap():
- return wxBitmapFromImage(getDocFactory031Image())
-
-def getDocFactory031Image():
- stream = cStringIO.StringIO(getDocFactory031Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory031')
-catalog['DocFactory031'] = ImageClass()
-catalog['DocFactory031'].getData = getDocFactory031Data
-catalog['DocFactory031'].getImage = getDocFactory031Image
-catalog['DocFactory031'].getBitmap = getDocFactory031Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory032Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rb\
-IDATx\x9c\xed\x9bYl]\xc7y\xc7\x7f3g\xbb+\xef\xc2\xcbU")\x91\x94m\xd9\x94d\
-\xed\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb>\xe41(\x82\x02E\
-\x17\xa3A`\xa7Ij\x14-\\\xa7n\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xda,k\xa5,\
-\x89\xa4\xb8\\\xee\xe4%\xefz\xce=\xe7L\x1f\xe8\xd8V\xe9X|\xb0M\x06\xba\xbf\
-\xc7\x839\xe7\xff\xff\xbe\x99\x0f3g\x06#\xfe\xe1[JQ\xa1B\x85OD\x0fU/\xb4\x85\
-\n\x15\x16/z\xb0R \x15*\xfcV\xf4pb\xa1-|2\x02\x85\x81\x8d\xc4\xbb\xec\xb9\
-\x8b\x81\x8b\xf9\xc5y\x106\xda\xff\xf3\xa0\x80\xb2\n\xe0\xa1}.\xba\x12\x1fS\
-\x94\xf0\x91\x94\x95\x85B|.:\x15\xae\x8c\x1e\x8a/\xb4\x85\xb9\x08|\x1a\n\xfb\
-\x88\xba\x97\xf0?66\xa5\x04i\xea\xe4\xdd8\xb9`;3\xfa2\\\x02\x9f\x93\x07\x8f&\
-\xfbM\xaa\xbc\x9e\xcb<\x00\xe8\x96\xc2\xd6j\xe8\xd6vP&\xf4\x99\xeaj8,w\x7fF\
-\xa0<\x82f\x08\xc6\xe4*\xd2\xf2\xe6\xcfT\xa3\xc2\xfc\xd1\xc3\x8b\xb0@,Fi\xd2\
-\x9f\xe3\xfck\xb5L\x0fF\x00\x01R"uE\xb8\xa6H\xa4\xbeH\xdb\xeaI\x1ck\x19}\xc1\
-\xbf\xc5\xa1\xee3\xf7\x10d\x98\xa6\xe2K\x9c\xfdI\x9c\xe9t\x00\x84\x00!\x01\
-\x885\xda\xacz\xf0m\x8aF=\x13\xdc\xfa\x99\xea\x86\x18\xa6\xc1\xfe\x11\xa7~\
-\x94"\xb6\xb4D\xcb\x86c\x14\x82\xd7Sf\x11v\xd4U\x80\x1eY\x84y\x0f)AB[\x87\
-\xf0\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9e\x95\xe4G\x9bY}\x8f\xc44~M\
-\x7f\xf8\xbe\xcb\x96!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%?y9$\\\x07\xe9\x96\
-\x01.k\x1bR:aq-\xca- 5>\xf4\x00\x82\xd4r\x93P\xa8\x033\xd8DD\xce\xfd\x8e\xaf\
-\x9b(MG:E\x10\x12\xdf\xb0f\x0b\xec\n\x9a\x02E\xdc/\x12\xce\xafDR"\x9b\x8eq]\
-\xd4\xa2.4NF~\xd4Q\xf3\x8aO\xa9\x8f\xf4\xcd\xc0\xac\xa6W\xc6\xd7\xadY\xad\
-\xb2=\xdb\xcc\x0c\xcc}\x07\xf0\xcd\xe0e\x9e\xafV\xf4*s`\xa1=\xcc\xc1R\x0e\
-\x18\x9b0\xf4\xb7\x89\xa5\\n\xfc\xa3[\xd0BAP>\xe5\xbc\xcd\xc0\xb1\x1eFN\xa7\
-\xb9t8\xc5uwEq\x8c\x0b\x14D\x10\xa1<\xccL7f\xa6\x1b\xafPB\xa0f\'\x9f@\x00;\
-\xb5\x12\xa7\xaa\x19>($\xe1\x97\xb1fz0&/\xa2l\x07P\xb3\x13\x84\x11\xa0X{#Z\
-\xb8\x1a\x19\xb8\x05\xcb\xda\x8b\x96r\xb9\xf1\x89\xad\x18\x91 \x00vY1iD\x90\
-\x01I\xcc\xef\xc1\x9c\xba\x805\xd3\x8d\xb2]\x94R`\x06\xf1\x82\xd5\x98\xc54J\
-\x81\x13o\xa5\x94\xea\xb8\xa2fX\xe8T{3\xe4\xa6V\x81\xdb\x89\xd0\xa0TX\xcb2k\
-\x94!\x03J\xd2\x98_|\xca\'\x90>\x82\x91K#\r\x89\x1bn@+\x8c\xe1\xdbe\x84i\xe1\
-\xe8\xb5\xc8\xec8B\n\xec\xa5k\xf0\xa2\xb5\x00\x18\xe93\x18S\x03 \x14\xe5x3\
-\xe5\xc6\x95\x0b\xd0\xfb\x8b\x0b=\xc2\xd9\x85\xf60\x07C\xe8\x08\xb3\n]\xe6\
-\xd0\x83\x02#\x96"c\x15\xf0\x00+\x14\xa6\xed\x8e\x8dx\xb9\xdd\xe4\x86\xbb)d\
-\xae!a\x8d\xa0\x9b3D\xb2\xe7\xd1\xcb\x19\x86\xceL2~"\x8b\xe7\xfa\xe8A\x9d\
-\xc6-\t\x1abC\x14\x8bK(\x04\x97"\x95G$w\x0e\x95\x9d\xa6\xff\xedar\x836B\x033\
-bP}C\x94\xda\xd0\x08vh3\xc2H\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\
-\x18%\xa2\x86\x88\xe6\xba\xa04\xcd\xf0\xb1q2\xddy\x00\x1a\xb7$\x897\x87\x18=\
-9\x8d\x1e\xd6\xa9Y\x97!\xe7;\x84r\xdd\xbfU\xb3.<\x81Y\xb5\x8d\xe1C\xe7\x18<p\
-\x08\xe5{()8\xb7\xeb\xe7\xac|\xe4\x01\x12Z?8\'\xe6\x15\x9f\xaeJ\xc4\x02\xa7\
-\xe9\xfeE\x9aP\xadE\xf2\xfaa&\xba\xb2\x8c\x9f\x9aa\xc5\x83IB\xde\x8f\xe9\xfb\
-U\x98x\xbbC\xa2\xea-\xec\xc8N\xa4\x97%\xe0\xbeD\xfax\x10\xb3\xca#\xde!p\xd4\
-\x9f\xa0\x84\xb1\xb0\x83a\x81\xd1\xc3\x1cXh\x0fs\xd0H"\xb8\x13\x9dI\x84\x10\
-\x08\x15\xc2\xe4WxL\xa24\x89\xe7\xdd\xc6\x92\xf5\x1d\xf4\xec\xfe\x0f\xec\xb1\
-!b\xa9\x18\x89\xf2\x08\xa2\xd0\xc0\xf9\x1f\x1e\xa606J \x1eC\x9a&N~\x8a\xe1\
-\xfdi\x8a\xe96Z\xbe\xba\x1a\xc3<\x83\xee$\xd1\xec\x16\xba~\xf2C\x8ac\xa3\x98\
-\xd1\x08F8\x0c\xc2!\xdf\xe3\xd2\xb8v\x1b\x9a?\x80\xa0\x05\x9d\t<\xbb\x88=1\
-\x8d\x11\xb40\x85\x86\x16\x88Q\xd2\x0f\x81\x97#\xe0\xb6q\xee\x95\x97\xc9\x0f\
-\x0f\x13H\xc4\x91\x96\xc5\xf8\x91K\x8c\x1e\xb4\xf1\xdd2\xa1\xfaz\x82[\xeeD\
-\xb73\xc8O\xd3\\w\'JA\xb0*BU\xad$?\xd2\x87\x90\x92p|\x19z \x86\xa1\xd2\xf8\
-\xf3\x8a\xef4Jz\x98\xc6z\xfc\xe9.F/\x8e1\xf5^\x88`u\x92\xa5\x1b[\xa9\xaaY\tN\
-\x18\xc3?I\xfe}\x8d\xa5kZ(xG\x90%\x1f]\xeb\xa0<z\x92xM\x1d\xf1\xaa\x06\xf2\
-\x1c\xe2j?E\xd6C\xec[h\x0fs\x10,Cp/\xba\x18GH\x10"H\x80wQ\xf4\x02 5\x9b`\xf5\
-\x03\x04\xac!\xec\xf1\xa3h\xac\xc5\x10\x1d\xf4\x1dx\x81\xf2\xd8Q\x96\xde\xba\
-\x93\xba\x9bw\x80*\xe3\x16\x8b\x0c\xec\xf9w\n\xbd{)\xa4W\x13i_\x02~\r\x03\
-\xfb\xff\x17w\xe2=Z\xeex\x8cD\xc7&d\xc0G\xd3\xe2xN\x11\xa5Ob\xea\x9d\x08w\
-\x1b\xba\x18\xc3\xcd^\xe0\xe2\x7f?\x834%B\x934n}\x9a\xe8\x8a\x15(/K\xe6\\\
-\x17\xce\xe81\x96\xde\xf6\x10u7\xef@\xe8>\xbe\r\x83o\xbe\xc0\xf4\xf9\x83\x18\
-\xba\x860\xeb\xd1\xdd(\x03\xfb_\xfaTMe\xed!v\xed]\xc4\xda\x9e\xe6\xc2\x8b\
-\xcf t\x8f\xf6\xfb\x9fBX\x93H\xad\x8e\xbe\x03?\xbdr|m\xf5(k7\xc2\xdc\x86.\
-\xa70\xe5\x10-\xdb\xff\x82X\xfb\x1a|\xd1\x8b\n\xbc\x0b\xb9\x15\xd4o0\xe9{\
-\xfd\x7f(M\x7f\x95`\xb0\x88\xf2\x92L\xf5t\xa13Dj\xd5#\x10\xea\'(\xde\x80\xab\
-\xbcD\xf4\xc0\xe8"\xfc\x11\xd35\xbc@\x04\xcd\x96H)\xc0\x8f`Mj\xe0\xcezUV\x1c\
-\xd7\x0fc\x96\x04\xa6\x17F\xa8\x18\x94}\xec\xde>B\xc1F\xea6=\x8aV\xde\x8d\
-\xf4\x0e#\xcd\x87\xa8[\xff0\x03\xddg(\xf5\xf4\x10[\xfe8\x9e\'\xb0\xbb/\x12\n\
-\xd4Q\xb3\xee!\xa4\xfbcd\xe1\x00\xc8\x04\x9a\xd0\xc1\x99\x82R\x12\xcf\x04\
-\xad\x04z\x11\xacP\x02\xdd\x8a"\r\r+\x98Bs]\x94l%\xd3\xf9o\x84\x02\xf5\xd4m\
-\xdc\x89\xee\xfc\x0cQ:\x81o=I\xcd\xea\xfb(\x9e9\x8c\xee\xe8\x08\x95\x00/pe\
-\xcd\xdc\x0c\xe8\x19<\xeb\x1b\x98*\x82T\x02M\xafB\xb3_\xc63\x9e\x9cW|U-;\xd1\
-\n\xfb\xf1\xac\x18\x9a\xad\x11\n/%\xd6\xba\r\xdd\xf9.8\' \xeb\xa1\xf4\x12U+\
-\xb6\x13\xb0\xde`\xb2\xf3\x08M;\xff\x1c\xcf\xcf\x93=\xfe"\x89\xa6\xb5\x98\
-\xc9\xe5\xc8\xfc\x1e\xc8\x02W\xf9\x19\x8c\xce\xde\xe5\x0b\xeda.\xb1Z\xd8<\
-\x82\x18\x0e\x82\x04\xec\x118T\x0b\xd3\n\x0c\x0b\xb5i\x13\xa5\xbewQgCX\xed\
-\xad\xc8\xe9\t<\x91\xc2;/\xd0c\x8dP\x08 \x8f\x0cB!\x88\xd6\x98\xc6j\xb8\rm\
-\xb8\x11\xc6b\xa8B\x02U,\xe2\xbe\x0fF\xa2\x1e\x7f\xc6@?6\x01\x85\x8fo\x15WC\
-\xac\x066\xa4\x11\xc3\x01,\xa7\x9d\xd6\x9d\x7f\x85\x16\x8d\x80\xef\xe3\x8f\
-\x0f"O\\\xc0i^\x82s\xba\x84\x91lD\x94\x13\x88C\xd3\x90\x0b"[\x060\xeaoB\x1b\
-\xaaGxI\xf0\x12\xa8\x9c\xba\xb2\xe6ot7\x0e"\x87\x03\x08)\xa0\x94\x86\xae$\
-\xfer9\xaf\xf8\xc8\'\xe0D\x13l\x8a\xc3plv\x89\xea\xa7\xa03\x02\x99f\x00D\xa0\
-\x8c\xbc9J$~3\xd9\xfd\xefb\xdfT\xc0N\xa7)\x9ft\xa9\xbf\xed^\x18\xce\xc3\xa1\
-\x00\xf8\x8bpl|\xc1\xe8\x83\xcf=\xb9\xd0\x1e\xe6`\xb4\n\x12\x1d\xe3\x14\xce.\
-C\xa2\xe1\xe7\'\x99>\xb8\x1d\xa4\xc2\\\xef\xa3g]\x06\xbf=D\xe1\xdc-\xd4<\xd0\
-H\xf1\xb8\x8d\xb9&\x8f*m!{>\x83\x97\x9d\xc2\t=\x8e\xfd\x9eKh\x85\xc5Lg?\xd3\
-\xfb:\x0864\xe0OM!B@\xf9V2\xfbFp\x1e\x1d\xa1\xa4\xfe\x00{\x9f\x8b\xde\xa4c\\\
-\xa3a\x1f+\xe3\xa5\x8b$V\x8e\xcez\x10\x1a\x88\x02\x99\x7f\x16\xb8\xfd\x02w\
-\xb0\x06\xad\xa1\x81\xe4\xdf\x97\xf02\x1b)t\xe5(O\x0c\xe3\x04\x1e\xa1x\xd0&\
-\xbc"\xc0\xcc\x81\x1e\xa6\xf7u\x10\xba&\x85_H#\xa4\x7fE\xcd\xd2\x01\x1bc\x99\
-O\xe2\xfaq\xf2\xa7\xda\x11H\xfc\xfc\x18\x99\xd76P\xf5ta^\xf1\xb9\xe3Y&w}\x99\
-\xf8\rC\x14\xba\x9af\xb7y\xf3\xc3L\xfc\xe0.\xca\xdd\xe5\x0fs\x1c\xea\x0b\x10\
-[\xff0\x83\xcf\xcfp\xe6\xcfv\xa3\x8a.V\xc3]XK7\x93\xf9\xf6\x10\xc5_\xfe\xe1\
-\xc2\r\x80E\x84\xfe\xca\xba\xcd\x0b\xeda\x0e\xd5\xf53\xdc\xcb~.\xa5\xaaq\x8a\
-\x92\xda\xc1A\xb8\xdf"?\t\xd9a\x87\xeeo\xd9dr)\xae\xfb\xe3z\x8c\x95e\xde\xdc\
-\xd5\xcc\r\xb1~\xa2O\xb4s\xfc\x1f\xcf3\xfc\xec~\xda\xee\\\x82\\\x1b\xa4t:\
-\xcf\xb972\x14[\xdb\xa9\xdb\x1a\xa7\xab\xd7!\x91\xca\x12~\xac\x8dc\xff\xe43\
-\xf6\xbdN\xda\xee\xa8G\xdd\x15E\xb7@7\\\x92_\x8bpxO+\xb7\xcb=\\J%Aj\xb43\xc8\
-\x1b\x91\xfb\x98H&!\tRS|\xa5\xef0\xfa\x03\xad\x1c\xff~\x1f\x85\x1f\x1c\xa6qc\
--\xfef\x93\x81\x0f4sMm$\xeb,Z\xdd>\xb2S\xc6\x155\xdf\x8e\xaeE`s\xafx\x95\x9e\
-\x9aj\x944h\x15i~\x99\\\xc7\xba\xde\xde\xf9\xc57\xe0rn\xf9\n\xeeQG\xe8K\xc6\
-\x10Rr\xad\xeag\xefu\x1b\x99\x88\x87?\xccqlF\xb0\xa3\xd9e\xf2\xf6\x8d\x8c\
-\x9c\x1e\x82\x90\xce\xfa\x87\xb72\x9d\xab\xe2\x15\'\x8e\xbd\xee\xea\xfe\xf7\
-\xf8\r\xfa9\xbf\xb0\xd0\x1e\xe6\xd0\xe8Oc\xdb\xbd\x8c;%&\xc6t\xfa\xbf\x99\
-\x06M\xc7v\x0c\x94\xd0@H\x96\xadr\xe9\xf8\xfd<GO\xb4\xf1VO\x88Q=\xcc\x13\x0f\
-\x8e\xb2t\xbb\xc1\xf1\x9f\xe78\xfb\xfcE\x94\xd4\xf0\x85A8!Yu\x8f\xc4\xac\x19\
-\xe1\xb5]\xabh\xac\xf5yx\xc7\x18u_\xd28w0\xcf\xd9\xef\xf4~\xd8\xb6\xbaIr\xdf\
-\xdf\x18\x8ckA\xec\xd2\x05\xc6\xcba\xac\xa8\xc4\xb1G\xb9X\xce1\xe2\x7fp\xb0\
-\xe6\x83\xdb\x99\xe0\xd1\x1d9\xc2k$\xc7\x0e\x8cs\xf8\x9d\x0cJjDk\r\x96\\\'\
-\x19*I\x82\x91<v\xf1"\xef\x1c_\xc3\xefm\xfdt\xcd!\xbd\t\xc7\xf1)\x15\xba\x19\
-\xb6\xab\t\xc6\x1c\xca\xf68\xe7Ky\xa6O\xcc/\xbe\xd7w\xadB\xcai\x9c\xd2y&\x9d\
-\x02V\x95A\xd9\xbe\xc0\xc5\xf2\xb5\x8c\xf8\x1f;\xac\x1c\x83\xa6\xb33\xd4mm\
-\xe2\xf4\x99AB\t\x93\x86\xcd\x11:\xdf\x9d\xe4D.\xb8@=\xbf\xf8\xd0\x07\x06\
-\x16\xdfAa>\x9b\xa7\x94\xef\xa6\xfd&A\xb93\x84\xed\x18\xf8B\'\x92\x90\xd46;\
-\xb4\xac\xb4i^Y\xe2@g\x1b/\xbe\xd2D\xb1\x94&=\xa8\x90^\x90\xfb\xb7\x1f\xa3\
-\xba\xd5\xe0\xc2\xd1 \xc5\x9c\x86\x15\x15\xdc\xf8\xe5,\xe1j\xf8\xce\x7f\xdd\
-\xc3\xc9\xae,\x86\xae\xa1l\x9d\x07\x1f\xef\xe2\x9a[4N\xee\x8f05n\x11\xabW\
-\xac\xf9R\x96\x9e\xde\x14\x87\x8f\xad\xe0+\xeb\xbbY\xb66BU\xadOz\xc0\xe2\xd4\
-\x99\x19l\xa7\xf4\xa1\xcftZQ\x1d\x81\xedO\x9d\xe7\xd2\xc9\x00\xa7\xdf\t\xa1\
-\x99\x82\r\xdb\xb34_\x93\xe7\xd0\x9e$\xd1\xa4\xc7\xc5\x0bU\xeczm3\xd9\xc9+h\
-\x1e\xcd\x11\xab\xcaR,\xf4\xd0\xb2z\x92\x86\xb6"\xdd\x17\xa3\xbcw*\x8f\x80y\
-\xc7W\x9b\xca`\x17\x8e\xd1\xbcA\'V\xe73\xd0?\xce\xa9\xd3\x93\xd8N\xf6\xb2<\
-\x1f<\xec\xf2\xe06\x87\xbcS\xa2\xa9=\x81\x90\xe3\xbc\xb1\xb7\xc4\xc0\x80\xfc\
-\x82{|\xf1"6o~}\xd1\xcd\xa5B\xc0\x8e\xad]\xdc\xbe\xa1\x87T\xb2\x88\x90\xb3\
-\x16\xb3Y\x93\xcc\x8c\xc5\xe8d\x84_\xfcz\x05\x17/USv\xe5e\xef\xadl\x9ff\xcb\
-\xaa!Z\x1agP\x9e\xc2G\xa3\xab\'\xc1\xe1\xd3u\xf4\xf4G>l+\xa5b\xf5\xb5\x93l]?\
-H*^\xa0\\\x96(\xa9\xf3\xde\xfb\xd5\xec\xedl$\x977\xb8\xfb\xf6!6wLR\xf65^}\
-\xab\x91\xe3g\xab\xe6x\rX\x1e\xb7n\x1c\xe5\xa6\xd5CH\xdfEj0\x92\x89p\xe1R\
-\x15[V\r\x01\x82W\xdfZ\xce\xf1\xb3\xd5W\xd4\xcc\xe6\x0c\x84\x80\xbbo\x1faS\
-\xc7\x04\xae//\xd3\x9do|\xb3\xdf\xe8eK\xc7\x10e_\xe3\x95\xb7\xda8~\xf6\xf2{\
-\r\x86\x0e\x7f\xf7\xf5\x1c\xe5\xfe!^\xffn/_\xfb\x97\x0ez\xc6\xa2|\xf3\xd9\
-\x08\x95+t\x1f!\x96,\xf9\xde\xa2M\x87\x10\x10\n~d\xcfu\xc1v\xae\xeem\xc7\xcf\
-\x8aM\xeb\xca|\xff\xd9)\x9e\xfb\xeb\x01\\O\xf0\x97\xff\xba\x84\xa7\xbe\x1e\
-\xe7\xed\x83_\xccU\x82\xdf\x15\xf4\xc1\xc1\xc1\x85\xf6Pa\x01\xb8a\xe7\x04SC\
-\x19N\x1d\xcd\xf3\xd83\x01\xba\xce\xd8\xbc\xbe{\t3\xd9\xca\xf2\xea\xe3T\xb2q\
-\x95\x12\x0e\xdaD\xa3y\x1e\xf8S\xd8z\xb7\xcd\x0b/\x85*\xc5\xf1\t\xe8\x0bm\
-\xa0\xc2\xc2\xf0\xfc\x7f6\x124\xeb\xa8\x8e\xf9<\xfb\x1d\xc9\xcb?\xfd|nG\xfe\
-\xae#\xe0\x1b\x8b\xf6\x1f\xa4B\x85\x85\xa62\xa7V\xa8\xf0)T\n\xa4B\x85O\xe1\
-\xff\x00\x0e\x0c\x96s\xfbJR\xd9\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory032Bitmap():
- return wxBitmapFromImage(getDocFactory032Image())
-
-def getDocFactory032Image():
- stream = cStringIO.StringIO(getDocFactory032Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory032')
-catalog['DocFactory032'] = ImageClass()
-catalog['DocFactory032'].getData = getDocFactory032Data
-catalog['DocFactory032'].getImage = getDocFactory032Image
-catalog['DocFactory032'].getBitmap = getDocFactory032Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory033Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ra\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0N\x93\xd4(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\n\xb5Y\xd6JY\x12Iq\
-\xb9\xdc\xc9K\xde\xf5\x9c{\xce\x99\xfe\xa0K[\xb5#\xb1\x80m\xb2\xf5}~\x1e\xcc\
-9\xef\xfb}3\x1ff\xce\x0cF\xfc\xcd\xb7\x94\xa2B\x85\n\x9f\x88\x1e\xaa^h\x0b\
-\x15*,^\xf4`\xa5@*T\xf8\x8d\xe8\xe1\xc4B[\xb8\x1c\x81\xc2\xc0F\xe2]\xf6\xdc\
-\xc5\xc0\xc5\xfc\xfc<\x08\x1b\xed\x7fxP@Y\x05\xf0\xd0>\x13]\x89\x8f)J\xf8H\
-\xca\xcaB!>\x13\x9d\n\xf3G\x0f\xc5\x17\xda\xc2\x87\x08|\x1a\n\xfb\x88\xba\
-\x97\xf0?26\xa5\x04i\xea\xe4\xdd8\xb9`;3\xfa2\\\x02\x9f\x91\x07\x8f&\xfbM\
-\xaa\xbc\x9e\xcb<\x00\xe8\x96\xc2\xd6j\xe8\xd6vP&\xf4\xa9\xeaj8,w\x7fF\xa0<\
-\x82f\x08\xc6\xe4*\xd2\xf2\xe6OU\xa3\xc2\xff\x1e=\xbc\x88\n\xc4b\x94&\xfd9\
-\xce\xbfV\xcb\xf4`\x04\x10 %RW\x84k\x8aD\xea\x8b\xb4\xad\x9e\xc4\xb1\x96\xd1\
-\x17\xfcK\x1c\xea>u\x0fA\x86i*\xbe\xc4\xd9\x9f\xc4\x99N\x07@\x08\x10\x12\x80\
-X\xa3\xcd\xaa\x07\xdf\xa6h\xd43\xc1\xad\x9f\xaan\x88a\x1a\xec\x1fq\xeaG)bKK\
-\xb4l8F!x=e\x16Q\x07}\x01\xd1#\x8b(\xff!%Hh\xeb\x10~\x11\xa9)\x82q\x81\x11\
-\x10(\x04\xa5|\x90\xd1\xb3\x92\xfch3\xab\xef\x91\x98\xc6\xaf\xe9\x0f\xdfw\
-\xd92D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\xe4\'/\x87\x84\xeb \xdd2\xc0emCJ\',\xae\
-E\xb9\x05\xa4\xc6\x9c\x07\x10\xa4\x96\x9b\x84B\x1d\x98\xc1&"\xf2\xe3\xdf\xf1\
-u\x13\xa5\xe9H\xa7\x08B\xe2\x1b\xd6l\x81]ES\xa0\x88\xfbE\xc2\xf9\x95HJd\xd31\
-\xae\x8bZ\xd4\x85\xc6\xc9\xc8\x0f;h^\xf1)\xf5\xa1\xbe\x19\x98\xd5\xf4\xca\
-\xf8\xba5\xabU\xb6g\x9b\x99\x81\x8f\xbf\x03\xf8f\xf02\xcf_t\xf4*s`\xa1=\xcca\
-)\x07\x8cM\x18\xfa\xdb\xc4R.7\xfe\xde-h\xa1 (\x9fr\xdef\xe0X\x0f#\xa7\xd3\\:\
-\x9c\xe2\xba\xbb\xa28\xc6\x05\n"\x88P\x1ef\xa6\x1b3\xd3\x8dW(!P\xb3\x93O \
-\x80\x9dZ\x89S\xd5\x0c\x1f\x14\x92\xf0\xcbX3=\x18\x93\x17Q\xb6\x03\xa8\xd9\t\
-\xc2\x08P\xac\xbd\x11-\\\x8d\x0c\xdc\x82e\xedEK\xb9\xdc\xf8\xc4V\x8cH\x10\
-\x00\xbb\xac\x984"\xc8\x80$\xe6\xf7`N]\xc0\x9a\xe9F\xd9.J)0\x83x\xc1j\xccb\
-\x1a\xa5\xc0\x89\xb7RJu\\U3,t\xaa\xbd\x19rS\xab\xc0\xedDhP*\xace\x995\xca\
-\x90\x01%i\xcc/>\xe5\x13H\x1f\xc1\xc8\xa5\x91\x86\xc4\r7\xa0\x15\xc6\xf0\xed\
-2\xc2\xb4p\xf4Zdv\x1c!\x05\xf6\xd25x\xd1Z\x00\x8c\xf4\x19\x8c\xa9\x01\x10\
-\x8ar\xbc\x99r\xe3\xca\x05\xe8\xfd\xc5\x89\x1e\xe1\xecB{\x98\xc3\x10:\xc2\
-\xacB\x979\xf4\xa0\xc0\x88\xa5\xc8X\x05<\xc0\n\x85i\xbbc#^n7\xb9\xe1n\n\x99k\
-HX#\xe8\xe6\x0c\x91\xecy\xf4r\x86\xa13\x93\x8c\x9f\xc8\xe2\xb9>zP\xa7qK\x82\
-\x86\xd8\x10\xc5\xe2\x12\n\xc1\xa5H\xe5\x11\xc9\x9dCe\xa7\xe9\x7f{\x98\xdc\
-\xa0\x8d\xd0\xc0\x8c\x18T\xdf\x10\xa564\x82\x1d\xda\x8c0R\xe82\x8f\x1e\x04#\
-\x9a\xa2\x10(\xe1\xe2\xe1\x06]\x1cF\x89\xa8!\xa2\xb9.(M3|l\x9cLw\x1e\x80\xc6\
--I\xe2\xcd!FON\xa3\x87uj\xd6e\xc8\xf9\x0e\xa1\\\xf7o\xd4\xac\x0bO`Vmc\xf8\
-\xd09\x06\x0f\x1cB\xf9\x1eJ\n\xce\xed\xfa9+\x1fy\x80\x84\xd6\x0f\xce\x89y\
-\xc5\xa7\xab\x12\xb1\xc0i\xba\x7f\x91&Tk\x91\xbc~\x98\x89\xae,\xe3\xa7fX\xf1\
-`\x92\x90\xf7c\xfa~\x15&\xde\xee\x90\xa8z\x0b;\xb2\x13\xe9e\t\xb8/\x91>\x1e\
-\xc4\xac\xf2\x88w\x08\x1c\xf5\x07(a,\xec`X$\xe8a\x0e,\xb4\x8794\x92\x08\xeeD\
-g\x12!\x04B\x850\xf9\x15\x1e\x93(M\xe2y\xb7\xb1d}\x07=\xbb\xff\x05{l\x88X*F\
-\xa2<\x82(4p\xfe\x87\x87)\x8c\x8d\x12\x88\xc7\x90\xa6\x89\x93\x9fbx\x7f\x9ab\
-\xba\x8d\x96\xaf\xae\xc60\xcf\xa0;I4\xbb\x85\xae\x9f\xfc\x90\xe2\xd8(f4\x82\
-\x11\x0e\x83p\xc8\xf7\xb84\xae\xdd\x86\xe6\x0f hAg\x02\xcf.bOLc\x04-L\xa1\
-\xa1\x05b\x94\xf4C\xe0\xe5\x08\xb8m\x9c{\xe5e\xf2\xc3\xc3\x04\x12q\xa4e1~\
-\xe4\x12\xa3\x07m|\xb7L\xa8\xbe\x9e\xe0\x96;\xd1\xed\x0c\xf2J\x9a\xeb\xeeD)\
-\x08VE\xa8\xaa\x95\xe4G\xfa\x10R\x12\x8e/C\x0f\xc40T\x1a\x7f^\xf1\x9dFI\x0f\
-\xd3X\x8f?\xdd\xc5\xe8\xc51\xa6\xde\x0b\x11\xacN\xb2tc+U5+\xc1\tc\xf8\'\xc9\
-\xbf\xaf\xb1tM\x0b\x05\xef\x08\xb2\xe4\xa3k\x1d\x94GO\x12\xaf\xa9#^\xd5@\x9e\
-CTN\x8fg\xd1C\xec[h\x0fs\x08\x96!\xb8\x17]\x8c#$\x08\x11$\xc0\xbb(z\x01\x90\
-\x9aM\xb0\xfa\x01\x02\xd6\x10\xf6\xf8Q4\xd6b\x88\x0e\xfa\x0e\xbc@y\xec(Ko\
-\xddI\xdd\xcd;@\x95q\x8bE\x06\xf6\xfc3\x85\xde\xbd\x14\xd2\xab\x89\xb4/\x01\
-\xbf\x86\x81\xfd\xff\x89;\xf1\x1e-w<F\xa2c\x132\xe0\xa3iq<\xa7\x88\xd2\'1\
-\xf5N\x84\xbb\r]\x8c\xe1f/p\xf1\xdf\x9fA\x9a\x12\xa1I\x1a\xb7>Mt\xc5\n\x94\
-\x97%s\xae\x0bg\xf4\x18Ko{\x88\xba\x9bw t\x1f\xdf\x86\xc17_`\xfa\xfcA\x0c]C\
-\x98\xf5\xe8n\x94\x81\xfd/]QSY{\x88]{\x17\xb1\xb6\xa7\xb9\xf0\xe23\x08\xdd\
-\xa3\xfd\xfe\xa7\x10\xd6$R\xab\xa3\xef\xc0O\xaf\x1e_[=\xca\xda\x8d0\xb7\xa1\
-\xcb)L9D\xcb\xf6?!\xd6\xbe\x06_\xf4\xa2\x02\xefBn\x05\xf5\x1bL\xfa^\xff\x0fJ\
-\xd3_%\x18,\xa2\xbc$S=]\xe8\x0c\x91Z\xf5\x08\x84\xfa\t\x8a7\xa0R"\x00\xe8\
-\x81\xd1E\xf4C\xa6kx\x81\x08\x9a-\x91R\x80\x1f\xc1\x9a\xd4\xc0\x9d\xf5\xa8\
-\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\xd8\xbd}\x84\x82\x8d\xd4mz\x14\xad\xbc\x1b\
-\xe9\x1dF\x9a\x0fQ\xb7\xfea\x06\xba\xcfP\xea\xe9!\xb6\xfcq<O`w_$\x14\xa8\xa3\
-f\xddCH\xf7\xc7\xc8\xc2\x01\x90\t4\xa1\x833\x05\xa5$\x9e\tZ\t\xf4"X\xa1\x04\
-\xba\x15E\x1a\x1aV0\x85\xe6\xba(\xd9J\xa6\xf3\x9f\x08\x05\xea\xa9\xdb\xb8\
-\x13\xdd\xf9\x19\xa2t\x02\xdfz\x92\x9a\xd5\xf7Q<s\x18\xdd\xd1\x11*\x01^\xe0\
-\xea\x9a\xb9\x19\xd03x\xd670U\x04\xa9\x04\x9a^\x85f\xbf\x8cg<9\xaf\xf8\xaaZv\
-\xa2\x15\xf6\xe3Y14[#\x14^J\xacu\x1b\xba\xf3]pN@\xd6C\xe9%\xaaVl\'`\xbd\xc1d\
-\xe7\x11\x9av\xfe1\x9e\x9f\'{\xfcE\x12Mk1\x93\xcb\x91\xf9=\x90\x05*g0\x00\
-\xe8\xec]\xbe\xd0\x1e>$V\x0b\x9bG\x10\xc3A\x90\x80=\x02\x87jaZ\x81a\xa16m\
-\xa2\xd4\xf7.\xeal\x08\xab\xbd\x159=\x81\'Rx\xe7\x05z\xac\x11\n\x01\xe4\x91A\
-(\x04\xd1\x1a\xd3X\r\xb7\xa1\r7\xc2X\x0cUH\xa0\x8aE\xdc\xf7\xc1H\xd4\xe3\xcf\
-\x18\xe8\xc7&\xa0\xf0\xd1\xad\xe2j\x88\xd5\xc0\x864b8\x80\xe5\xb4\xd3\xba\
-\xf3\xcf\xd0\xa2\x11\xf0}\xfc\xf1A\xe4\x89\x0b8\xcdKpN\x970\x92\x8d\x88r\x02\
-qh\x1arAd\xcb\x00F\xfdMhC\xf5\x08/\t^\x02\x95SW\xd7\xfco\xdd\x8d\x83\xc8\xe1\
-\x00B\n(\xa5\xa1+\x89\xbf\\\xce+>\xf2\t8\xd1\x04\x9b\xe20\x1c\x9b]\xa2\xfa)\
-\xe8\x8c@\xa6\x19\x00\x11(#o\x8e\x12\x89\xdfLv\xff\xbb\xd87\x15\xb0\xd3i\xca\
-\']\xeao\xbb\x17\x86\xf3p(\x00\xfe"\x1a\x13\x0b\x8c>\xf8\xdc\x93\x0b\xeda\
-\x0e\xa3U\x90\xe8\x18\xa7pv\x19\x12\r??\xc9\xf4\xc1\xed \x15\xe6z\x1f=\xeb2\
-\xf8\xed!\n\xe7n\xa1\xe6\x81F\x8a\xc7m\xcc5yTi\x0b\xd9\xf3\x19\xbc\xec\x14N\
-\xe8q\xec\xf7\\B+,f:\xfb\x99\xde\xd7A\xb0\xa1\x01\x7fj\n\x11\x02\xca\xb7\x92\
-\xd97\x82\xf3\xe8\x08%\xf5;\xd8\xfb\\\xf4&\x1d\xe3\x1a\r\xfbX\x19/]$\xb1rt\
-\xd6\x83\xd0@\x14\xc8\xfc\xbd\xc0\xed\x17\xb8\x835h\r\r$\xff\xba\x84\x97\xd9\
-H\xa1+Gyb\x18\'\xf0\x08\xc5\x836\xe1\x15\x01f\x0e\xf40\xbd\xaf\x83\xd05)\xfc\
-B\x1a!\xfd\xabj\x96\x0e\xd8\x18\xcb|\x12\xd7\x8f\x93?\xd5\x8e@\xe2\xe7\xc7\
-\xc8\xbc\xb6\x81\xaa\xa7\x0b\xf3\x8a\xcf\x1d\xcf2\xb9\xeb\xcb\xc4o\x18\xa2\
-\xd0\xd54\xbb\xcd\x9b\x1ff\xe2\x07wQ\xee.\xcf\xe58\xd4\x17 \xb6\xfea\x06\x9f\
-\x9f\xe1\xcc\x1f\xedF\x15]\xac\x86\xbb\xb0\x96n&\xf3\xed!\x8a\xbf\xfc\xdd\
-\x85\x1b\x00\x8b\x10\xfd\x95u\x9b\x17\xda\xc3\x1c\xd5\xf53\xdc\xcb~.\xa5\xaa\
-q\x8a\x92\xda\xc1A\xb8\xdf"?\t\xd9a\x87\xeeo\xd9dr)\xae\xfb\xfdz\x8c\x95e\
-\xde\xdc\xd5\xcc\r\xb1~\xa2O\xb4s\xfco\xcf3\xfc\xec~\xda\xee\\\x82\\\x1b\xa4\
-t:\xcf\xb972\x14[\xdb\xa9\xdb\x1a\xa7\xab\xd7!\x91\xca\x12~\xac\x8dc\x7f\xe7\
-3\xf6\xbdN\xda\xee\xa8G\xdd\x15E\xb7@7\\\x92_\x8bpxO+\xb7\xcb=\\J%Aj\xb43\
-\xc8\x1b\x91\xfb\x98H&!\tRS|\xa5\xef0\xfa\x03\xad\x1c\xff~\x1f\x85\x1f\x1c\
-\xa6qc-\xfef\x93\x81\x0f4sMm$\xeb,Z\xdd>\xb2S\xc6U5\xdf\x8e\xaeE`s\xafx\x95\
-\x9e\x9aj\x944h\x15i~\x99\\\xc7\xba\xde\xde\xf9\xc57\xe0rn\xf9\n\xeeQG\xe8K\
-\xc6\x10Rr\xad\xeag\xefu\x1b\x99\x88\x87\xe7r\x1c\x9b\x11\xechv\x99\xbc}##\
-\xa7\x87 \xa4\xb3\xfe\xe1\xadL\xe7\xaax\xc5\x89c\xaf\xab\xfc{|\x14\xfd\x9c_X\
-h\x0fs4\xfa\xd3\xd8v/\xe3N\x89\x891\x9d\xfeo\xa6A\xd3\xb1\x1d\x03%4\x10\x92e\
-\xab\\:~;\xcf\xd1\x13m\xbc\xd5\x13bT\x0f\xf3\xc4\x83\xa3,\xddnp\xfc\xe79\xce\
->\x7f\x11%5|a\x10NHV\xdd#1kFxm\xd7*\x1ak}\x1e\xde1F\xdd\x974\xce\x1d\xccs\
-\xf6;\xbdsm\xab\x9b$\xf7\xfd\x85\xc1\xb8\x16\xc4.]`\xbc\x1c\xc6\x8aJ\x1c{\
-\x94\x8b\xe5\x1c#\xfe\x07\x07k>\xb8\x9d\t\x1e\xdd\x91#\xbcFr\xec\xc08\x87\
-\xdf\xc9\xa0\xa4F\xb4\xd6`\xc9u\x92\xa1\x92$\x18\xc9c\x17/\xf2\xce\xf15\xfc\
-\xd6\xd6+k\x0e\xe9M8\x8eO\xa9\xd0\xcd\xb0]M0\xe6P\xb6\xc79_\xca3}b~\xf1\xbd\
-\xbek\x15RN\xe3\x94\xce3\xe9\x14\xb0\xaa\x0c\xca\xf6\x05.\x96\xafe\xc4\xff\
-\xc8a\xe5\x184\x9d\x9d\xa1nk\x13\xa7\xcf\x0c\x12J\x984l\x8e\xd0\xf9\xee$\'r\
-\xc1\x05\xea\xf9\xc5\x8b>0\xb0x\x0e\n\xf3\xd9<\xa5|7\xed7\t\xca\x9d!l\xc7\
-\xc0\x17:\x91\x84\xa4\xb6\xd9\xa1e\xa5M\xf3\xca\x12\x07:\xdbx\xf1\x95&\x8a\
-\xa54\xe9A\x85\xf4\x82\xdc\xbf\xfd\x18\xd5\xad\x06\x17\x8e\x06)\xe64\xac\xa8\
-\xe0\xc6/g\tW\xc3w\xfe\xed\x1eNve1t\re\xeb<\xf8x\x17\xd7\xdc\xa2qr\x7f\x84\
-\xa9q\x8bX\xbdb\xcd\x97\xb2\xf4\xf4\xa68|l\x05_Y\xdf\xcd\xb2\xb5\x11\xaaj}\
-\xd2\x03\x16\xa7\xce\xcc`;\xa59\x9f\xe9\xb4\xa2:\x02\xdb\x9f:\xcf\xa5\x93\
-\x01N\xbf\x13B3\x05\x1b\xb6gi\xbe&\xcf\xa1=I\xa2I\x8f\x8b\x17\xaa\xd8\xf5\
-\xdaf\xb2\x93W\xd1<\x9a#V\x95\xa5X\xe8\xa1e\xf5$\rmE\xba/Fy\xefT\x1e\x01\xf3\
-\x8e\xaf6\x95\xc1.\x1c\xa3y\x83N\xac\xceg\xa0\x7f\x9cS\xa7\'\xb1\x9d\xecey>x\
-\xd8\xe5\xc1m\x0ey\xa7DS{\x02!\xc7yco\x89\x81\x01\xf99\xf7\xf8\xe2Gl\xde\xfc\
-\xfa\xa2\x99S\x85\x80\x1d[\xbb\xb8}C\x0f\xa9d\x11!g\xade\xb3&\x99\x19\x8b\
-\xd1\xc9\x08\xbf\xf8\xf5\n.^\xaa\xa6\xec\xca\xcb\xde[\xd9>\xcd\x96UC\xb44\
-\xce\xa0<\x85\x8fFWO\x82\xc3\xa7\xeb\xe8\xe9\x8f\xcc\xb5\x95R\xb1\xfa\xdaI\
-\xb6\xae\x1f$\x15/P.K\x94\xd4y\xef\xfdj\xf6v6\x92\xcb\x1b\xdc}\xfb\x10\x9b;&\
-)\xfb\x1a\xaf\xbe\xd5\xc8\xf1\xb3U\x1f\xf3\x1a\xb0<n\xdd8\xcaM\xab\x87\x90\
-\xbe\x8b\xd4`$\x13\xe1\xc2\xa5*\xb6\xac\x1a\x02\x04\xaf\xbe\xb5\x9c\xe3g\xab\
-\xaf\xaa\x99\xcd\x19\x08\x01w\xdf>\xc2\xa6\x8e\t\\_^\xa6;\xdf\xf8f\xbf\xd1\
-\xcb\x96\x8e!\xca\xbe\xc6+o\xb5q\xfc\xec\xe5\xf7\x19\x0c\x1d\xfe\xea\xeb9\
-\xca\xfdC\xbc\xfe\xdd^\xbe\xf6\x0f\x1d\xf4\x8cE\xf9\xe6\xb3\x11*W\xe7>\x8eX\
-\xb2\xe4{\x8b.-B@(\xf8\xa1-\xd7\x05\xdb\xa9l;~\x1alZW\xe6\xfb\xcfN\xf1\xdc\
-\x9f\x0f\xe0z\x82?\xfd\xc7%<\xf5\xf58o\x1f\xfc|\xae\x12\xfc_C\x1f\x1c\x1c\\h\
-\x0f\x15>Gn\xd89\xc1\xd4P\x86SG\xf3<\xf6L\x80\xae36\xaf\xef^\xc2L\xb6\xb2\
-\xbc\xfa$*Y\xf9\x82\x11\x0e\xdaD\xa3y\x1e\xf8C\xd8z\xb7\xcd\x0b/\x85*\xc5q\
-\x05\xf4\x856P\xe1\xf3\xe5\xf9\x7fm$h\xd6Q\x1d\xf3y\xf6;\x92\x97\x7f\xfa\xd9\
-\xdc\x8e\xfc\xff\x82\x80o,\xba\x7f\x90\n\x15\x16\x0b\x95\xb9\xb5B\x85+P)\x90\
-\n\x15\xae\xc0\x7f\x01\xf2\x91\x96s\xa0O\xc2"\x00\x00\x00\x00IEND\xaeB`\x82'\
-
-
-def getDocFactory033Bitmap():
- return wxBitmapFromImage(getDocFactory033Image())
-
-def getDocFactory033Image():
- stream = cStringIO.StringIO(getDocFactory033Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory033')
-catalog['DocFactory033'] = ImageClass()
-catalog['DocFactory033'].getData = getDocFactory033Data
-catalog['DocFactory033'].getImage = getDocFactory033Image
-catalog['DocFactory033'].getBitmap = getDocFactory033Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory034Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rW\
-IDATx\x9c\xed\x9byl]U~\xc7?\xe7\xdc\xed\xad~\x8b\x9f\xd7\xc4vb;@\xc0I\xc8\
-\x1e\xd6\xcc\x04fh\xc2R\xb6\x94\xa5\x85\xaaj5\xaa\njE\xdb?\xe6\xcfQ5\xaaTuA\
-\x1d\x8d\x80Y\x8a\xaaV\x94)\x9d\xcc\x0c\x0c\x83&\x81\x99\x90@&\xe3l\x84\xac\
-\x0eIl\xc7\xcb\xf3n?\xfb\xad\xf7\xbe{\xef\xe9\x1f\xa6\x80\x0b$n\x05\xd8\xd3\
-\xbe\xcf\x9fW\xe7\xde\xef\xf7w~\xe7\xa7s\xee9:\xe2o\xbe\xa5\x14\x15*T\xf8D\
-\xf4P\xf5B[\xa8Pa\xf1\xa2\x07+\x05R\xa1\xc2\xa7\xa2\x87\x13\x0bma\x16\x81\
-\xc2\xc0F\xe2\xcdy\xeeb\xe0b~q\x1e\x84\x8d\xf6\xdf<(\xa0\xac\x02xh\x9f\x8b\
-\xae\xc4\xc7\x14%|$ee\xa1\x10\x9f\x8bN\x85\xff9z(\xbe\xd0\x16@\xe0\xd3P\xd8G\
-\xd4\xbd\x84\xff\x91\xb1)%HS\'\xef\xc6\xc9\x05\xdb\x99\xd1\x97\xe1\x12\xf8\
-\x9c<x4\xd9oP\xe5\xf5\xcc\xf1\x00\xa0[\n[\xab\xa1[\xdbA\x99\xd0g\xaa\xab\xe1\
-\xb0\xdc\xfd\x19\x81\xf2\x08\x9a!\x18\x93\xabH\xcb\x1b?S\x8d\n\xff{\xf4\xf0"\
-(\x10\x8bQ\x9a\xf4g8\xffj-\xd3\x83\x11@\x80\x94H]\x11\xae)\x12\xa9/\xd2\xb6z\
-\x12\xc7ZF_\xf0/q\xa8\xfb\xcc=\x04\x19\xa6\xa9\xf8"g\x7f\x12g:\x1d\x00!@H\
-\x00b\x8d6\xab\xee\x7f\x8b\xa2Q\xcf\x047\x7f\xa6\xba!\x86i\xb0\x7f\xc4\xa9\
-\x1f\xa5\x88--\xd1\xb2\xe1\x18\x85\xe0\xb5\x94Y\x04\x89\xa9\x80\x1eY\x04y\
-\x08)AB[\x87\xf0\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9e\x95\xe4G\x9bY}\
-\x97\xc44~M\x7f\xf8\x9e9\xcb\x10\xe1{\x08\xb7\x8c\xf0=\x94\xd4P\xba\x81\x92\
-\x9f\xbc\x1c\x12\xae\x83t\xcb\x00s\xda\x86\x94NX\\\x8dr\x0bH\x8d\x0f<\x80 \
-\xb5\xdc$\x14\xea\xc0\x0c6\x11\x91\x1f\xff\x8e\xaf\x9b(MG:E\x10\x12\xdf\xb0f\
-\x0b\xec\n\x9a\x02E\xdc/\x12\xce\xafDR"\x9b\x8eqM\xd4\xa2.4NF~\x98\x98y\xc5\
-\xa7\xd4\x87\xfaf`V\xd3+\xe3\xeb\xd6\xacV\xd9\x9emf\x06>\xfe\x0e\xe0\x9b\xc1\
-9\x9e+\xcc\xa2W\x99\x03\x0b\xed\x01K9`l\xc2\xd0\xdf"\x96r\xb9\xfe\xf7nB\x0b\
-\x05A\xf9\x94\xf36\x03\xc7z\x189\x9d\xe6\xd2\xe1\x14\xd7\xdc\x11\xc51.P\x10A\
-\x84\xf203\xdd\x98\x99n\xbcB\t\x81\x9a\x9d|\x02\x01\xec\xd4J\x9c\xaafx\xbf\
-\x90\x84_\xc6\x9a\xe9\xc1\x98\xbc\x88\xb2\x1d@\xcdN\x10F\x80b\xed\xf5h\xe1jd\
-\xe0&,k/Z\xca\xe5\xfa\xc7\xb6bD\x82\x00\xd8e\xc5\xa4\x11A\x06$1\xbf\x07s\xea\
-\x02\xd6L7\xcavQJ\x81\x19\xc4\x0bVc\x16\xd3(\x05N\xbc\x95R\xaa\xe3\x8a\x9aa\
-\xa1S\xed\xcd\x90\x9bZ\x05n\'B\x83Ra-\xcb\xacQ\x86\x0c(Ic~\xf1)\x9f@\xfa\x08\
-F.\x8d4$n\xb8\x01\xad0\x86o\x97\x11\xa6\x85\xa3\xd7"\xb3\xe3\x08)\xb0\x97\
-\xae\xc1\x8b\xd6\x02`\xa4\xcf`L\r\x80P\x94\xe3\xcd\x94\x1bW.@\xf6\x177z\x84\
-\xb3\x0b\xed\x01C\xe8\x08\xb3\n]\xe6\xd0\x83\x02#\x96"c\x15\xf0\x00+\x14\xa6\
-\xed\xb6\x8dx\xb9\xdd\xe4\x86\xbb)d\xae"a\x8d\xa0\x9b3D\xb2\xe7\xd1\xcb\x19\
-\x86\xceL2~"\x8b\xe7\xfa\xe8A\x9d\xc6-\t\x1abC\x14\x8bK(\x04\x97"\x95G$w\x0e\
-\x95\x9d\xa6\xff\xadar\x836B\x033bP}]\x94\xda\xd0\x08vh3\xc2H\xa1\xcb<z\x10\
-\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18%\xa2\x86\x88\xe6\xba\xa04\xcd\xf0\xb1q2\
-\xddy\x00\x1a\xb7$\x897\x87\x18=9\x8d\x1e\xd6\xa9Y\x97!\xe7;\x84r\xdd\x9f\
-\xaaY\x17\x9e\xc0\xac\xda\xc6\xf0\xa1s\x0c\x1e8\x84\xf2=\x94\x14\x9c\xdb\xf5\
-sV>t\x1f\t\xad\x1f\x9c\x13\xf3\x8aOW%b\x81\xd3t\xff"M\xa8\xd6"y\xed0\x13]Y\
-\xc6O\xcd\xb0\xe2\xfe$!\xef\xc7\xf4\xfd*L\xbc\xdd!Q\xf5&vd\'\xd2\xcb\x12p_$}\
-<\x88Y\xe5\x11\xef\x108\xea\x0fP\xc2X\xd8\xc1\xb0\xc8\xd0\xc3\x1cXh\x0fh$\
-\x11\xdc\x8e\xce$B\x08\x84\na\xf2+<&Q\x9a\xc4\xf3na\xc9\xfa\x0ezv\xff3\xf6\
-\xd8\x10\xb1T\x8cDy\x04Qh\xe0\xfc\x0f\x0fS\x18\x1b%\x10\x8f!M\x13\'?\xc5\xf0\
-\xfe4\xc5t\x1b-_]\x8da\x9eAw\x92hv\x0b]?\xf9!\xc5\xb1Q\xcch\x04#\x1c\x06\xe1\
-\x90\xefqi\\\xbb\r\xcd\x1f@\xd0\x82\xce\x04\x9e]\xc4\x9e\x98\xc6\x08Z\x98BC\
-\x0b\xc4(\xe9\x87\xc0\xcb\x11p\xdb8\xf7\xf2K\xe4\x87\x87\t$\xe2H\xcbb\xfc\
-\xc8%F\x0f\xda\xf8n\x99P}=\xc1-\xb7\xa3\xdb\x19\xe4\xe54\xd7\xdd\x8eR\x10\
-\xac\x8aPU+\xc9\x8f\xf4!\xa4$\x1c_\x86\x1e\x88a\xa84\xfe\xbc\xe2;\x8d\x92\
-\x1e\xa6\xb1\x1e\x7f\xba\x8b\xd1\x8bcL\xbd\x1b"X\x9dd\xe9\xc6V\xaajV\x82\x13\
-\xc6\xf0O\x92\x7fOc\xe9\x9a\x16\n\xde\x11d\xc9G\xd7:(\x8f\x9e$^SG\xbc\xaa\
-\x81<\x87\xa8\x9c\x1a\xcfE\x0f\xb1o\xa1= X\x86\xe0nt1\x8e\x90 D\x90\x00\xef\
-\xa0\xe8\x05@j6\xc1\xea\xfb\x08XC\xd8\xe3G\xd1X\x8b!:\xe8;\xf0<\xe5\xb1\xa3,\
-\xbdy\'u7\xee\x00U\xc6-\x16\x19\xd8\xf3O\x14z\xf7RH\xaf&\xd2\xbe\x04\xfc\x1a\
-\x06\xf6\xff\x07\xee\xc4\xbb\xb4\xdc\xf6\x08\x89\x8eM\xc8\x80\x8f\xa6\xc5\
-\xf1\x9c"J\x9f\xc4\xd4;\x11\xee6t1\x86\x9b\xbd\xc0\xc5\x7f{\niJ\x84&i\xdc\
-\xfa$\xd1\x15+P^\x96\xcc\xb9.\x9c\xd1c,\xbd\xe5\x01\xean\xdc\x81\xd0}|\x1b\
-\x06\xdfx\x9e\xe9\xf3\x071t\ra\xd6\xa3\xbbQ\x06\xf6\xbfxYMe\xed!v\xf5\x1d\
-\xc4\xda\x9e\xe4\xc2\x0bO!t\x8f\xf6{\x9f@X\x93H\xad\x8e\xbe\x03?\xbdr|m\xf5(\
-k7\xc2\xdc\x86.\xa70\xe5\x10-\xdb\xff\x84X\xfb\x1a|\xd1\x8b\n\xbc\x03\xb9\
-\x15\xd4o0\xe9{\xed\xdf)M\x7f\x95`\xb0\x88\xf2\x92L\xf5t\xa13Dj\xd5C\x10\xea\
-\'(^\x87J\x89\xccA\x0f\x8c.\x82\x1f3]\xc3\x0bD\xd0l\x89\x94\x02\xfc\x08\xd6\
-\xa4\x06\xee\xac7e\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\xed#\x14l\xa4n\xd3\
-\xc3h\xe5\xddH\xef0\xd2|\x80\xba\xf5\x0f2\xd0}\x86RO\x0f\xb1\xe5\x8f\xe2y\
-\x02\xbb\xfb"\xa1@\x1d5\xeb\x1e@\xba?F\x16\x0e\x80L\xa0\t\x1d\x9c)(%\xf1L\
-\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9V2\x9d\xdf!\x14\xa8\
-\xa7n\xe3Nt\xe7g\x88\xd2\t|\xebqjV\xdfC\xf1\xccatGG\xa8\x04x\x81+k\xe6f@\xcf\
-\xe0Y\xdf\xc0T\x11\xa4\x12hz\x15\x9a\xfd\x12\x9e\xf1\xf8\xbc\xe2\xabj\xd9\
-\x89V\xd8\x8fg\xc5\xd0l\x8dPx)\xb1\xd6m\xe8\xcew\xc19\x01Y\x0f\xa5\x97\xa8Z\
-\xb1\x9d\x80\xf5:\x93\x9dGh\xda\xf9\xc7x~\x9e\xec\xf1\x17H4\xad\xc5L.G\xe6\
-\xf7@\x16\xa8\x9c\xc1\xccAg\xef\xf2\x85\xf6\x00\xb1Z\xd8<\x82\x18\x0e\x82\
-\x04\xec\x118T\x0b\xd3\n\x0c\x0b\xb5i\x13\xa5\xbewPgCX\xed\xad\xc8\xe9\t<\
-\x91\xc2;/\xd0c\x8dP\x08 \x8f\x0cB!\x88\xd6\x98\xc6j\xb8\x05m\xb8\x11\xc6b\
-\xa8B\x02U,\xe2\xbe\x07F\xa2\x1e\x7f\xc6@?6\x01\x85\x8fn\x15WC\xac\x066\xa4\
-\x11\xc3\x01,\xa7\x9d\xd6\x9d\x7f\x86\x16\x8d\x80\xef\xe3\x8f\x0f"O\\\xc0i^\
-\x82s\xba\x84\x91lD\x94\x13\x88C\xd3\x90\x0b"[\x060\xeao@\x1b\xaaGxI\xf0\x12\
-\xa8\x9c\xba\xb2\xe6\x7f\xe9n\x1cD\x0e\x07\x10R@)\r]I\xfc\xe5r^\xf1\x91O\xc0\
-\x89&\xd8\x14\x87\xe1\xd8\xec\x12\xd5OAg\x042\xcd\x00\x88@\x19yc\x94H\xfcF\
-\xb2\xfb\xdf\xc1\xbe\xa1\x80\x9dNS>\xe9R\x7f\xcb\xdd0\x9c\x87C\x01\xf0\x17\
-\xc1XXd\xe8\x83\xcf<\xbe\xd0\x1e0Z\x05\x89\x8eq\ng\x97!\xd1\xf0\xf3\x93L\x1f\
-\xdc\x0eRa\xae\xf7\xd1\xb3.\x83\xdf\x1e\xa2p\xee&j\xeek\xa4x\xdc\xc6\\\x93G\
-\x95\xb6\x90=\x9f\xc1\xcbN\xe1\x84\x1e\xc5~\xd7%\xb4\xc2b\xa6\xb3\x9f\xe9}\
-\x1d\x04\x1b\x1a\xf0\xa7\xa6\x10!\xa0|3\x99}#8\x0f\x8fPR\xbf\x83\xbd\xcfEo\
-\xd21\xae\xd2\xb0\x8f\x95\xf1\xd2E\x12+Gg=\x08\rD\x81\xcc\xdf\x0b\xdc~\x81;X\
-\x83\xd6\xd0@\xf2\xafKx\x99\x8d\x14\xbar\x94\'\x86q\x02\x0fQ<h\x13^\x11`\xe6\
-@\x0f\xd3\xfb:\x08]\x95\xc2/\xa4\x11\xd2\xbf\xa2f\xe9\x80\x8d\xb1\xcc\'q\xed\
-8\xf9S\xed\x08$~~\x8c\xcc\xab\x1b\xa8z\xb20\xaf\xf8\xdc\xf1,\x93\xbb\xbeL\
-\xfc\xba!\n]M\xb3\xdb\xbc\xf9a&~p\x07\xe5\xee\xf2\x07}\x1c\xea\x0b\x10[\xff \
-\x83\xcf\xcep\xe6\x8fv\xa3\x8a.V\xc3\x1dXK7\x93\xf9\xf6\x10\xc5_\xfe\xee\xc2\
-\r\x80E\x8c\xfe\xf2\xba\xcd\x0b\xed\x81\xea\xfa\x19\xeef?\x97R\xd58EI\xed\
-\xe0 \xdck\x91\x9f\x84\xec\xb0C\xf7\xb7l2\xb9\x14\xd7\xfc~=\xc6\xca2o\xecj\
-\xe6\xbaX?\xd1\xc7\xda9\xfe\xb7\xe7\x19~z?m\xb7/A\xae\rR:\x9d\xe7\xdc\xeb\
-\x19\x8a\xad\xed\xd4m\x8d\xd3\xd5\xeb\x90He\t?\xd2\xc6\xb1\xbf\xf3\x19\xfb^\
-\'m\xb7\xd5\xa3\xee\x88\xa2[\xa0\x1b.\xc9\xafE8\xbc\xa7\x95[\xe5\x1e.\xa5\
-\x92 5\xda\x19\xe4\xf5\xc8=L$\x93\x90\x04\xa9)\xbe\xd2w\x18\xfd\xbeV\x8e\x7f\
-\xbf\x8f\xc2\x0f\x0e\xd3\xb8\xb1\x16\x7f\xb3\xc9\xc0\xfb\x9a\xb9\xa66\x92u\
-\x16\xadn\x1f\xd9)\xe3\x8a\x9aoE\xd7"\xb0\xb9[\xbcBOM5J\x1a\xb4\x8a4\xbfL\
-\xaec]o\xef\xfc\xe2\x1bp9\xb7|\x05w\xa9#\xf4%c\x08)\xb9Z\xf5\xb3\xf7\x9a\x8d\
-L\xc4\xc3\x1f\xf4qlF\xb0\xa3\xd9e\xf2\xd6\x8d\x8c\x9c\x1e\x82\x90\xce\xfa\
-\x07\xb72\x9d\xab\xe2e\'\x8e\xbd\xae\xf2\xef\xf1I\xe8\xe7\xfc\xc2B{\xa0\xd1\
-\x9f\xc6\xb6{\x19wJL\x8c\xe9\xf4\x7f3\r\x9a\x8e\xed\x18(\xa1\x81\x90,[\xe5\
-\xd2\xf1\xdby\x8e\x9eh\xe3\xcd\x9e\x10\xa3z\x98\xc7\xee\x1fe\xe9v\x83\xe3?\
-\xcfq\xf6\xd9\x8b(\xa9\xe1\x0b\x83pB\xb2\xea.\x89Y3\xc2\xab\xbbV\xd1X\xeb\
-\xf3\xe0\x8e1\xea\xbe\xa4q\xee`\x9e\xb3\xcf\xf5~\xd0\xb6\xbaIr\xcf_\x18\x8ck\
-A\xec\xd2\x05\xc6\xcba\xac\xa8\xc4\xb1G\xb9X\xce1\xe2\xbf\x7f\xb0\xe6\x83\
-\xdb\x99\xe0\xe1\x1d9\xc2k$\xc7\x0e\x8cs\xf8\xed\x0cJjDk\r\x96\\#\x19*I\x82\
-\x91<v\xf1"o\x1f_\xc3om\xbd\xbc\xe6\x90\xde\x84\xe3\xf8\x94\n\xdd\x0c\xdb\
-\xd5\x04c\x0ee{\x9c\xf3\xa5<\xd3\'\xe6\x17\xdfk\xbbV!\xe54N\xe9<\x93N\x01\
-\xab\xca\xa0l_\xe0b\xf9jF\xfc\x8f\x1cV\x8eA\xd3\xd9\x19\xea\xb66q\xfa\xcc \
-\xa1\x84I\xc3\xe6\x08\x9d\xefLr"\x17\\\xa0\xcc/~\xf4\x81\x81\x85?(\xccg\xf3\
-\x94\xf2\xdd\xb4\xdf (w\x86\xb0\x1d\x03_\xe8D\x12\x92\xdaf\x87\x96\x956\xcd+\
-K\x1c\xe8l\xe3\x85\x97\x9b(\x96\xd2\xa4\x07\x15\xd2\x0br\xef\xf6cT\xb7\x1a\\\
-8\x1a\xa4\x98\xd3\xb0\xa2\x82\xeb\xbf\x9c%\\\r\xcf\xfd\xeb]\x9c\xec\xcab\xe8\
-\x1a\xca\xd6\xb9\xff\xd1.\xae\xbaI\xe3\xe4\xfe\x08S\xe3\x16\xb1z\xc5\x9a/e\
-\xe9\xe9Mq\xf8\xd8\n\xbe\xb2\xbe\x9bek#T\xd5\xfa\xa4\x07,N\x9d\x99\xc1vJ\x1f\
-\xf8L\xa7\x15\xd5\x11\xd8\xfe\xc4y.\x9d\x0cp\xfa\xed\x10\x9a)\xd8\xb0=K\xf3U\
-y\x0e\xedI\x12Mz\\\xbcP\xc5\xaeW7\x93\x9d\xbc\x82\xe6\xd1\x1c\xb1\xaa,\xc5B\
-\x0f-\xab\'ih+\xd2}1\xca\xbb\xa7\xf2\x08\x98w|\xb5\xa9\x0cv\xe1\x18\xcd\x1bt\
-bu>\x03\xfd\xe3\x9c:=\x89\xedd\xe7\xf4\xf3\xc1\xc3.\xf7os\xc8;%\x9a\xda\x13\
-\x089\xce\xeb{K\x0c\x0c\xc8/8\xe3\xbf9\x88\xcd\x9b_[\xf0\xb9U\x08\xd8\xb1\
-\xb5\x8b[7\xf4\x90J\x16\x11r\xd6R6k\x92\x99\xb1\x18\x9d\x8c\xf0\x8b_\xaf\xe0\
-\xe2\xa5j\xca\xae\x9c\xf3\xde\xca\xf6i\xb6\xac\x1a\xa2\xa5q\x06\xe5)|4\xbaz\
-\x12\x1c>]GO\x7f\xe4\x83\xb6R*V_=\xc9\xd6\xf5\x83\xa4\xe2\x05\xcae\x89\x92:\
-\xef\xbeW\xcd\xde\xceFry\x83;o\x1dbs\xc7$e_\xe3\x957\x1b9~\xb6\xeac^\x03\x96\
-\xc7\xcd\x1bG\xb9a\xf5\x10\xd2w\x91\x1a\x8cd"\\\xb8T\xc5\x96UC\x80\xe0\x957\
-\x97s\xfcl\xf5\x155\xb39\x03!\xe0\xce[G\xd8\xd41\x81\xeb\xcb9\xba\xf3\x8do\
-\xf6\x1b\xbdl\xe9\x18\xa2\xeck\xbc\xfcf\x1b\xc7\xcf\xce\xbd\xc7`\xe8\xf0W_\
-\xcfQ\xee\x1f\xe2\xb5\xef\xf6\xf2\xb5\x7f\xe8\xa0g,\xca7\x9f\x8eP\xb92\xf7\
-\xe9\x88%K\xbe\xb7h\xbaG\x08\x08\x05?\xb4\xe3\xba`;\x95m\xc7\xcf\x82M\xeb\
-\xca|\xff\xe9)\x9e\xf9\xf3\x01\\O\xf0\xa7\xff\xb8\x84\'\xbe\x1e\xe7\xad\x83_\
-\xccU\x82\xdfT\xf4\xc1\xc1\xc1\x85\xf6P\xe1\x0b\xe0\xba\x9d\x13L\re8u4\xcf#O\
-\x05\xe8:c\xf3\xda\xee%\xccd+\xcb\xab\xcbQ\xe9\x9d\xff\'\x84\x836\xd1h\x9e\
-\xfb\xfe\x10\xb6\xdei\xf3\xfc\x8b\xa1Jq\xcc\x03}\xa1\rT\xf8bx\xf6_\x1a\t\x9a\
-uT\xc7|\x9e~N\xf2\xd2O?\x9f\xdb\x91\xff\xd7\x10\xf0\x8dE\xf3\x0fR\xa1\xc2b\
-\xa32\xc7V\xa8p\x19*\x05R\xa1\xc2e\xf8O\xd7%\x96s\x80I\xb1\xb6\x00\x00\x00\
-\x00IEND\xaeB`\x82'
-
-def getDocFactory034Bitmap():
- return wxBitmapFromImage(getDocFactory034Image())
-
-def getDocFactory034Image():
- stream = cStringIO.StringIO(getDocFactory034Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory034')
-catalog['DocFactory034'] = ImageClass()
-catalog['DocFactory034'].getData = getDocFactory034Data
-catalog['DocFactory034'].getImage = getDocFactory034Image
-catalog['DocFactory034'].getBitmap = getDocFactory034Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory035Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rR\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfbG\xfe\
-\x8c\xaa\xa8R\xd5\x055\x8a\x80&)\xaaZQR\x1a\'\x81\x10\x14\x1b\x12c\x83\xe3\
-\x8c7\x8c\xd71\xb6g\xc6\xb3\xbc\xd9g\xde\xcc[\xef}\xf7\xde\xd3?\x86\x1a\\\
-\x88=m\x81\x07\xd1\xfb\xfc\xf9t\xef\xfb|\x7f\xe7\xdc\xa3s\xee=:\xe2o\xbe\xa5\
-\x14U\xaaT\xf9X\xf4Pm\xa5#T\xa9\xf2\xf9E\x0fV\x07H\x95*\xbf\x16=\x9c\xa8l\
-\x00\x81\xc2\xc0F\xe2]\xf2\xbb\x8b\x81\x8b\xf9\xd9e\x106\xda\xff\xc8\xa0\x80\
-\xb2\n\xe0\xa1}*^\x89\x8f)J\xf8H\xca\xcaB!>\x15O\x95\xff;z(^9\xb9\xc0\xa7\
-\xa9\xb0\x87\xa8{\x01\xffC\xcf\xa6\x94 M\x9d\xbc\x1b\'\x17\xecdN_\x82K\xe0S\
-\xca\xe0\xd1b\xbfA\x8d\xd7wI\x06\x00\xddR\xd8Z\x1d\xbd\xda6\xca\x84>Q\xaf\
-\x86\xc3R\xf7\xa7\x04\xcach\x86`B\xae -o\xfcD\x1dU\xfe\xff\xe8\xe1\n\x0e\x10\
-\x8bqZ\xf4g8\xfbj=\xb3\xc3\x11@\x80\x94H]\x11\xae+\x12i,\xd2\xb1r\x1a\xc7Z\
-\xc2@\xf0/qh\xf8\xc43\x04\x19\xa5\xa5\xf8"\xa7\x7f\x1cg6\x1d\x00!@H\x00b\xcd\
-6+\xee\x7f\x8b\xa2\xd1\xc8\x147\x7f\xa2\xde\x10\xa34\xd9?\xe4\xc4\x0fS\xc4\
-\x16\x97h[w\x84B\xf0Z\xcaT\xb0C\xaa|\x04=R\xc1\xfe\x08)AB[\x83\xf0\x8bHM\x11\
-\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9f\x96\xe4\xc7[Yy\x97\xc44~\xc5`\xf8\x9eK\
-\x96!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%?~9$\\\x07\xe9\x96\x01.\xb96\xa4t\
-\xc2\xe2j\x94[@j\\\xcc\x00\x82\xd4R\x93P\xa8\x0b3\xd8BD~\xf4\x7f|\xddDi:\xd2\
-)\x82\x90\xf8\x865?\xc0\xae\xe0\x14(\xe2~\x91p~9\x92\x12\xd9t\x8ck\xa2\x16\r\
-\xa1I2\xf2\x83\x0eYP}J}\xe07\x03\xf3N\xaf\x8c\xaf[\xf3\xae\xb2=\x7f\x99\x19\
-\xf8\xe8=\x80o\x06/\xc9\\\xe5R\xf4\x1as\xa8brK9`l\xc0\xd0\xdf"\x96r\xb9\xfe\
-\xf7nB\x0b\x05A\xf9\x94\xf36CG\xfa\x18;\x99\xe6\xc2\xc1\x14\xd7\xdc\x11\xc51\
-\xceQ\x10A\x84\xf203\xbd\x98\x99^\xbcB\t\x81\x9a\x9f|\x02\x01\xec\xd4r\x9c\
-\x9aVx\x7f \t\xbf\x8c5\xd7\x871}\x1ee;\x80\x9a\x9f \x8c\x00\xc5\xfa\xeb\xd1\
-\xc2\xb5\xc8\xc0MX\xd6n\xb4\x94\xcb\xf5\x8fm\xc6\x88\x04\x01\xb0\xcb\x8ai#\
-\x82\x0cHb~\x1f\xe6\xcc9\xac\xb9^\x94\xed\xa2\x94\x023\x88\x17\xac\xc5,\xa6Q\
-\n\x9cx;\xa5T\xd7\x15\x9da\xa1S\xeb\xcd\x91\x9bY\x01n7B\x83Ra5K\xacqF\x0c(Ic\
-a\xf5)\x9f@\xfa\x10F.\x8d4$n\xb8\t\xad0\x81o\x97\x11\xa6\x85\xa3\xd7#\xb3\
-\x93\x08)\xb0\x17\xaf\xc2\x8b\xd6\x03`\xa4Oa\xcc\x0c\x81P\x94\xe3\xad\x94\
-\x9b\x97W\xa0\xf7\xbf\x18\xe8\x11NWLn\x08\x1da\xd6\xa0\xcb\x1czP`\xc4Rd\xac\
-\x02\x1e`\x85\xc2t\xdc\xb6\x1e/\xb7\x93\xdch/\x85\xccU$\xac1ts\x8eH\xf6,z9\
-\xc3\xc8\xa9i&\x8fe\xf1\\\x1f=\xa8\xd3\xbc)ASl\x84bq\x11\x85\xe0b\xa4\xf2\
-\x88\xe4\xce\xa0\xb2\xb3\x0c\xbe5Jn\xd8Fh`F\x0cj\xaf\x8bR\x1f\x1a\xc3\x0emD\
-\x18)t\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0e\xe3D\xd4\x08\xd1\\\x0f\x94f\
-\x19=2I\xa67\x0f@\xf3\xa6$\xf1\xd6\x10\xe3\xc7g\xd1\xc3:uk2\xe4|\x87P\xae\
-\xf7\xd7:\x1b\xc2S\x985[\x18=p\x86\xe1}\x07P\xbe\x87\x92\x823;~\xc6\xf2\x87\
-\xee#\xa1\r\x82slA\xf5\xe9\xaaD,p\x92\xde\x9f\xa7\t\xd5[$\xaf\x1de\xaa\'\xcb\
-\xe4\x899\x96\xdd\x9f$\xe4\xfd\x88\x81_\x86\x89w:$j\xde\xc4\x8elGzY\x02\xee\
-\x8b\xa4\x8f\x061k<\xe2]\x02G\xfd\x01J\x18\x15{\x0e>\xcf\xe8a\xf6UL\xae\x91D\
-p;:\xd3\x08!\x10*\x84\xc9/\xf1\x98Fi\x12\xcf\xbb\x85Ek\xbb\xe8\xdb\xf9/\xd8\
-\x13#\xc4R1\x12\xe51D\xa1\x89\xb3?8Hab\x9c@<\x864M\x9c\xfc\x0c\xa3{\xd3\x14\
-\xd3\x1d\xb4}u%\x86y\n\xddI\xa2\xd9m\xf4\xfc\xf8\x07\x14\'\xc61\xa3\x11\x8cp\
-\x18\x84C\xbe\xcf\xa5y\xf5\x164\x7f\x08A\x1b:Sxv\x11{j\x16#ha\n\r-\x10\xa3\
-\xa4\x1f\x00/G\xc0\xed\xe0\xcc\xcb/\x91\x1f\x1d%\x90\x88#-\x8b\xc9C\x17\x18\
-\xdfo\xe3\xbbeB\x8d\x8d\x047\xdd\x8eng\x90\x97s\xae\xb9\x1d\xa5 X\x13\xa1\
-\xa6^\x92\x1f\x1b@HI8\xbe\x04=\x10\xc3Pi\xfc\x05\xd5w\x12%=Lc-\xfel\x0f\xe3\
-\xe7\'\x98y7D\xb06\xc9\xe2\xf5\xed\xd4\xd4-\x07\'\x8c\xe1\x1f\'\xff\x9e\xc6\
-\xe2Um\x14\xbcC\xc8\x92\x8f\xaeuQ\x1e?N\xbc\xae\x81xM\x13y\x0eP\xdd-\xfex\
-\xf4\x10{*&\x17,Ap7\xba\x98DH\x10"H\x80wP\xf4\x03 5\x9b`\xed}\x04\xac\x11\
-\xec\xc9\xc3h\xac\xc6\x10]\x0c\xec{\x9e\xf2\xc4a\x16\xdf\xbc\x9d\x86\x1b\xb7\
-\x81*\xe3\x16\x8b\x0c\xed\xfag\n\xfd\xbb)\xa4W\x12\xe9\\\x04~\x1dC{\xff\x13w\
-\xea]\xdan{\x84D\xd7\x06d\xc0G\xd3\xe2xN\x11\xa5Oc\xea\xdd\x08w\x0b\xba\x98\
-\xc0\xcd\x9e\xe3\xfc\xbf?\x854%B\x934o~\x92\xe8\xb2e(/K\xe6L\x0f\xce\xf8\x11\
-\x16\xdf\xf2\x00\r7nC\xe8>\xbe\r\xc3o<\xcf\xec\xd9\xfd\x18\xba\x860\x1b\xd1\
-\xdd(C{_\xbc\xacSY\xbb\x88]}\x07\xb1\x8e\'9\xf7\xc2S\x08\xdd\xa3\xf3\xde\'\
-\x10\xd64Rk``\xdfO\xae\\_G#\xca\xda\x890\xb7\xa0\xcb\x19L9B\xdb\xd6?!\xd6\
-\xb9\n_\xf4\xa3\x02\xef@n\x19\x8d\xebL\x06^\xfb\x0fJ\xb3_%\x18,\xa2\xbc$3}=\
-\xe8\x8c\x90Z\xf1\x10\x84\x06\t\x8a\xd7\xa1:D>\x16=0^\xc1\x174]\xc3\x0bD\xd0\
-l\x89\x94\x02\xfc\x08\xd6\xb4\x06\xee|&e\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\
-\x1f \x14l\xa6a\xc3\xc3h\xe5\x9dH\xef \xd2|\x80\x86\xb5\x0f2\xd4{\x8aR_\x1f\
-\xb1\xa5\x8f\xe2y\x02\xbb\xf7<\xa1@\x03uk\x1e@\xba?B\x16\xf6\x81L\xa0\t\x1d\
-\x9c\x19(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9v2\
-\xdd\xffD(\xd0H\xc3\xfa\xed\xe8\xceO\x11\xa5c\xf8\xd6\xe3\xd4\xad\xbc\x87\
-\xe2\xa9\x83\xe8\x8e\x8eP\t\xf0\x02Wv\xe6\xe6@\xcf\xe0Y\xdf\xc0T\x11\xa4\x12\
-hz\r\x9a\xfd\x12\x9e\xf1\xf8\x82\xea\xabi\xdb\x8eV\xd8\x8bg\xc5\xd0l\x8dPx1\
-\xb1\xf6-\xe8\xcew\xc09\x06Y\x0f\xa5\x97\xa8Y\xb6\x95\x80\xf5:\xd3\xdd\x87h\
-\xd9\xfe\xc7x~\x9e\xec\xd1\x17H\xb4\xac\xc6L.E\xe6wA\x16\xa8\xee\xc1|,:\xbb\
-\x97V\xce\x1e\xab\x87\x8dc\x88\xd1 H\xc0\x1e\x83\x03\xf50\xab\xc0\xb0P\x1b6P\
-\x1ax\x07u:\x84\xd5\xd9\x8e\x9c\x9d\xc2\x13)\xbc\xb3\x02=\xd6\x0c\x85\x00\
-\xf2\xd00\x14\x82h\xcdi\xac\xa6[\xd0F\x9ba"\x86*$P\xc5"\xee{`$\x1a\xf1\xe7\
-\x0c\xf4#SP\xf8\xf0\xa7\xe2Z\x88\xd5\xc1\xba4b4\x80\xe5t\xd2\xbe\xfd\xcf\xd0\
-\xa2\x11\xf0}\xfc\xc9a\xe4\xb1s8\xad\x8bpN\x960\x92\xcd\x88r\x02q`\x16rAd\
-\xdb\x10F\xe3\rh#\x8d\x08/\t^\x02\x95SWv\xfe\xb7w\xfd0r4\x80\x90\x02Ji\xe8I\
-\xe2/\x95\x0b\xaa\x8f|\x02\x8e\xb5\xc0\x868\x8c\xc6\xe6\x97\xa8~\n\xba#\x90i\
-\x05@\x04\xca\xc8\x1b\xa3D\xe27\x92\xdd\xfb\x0e\xf6\r\x05\xect\x9a\xf2q\x97\
-\xc6[\xee\x86\xd1<\x1c\x08\x80_\xc1g\xe0s\x8e>\xfc\xcc\xe3\x15\x93\x1b\xed\
-\x82D\xd7$\x85\xd3K\x90h\xf8\xf9if\xf7o\x05\xa90\xd7\xfa\xe8Y\x97\xe1o\x8fP8\
-s\x13u\xf75S<jc\xae\xca\xa3J\x9b\xc8\x9e\xcd\xe0egpB\x8fb\xbf\xeb\x12Zf1\xd7\
-=\xc8\xec\x9e.\x82MM\xf833\x88\x10P\xbe\x99\xcc\x9e1\x9c\x87\xc7(\xa9\xdf\
-\xc1\xde\xe3\xa2\xb7\xe8\x18Wi\xd8G\xcax\xe9"\x89\xe5\xe3\xf3\x19\x84\x06\
-\xa2@\xe6\xef\x05\xee\xa0\xc0\x1d\xaeCkj"\xf9\xd7%\xbc\xccz\n=9\xcaS\xa38\
-\x81\x87(\xee\xb7\t/\x0b0\xb7\xaf\x8f\xd9=]\x84\xaeJ\xe1\x17\xd2\x08\xe9_\
-\xd1Y\xdagc,\xf1I\\;I\xfeD\'\x02\x89\x9f\x9f \xf3\xea:j\x9e,,\xa8>w2\xcb\xf4\
-\x8e/\x13\xbfn\x84BO\xcb\xfcg\xde\xfc(S\xdf\xbf\x83ro\xf9b\x1b\x87\x06\x02\
-\xc4\xd6>\xc8\xf0\xb3s\x9c\xfa\xa3\x9d\xa8\xa2\x8b\xd5t\x07\xd6\xe2\x8dd\xbe\
-=B\xf1\x17\xbf[\xb1\xfe\xff"\xa0\xbf\xbcfc\xc5\xe4\xb5\x8ds\xdc\xcd^.\xa4jq\
-\x8a\x92\xfa\xe1a\xb8\xd7"?\r\xd9Q\x87\xdeo\xd9dr)\xae\xf9\xfdF\x8c\xe5e\xde\
-\xd8\xd1\xcau\xb1A\xa2\x8fur\xf4o\xcf2\xfa\xf4^:n_\x84\\\x1d\xa4t2\xcf\x99\
-\xd73\x14\xdb;i\xd8\x1c\xa7\xa7\xdf!\x91\xca\x12~\xa4\x83#\x7f\xe73\xf1\xddn\
-:nkD\xdd\x11E\xb7@7\\\x92_\x8bppW;\xb7\xca]\\H%Ajt2\xcc\xeb\x91{\x98J&!\tRS|\
-e\xe0 \xfa}\xed\x1c\xfd\xde\x00\x85\xef\x1f\xa4y}=\xfeF\x93\xa1\xf7\x9d\xb9\
-\x96\x0e\x92\r\x16\xed\xee\x00\xd9\x19\xe3\x8a\xce\xb7\xa2\xab\x11\xd8\xdc-^\
-\xa1\xaf\xae\x16%\r\xdaE\x9a_$\xd7\xb0\xa6\xbf\x7fa\xf5\r\xb9\x9cY\xba\x8c\
-\xbb\xd4!\x06\x921\x84\x94\\\xad\x06\xd9}\xcdz\xa6\xe2\xe1\x8bm\x1c\x9b\x13l\
-ku\x99\xbeu=c\'G \xa4\xb3\xf6\xc1\xcd\xcc\xe6jx\xd9\x89c\xaf\xa9\xbe{\\\x0e\
-\xfd\x8c_\xa8\x98\xbc\xd9\x9f\xc5\xb6\xfb\x99tJLM\xe8\x0c~3\r\x9a\x8e\xed\
-\x18(\xa1\x81\x90,Y\xe1\xd2\xf5\xdby\x0e\x1f\xeb\xe0\xcd\xbe\x10\xe3z\x98\
-\xc7\xee\x1fg\xf1V\x83\xa3?\xcbq\xfa\xd9\xf3(\xa9\xe1\x0b\x83pB\xb2\xe2.\x89\
-Y7\xc6\xab;V\xd0\\\xef\xf3\xe0\xb6\t\x1a\xbe\xa4qf\x7f\x9e\xd3\xcf\xf5_\xbc\
-\xb6\xb6Er\xcf_\x18LjA\xec\xd29&\xcba\xac\xa8\xc4\xb1\xc79_\xce1\xe6\xbf\xbf\
-\xb1\xe6\x83\xdb\x9d\xe0\xe1m9\xc2\xab$G\xf6Mr\xf0\xed\x0cJjD\xeb\r\x16]#\
-\x19)I\x82\x91<v\xf1<o\x1f]\xc5om\xbe\xbcsDo\xc1q|J\x85^F\xedZ\x821\x87\xb2=\
-\xc9\xd9R\x9e\xd9c\x0b\xab\xef\xb5\x1d+\x90r\x16\xa7t\x96i\xa7\x80UcP\xb6\
-\xcfq\xbe|5c\xfe\x876+\'\xa0\xe5\xf4\x1c\r\x9b[8yj\x98P\xc2\xa4ic\x84\xeew\
-\xa69\x96\x0bV\xa8\xe7\xbf8\xe8CC\x95\xdb(\xccg\xf3\x94\xf2\xbdt\xde (w\x87\
-\xb0\x1d\x03_\xe8D\x12\x92\xfaV\x87\xb6\xe56\xad\xcbK\xec\xeb\xee\xe0\x85\
-\x97[(\x96\xd2\xa4\x87\x15\xd2\x0br\xef\xd6#\xd4\xb6\x1b\x9c;\x1c\xa4\x98\
-\xd3\xb0\xa2\x82\xeb\xbf\x9c%\\\x0b\xcf\xfd\xdb]\x1c\xef\xc9b\xe8\x1a\xca\
-\xd6\xb9\xff\xd1\x1e\xae\xbaI\xe3\xf8\xde\x083\x93\x16\xb1F\xc5\xaa/e\xe9\
-\xebOq\xf0\xc82\xbe\xb2\xb6\x97%\xab#\xd4\xd4\xfb\xa4\x87,N\x9c\x9a\xc3vJ\
-\x17s\xa6\xd3\x8a\xda\x08l}\xe2,\x17\x8e\x078\xf9v\x08\xcd\x14\xac\xdb\x9a\
-\xa5\xf5\xaa<\x07v%\x89&=\xce\x9f\xaba\xc7\xab\x1b\xc9N_\xc1y8G\xac&K\xb1\
-\xd0G\xdb\xcai\x9a:\x8a\xf4\x9e\x8f\xf2\xee\x89<\x02\x16\\_}*\x83]8B\xeb:\
-\x9dX\x83\xcf\xd0\xe0$\'NNc;\xd9K\xday\xffA\x97\xfb\xb78\xe4\x9d\x12-\x9d\t\
-\x84\x9c\xe4\xf5\xdd%\x86\x86\xe4g\xdc\xe3_<\xc4\xc6\x8d\xafUl\x8e\x15\x02\
-\xb6m\xee\xe1\xd6u}\xa4\x92E\x84\x9c\x8f\x92\xcd\x9ad\xe6,\xc6\xa7#\xfc\xfcW\
-\xcb8\x7f\xa1\x96\xb2+/\xb9oy\xe7,\x9bV\x8c\xd0\xd6<\x87\xf2\x14>\x1a=}\t\
-\x0e\x9el\xa0o0r\xf1Z)\x15+\xaf\x9ef\xf3\xdaaR\xf1\x02\xe5\xb2DI\x9dw\xdf\
-\xabeww3\xb9\xbc\xc1\x9d\xb7\x8e\xb0\xb1k\x9a\xb2\xaf\xf1\xca\x9b\xcd\x1c=]\
-\xf3\x91\xac\x01\xcb\xe3\xe6\xf5\xe3\xdc\xb0r\x04\xe9\xbbH\r\xc62\x11\xce]\
-\xa8a\xd3\x8a\x11@\xf0\xca\x9bK9z\xba\xf6\x8a\xcel\xce@\x08\xb8\xf3\xd616tM\
-\xe1\xfa\xf2\x12\xefB\xeb\x9b\xff\x8f~6u\x8dP\xf65^~\xb3\x83\xa3\xa7/=\xbf`\
-\xe8\xf0W_\xcfQ\x1e\x1c\xe1\xb5\xef\xf4\xf3\xb5\x7f\xe8\xa2o"\xca7\x9f\x8eP=\
-*we\xc4\xa2E\xdf\xadx3\t\x01\xa1\xe0\x071\\\x17l\xa7\xfa\xd9\xf1\x93`\xc3\
-\x9a2\xdf{z\x86g\xfe|\x08\xd7\x13\xfc\xe9?.\xe2\x89\xaf\xc7yk\xffgs\x94\xe0\
-\x8b\x8e><<\\\xe9\x0cU>E\xae\xdb>\xc5\xccH\x86\x13\x87\xf3<\xf2T\x80\x9eS6\
-\xaf\xed\\\xc4\\\xb6\xba\xbcZ\x08\xd5V\xfa\r\'\x1c\xb4\x89F\xf3\xdc\xf7\x87\
-\xb0\xf9N\x9b\xe7_\x0cU\x07\xc7\xff\x02\xbd\xd2\x01\xaa|\xba<\xfb\xaf\xcd\
-\x04\xcd\x06jc>O?\'y\xe9\'\x9f\xce\xe9\xc8\xdfT\x04|\xa3\xe2\xef U\xaa|^\xa9\
-\xce\xb5U\xaa\\\x86\xea\x00\xa9R\xe52\xfc\x17\xbb\xb9\x96s\xb1\xdd\x12m\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory035Bitmap():
- return wxBitmapFromImage(getDocFactory035Image())
-
-def getDocFactory035Image():
- stream = cStringIO.StringIO(getDocFactory035Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory035')
-catalog['DocFactory035'] = ImageClass()
-catalog['DocFactory035'].getData = getDocFactory035Data
-catalog['DocFactory035'].getImage = getDocFactory035Image
-catalog['DocFactory035'].getBitmap = getDocFactory035Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory036Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rQ\
-IDATx\x9c\xed\x9bYl]\xc7y\x80\xbf\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x1f\xf2\x18\x14A\x81\
-\xa2\x8b\xd1 \xb0\xb3\xd5(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\n\xb5Y\xd6JY\
-\x12Iq\xb9\xdc\xc9K\xde\xf5\x9c{\xce\x99>\xd0\x95\xad\xda\x96\xd8V\xa2*\xe3~\
-\x8f\x17s\xce\xf7\xff\xf3\xdf\xc1\xcc\x99\xc1\x88\xbf\xf9\x96RT\xa8P\xe13\
-\xd1C\xd5W;\x84\n\x15\xfe\xff\xa2\x07+\x03\xa4B\x85\xcfE\x0f\'\xae\x8eX\xa00\
-\xb0\x91x\x17\xfc\xeeb\xe0b\xce_\x0c\xc2F\xfbo1(\xa0\xac\x02xhW\xc4+\xf11E\t\
-\x1fIYY(\xc4\x15\xf1T\xf8\xbf\xa3\x87\xe2\xf3/\x15\xf84\x14v\x11u\xcf\xe1\
-\x7f\xe2\xbf)%HS\'\xef\xc6\xc9\x05\xdb\x99\xd1\x17\xe1\x12\xb8B1x4\xd9oS\xe5\
-\xf5\\\x10\x03\x80n)l\xad\x86nm\x0beB\x97\xd5\xab\xe1\xb0\xd8\xfd9\x81\xf2\
-\x08\x9a!\x18\x93\xcbH\xcb[/\xab\xa3\xc2\xe5C\x0f_\x85\x01b1J\x93\xfe\x02\
-\xa7\xdf\xa8ez0\x02\x08\x90\x12\xa9+\xc25E"\xf5E\xda\x96O\xe2X\x8b\xe8\x0b\
-\xfe%\x0eu\x97=\x86 \xc34\x15_\xe1\xe4O\xe3L\xa7\x03 \x04\x08\t@\xac\xd1f\
-\xd9\xc3\xefR4\xea\x99\xe0\xf6\xcb\xea\r1L\x83\xfdc\x8e\xfd8Ela\x89\x965\x87\
-(\x04o\xa4\xccU(D\x85K\xa2G\xaeB]BJ\x90\xd0V!\xfc"RS\x04\xe3\x02# P\x08J\xf9\
- \xa3\'%\xf9\xd1f\x96\xdf\'1\x8d\xdf\xd0\x1f~\xe0\x82e\x88\xf0=\x84[F\xf8\
-\x1eJj(\xdd@\xc9\xcf^\x0e\t\xd7A\xbae\x80\x0b\xda\x86\x94NX\\\x8fr\x0bH\x8d\
-\xf31\x80 \xb5\xd8$\x14\xea\xc0\x0c6\x11\x91\x9f~\x8f\xaf\x9b(MG:E\x10\x12\
-\xdf\xb0f\x07\xd8%\x9c\x02E\xdc/\x12\xce/ER"\x9b\x8eqC\xd4\xa2.4NF~\\\x889\
-\xe5\xa7\xd4\xc7~30\xeb\xf4\xca\xf8\xba5\xeb*\xdb\xb3\xcd\xcc\xc0\xa7\x9f\
-\x01|3xA\xcc\x15>\x1b\xbd\xca\x1c\x98w\xa9\xa5\x1c0\xd6a\xe8\xef\x12K\xb9\
-\xdc\xfc{\xb7\xa1\x85\x82\xa0|\xcay\x9b\x81C=\x8c\x1cOsn\x7f\x8a\x1b\xee\x89\
-\xe2\x18g(\x88 By\x98\x99n\xccL7^\xa1\x84@\xcdN>\x81\x00vj)NU3|4\x90\x84_\
-\xc6\x9a\xe9\xc1\x98<\x8b\xb2\x1d@\xcdN\x10F\x80b\xed\xcdh\xe1jd\xe06,k\'Z\
-\xca\xe5\xe6\xa76bD\x82\x00\xd8e\xc5\xa4\x11A\x06$1\xbf\x07s\xea\x0c\xd6L7\
-\xcavQJ\x81\x19\xc4\x0bVc\x16\xd3(\x05N\xbc\x95R\xaa\xe3\x92\xce\xb0\xd0\xa9\
-\xf6f\xc8M-\x03\xb7\x13\xa1A\xa9\xb0\x92E\xd6(C\x06\x94\xa41\xb7\xfc\x94O }\
-\x00#\x97F\x1a\x127\xdc\x80V\x18\xc3\xb7\xcb\x08\xd3\xc2\xd1k\x91\xd9q\x84\
-\x14\xd8\x0bW\xe0Ek\x010\xd2\'0\xa6\x06@(\xca\xf1f\xca\x8dK\xe7\xbd\xf6\xd7\
-\x1az\x84\x93\xf3.5\x84\x8e0\xab\xd0e\x0e=(0b)2V\x01\x0f\xb0Ba\xda\xeeZ\x8b\
-\x97\xdbNn\xb8\x9bB\xe6:\x12\xd6\x08\xba9C${\x1a\xbd\x9ca\xe8\xc4$\xe3G\xb2x\
-\xae\x8f\x1e\xd4i\xdc\x90\xa0!6D\xb1\xb8\x80Bp!RyDr\xa7P\xd9i\xfa\xdf\x1d&7h\
-#40#\x06\xd57E\xa9\r\x8d`\x87\xd6#\x8c\x14\xba\xcc\xa3\x07\xc1\x88\xa6(\x04J\
-\xb8x\xb8A\x17\x87Q"j\x88h\xae\x0bJ\xd3\x0c\x1f\x1a\'\xd3\x9d\x07\xa0qC\x92x\
-s\x88\xd1\xa3\xd3\xe8a\x9d\x9aU\x19r\xbeC(\xd7\xfd\xb9\xce\xba\xf0\x04f\xd5&\
-\x86\xf7\x9dbp\xcf>\x94\xef\xa1\xa4\xe0\xd4\xb6_\xb0\xf4\xb1\x87Hh\xfd\xe0\
-\x1c\x99S~\xba*\x11\x0b\x1c\xa7\xfb\x97iB\xb5\x16\xc9\x1b\x87\x99\xe8\xca2~l\
-\x86%\x0f\'\ty?\xa1\xef\xd7a\xe2\xed\x0e\x89\xaaw\xb0#[\x91^\x96\x80\xfb\n\
-\xe9\xc3A\xcc*\x8fx\x87\xc0Q\x7f\x80\x12\xc6\xbc\xd7\xffZB\x0f\xb3g\xde\xa5\
-\x1aI\x04w\xa33\x89\x10\x02\xa1B\x98\xfc\x1a\x8fI\x94&\xf1\xbc;X\xb0\xba\x83\
-\x9e\xed\xff\x8c=6D,\x15#Q\x1eA\x14\x1a8\xfd\xa3\xfd\x14\xc6F\t\xc4cH\xd3\
-\xc4\xc9O1\xbc;M1\xddF\xcbW\x97c\x98\'\xd0\x9d$\x9a\xddB\xd7O\x7fDql\x143\
-\x1a\xc1\x08\x87A8\xe4{\\\x1aWnB\xf3\x07\x10\xb4\xa03\x81g\x17\xb1\'\xa61\
-\x82\x16\xa6\xd0\xd0\x021J\xfa>\xf0r\x04\xdc6N\xbd\xf6*\xf9\xe1a\x02\x898\
-\xd2\xb2\x18?p\x8e\xd1\xbd6\xbe[&T_Op\xc3\xdd\xe8v\x06y1\xe7\xaa\xbbQ\n\x82U\
-\x11\xaaj%\xf9\x91>\x84\x94\x84\xe3\x8b\xd0\x031\x0c\x95\xc6\x9fS~\xc7Q\xd2\
-\xc34V\xe3Ow1zv\x8c\xa9\x0fB\x04\xab\x93,\\\xdbJU\xcdRp\xc2\x18\xfeQ\xf2\x1f\
-j,\\\xd1B\xc1;\x80,\xf9\xe8Z\x07\xe5\xd1\xa3\xc4k\xea\x88W5\x90g\x1f\x95S\
-\xe2\x8b\xa3\x87\xd85\xefR\xc1"\x04\xf7\xa3\x8bq\x84\x04!\x82\x04x\x1fE/\x00\
-R\xb3\tV?D\xc0\x1a\xc2\x1e?\x88\xc6J\x0c\xd1A\xdf\x9e\x97(\x8f\x1dd\xe1\xed[\
-\xa9\xbbu\x0b\xa82n\xb1\xc8\xc0\x8e\x7f\xa2\xd0\xbb\x93Bz9\x91\xf6\x05\xe0\
-\xd70\xb0\xfb?p\'>\xa0\xe5\xae\'Ht\xacC\x06|4-\x8e\xe7\x14Q\xfa$\xa6\xde\x89\
-p7\xa1\x8b1\xdc\xec\x19\xce\xfe\xdbsHS"4I\xe3\xc6g\x89.Y\x82\xf2\xb2dNu\xe1\
-\x8c\x1eb\xe1\x1d\x8fPw\xeb\x16\x84\xee\xe3\xdb0\xf8\xf6KL\x9f\xde\x8b\xa1k\
-\x08\xb3\x1e\xdd\x8d2\xb0\xfb\x95\x8b:\x95\xb5\x83\xd8\xf5\xf7\x10k{\x963/?\
-\x87\xd0=\xda\x1f|\x06aM"\xb5:\xfa\xf6\xfc\xec\xd2\xf9\xb5\xd5\xa3\xac\xed\
-\x08s\x13\xba\x9c\xc2\x94C\xb4l\xfe\x13b\xed+\xf0E/*\xf0>\xe4\x96P\xbf\xc6\
-\xa4\xef\xcd\x7f\xa74\xfdU\x82\xc1"\xcaK2\xd5\xd3\x85\xce\x10\xa9e\x8fA\xa8\
-\x9f\xa0x\x0b*C\xe4\xa2\xe8\x81\xd1\xab\xf0\xa1\xa6kx\x81\x08\x9a-\x91R\x80\
-\x1f\xc1\x9a\xd4\xc0\x9d\x8dEYq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\
-\x05\x1b\xa9[\xf78Zy;\xd2\xdb\x8f4\x1f\xa1n\xf5\xa3\x0ct\x9f\xa0\xd4\xd3Cl\
-\xf1\x93x\x9e\xc0\xee>K(PG\xcd\xaaG\x90\xeeO\x90\x85= \x13hB\x07g\nJI<\x13\
-\xb4\x12\xe8E\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7w\t\x05\xea\xa9[\xbb\
-\x15\xdd\xf99\xa2t\x04\xdfz\x9a\x9a\xe5\x0fP<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\
-\xd2\xce\xdc\x0c\xe8\x19<\xeb\x1b\x98*\x82T\x02M\xafB\xb3_\xc53\x9e\x9eS~U-[\
-\xd1\n\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\xf9\x1e8G \xeb\xa1\xf4\
-\x12UK6\x13\xb0\xdeb\xb2\xf3\x00M[\xff\x18\xcf\xcf\x93=\xfc2\x89\xa6\x95\x98\
-\xc9\xc5\xc8\xfc\x0e\xc8\x02\x953\x98\x8b\xa2\xb3s\xf1\xfc[c\xb5\xb0~\x041\
-\x1c\x04\t\xd8#\xb0\xaf\x16\xa6\x15\x18\x16j\xdd:J}\xef\xa3N\x86\xb0\xda[\
-\x91\xd3\x13x"\x85wZ\xa0\xc7\x1a\xa1\x10@\x1e\x18\x84B\x10\xad1\x8d\xd5p\x07\
-\xdap#\x8c\xc5P\x85\x04\xaaX\xc4\xfd\x10\x8cD=\xfe\x8c\x81~h\x02\n\x9f\xdc*\
-\xae\x86X\r\xacI#\x86\x03XN;\xad[\xff\x0c-\x1a\x01\xdf\xc7\x1f\x1fD\x1e9\x83\
-\xd3\xbc\x00\xe7x\t#\xd9\x88(\'\x10\xfb\xa6!\x17D\xb6\x0c`\xd4\xdf\x826T\x8f\
-\xf0\x92\xe0%P9ui\xe7\x7fy\xd7\x0e"\x87\x03\x08)\xa0\x94\x86\xae$\xfeb9\xa7\
-\xfc\xc8\'\xe0H\x13\xac\x8b\xc3plv\x89\xea\xa7\xa03\x02\x99f\x00D\xa0\x8c\
-\xbc5J$~+\xd9\xdd\xefc\xdfR\xc0N\xa7)\x1fu\xa9\xbf\xe3~\x18\xce\xc3\xbe\x00\
-\xf8W\xa1\xf6\xd7\x18\xfa\xe0\x0bO\xcf\xbb\xd4h\x15$:\xc6)\x9c\\\x84D\xc3\
-\xcfO2\xbdw3H\x85\xb9\xdaG\xcf\xba\x0c~{\x88\xc2\xa9\xdb\xa8y\xa8\x91\xe2a\
-\x1bsE\x1eU\xda@\xf6t\x06/;\x85\x13z\x12\xfb\x03\x97\xd0\x12\x8b\x99\xce~\
-\xa6wu\x10lh\xc0\x9f\x9aB\x84\x80\xf2\xeddv\x8d\xe0<>BI\xfd\x0e\xf6.\x17\xbd\
-I\xc7\xb8N\xc3>T\xc6K\x17I,\x1d\x9d\x8dAh \nd\xfe^\xe0\xf6\x0b\xdc\xc1\x1a\
-\xb4\x86\x06\x92\x7f]\xc2\xcb\xac\xa5\xd0\x95\xa3<1\x8c\x13x\x8c\xe2^\x9b\
-\xf0\x92\x003{z\x98\xde\xd5A\xe8\xba\x14~!\x8d\x90\xfe%\x9d\xa5=6\xc6"\x9f\
-\xc4\x8d\xe3\xe4\x8f\xb5#\x90\xf8\xf912o\xac\xa1\xea\xd9\xc2\x9c\xf2s\xc7\
-\xb3Ln\xfb2\xf1\x9b\x86(t5\xcdn\xf3\xe6\x87\x99\xf8\xe1=\x94\xbb\xcb\xe7\xfb\
-8\xd4\x17 \xb6\xfaQ\x06_\x9c\xe1\xc4\x1fmG\x15]\xac\x86{\xb0\x16\xae\'\xf3\
-\xed!\x8a\xbf\xfa\xddy\xaf\xfb\xb5\x88\xfe\xda\xaa\xf5\xf3.\xad\xae\x9f\xe1~\
-vs.U\x8dS\x94\xd4\x0e\x0e\xc2\x83\x16\xf9I\xc8\x0e;t\x7f\xcb&\x93Kq\xc3\xef\
-\xd7c,-\xf3\xf6\xb6fn\x8a\xf5\x13}\xaa\x9d\xc3\x7f{\x9a\xe1\xe7w\xd3v\xf7\
-\x02\xe4\xca \xa5\xe3yN\xbd\x95\xa1\xd8\xdaN\xdd\xc68]\xbd\x0e\x89T\x96\xf0\
-\x13m\x1c\xfa;\x9f\xb1\xefw\xd2vW=\xea\x9e(\xba\x05\xba\xe1\x92\xfcZ\x84\xfd\
-;Z\xb9S\xee\xe0\\*\tR\xa3\x9dA\xde\x8a<\xc0D2\tI\x90\x9a\xe2+}\xfb\xd1\x1fj\
-\xe5\xf0\x0f\xfa(\xfcp?\x8dkk\xf1\xd7\x9b\x0c|\xe4\xcc5\xb5\x91\xac\xb3hu\
-\xfb\xc8N\x19\x97t\xbe\x1b]\x89\xc0\xe6~\xf1:=5\xd5(i\xd0*\xd2\xfc*\xb9\x8aU\
-\xbd\xbds\xcbo\xc0\xe5\xd4\xe2%\xdc\xa7\x0e\xd0\x97\x8c!\xa4\xe4z\xd5\xcf\
-\xce\x1b\xd62\x11\x0f\x9f\xef\xe3\xd8\x8c`K\xb3\xcb\xe4\x9dk\x199>\x04!\x9d\
-\xd5\x8fnd:W\xc5kN\x1c{U\xe5\xdbc.\xe8\xa7\xfc\xc2\xbcK\x1b\xfdil\xbb\x97q\
-\xa7\xc4\xc4\x98N\xff7\xd3\xa0\xe9\xd8\x8e\x81\x12\x1a\x08\xc9\xa2e.\x1d\xbf\
-\x9d\xe7\xe0\x916\xde\xe9\t1\xaa\x87y\xea\xe1Q\x16n68\xfc\x8b\x1c\'_<\x8b\
-\x92\x1a\xbe0\x08\'$\xcb\xee\x93\x985#\xbc\xb1m\x19\x8d\xb5>\x8fn\x19\xa3\
-\xeeK\x1a\xa7\xf6\xe69\xf9\x9d\xde\xf3m\xab\x9b$\x0f\xfc\x85\xc1\xb8\x16\xc4\
-.\x9da\xbc\x1c\xc6\x8aJ\x1c{\x94\xb3\xe5\x1c#\xfeG\x07k>\xb8\x9d\t\x1e\xdf\
-\x92#\xbcBrh\xcf8\xfb\xdf\xcb\xa0\xa4F\xb4\xd6`\xc1\r\x92\xa1\x92$\x18\xc9c\
-\x17\xcf\xf2\xde\xe1\x15\xfc\xd6\xc6\x8b;\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\xae\
-&\x18s(\xdb\xe3\x9c.\xe5\x99>2\xb7\xfc\xde\xdc\xb6\x0c)\xa7qJ\xa7\x99t\nXU\
-\x06e\xfb\x0cg\xcb\xd73\xe2\x7f\xe2\xb0r\x0c\x9aN\xceP\xb7\xb1\x89\xe3\'\x06\
-\t%L\x1a\xd6G\xe8|\x7f\x92#\xb9\xe0\xbc\xd7\xfcZE\x1f\x18\x98\xff\x83\xc2|6O\
-)\xdfM\xfb-\x82rg\x08\xdb1\xf0\x85N$!\xa9mvhYj\xd3\xbc\xb4\xc4\x9e\xce6^~\
-\xad\x89b)MzP!\xbd \x0fn>Du\xab\xc1\x99\x83A\x8a9\r+*\xb8\xf9\xcbY\xc2\xd5\
-\xf0\x9d\x7f\xbd\x8f\xa3]Y\x0c]C\xd9:\x0f?\xd9\xc5u\xb7i\x1c\xdd\x1daj\xdc"V\
-\xafX\xf1\xa5,=\xbd)\xf6\x1fZ\xc2WVw\xb3he\x84\xaaZ\x9f\xf4\x80\xc5\xb1\x133\
-\xd8N\xe9|\x9c\xe9\xb4\xa2:\x02\x9b\x9f9\xcd\xb9\xa3\x01\x8e\xbf\x17B3\x05k6\
-gi\xbe.\xcf\xbe\x1dI\xa2I\x8f\xb3g\xaa\xd8\xf6\xc6z\xb2\x93\x97p\x1e\xcc\x11\
-\xab\xcaR,\xf4\xd0\xb2|\x92\x86\xb6"\xddg\xa3|p,\x8f\x809\xe7W\x9b\xca`\x17\
-\x0e\xd1\xbcF\'V\xe73\xd0?\xce\xb1\xe3\x93\xd8N\xf6\x82~\xde\xbb\xdf\xe5\xe1\
-M\x0ey\xa7DS{\x02!\xc7ykg\x89\x81\x019\xcf\x15\xbfv\x11\xeb\xd7\xbf9\xefs\
-\xad\x10\xb0ec\x17w\xae\xe9!\x95,"\xe4l\x08\xd9\xacIf\xc6bt2\xc2/\x7f\xb3\
-\x84\xb3\xe7\xaa)\xbb\xf2\x82\xe7\x96\xb6O\xb3a\xd9\x10-\x8d3(O\xe1\xa3\xd1\
-\xd5\x93`\xff\xf1:z\xfa#\xe7\xdbJ\xa9X~\xfd$\x1bW\x0f\x92\x8a\x17(\x97%J\xea\
-|\xf0a5;;\x1b\xc9\xe5\r\xee\xbds\x88\xf5\x1d\x93\x94}\x8d\xd7\xdfi\xe4\xf0\
-\xc9\xaaO\xc5\x1a\xb0<n_;\xca-\xcb\x87\x90\xbe\x8b\xd4`$\x13\xe1\xcc\xb9*6,\
-\x1b\x02\x04\xaf\xbf\xb3\x98\xc3\'\xab/\xe9\xcc\xe6\x0c\x84\x80{\xef\x1ca]\
-\xc7\x04\xae//\xf0\xce5\xbf\xd9w\xf4\xb2\xa1c\x88\xb2\xaf\xf1\xda;m\x1c>y\
-\xe1\xbd\x05C\x87\xbf\xfaz\x8er\xff\x10o~\xaf\x97\xaf\xfdC\x07=cQ\xbe\xf9|\
-\x84\xca\x15\xb9\xb9#\x16,\xf8\xfeU\xeb.! \x14\xfcX\xef\xba`;\x95m\xc7\xcb\
-\xc1\xbaUe~\xf0\xfc\x14/\xfc\xf9\x00\xae\'\xf8\xd3\x7f\\\xc03_\x8f\xf3\xee\
-\xde\xf9\xb9J\xf0EA\x1f\x1c\x1c\xbc\xda1T\xb8\x02\xdc\xb4u\x82\xa9\xa1\x0c\
-\xc7\x0e\xe6y\xe2\xb9\x00]\'l\xde\xdc\xbe\x80\x99ley\xf5?\xa1\xd2[_P\xc2A\
-\x9bh4\xcfC\x7f\x08\x1b\xef\xb5y\xe9\x95Pep\xfc/\xd0\xafv\x00\x15\xae\x0c/\
-\xfeK#A\xb3\x8e\xea\x98\xcf\xf3\xdf\x91\xbc\xfa\xb3+s;\xf2\x8b\x8e\x80oT>\
-\xd9*T\xf8\x1c*sn\x85\n\x17\xa12@*T\xb8\x08\xff\t\xa0M\x96s\x18I#\x89\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory036Bitmap():
- return wxBitmapFromImage(getDocFactory036Image())
-
-def getDocFactory036Image():
- stream = cStringIO.StringIO(getDocFactory036Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory036')
-catalog['DocFactory036'] = ImageClass()
-catalog['DocFactory036'].getData = getDocFactory036Data
-catalog['DocFactory036'].getImage = getDocFactory036Image
-catalog['DocFactory036'].getBitmap = getDocFactory036Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory037Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rP\
-IDATx\x9c\xed\x9bi\x8c]\xd5}\xc0\x7f\xe7\xdc\xed\xad\xf3\x96y\xb3\xda\xe3\
-\xb1g\xc6\x80al\xe3\xdd\xacN\x0c\t\xb5Y\xca\xe6\xb2\xb4PU\xad\xa2\xaa\xa0V\
-\xb4\xfd\x90\x8fQ\x15U\xaa\xba\xa0F\x11\x90\xa5\xa8jEIi\x9c\x04BPlH\x8c\r\
-\x8e3\xde0^\xc7\xd8\x9e\x19\xcf\xf2f\x9fy3o\xbd\xf7\xdd{O?\x0c5\xb8\x04{h\
-\xcd\xa3\xd0\xf7\xfb\xf8t\xee\xfd\xfd\xff\xe7\xff\x8e\xce\xb9\xe7\xe8\x88\
-\xbf\xf9\x96RT\xa9R\xe57\xa2\x87j?\xeb\x10\xaaT\xf9\xbf\x8b\x1e\xac\x0e\x90*\
-U>\x16=\x9c\xa8\xacP\xa00\xb0\x91x\x17\xfd\xeeb\xe0bV.\x06a\xa3\xfd\xb7\x18\
-\x14PV\x01<\xb4O\xc5+\xf11E\t\x1fIYY(\xc4\xa7\xe2\xa9r\xe5\xd0C\xf1\xca\xc9\
-\x04>M\x85\xddD\xdd\xf3\xf8\x1f\xfaoJ\t\xd2\xd4\xc9\xbbqr\xc1\x0ef\xf5\xc5\
-\xb8\x04>\xa5\x18<Z\xec7\xa8\xf1z/\x8a\x01@\xb7\x14\xb6VG\x8f\xb6\x952\xa1+\
-\xea\xd5pX\xe2\xfe\x8c@y\x14\xcd\x10\x8c\xcb\xe5\xa4\xe5\x8dW\xd4Q\xe5\xca\
-\xa3\x87+8@,\xc6h\xd1\x9f\xe1\xcc\xab\xf5\xcc\x0cE\x00\x01R"uE\xb8\xaeH\xa4\
-\xb1H\xfb\x8a)\x1ck1\xfd\xc1\xbf\xc4\xa1\xe1\x8a\xc7\x10d\x84\x96\xe2\x8b\
-\x9c\xfaI\x9c\x99t\x00\x84\x00!\x01\x885\xdb,\xbf\xff-\x8aF#\x93\xdc|E\xbd!F\
-h\xb2\x7f\xc4\xf1\x1f\xa5\x88-,\xd1\xba\xf60\x85\xe0\xb5\x94\xa9`\x01\xaa|b\
-\xf4H\x05\xeb\x13R\x82\x84\xb6\x1a\xe1\x17\x91\x9a"\x18\x17\x18\x01\x81BP\
-\xca\x07\x19;%\xc9\x8f-b\xc5]\x12\xd3\xf85\x03\xe1{.Z\x86\x08\xdfC\xb8e\x84\
-\xef\xa1\xa4\x86\xd2\r\x94\xfc\xcd\xcb!\xe1:H\xb7\x0cpQ\xdb\x90\xd2\t\x8b\
-\xabQn\x01\xa9q!\x06\x10\xa4\x96\x98\x84B\x9d\x98\xc1\x16"\xf2\xa3\xef\xf1u\
-\x13\xa5\xe9H\xa7\x08B\xe2\x1b\xd6\xdc\x00\xbb\x8cS\xa0\x88\xfbE\xc2\xf9eHJd\
-\xd31\xae\x89Z4\x84&\xc8\xc8\x0f\n0\xaf\xfc\x94\xfa\xc0o\x06\xe6\x9c^\x19_\
-\xb7\xe6\\e{\xae\x99\x19\xf8\xe83\x80o\x06/\x8a\xb9\xca\xa5\xd1k\xcc\xc1\x8a\
-\xc9,\xe5\x80\xb1\x1eC\x7f\x8bX\xca\xe5\xfa\xdf\xbb\t-\x14\x04\xe5S\xce\xdb\
-\x0c\x1e\xeee\xf4D\x9a\xf3\x07R\\sG\x14\xc78KA\x04\x11\xca\xc3\xcc\xf4`fz\
-\xf0\n%\x04jn\xf2\t\x04\xb0S\xcbpj\x16\xc1\xfb\x03I\xf8e\xac\xd9^\x8c\xa9s(\
-\xdb\x01\xd4\xdc\x04a\x04(\xd6_\x8f\x16\xaeE\x06n\xc2\xb2v\xa1\xa5\\\xae\x7f\
-l\x13F$\x08\x80]VL\x19\x11d@\x12\xf3{1\xa7\xcfb\xcd\xf6\xa0l\x17\xa5\x14\x98\
-A\xbc`-f1\x8dR\xe0\xc4\xdb(\xa5:/\xeb\x0c\x0b\x9dZo\x96\xdc\xf4rp\xbb\x10\
-\x1a\x94\n\xabXl\x8d1l@I\x1a\xf3\xcbO\xf9\x04\xd2\x071ri\xa4!q\xc3Mh\x85q|\
-\xbb\x8c0-\x1c\xbd\x1e\x99\x9d@H\x81\xbdp%^\xb4\x1e\x00#}\x12cz\x10\x84\xa2\
-\x1c_D\xb9yY\xc5j\xfeyG\x8fp\xaab2C\xe8\x08\xb3\x06]\xe6\xd0\x83\x02#\x96"c\
-\x15\xf0\x00+\x14\xa6\xfd\xb6ux\xb9\x1d\xe4Fz(d\xae"a\x8d\xa2\x9b\xb3D\xb2g\
-\xd0\xcb\x19\x86ON1q4\x8b\xe7\xfa\xe8A\x9d\xe6\x8d\t\x9ab\xc3\x14\x8b\x0b(\
-\x04\x17"\x95G$w\x1a\x95\x9da\xe0\xad\x11rC6B\x033bP{]\x94\xfa\xd0(vh\x03\
-\xc2H\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x18#\xa2\x86\x89\xe6\xba\
-\xa14\xc3\xc8\xe1\t2=y\x00\x9a7&\x89/\n1vl\x06=\xacS\xb7:C\xcew\x08\xe5z>\
-\xd6\xd9\x10\x9e\xc4\xac\xd9\xcc\xc8\xfe\xd3\x0c\xed\xdd\x8f\xf2=\x94\x14\
-\x9c\xde\xfes\x96=t\x1f\tm\x00\x9c\xa3\xf3\xcaOW%b\x81\x13\xf4\xfc"M\xa8\xde\
-"y\xed\x08\x93\xddY&\x8e\xcf\xb2\xf4\xfe$!\xef\xc7\xf4\xff*L\xbc\xc3!Q\xf3&v\
-d\x1b\xd2\xcb\x12p_$}$\x88Y\xe3\x11\xef\x148\xea\x0fP\xc2\xa8X\xdd?\xcf\xe8a\
-\xf6VL\xa6\x91Dp;:S\x08!\x10*\x84\xc9\xaf\xf0\x98Bi\x12\xcf\xbb\x85\x05k:\
-\xe9\xdd\xf1\xcf\xd8\xe3\xc3\xc4R1\x12\xe5QD\xa1\x893?<@a|\x8c@<\x864M\x9c\
-\xfc4#{\xd2\x14\xd3\xed\xb4~u\x05\x86y\x12\xddI\xa2\xd9\xadt\xff\xe4\x87\x14\
-\xc7\xc70\xa3\x11\x8cp\x18\x84C\xbe\xd7\xa5y\xd5f4\x7f\x10A+:\x93xv\x11{r\
-\x06#ha\n\r-\x10\xa3\xa4\xef\x07/G\xc0m\xe7\xf4\xcb/\x91\x1f\x19!\x90\x88#-\
-\x8b\x89\x83\xe7\x19\xdbg\xe3\xbbeB\x8d\x8d\x047\xde\x8eng\x90\x97r\xae\xbe\
-\x1d\xa5 X\x13\xa1\xa6^\x92\x1f\xedGHI8\xbe\x18=\x10\xc3Pi\xfcy\xe5w\x02%=Lc\
-\r\xfeL7c\xe7\xc6\x99~7D\xb06\xc9\xc2um\xd4\xd4-\x03\'\x8c\xe1\x1f#\xff\x9e\
-\xc6\xc2\x95\xad\x14\xbc\x83\xc8\x92\x8f\xaeuR\x1e;F\xbc\xae\x81xM\x13y\xf6S\
-=\x1d\x9e\x1fz\x88\xdd\x15\x93\t\x16#\xb8\x1b]L $\x08\x11$\xc0;(\xfa\x00\x90\
-\x9aM\xb0\xf6>\x02\xd60\xf6\xc4!4Va\x88N\xfa\xf7>Oy\xfc\x10\x0bo\xdeF\xc3\
-\x8d[A\x95q\x8bE\x06w\xfe\x13\x85\xbe]\x14\xd2+\x88t,\x00\xbf\x8e\xc1=\xff\
-\x81;\xf9.\xad\xb7=B\xa2s=2\xe0\xa3iq<\xa7\x88\xd2\xa70\xf5.\x84\xbb\x19]\
-\x8c\xe3f\xcfr\xee\xdf\x9eB\x9a\x12\xa1I\x9a7=It\xe9R\x94\x97%s\xba\x1bg\xec\
-0\x0boy\x80\x86\x1b\xb7"t\x1f\xdf\x86\xa17\x9eg\xe6\xcc>\x0c]C\x98\x8d\xe8n\
-\x94\xc1=/^\xd2\xa9\xac\x9d\xc4\xae\xbe\x83X\xfb\x93\x9c}\xe1)\x84\xee\xd1q\
-\xef\x13\x08k\n\xa95\xd0\xbf\xf7\xa7\x97\xcf\xaf\xbd\x11e\xed@\x98\x9b\xd1\
-\xe54\xa6\x1c\xa6u\xcb\x9f\x10\xebX\x89/\xfaP\x81w \xb7\x94\xc6\xb5&\xfd\xaf\
-\xfd;\xa5\x99\xaf\x12\x0c\x16Q^\x92\xe9\xdent\x86I-\x7f\x08B\x03\x04\xc5\xeb\
-P\x1d"\xf3B\x0f\x8cU\xf0\x83M\xd7\xf0\x02\x114["\xa5\x00?\x825\xa5\x81;\x17\
-\x83\xb2\xe2\xb8~\x18\xb3$0\xbd0B\xc5\xa0\xecc\xf7\xf5\x13\n6\xd3\xb0\xfea\
-\xb4\xf2\x0e\xa4w\x00i>@\xc3\x9a\x07\x19\xec9I\xa9\xb7\x97\xd8\x92G\xf1<\x81\
-\xdds\x8eP\xa0\x81\xba\xd5\x0f \xdd\x1f#\x0b{A&\xd0\x84\x0e\xce4\x94\x92x&h%\
-\xd0\x8b`\x85\x12\xe8V\x14ihX\xc1\x14\x9a\xeb\xa2d\x1b\x99\xae\xef\x10\n4\
-\xd2\xb0n\x1b\xba\xf33D\xe9(\xbe\xf58u+\xee\xa1x\xf2\x00\xba\xa3#T\x02\xbc\
-\xc0\xe5\x9d\xb9Y\xd03x\xd670U\x04\xa9\x04\x9a^\x83f\xbf\x84g<>\xaf\xfcjZ\
-\xb7\xa1\x15\xf6\xe0Y14[#\x14^H\xacm3\xba\xf3]p\x8eB\xd6C\xe9%j\x96n!`\xbd\
-\xceT\xd7AZ\xb6\xfd1\x9e\x9f\'{\xe4\x05\x12-\xab0\x93K\x90\xf9\x9d\x90\x05\
-\xaag0\xf3Bg\xd7\x92\xca\xd9b\xf5\xb0a\x141\x12\x04\t\xd8\xa3\xb0\xbf\x1ef\
-\x14\x18\x16j\xfdzJ\xfd\xef\xa0N\x85\xb0:\xda\x903\x93x"\x85wF\xa0\xc7\x9a\
-\xa1\x10@\x1e\x1c\x82B\x10\xad9\x8d\xd5t\x0b\xdaH3\x8c\xc7P\x85\x04\xaaX\xc4\
-}\x0f\x8cD#\xfe\xac\x81~x\x12\n\x1f\xde*\xae\x85X\x1d\xacM#F\x02XN\x07m\xdb\
-\xfe\x0c-\x1a\x01\xdf\xc7\x9f\x18B\x1e=\x8b\xb3h\x01\xce\x89\x12F\xb2\x19QN \
-\xf6\xcf@.\x88l\x1d\xc4h\xbc\x01m\xb8\x11\xe1%\xc1K\xa0r\xea\xf2\xce\xff\xf2\
-\xae\x1bB\x8e\x04\x10R@)\r\xddI\xfc%r^\xf9\x91O\xc0\xd1\x16X\x1f\x87\x91\xd8\
-\xdc\x12\xd5OAW\x042\x8b\x00\x10\x812\xf2\xc6(\x91\xf8\x8dd\xf7\xbc\x83}C\
-\x01;\x9d\xa6|\xcc\xa5\xf1\x96\xbba$\x0f\xfb\x03\xe0W\xb0\xe6\x9fs\xf4\xa1g\
-\x1e\xaf\x98\xcch\x13$:\'(\x9cZ\x8cD\xc3\xcfO1\xb3o\x0bH\x85\xb9\xc6G\xcf\
-\xba\x0c}{\x98\xc2\xe9\x9b\xa8\xbb\xaf\x99\xe2\x11\x1bse\x1eU\xdaH\xf6L\x06/\
-;\x8d\x13z\x14\xfb]\x97\xd0R\x8b\xd9\xae\x01fvw\x12lj\xc2\x9f\x9eF\x84\x80\
-\xf2\xcddv\x8f\xe2<<JI\xfd\x0e\xf6n\x17\xbdE\xc7\xb8J\xc3>\\\xc6K\x17I,\x1b\
-\x9b\x8bAh \nd\xfe^\xe0\x0e\x08\xdc\xa1:\xb4\xa6&\x92\x7f]\xc2\xcb\xac\xa3\
-\xd0\x9d\xa3<9\x82\x13x\x88\xe2>\x9b\xf0\xd2\x00\xb3{{\x99\xd9\xddI\xe8\xaa\
-\x14~!\x8d\x90\xfee\x9d\xa5\xbd6\xc6b\x9f\xc4\xb5\x13\xe4\x8fw \x90\xf8\xf9q\
-2\xaf\xae\xa5\xe6\xc9\xc2\xbc\xf2s\'\xb2Lm\xff2\xf1\xeb\x86)t\xb7\xccm\xf3\
-\xe6G\x98\xfc\xc1\x1d\x94{\xca\x17\xfa8\xd4\x1f \xb6\xe6A\x86\x9e\x9d\xe5\
-\xe4\x1f\xed@\x15]\xac\xa6;\xb0\x16n \xf3\xeda\x8a\xbf\xfc\xdd\x8a\xd5\xfb\
-\x8b\x80\xfe\xf2\xea\r\x15\x93\xd56\xcer7{8\x9f\xaa\xc5)J\xea\x87\x86\xe0^\
-\x8b\xfc\x14dG\x1cz\xbee\x93\xc9\xa5\xb8\xe6\xf7\x1b1\x96\x95yc\xfb"\xae\x8b\
-\r\x10}\xac\x83#\x7f{\x86\x91\xa7\xf7\xd0~\xfb\x02\xe4\xaa \xa5\x13yN\xbf\
-\x9e\xa1\xd8\xd6A\xc3\xa68\xdd}\x0e\x89T\x96\xf0#\xed\x1c\xfe;\x9f\xf1\xefu\
-\xd1~[#\xea\x8e(\xba\x05\xba\xe1\x92\xfcZ\x84\x03;\xdb\xb8U\xee\xe4|*\tR\xa3\
-\x83!^\x8f\xdc\xc3d2\tI\x90\x9a\xe2+\xfd\x07\xd0\xefk\xe3\xc8\xf7\xfb)\xfc\
-\xe0\x00\xcd\xeb\xea\xf17\x98\x0c\xbe\xef\xcc\xb5\xb4\x93l\xb0hs\xfb\xc9N\
-\x1b\x97u\xbe\x15]\x85\xc0\xe6n\xf1\n\xbdu\xb5(i\xd0&\xd2\xfc2\xb9\x9a\xd5}}\
-\xf3\xcbo\xd0\xe5\xf4\x92\xa5\xdc\xa5\x0e\xd2\x9f\x8c!\xa4\xe4j5\xc0\xaek\
-\xd61\x19\x0f_\xe8\xe3\xd8\xac`\xeb"\x97\xa9[\xd71zb\x18B:k\x1e\xdc\xc4L\xae\
-\x86\x97\x9d8\xf6\xea\xea\xb7\xc7\'A?\xed\x17*&k\xf6g\xb0\xed>&\x9c\x12\x93\
-\xe3:\x03\xdfL\x83\xa6c;\x06Jh $\x8b\x97\xbbt\xfev\x9eCG\xdby\xb37\xc4\x98\
-\x1e\xe6\xb1\xfb\xc7X\xb8\xc5\xe0\xc8\xcfs\x9cz\xf6\x1cJj\xf8\xc2 \x9c\x90,\
-\xbfKb\xd6\x8d\xf2\xea\xf6\xe54\xd7\xfb<\xb8u\x9c\x86/i\x9c\xde\x97\xe7\xd4s\
-}\x17\xda\xd6\xb6H\xee\xf9\x0b\x83\t-\x88]:\xcbD9\x8c\x15\x958\xf6\x18\xe7\
-\xca9F\xfd\xf7\x0f\xd6|p\xbb\x12<\xbc5Gx\xa5\xe4\xf0\xde\t\x0e\xbc\x9dAI\x8d\
-h\xbd\xc1\x82k$\xc3%I0\x92\xc7.\x9e\xe3\xed#+\xf9\xadM\x97v\x0e\xeb-8\x8eO\
-\xa9\xd0\xc3\x88]K0\xe6P\xb6\'8S\xca3st~\xf9\xbd\xb6}9R\xce\xe0\x94\xce0\xe5\
-\x14\xb0j\x0c\xca\xf6Y\xce\x95\xaff\xd4\xff\xd0a\xe58\xb4\x9c\x9a\xa5aS\x0b\
-\'N\x0e\x11J\x984m\x88\xd0\xf5\xce\x14Gs\xc1\x8a\xd5\xfa\x8b\x82>8X\xb9\x83\
-\xc2|6O)\xdfC\xc7\r\x82rW\x08\xdb1\xf0\x85N$!\xa9_\xe4\xd0\xba\xccf\xd1\xb2\
-\x12{\xbb\xday\xe1\xe5\x16\x8a\xa54\xe9!\x85\xf4\x82\xdc\xbb\xe50\xb5m\x06g\
-\x0f\x05)\xe64\xac\xa8\xe0\xfa/g\t\xd7\xc2s\xffz\x17\xc7\xba\xb3\x18\xba\x86\
-\xb2u\xee\x7f\xb4\x9b\xabn\xd28\xb6\'\xc2\xf4\x84E\xacQ\xb1\xf2KYz\xfbR\x1c8\
-\xbc\x94\xaf\xac\xe9a\xf1\xaa\x085\xf5>\xe9A\x8b\xe3\'g\xb1\x9d\xd2\x858\xd3\
-iEm\x04\xb6<q\x86\xf3\xc7\x02\x9cx;\x84f\n\xd6n\xc9\xb2\xe8\xaa<\xfbw&\x89&=\
-\xce\x9d\xada\xfb\xab\x1b\xc8N]\xc6y(G\xac&K\xb1\xd0K\xeb\x8a)\x9a\xda\x8b\
-\xf4\x9c\x8b\xf2\xee\xf1<\x02\xe6\x9d_}*\x83]8\xcc\xa2\xb5:\xb1\x06\x9f\xc1\
-\x81\t\x8e\x9f\x98\xc2v\xb2\x17\xf5\xf3\xbe\x03.\xf7ov\xc8;%Z:\x12\x089\xc1\
-\xeb\xbbJ\x0c\x0e\xca\x8a\xd5\xfa\x8b\x82\xd8\xb0\xe1\xb5\x8a\xcd\xb9B\xc0\
-\xd6M\xdd\xdc\xba\xb6\x97T\xb2\x88\x90s\xeal\xd6$3k16\x15\xe1\x17\xbf^\xca\
-\xb9\xf3\xb5\x94]y\xd1s\xcb:f\xd8\xb8|\x98\xd6\xe6Y\x94\xa7\xf0\xd1\xe8\xeeM\
-p\xe0D\x03\xbd\x03\x91\x0bm\xa5T\xac\xb8z\x8aMk\x86H\xc5\x0b\x94\xcb\x12%u\
-\xde}\xaf\x96]]\xcd\xe4\xf2\x06w\xde:\xcc\x86\xce)\xca\xbe\xc6+o6s\xe4T\xcdG\
-b\rX\x1e7\xaf\x1b\xe3\x86\x15\xc3H\xdfEj0\x9a\x89p\xf6|\r\x1b\x97\x0f\x03\
-\x82W\xde\\\xc2\x91S\xb5\x97ufs\x06B\xc0\x9d\xb7\x8e\xb2\xbes\x12\xd7\x97\
-\x17y\xe7\x9b\xdf\xdc;\xfa\xd8\xd89L\xd9\xd7x\xf9\xcdv\x8e\x9c\xba\xf8\xbe\
-\x82\xa1\xc3_}=Gy`\x98\xd7\xbe\xdb\xc7\xd7\xfe\xa1\x93\xde\xf1(\xdf|:B\xf5j\
-\xdc\'G,X\xf0\xbd\x8aw\x9b\x10\x10\n~\xa0u]\xb0\x9d\xea\xb6\xe3\x95`\xfd\xea\
-2\xdf\x7fz\x9ag\xfe|\x10\xd7\x13\xfc\xe9?.\xe0\x89\xaf\xc7yk_e\xae\x12|\xd1\
-\xd0\x87\x86\x86>\xeb\x18\xaa\\A\xae\xdb6\xc9\xf4p\x86\xe3\x87\xf2<\xf2T\x80\
-\xee\x936\xaf\xedX\xc0l\xb6\xba\xbc\xfa\x9fP\xed\xb5/\x18\xe1\xa0M4\x9a\xe7\
-\xbe?\x84Mw\xda<\xffb\xa8:8\xfe\x17\xe8\x9fu\x00U\xae,\xcf\xfeK3A\xb3\x81\
-\xda\x98\xcf\xd3\xcfI^\xfa\xe9\xa7s;\xf2\xff\x0b\x02\xbeQ\xfdt\xabR\xe5c\xa8\
-\xce\xbdU\xaa\\\x82\xea\x00\xa9R\xe5\x12\xfc\'\x84\xe1\x96s\xc0\xa1{O\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory037Bitmap():
- return wxBitmapFromImage(getDocFactory037Image())
-
-def getDocFactory037Image():
- stream = cStringIO.StringIO(getDocFactory037Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory037')
-catalog['DocFactory037'] = ImageClass()
-catalog['DocFactory037'].getData = getDocFactory037Data
-catalog['DocFactory037'].getImage = getDocFactory037Image
-catalog['DocFactory037'].getBitmap = getDocFactory037Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory038Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rR\
-IDATx\x9c\xed\x9bYl]\xc7y\x80\xbf\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x1f\xf2\x18\x14A\x81\
-\xa2\x8b\xd1 \xb0\xb3\xd5(Z\xb8N\xdd(\x89\x1d\xc7\x88d\'\xb2d+\nEI\x96\xb5R\
-\x96DR\\.w\xf2\x92w=\xe7\x9es\xa6\x0fte\xab\x8e-:\x11\xe5B\xbd\xdf\xe3\xc5\
-\x9c\xf3\xfd\xff\xfcw0sf0\xe2\xef\xbe\xa1\x14\x15*T\xf8\xb5\xe8\xa1\xea\xcf;\
-\x84\n\x15\xfe\xef\xa2\x07+\x03\xa4B\x85OD\x0f\'\xae\x8cH\xa00\xb0\x91x\x17\
-\xfd\xeeb\xe0b^\xb9\x18\x84\x8d\xf6\xbfbP@Y\x05\xf0\xd0\x16\xc4+\xf11E\t\x1f\
-IYY(\xc4\x82x*\\~\xf4P|\xe1%\x02\x9f\x86\xc2\x1e\xa2\xeey\xfc\x8f\xfc7\xa5\
-\x04i\xea\xe4\xdd8\xb9`;\xb3\xfa\x12\\\x02\x0b\x14\x83G\x93\xfd&U^\xefE1\x00\
-\xe8\x96\xc2\xd6j\xe8\xd1\xb6Q&tY\xbd\x1a\x0eK\xdd\x9f\x12(\x8f\xa2\x19\x82q\
-\xb9\x82\xb4\xbc\xf9\xb2:*,\x1cz\xf8\n\x0c\x10\x8b1\x9a\xf4\xe78\xf3Z-3C\x11\
-@\x80\x94H]\x11\xae)\x12\xa9/\xd2\xb6r\n\xc7ZB\x7f\xf0\xafq\xa8\xbb\xec1\x04\
-\x19\xa1\xa9\xf8\x12\xa7~\x1cg&\x1d\x00!@H\x00b\x8d6+\x1e|\x9b\xa2Q\xcf$\xb7\
-^Vo\x88\x11\x1a\xec\x1fr\xfc\x87)b\x8bK\xb4\xac;L!x=e\xae@\xc7W\xf8\xad\xd1#\
-W\xa0N!%Hhk\x10~\x11\xa9)\x82q\x81\x11\x10(\x04\xa5|\x90\xb1S\x92\xfcX3+\xef\
-\x91\x98\xc6\xaf\x18\x08\xdfw\xd12D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\xe4\xaf_\
-\x0e\t\xd7A\xbae\x80\x8b\xda\x86\x94NX\\\x8br\x0bH\x8d\x0b1\x80 \xb5\xd4$\
-\x14\xea\xc0\x0c6\x11\x91\x1f\x7f\x8f\xaf\x9b(MG:E\x10\x12\xdf\xb0\xe6\x06\
-\xd8%\x9c\x02E\xdc/\x12\xce/GR"\x9b\x8eq]\xd4\xa2.4AF~\xd8\xf1\xf3\xcaO\xa9\
-\x0f\xfdf`\xce\xe9\x95\xf1uk\xceU\xb6\xe7\x9a\x99\x81\x8f?\x03\xf8f\xf0\xa2\
-\x98+\xcc\x0f\xbd\xca\x1c\\p\x89\xa5\x1c06`\xe8o\x13K\xb9\xdc\xf8\x07\xb7\
-\xa0\x85\x82\xa0|\xcay\x9b\xc1\xc3\xbd\x8c\x9eHs\xbe+\xc5uwEq\x8c\xb3\x14D\
-\x10\xa1<\xccL\x0ff\xa6\x07\xafPB\xa0\xe6&\x9f@\x00;\xb5\x1c\xa7\xaa\x19>\
-\x18H\xc2/c\xcd\xf6bL\x9dC\xd9\x0e\xa0\xe6&\x08#@\xb1\xf6F\xb4p52p\x0b\x96\
-\xb5\x1b-\xe5r\xe3\x13\x9b1"A\x00\xec\xb2b\xca\x88 \x03\x92\x98\xdf\x8b9}\
-\x16k\xb6\x07e\xbb(\xa5\xc0\x0c\xe2\x05\xab1\x8bi\x94\x02\'\xdeJ)\xd5qIgX\
-\xe8T{\xb3\xe4\xa6W\x80\xdb\x89\xd0\xa0TX\xcd\x12k\x8ca\x03J\xd2\x98_~\xca\'\
-\x90>\x88\x91K#\r\x89\x1bn@+\x8c\xe3\xdbe\x84i\xe1\xe8\xb5\xc8\xec\x04B\n\
-\xec\xc5\xab\xf0\xa2\xb5\x00\x18\xe9\x93\x18\xd3\x83 \x14\xe5x3\xe5\xc6\xe5\
-\x0b^\xeb\xab\r=\xc2\xa9\x05\x97\x18BG\x98U\xe82\x87\x1e\x14\x18\xb1\x14\x19\
-\xab\x80\x07X\xa10mw\xac\xc7\xcb\xed$7\xd2C!s\r\tk\x14\xdd\x9c%\x92=\x83^\
-\xce0|r\x8a\x89\xa3Y<\xd7G\x0f\xea4nJ\xd0\x10\x1b\xa6X\\D!\xb8\x18\xa9<"\xb9\
-\xd3\xa8\xec\x0c\x03o\x8f\x90\x1b\xb2\x11\x1a\x98\x11\x83\xea\x1b\xa2\xd4\
-\x86F\xb1C\x1b\x11F\n]\xe6\xd1\x83`DS\x14\x02%\\<\xdc\xa0\x8b\xc3\x18\x115L4\
-\xd7\r\xa5\x19F\x0eO\x90\xe9\xc9\x03\xd0\xb8)I\xbc9\xc4\xd8\xb1\x19\xf4\xb0N\
-\xcd\x9a\x0c9\xdf!\x94\xeb\xf9Dg]x\x12\xb3j\x0b#\x07N3\xb4\xef\x00\xca\xf7PR\
-pz\xc7\xcfX\xfe\xc8\x03$\xb4\x01p\x8e\xce+?]\x95\x88\x05N\xd0\xf3\xf34\xa1Z\
-\x8b\xe4\xf5#Lvg\x998>\xcb\xb2\x07\x93\x84\xbc\x1f\xd1\xff\xcb0\xf1v\x87D\
-\xd5[\xd8\x91\xedH/K\xc0}\x89\xf4\x91 f\x95G\xbcC\xe0\xa8?B\tc\xc1\xeb}5\xa1\
-\x87\xd9\xb7\xe0\x12\x8d$\x82;\xd1\x99B\x08\x81P!L~\x89\xc7\x14J\x93x\xdem,Z\
-\xdbA\xef\xce\x7f\xc5\x1e\x1f&\x96\x8a\x91(\x8f"\n\r\x9c\xf9A\x17\x85\xf11\
-\x02\xf1\x18\xd24q\xf2\xd3\x8c\xecMSL\xb7\xd1\xf2\xe5\x95\x18\xe6It\'\x89f\
-\xb7\xd0\xfd\xe3\x1fP\x1c\x1f\xc3\x8cF0\xc2a\x10\x0e\xf9^\x97\xc6\xd5[\xd0\
-\xfcA\x04-\xe8L\xe2\xd9E\xec\xc9\x19\x8c\xa0\x85)4\xb4@\x8c\x92~\x00\xbc\x1c\
-\x01\xb7\x8d\xd3\xaf\xbcL~d\x84@"\x8e\xb4,&\x0e\x9egl\xbf\x8d\xef\x96\t\xd5\
-\xd7\x13\xdct\'\xba\x9dA~\x9as\xcd\x9d(\x05\xc1\xaa\x08U\xb5\x92\xfch?BJ\xc2\
-\xf1%\xe8\x81\x18\x86J\xe3\xcf+\xbf\x13(\xe9a\x1ak\xf1g\xba\x19;7\xce\xf4{!\
-\x82\xd5I\x16\xafo\xa5\xaaf98a\x0c\xff\x18\xf9\xf75\x16\xafj\xa1\xe0\x1dD\
-\x96|t\xad\x83\xf2\xd81\xe25u\xc4\xab\x1a\xc8s\x80\xca\xa9\xf0gC\x0f\xb1g\
-\xc1%\x82%\x08\xeeE\x17\x13\x08\tB\x04\t\xf0.\x8a>\x00\xa4f\x13\xac~\x80\x80\
-5\x8c=q\x08\x8d\xd5\x18\xa2\x83\xfe}/P\x1e?\xc4\xe2[\xb7Sw\xf36Pe\xdcb\x91\
-\xc1]\xffB\xa1o7\x85\xf4J"\xed\x8b\xc0\xafap\xef\x7f\xe1N\xbeG\xcb\x1d\x8f\
-\x91\xe8\xd8\x80\x0c\xf8hZ\x1c\xcf)\xa2\xf4)L\xbd\x13\xe1nA\x17\xe3\xb8\xd9\
-\xb3\x9c\xfb\x8fg\x90\xa6Dh\x92\xc6\xcdO\x13]\xb6\x0c\xe5e\xc9\x9c\xee\xc6\
-\x19;\xcc\xe2\xdb\x1e\xa2\xee\xe6m\x08\xdd\xc7\xb7a\xe8\xcd\x17\x989\xb3\x1f\
-C\xd7\x10f=\xba\x1bep\xefK\x9f\xeaT\xd6.b\xd7\xdeE\xac\xedi\xce\xbe\xf8\x0cB\
-\xf7h\xbf\xff)\x845\x85\xd4\xea\xe8\xdf\xf7\x93K\xe7\xd7V\x8f\xb2v"\xcc-\xe8\
-r\x1aS\x0e\xd3\xb2\xf5\xcf\x88\xb5\xaf\xc2\x17}\xa8\xc0\xbb\x90[F\xfd:\x93\
-\xfe\xd7\xff\x93\xd2\xcc\x97\t\x06\x8b(/\xc9to7:\xc3\xa4V<\x02\xa1\x01\x82\
-\xe2\r\xa8\x0c\x91\xcf\x84\x1e\x18\xbb\x02\x1fn\xba\x86\x17\x88\xa0\xd9\x12)\
-\x05\xf8\x11\xac)\r\xdc9\xb7\xb2\xe2\xb8~\x18\xb3$0\xbd0B\xc5\xa0\xecc\xf7\
-\xf5\x13\n6R\xb7\xe1Q\xb4\xf2N\xa4\xd7\x854\x1f\xa2n\xed\xc3\x0c\xf6\x9c\xa4\
-\xd4\xdbKl\xe9\xe3x\x9e\xc0\xee9G(PG\xcd\x9a\x87\x90\xee\x8f\x90\x85} \x13hB\
-\x07g\x1aJI<\x13\xb4\x12\xe8E\xb0B\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7\xb7\t\
-\x05\xea\xa9[\xbf\x1d\xdd\xf9)\xa2t\x14\xdfz\x92\x9a\x95\xf7Q<\xd9\x85\xee\
-\xe8\x08\x95\x00/pign\x16\xf4\x0c\x9e\xf55L\x15A*\x81\xa6W\xa1\xd9/\xe3\x19O\
-\xce+\xbf\xaa\x96\xedh\x85\xbdxV\x0c\xcd\xd6\x08\x85\x17\x13k\xdd\x82\xee|\
-\x07\x9c\xa3\x90\xf5Pz\x89\xaae[\tXo0\xd5y\x90\xa6\xed\x7f\x8a\xe7\xe7\xc9\
-\x1ey\x91D\xd3j\xcc\xe4Rd~\x17d\x81\xca\x19\xccgBg\xf7\xd2\x85\xb7\xc4ja\xe3\
-(b$\x08\x12\xb0G\xe1@-\xcc(0,\xd4\x86\r\x94\xfa\xdfE\x9d\na\xb5\xb7"g&\xf1D\
-\n\xef\x8c@\x8f5B!\x80<8\x04\x85 Zc\x1a\xab\xe16\xb4\x91F\x18\x8f\xa1\n\tT\
-\xb1\x88\xfb>\x18\x89z\xfcY\x03\xfd\xf0$\x14>\xbaU\\\r\xb1\x1aX\x97F\x8c\x04\
-\xb0\x9cvZ\xb7\xff\x05Z4\x02\xbe\x8f?1\x84<z\x16\xa7y\x11\xce\x89\x12F\xb2\
-\x11QN \x0e\xcc@.\x88l\x19\xc4\xa8\xbf\tm\xb8\x1e\xe1%\xc1K\xa0r\xea\xd2\xce\
-\xff\xf1\xae\x1fB\x8e\x04\x10R@)\r\xddI\xfc\xa5r^\xf9\x91O\xc0\xd1&\xd8\x10\
-\x87\x91\xd8\xdc\x12\xd5OAg\x042\xcd\x00\x88@\x19ys\x94H\xfcf\xb2{\xdf\xc5\
-\xbe\xa9\x80\x9dNS>\xe6R\x7f\xdb\xbd0\x92\x87\x03\x01\xf0\xaf@\xad\xaf2\xf4\
-\xa1\xe7\x9e\\p\x89\xd1*HtLP8\xb5\x04\x89\x86\x9f\x9fbf\xffV\x90\ns\xad\x8f\
-\x9eu\x19\xfa\xe60\x85\xd3\xb7P\xf3@#\xc5#6\xe6\xaa<\xaa\xb4\x89\xec\x99\x0c\
-^v\x1a\'\xf48\xf6{.\xa1e\x16\xb3\x9d\x03\xcc\xec\xe9 \xd8\xd0\x80?=\x8d\x08\
-\x01\xe5[\xc9\xec\x19\xc5yt\x94\x92\xfa=\xec=.z\x93\x8eq\x8d\x86}\xb8\x8c\
-\x97.\x92X>6\x17\x83\xd0@\x14\xc8\xfc\xa3\xc0\x1d\x10\xb8C5h\r\r$\xff\xb6\
-\x84\x97YO\xa1;Gyr\x04\'\xf0\x08\xc5\xfd6\xe1e\x01f\xf7\xf52\xb3\xa7\x83\xd0\
-5)\xfcB\x1a!\xfdK:K\xfbl\x8c%>\x89\xeb\'\xc8\x1foG \xf1\xf3\xe3d^[G\xd5\xd3\
-\x85y\xe5\xe7Nd\x99\xda\xf1E\xe27\x0cS\xe8n\x9a\xdb\xe6\xcd\x8f0\xf9\xfd\xbb\
-(\xf7\x94/\xf4q\xa8?@l\xed\xc3\x0c=?\xcb\xc9?\xd9\x89*\xbaX\rwa-\xdeH\xe6\
-\x9b\xc3\x14\x7f\xf1\xfb\x0b^\xe7\xab\x11\xfd\x955\x1b\x17\\R]?\xcb\xbd\xec\
-\xe5|\xaa\x1a\xa7(\xa9\x1d\x1a\x82\xfb-\xf2S\x90\x1dq\xe8\xf9\x86M&\x97\xe2\
-\xba?\xac\xc7X^\xe6\xcd\x1d\xcd\xdc\x10\x1b \xfaD;G\xfe\xfe\x0c#\xcf\xee\xa5\
-\xed\xceE\xc8\xd5AJ\'\xf2\x9c~#C\xb1\xb5\x9d\xba\xcdq\xba\xfb\x1c\x12\xa9,\
-\xe1\xc7\xda8\xfc\x0f>\xe3\xdf\xed\xa4\xed\x8ez\xd4]Qt\x0bt\xc3%\xf9\x95\x08\
-]\xbbZ\xb9]\xee\xe2|*\tR\xa3\x9d!\xde\x88\xdc\xc7d2\tI\x90\x9a\xe2K\xfd]\xe8\
-\x0f\xb4r\xe4{\xfd\x14\xbe\xdfE\xe3\xfaZ\xfc\x8d&\x83\x1f8sMm$\xeb,Z\xdd~\
-\xb2\xd3\xc6%\x9doGW#\xb0\xb9W\xbcJoM5J\x1a\xb4\x8a4\xbfH\xaeaM_\xdf\xfc\xf2\
-\x1bt9\xbdt\x19\xf7\xa8\x83\xf4\'c\x08)\xb9V\r\xb0\xfb\xba\xf5L\xc6\xc3\x17\
-\xfa86+\xd8\xd6\xec2u\xfbzFO\x0cCHg\xed\xc3\x9b\x99\xc9U\xf1\x8a\x13\xc7^S\
-\xf9\xf6\xf8M\xd0O\xfb\x85\x05\x974\xfa3\xd8v\x1f\x13N\x89\xc9q\x9d\x81\xaf\
-\xa7A\xd3\xb1\x1d\x03%4\x10\x92%+\\:~7\xcf\xa1\xa3m\xbc\xd5\x1bbL\x0f\xf3\
-\xc4\x83c,\xdejp\xe4g9N=\x7f\x0e%5|a\x10NHV\xdc#1kFym\xc7\n\x1ak}\x1e\xde6N\
-\xdd\x174N\xef\xcfs\xea[}\x17\xdaV7I\xee\xfb+\x83\t-\x88]:\xcbD9\x8c\x15\x95\
-8\xf6\x18\xe7\xca9F\xfd\x0f\x0e\xd6|p;\x13<\xba-Gx\x95\xe4\xf0\xbe\t\xba\xde\
-\xc9\xa0\xa4F\xb4\xd6`\xd1u\x92\xe1\x92$\x18\xc9c\x17\xcf\xf1\xce\x91U\xfc\
-\xce\xe6Ow\x0e\xebM8\x8eO\xa9\xd0\xc3\x88]M0\xe6P\xb6\'8S\xca3st~\xf9\xbd\
-\xbec\x05R\xce\xe0\x94\xce0\xe5\x14\xb0\xaa\x0c\xca\xf6Y\xce\x95\xafe\xd4\
-\xff\xc8a\xe584\x9d\x9a\xa5ns\x13\'N\x0e\x11J\x984l\x8c\xd0\xf9\xee\x14Gs\
-\xc1\x05\xaf\xf1\xd5\x8a>8\xb8\xf0\x07\x85\xf9l\x9eR\xbe\x87\xf6\x9b\x04\xe5\
-\xce\x10\xb6c\xe0\x0b\x9dHBR\xdb\xec\xd0\xb2\xdc\xa6yy\x89}\x9dm\xbc\xf8J\
-\x13\xc5R\x9a\xf4\x90BzA\xee\xdfz\x98\xeaV\x83\xb3\x87\x82\x14s\x1aVTp\xe3\
-\x17\xb3\x84\xab\xe1[\xff~\x0f\xc7\xba\xb3\x18\xba\x86\xb2u\x1e|\xbc\x9bkn\
-\xd18\xb67\xc2\xf4\x84E\xac^\xb1\xea\x0bYz\xfbRt\x1d^\xc6\x97\xd6\xf6\xb0du\
-\x84\xaaZ\x9f\xf4\xa0\xc5\xf1\x93\xb3\xd8N\xe9B\x9c\xe9\xb4\xa2:\x02[\x9f:\
-\xc3\xf9c\x01N\xbc\x13B3\x05\xeb\xb6fi\xbe&\xcf\x81]I\xa2I\x8fsg\xab\xd8\xf1\
-\xdaF\xb2S\x97p\x1e\xca\x11\xab\xcaR,\xf4\xd2\xb2r\x8a\x86\xb6"=\xe7\xa2\xbc\
-w<\x8f\x80y\xe7W\x9b\xca`\x17\x0e\xd3\xbcN\'V\xe7380\xc1\xf1\x13S\xd8N\xf6\
-\xa2~\xde\xdf\xe5\xf2\xe0\x16\x87\xbcS\xa2\xa9=\x81\x90\x13\xbc\xb1\xbb\xc4\
-\xe0\xa0\\\xf0\x1a_\xad\x88\x8d\x1b__\xf0\xb9W\x08\xd8\xb6\xb9\x9b\xdb\xd7\
-\xf5\x92J\x16\x11rN\x99\xcd\x9adf-\xc6\xa6"\xfc\xfcW\xcb8w\xbe\x9a\xb2+/zny\
-\xfb\x0c\x9bV\x0c\xd3\xd28\x8b\xf2\x14>\x1a\xdd\xbd\t\xbaN\xd4\xd1;\x10\xb9\
-\xd0VJ\xc5\xcak\xa7\xd8\xbcv\x88T\xbc@\xb9,QR\xe7\xbd\xf7\xab\xd9\xdd\xd9H.o\
-p\xf7\xed\xc3l\xec\x98\xa2\xeck\xbc\xfaV#GNU},\xd6\x80\xe5q\xeb\xfa1nZ9\x8c\
-\xf4]\xa4\x06\xa3\x99\x08g\xcfW\xb1i\xc50 x\xf5\xad\xa5\x1c9U}Ig6g \x04\xdc}\
-\xfb(\x1b:&q}y\x91w\xbe\xf9\xcd\xbd\xa3\x8fM\x1d\xc3\x94}\x8dW\xdej\xe3\xc8\
-\xa9\x8b\xef)\x18:\xfc\xcdWs\x94\x07\x86y\xfd;}|\xe5\x9f:\xe8\x1d\x8f\xf2\
-\xf5g#T\xae\xc4\xfd\xe6\x88E\x8b\xbe{\xc5\xbaO\x08\x08\x05?\xd4\xb9.\xd8Ne\
-\xdb\xf1r\xb0aM\x99\xef=;\xcds\x7f9\x88\xeb\t\xfe\xfc\x9f\x17\xf1\xd4W\xe3\
-\xbc\xbd\xff\xca\\%\xb8Z\xd1\x87\x86\x86>\xef\x18*\\\x06n\xd8>\xc9\xf4p\x86\
-\xe3\x87\xf2<\xf6L\x80\xee\x936\xaf\xef\\\xc4l\xb6\xb2\xbc\xfam\xa8\xf4\xdeU\
-B8h\x13\x8d\xe6y\xe0\x8fa\xf3\xdd6/\xbc\x14\xaa\x0c\x8e\xcb\x80\xfey\x07P\
-\xe1\xf2\xf0\xfc\xbf5\x124\xeb\xa8\x8e\xf9<\xfb-\xc9\xcb?Y\x98\xdb\x91\xff\
-\xdf\x10\xf0\xb5\xca\'\\\x85\n\x9f@e\x0e\xaeP\xe1S\xa8\x0c\x90\n\x15>\x85\
-\xff\x06iu\x96sI3\xf6x\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory038Bitmap():
- return wxBitmapFromImage(getDocFactory038Image())
-
-def getDocFactory038Image():
- stream = cStringIO.StringIO(getDocFactory038Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory038')
-catalog['DocFactory038'] = ImageClass()
-catalog['DocFactory038'].getData = getDocFactory038Data
-catalog['DocFactory038'].getImage = getDocFactory038Image
-catalog['DocFactory038'].getBitmap = getDocFactory038Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory039Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rU\
-IDATx\x9c\xed\x9bi\x8c]\xd5}\xc0\x7f\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\
-\x8c\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12j\xb3\x94\xcdei\xa1\xaaZEUA\xadh\xfb!\
-\x1f\xa3*\xaaTuA\x8d" KQ\xd5\x8a\x92\xd28\t\x84\xa0\xd8\x90\x18\x1b\x1cg\xbc\
-a\xbc\x8e\xb1=3\x9e\xe5\xcd>\xf3f\xdez\xef\xbb\xf7\x9e~\x18jp\t\xb6\x0b~\xa5\
-\x85\xf7\xfb\xf8t\xee\xff\xf7\xff\x9f\xf3\x8e\xce\xb9\xf7\xe8\x88\xbf\xf9\
-\x96RT\xa9R\xe57\xa2\x87j?\xeb\x14\xaaT\xf9\xbf\x8b\x1e\xacN\x90*U>\x16=\x9c\
-\xa8\xac@\xa00\xb0\x91x\x17\xfc\xeeb\xe0bVV\xfe\xe1\x1c\x84\x8d\xf6\xdfrP@Y\
-\x05\xf0\xd0*\xe2\x95\xf8\x98\xa2\x84\x8f\xa4\xac,\x14\xa2"\x9e*\x95C\x0f\
-\xc5+\x17\\\xe0\xd3T\xd8E\xd4=\x87\xff\xa1\xff\xa6\x94 M\x9d\xbc\x1b\'\x17\
-\xecdN_\x84K\xa0B9x\xb4\xd8oP\xe3\xf5]\x90\x03\x80n)l\xad\x8e^m\x0beBW\xd4\
-\xab\xe1\xb0\xd8\xfd\x19\x81\xf2\x18\x9a!\x98\x90\xcbH\xcb\x1b\xaf\xa8\xa3J\
-\xe5\xd1\xc3\x15\x9c \x16\xe3\xb4\xe8\xcfp\xfa\xd5zf\x87#\x80\x00)\x91\xba"\
-\\W$\xd2X\xa4c\xf94\x8e\xb5\x88\x81\xe0_\xe2\xd0p\xc5s\x082JK\xf1EN\xfe$\xce\
-l:\x00B\x80\x90\x00\xc4\x9am\x96\xdd\xff\x16E\xa3\x91)n\xbe\xa2\xde\x10\xa34\
-\xd9?\xe2\xd8\x8fR\xc4\x16\x96h[s\x88B\xf0Z\xcaT\xb0\xc3\xab\\q\xf4H\x05\xc7\
-+\xa4\x04\tm\x15\xc2/"5E0.0\x02\x02\x85\xa0\x94\x0f2~R\x92\x1foe\xf9]\x12\
-\xd3\xf85\x83\xe1{.\xd8\x86\x08\xdfC\xb8e\x84\xef\xa1\xa4\x86\xd2\r\x94\xfc\
-\xcd\xdb!\xe1:H\xb7\x0cpA\xdb\x90\xd2\t\x8b\xabQn\x01\xa9q>\x07\x10\xa4\x16\
-\x9b\x84B]\x98\xc1\x16"\xf2\xa3q|\xddDi:\xd2)\x82\x90\xf8\x865?\xc1.\xe1\x14\
-(\xe2~\x91p~)\x92\x12\xd9t\x8ck\xa2\x16\r\xa1I2\xf2\x83\x0e\xbf\xac\xfa\x94\
-\xfa\xc0o\x06\xe6\x9d^\x19_\xb7\xe6]e{\xbe\x99\x19\xf8\xe83\x80o\x06/\xc8\
-\xb9\xca\xff\x0c\xbd\xc6\x1c\xaaXpK9`\xac\xc3\xd0\xdf"\x96r\xb9\xfe\xf7nB\
-\x0b\x05A\xf9\x94\xf36C\x87\xfa\x18;\x9e\xe6\xdc\xfe\x14\xd7\xdc\x11\xc51\
-\xceP\x10A\x84\xf203\xbd\x98\x99^\xbcB\t\x81\x9a_|\x02\x01\xec\xd4R\x9c\x9aV\
-x\x7f"\t\xbf\x8c5\xd7\x871}\x16e;\x80\x9a_ \x8c\x00\xc5\xfa\xeb\xd1\xc2\xb5\
-\xc8\xc0MX\xd6N\xb4\x94\xcb\xf5\x8fm\xc4\x88\x04\x01\xb0\xcb\x8ai#\x82\x0cHb\
-~\x1f\xe6\xcc\x19\xac\xb9^\x94\xed\xa2\x94\x023\x88\x17\xac\xc5,\xa6Q\n\x9cx\
-;\xa5T\xd7%\x9da\xa1S\xeb\xcd\x91\x9bY\x06n7B\x83Ra%\x8b\xacqF\x0c(I\xe3\xf2\
-\xeaS>\x81\xf4\x01\x8c\\\x1aiH\xdcp\x13Za\x02\xdf.#L\x0bG\xafGf\'\x11R`/\\\
-\x81\x17\xad\x07\xc0H\x9f\xc0\x98\x19\x02\xa1(\xc7[)7/\xad\xd8\x18\x7f\xde\
-\xd1#\x9c\xacXpC\xe8\x08\xb3\x06]\xe6\xd0\x83\x02#\x96"c\x15\xf0\x00+\x14\
-\xa6\xe3\xb6\xb5x\xb9\xed\xe4F{)d\xae"a\x8d\xa1\x9bsD\xb2\xa7\xd1\xcb\x19FNL\
-3y$\x8b\xe7\xfa\xe8A\x9d\xe6\r\t\x9ab#\x14\x8b\x0b(\x04\x17"\x95G$w\n\x95\
-\x9de\xf0\xadQr\xc36B\x033bP{]\x94\xfa\xd0\x18vh=\xc2H\xa1\xcb<z\x10\x8ch\
-\x8aB\xa0\x84\x8b\x87\x1btq\x18\'\xa2F\x88\xe6z\xa04\xcb\xe8\xa1I2\xbdy\x00\
-\x9a7$\x89\xb7\x86\x18?:\x8b\x1e\xd6\xa9[\x95!\xe7;\x84r\xbd\x1f\xebl\x08Oa\
-\xd6lbt\xdf)\x86\xf7\xecC\xf9\x1eJ\nNm\xfb9K\x1f\xba\x8f\x846\x08\xce\x91\
-\xcb\xaaOW%b\x81\xe3\xf4\xfe"M\xa8\xde"y\xed(S=Y&\x8f\xcd\xb1\xe4\xfe$!\xef\
-\xc7\x0c\xfc*L\xbc\xd3!Q\xf3&vd+\xd2\xcb\x12p_$}8\x88Y\xe3\x11\xef\x128\xea\
-\x0fP\xc2\xa8\xd88\x7f\x9e\xd1\xc3\xec\xa9Xp\x8d$\x82\xdb\xd1\x99F\x08\x81P!\
-L~\x85\xc74J\x93x\xde-,X\xddE\xdf\xf6\x7f\xc6\x9e\x18!\x96\x8a\x91(\x8f!\nM\
-\x9c\xfe\xe1~\n\x13\xe3\x04\xe21\xa4i\xe2\xe4g\x18\xdd\x9d\xa6\x98\xee\xa0\
-\xed\xab\xcb1\xcc\x13\xe8N\x12\xcdn\xa3\xe7\'?\xa481\x8e\x19\x8d`\x84\xc3 \
-\x1c\xf2}.\xcd+7\xa1\xf9C\x08\xda\xd0\x99\xc2\xb3\x8b\xd8S\xb3\x18A\x0bShh\
-\x81\x18%}\x1fx9\x02n\x07\xa7^~\x89\xfc\xe8(\x81D\x1ciYL\x1e8\xc7\xf8^\x1b\
-\xdf-\x13jl$\xb8\xe1vt;\x83\xbc\x98s\xd5\xed(\x05\xc1\x9a\x085\xf5\x92\xfc\
-\xd8\x00BJ\xc2\xf1E\xe8\x81\x18\x86J\xe3_V}\xc7Q\xd2\xc34V\xe3\xcf\xf60~v\
-\x82\x99wC\x04k\x93,\\\xdbNM\xddRp\xc2\x18\xfeQ\xf2\xefi,\\\xd1F\xc1;\x80,\
-\xf9\xe8Z\x17\xe5\xf1\xa3\xc4\xeb\x1a\x88\xd74\x91g\x1f\xd5\xd3\xe0O\x86\x1e\
-bW\xc5\x82\x0b\x16!\xb8\x1b]L"$\x08\x11$\xc0;(\xfa\x01\x90\x9aM\xb0\xf6>\x02\
-\xd6\x08\xf6\xe4A4Vb\x88.\x06\xf6<Oy\xe2 \x0bo\xdeJ\xc3\x8d[@\x95q\x8bE\x86v\
-\xfc\x13\x85\xfe\x9d\x14\xd2\xcb\x89t.\x00\xbf\x8e\xa1\xdd\xff\x81;\xf5.m\
-\xb7=B\xa2k\x1d2\xe0\xa3iq<\xa7\x88\xd2\xa71\xf5n\x84\xbb\t]L\xe0f\xcfp\xf6\
-\xdf\x9eB\x9a\x12\xa1I\x9a7>It\xc9\x12\x94\x97%s\xaa\x07g\xfc\x10\x0boy\x80\
-\x86\x1b\xb7 t\x1f\xdf\x86\xe17\x9eg\xf6\xf4^\x0c]C\x98\x8d\xe8n\x94\xa1\xdd\
-/^\xd4\xa9\xac\x1d\xc4\xae\xbe\x83X\xc7\x93\x9cy\xe1)\x84\xee\xd1y\xef\x13\
-\x08k\x1a\xa950\xb0\xe7\xa7\x97\xae\xaf\xa3\x11emG\x98\x9b\xd0\xe5\x0c\xa6\
-\x1c\xa1m\xf3\x9f\x10\xeb\\\x81/\xfaQ\x81w \xb7\x84\xc65&\x03\xaf\xfd;\xa5\
-\xd9\xaf\x12\x0c\x16Q^\x92\x99\xbe\x1etFH-{\x08B\x83\x04\xc5\xebP\x9d"\x9f\
-\x08=0^\xc1\x178]\xc3\x0bD\xd0l\x89\x94\x02\xfc\x08\xd6\xb4\x06\xee\xbcSYq\\\
-?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1\xfb\x07\x08\x05\x9biX\xf70Zy;\xd2\xdb\x8f4\
-\x1f\xa0a\xf5\x83\x0c\xf5\x9e\xa0\xd4\xd7Gl\xf1\xa3x\x9e\xc0\xee=K(\xd0@\xdd\
-\xaa\x07\x90\xee\x8f\x91\x85= \x13hB\x07g\x06JI<\x13\xb4\x12\xe8E\xb0B\tt+\
-\x8a44\xac`\n\xcduQ\xb2\x9dL\xf7w\x08\x05\x1aiX\xbb\x15\xdd\xf9\x19\xa2t\x04\
-\xdfz\x9c\xba\xe5\xf7P<\xb1\x1f\xdd\xd1\x11*\x01^\xe0\xd2\xce\xdc\x1c\xe8\
-\x19<\xeb\x1b\x98*\x82T\x02M\xafA\xb3_\xc23\x1e\xbf\xac\xfaj\xda\xb6\xa2\x15\
-v\xe3Y14[#\x14^H\xac}\x13\xba\xf3]p\x8e@\xd6C\xe9%j\x96l&`\xbd\xcet\xf7\x01Z\
-\xb6\xfe1\x9e\x9f\'{\xf8\x05\x12-+1\x93\x8b\x91\xf9\x1d\x90\x05\xaag0\x9f\
-\x08\x9d\x9d\x8b+\x17=V\x0f\xeb\xc7\x10\xa3A\x90\x80=\x06\xfb\xeaaV\x81a\xa1\
-\xd6\xad\xa34\xf0\x0e\xead\x08\xab\xb3\x1d9;\x85\'Rx\xa7\x05z\xac\x19\n\x01\
-\xe4\x81a(\x04\xd1\x9a\xd3XM\xb7\xa0\x8d6\xc3D\x0cUH\xa0\x8aE\xdc\xf7\xc0H4\
-\xe2\xcf\x19\xe8\x87\xa6\xa0\xf0\xe1O\xc5\xb5\x10\xab\x835i\xc4h\x00\xcb\xe9\
-\xa4}\xeb\x9f\xa1E#\xe0\xfb\xf8\x93\xc3\xc8#gpZ\x17\xe0\x1c/a$\x9b\x11\xe5\
-\x04b\xdf,\xe4\x82\xc8\xb6!\x8c\xc6\x1b\xd0F\x1a\x11^\x12\xbc\x04*\xa7.\xed\
-\xfc/\xef\xdaa\xe4h\x00!\x05\x94\xd2\xd0\x93\xc4_,/\xab>\xf2\t8\xd2\x02\xeb\
-\xe20\x1a\x9b\xdf\xa2\xfa)\xe8\x8e@\xa6\x15\x00\x11(#o\x8c\x12\x89\xdfHv\xf7\
-;\xd87\x14\xb0\xd3i\xcaG]\x1ao\xb9\x1bF\xf3\xb0/\x00~\x05\xc7\xf8s\x8e>\xfc\
-\xcc\xe3\x15\x0bn\xb4\x0b\x12]\x93\x14N.B\xa2\xe1\xe7\xa7\x99\xdd\xbb\x19\
-\xa4\xc2\\\xed\xa3g]\x86\xbf=B\xe1\xd4M\xd4\xdd\xd7L\xf1\xb0\x8d\xb9"\x8f*m \
-{:\x83\x97\x9d\xc1\t=\x8a\xfd\xaeKh\x89\xc5\\\xf7 \xb3\xbb\xba\x0865\xe1\xcf\
-\xcc B@\xf9f2\xbb\xc6p\x1e\x1e\xa3\xa4~\x07{\x97\x8b\xde\xa2c\\\xa5a\x1f*\
-\xe3\xa5\x8b$\x96\x8e\xcf\xe7 4\x10\x052\x7f/p\x07\x05\xeep\x1dZS\x13\xc9\
-\xbf.\xe1e\xd6R\xe8\xc9Q\x9e\x1a\xc5\t<Dq\xafMxI\x80\xb9=}\xcc\xee\xea"tU\n\
-\xbf\x90FH\xff\x92\xce\xd2\x1e\x1bc\x91O\xe2\xdaI\xf2\xc7:\x11H\xfc\xfc\x04\
-\x99W\xd7P\xf3d\xe1\xb2\xeas\'\xb3Lo\xfb2\xf1\xebF(\xf4\xb4\xcc\x7f\xe6\xcd\
-\x8f2\xf5\x83;(\xf7\x96\xcf\xf7qh @l\xf5\x83\x0c?;\xc7\x89?\xda\x8e*\xbaXMw`\
--\\O\xe6\xdb#\x14\x7f\xf9\xbb\x15\x1b\xdf/\x02\xfa\xcb\xab\xd6W,xm\xe3\x1cw\
-\xb3\x9bs\xa9Z\x9c\xa2\xa4~x\x18\xee\xb5\xc8OCv\xd4\xa1\xf7[6\x99\\\x8ak~\
-\xbf\x11ci\x997\xb6\xb5r]l\x90\xe8c\x9d\x1c\xfe\xdb\xd3\x8c>\xbd\x9b\x8e\xdb\
-\x17 W\x06)\x1d\xcfs\xea\xf5\x0c\xc5\xf6N\x1a6\xc6\xe9\xe9wH\xa4\xb2\x84\x1f\
-\xe9\xe0\xd0\xdf\xf9L|\xaf\x9b\x8e\xdb\x1aQwD\xd1-\xd0\r\x97\xe4\xd7"\xec\
-\xdf\xd1\xce\xadr\x07\xe7RI\x90\x1a\x9d\x0c\xf3z\xe4\x1e\xa6\x92IH\x82\xd4\
-\x14_\x19\xd8\x8f~_;\x87\xbf?@\xe1\x07\xfbi^[\x8f\xbf\xded\xe8}g\xae\xa5\x83\
-d\x83E\xbb;@v\xc6\xb8\xa4\xf3\xad\xe8J\x046w\x8bW\xe8\xab\xabEI\x83v\x91\xe6\
-\x97\xc9U\xac\xea\xef\xbf\xbc\xfa\x86\\N-^\xc2]\xea\x00\x03\xc9\x18BJ\xaeV\
-\x83\xec\xbcf-S\xf1\xf0\xf9>\x8e\xcd\t\xb6\xb4\xbaL\xdf\xba\x96\xb1\xe3#\x10\
-\xd2Y\xfd\xe0Ffs5\xbc\xec\xc4\xb1WU\xdf=>\r\xfa)\xbfP\xb1\xe0\xcd\xfe,\xb6\
-\xdd\xcf\xa4SbjBg\xf0\x9bi\xd0tl\xc7@\t\r\x84d\xd12\x97\xae\xdf\xces\xf0H\
-\x07o\xf6\x85\x18\xd7\xc3<v\xff8\x0b7\x1b\x1c\xfey\x8e\x93\xcf\x9eEI\r_\x18\
-\x84\x13\x92ewI\xcc\xba1^\xdd\xb6\x8c\xe6z\x9f\x07\xb7L\xd0\xf0%\x8dS{\xf3\
-\x9c|\xae\xff|\xdb\xda\x16\xc9=\x7fa0\xa9\x05\xb1Kg\x98,\x87\xb1\xa2\x12\xc7\
-\x1e\xe7l9\xc7\x98\xff\xfe\xc1\x9a\x0fnw\x82\x87\xb7\xe4\x08\xaf\x90\x1c\xda\
-3\xc9\xfe\xb73(\xa9\x11\xad7Xp\x8dd\xa4$\tF\xf2\xd8\xc5\xb3\xbc}x\x05\xbf\
-\xb5\xf1\xe2\xce\x11\xbd\x05\xc7\xf1)\x15z\x19\xb5k\t\xc6\x1c\xca\xf6$\xa7Ky\
-f\x8f\\^}\xafm[\x86\x94\xb38\xa5\xd3L;\x05\xac\x1a\x83\xb2}\x86\xb3\xe5\xab\
-\x19\xf3?tX9\x01-\'\xe7h\xd8\xd8\xc2\xf1\x13\xc3\x84\x12&M\xeb#t\xbf3\xcd\
-\x91\\\xb0bc\xfbEA\x1f\x1a\xaa\xdcAa>\x9b\xa7\x94\xef\xa5\xf3\x06A\xb9;\x84\
-\xed\x18\xf8B\'\x92\x90\xd4\xb7:\xb4-\xb5i]ZbOw\x07/\xbc\xdcB\xb1\x94&=\xac\
-\x90^\x90{7\x1f\xa2\xb6\xdd\xe0\xcc\xc1 \xc5\x9c\x86\x15\x15\\\xff\xe5,\xe1Z\
-x\xee_\xef\xe2hO\x16C\xd7P\xb6\xce\xfd\x8f\xf6p\xd5M\x1aGwG\x98\x99\xb4\x885\
-*V|)K_\x7f\x8a\xfd\x87\x96\xf0\x95\xd5\xbd,Z\x19\xa1\xa6\xde\'=dq\xec\xc4\
-\x1c\xb6S:\x9fg:\xad\xa8\x8d\xc0\xe6\'Ns\xeeh\x80\xe3o\x87\xd0L\xc1\x9a\xcdY\
-Z\xaf\xca\xb3oG\x92h\xd2\xe3\xec\x99\x1a\xb6\xbd\xba\x9e\xec\xf4%\x9c\x07s\
-\xc4j\xb2\x14\x0b}\xb4-\x9f\xa6\xa9\xa3H\xef\xd9(\xef\x1e\xcb#\xe0\xb2\xeb\
-\xabOe\xb0\x0b\x87h]\xa3\x13k\xf0\x19\x1a\x9c\xe4\xd8\xf1il\'{A?\xef\xdd\xef\
-r\xff&\x87\xbcS\xa2\xa53\x81\x90\x93\xbc\xbe\xb3\xc4\xd0\x90\xac\xd8\xd8~Q\
-\x10\xeb\xd7\xbfV\xb15X\x08\xd8\xb2\xb1\x87[\xd7\xf4\x91J\x16\x11r^\x95\xcd\
-\x9ad\xe6,\xc6\xa7#\xfc\xe2\xd7K8{\xae\x96\xb2+/xni\xe7,\x1b\x96\x8d\xd0\xd6\
-<\x87\xf2\x14>\x1a=}\t\xf6\x1fo\xa0o0r\xbe\xad\x94\x8a\xe5WO\xb3q\xf50\xa9x\
-\x81rY\xa2\xa4\xce\xbb\xef\xd5\xb2\xb3\xbb\x99\\\xde\xe0\xce[GX\xdf5M\xd9\
-\xd7x\xe5\xcdf\x0e\x9f\xac\xf9H\xae\x01\xcb\xe3\xe6\xb5\xe3\xdc\xb0|\x04\xe9\
-\xbbH\r\xc62\x11\xce\x9c\xaba\xc3\xb2\x11@\xf0\xca\x9b\x8b9|\xb2\xf6\x92\xce\
-l\xce@\x08\xb8\xf3\xd61\xd6uM\xe1\xfa\xf2\x02\xef\xe5\xd67\x1f\xa3\x9f\r]#\
-\x94}\x8d\x97\xdf\xec\xe0\xf0\xc9\x0b\xef\'\x18:\xfc\xd5\xd7s\x94\x07Gx\xed\
-\xbb\xfd|\xed\x1f\xba\xe8\x9b\x88\xf2\xcd\xa7#T\xaf\xc2}z\xc4\x82\x05\xdf\
-\xabx7\n\x01\xa1\xe0\x07\x1a\xd7\x05\xdb\xa9~v\xbc\x12\xac[U\xe6\xfbO\xcf\
-\xf0\xcc\x9f\x0f\xe1z\x82?\xfd\xc7\x05<\xf1\xf58o\xed\xfd\xdf\xb9J\xf0yG\x1f\
-\x1e\x1e\xfe\xacs\xa8\xf2)\xb8n\xeb\x143#\x19\x8e\x1d\xcc\xf3\xc8S\x01zN\xd8\
-\xbc\xb6}\x01s\xd9\xea\xf6\xeaJP\xed\xc5\xff\xe7\x84\x836\xd1h\x9e\xfb\xfe\
-\x106\xdei\xf3\xfc\x8b\xa1\xea\xe4\xb8\x82\xe8\x9fu\x02U>\x1d\xcf\xfeK3A\xb3\
-\x81\xda\x98\xcf\xd3\xcfI^\xfaienG~Q\x11\xf0\x8d\xea\xab\\\x95*\x1fCu-\xaeR\
-\xe5"T\'H\x95*\x17\xe1?\x01N\t\x96s06i\xb5\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory039Bitmap():
- return wxBitmapFromImage(getDocFactory039Image())
-
-def getDocFactory039Image():
- stream = cStringIO.StringIO(getDocFactory039Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory039')
-catalog['DocFactory039'] = ImageClass()
-catalog['DocFactory039'].getData = getDocFactory039Data
-catalog['DocFactory039'].getImage = getDocFactory039Image
-catalog['DocFactory039'].getBitmap = getDocFactory039Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory040Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rT\
-IDATx\x9c\xed\x9bi\x8c]\xe5y\xc7\x7f\xef{\xb6\xbb\xce]\xe6\xcej\xcf\x8c=3\
-\x06\x0cc\x1b\xeffubH\xa8\xcdR6\x97\xa5\x85\xaaj\x15U\x05\xb5\xa2\xed\x87|\
-\x8c\xaa\xa8R\xd5\x055\x8a [Q\xd5\x8a\x92\xd28\t\x84\xa0\xd8\x90\x18\x1b\x1c\
-g\xbca\xbc\x8e\xb1=3\x9e\xe5\xce>sg\xeez\xce=\xe7\xbc\xfd0\x14pYl\xc1\x9d\
-\xd0\xca\xf7\xf7\xf1\xea=\xcf\xffY\xee\xa3w\xd3+\xfe\xee[JQ\xa5J\x95\x8fE\
-\x0f\xd5~\xd1.T\xa9\xf2\x7f\x17=Xm\x90*U>\x11=\x9cX\x18\xc3\x02\x85\x81\x8d\
-\xc4\xbb\xe8w\x17\x03\x17saD?\xce\x07a\xa3\xfd/\x1f\x14PV\x01<\xb4\x05\xd1\
-\x95\xf8\x98\xa2\x84\x8f\xa4\xac,\x14bAt\xaa,<z(^y\xa3\x02\x9f\xa6\xc2\x1e\
-\xa2\xee\x05\xfc\x0f\xfd7\xa5\x04i\xea\xe4\xdd8\xb9`\'s\xfa\x12\\\x02\x95w\
-\x00\x10x\xb4\xd8\xafS\xe3\xf5]\xe4\x03\x80n)l\xad\x8e^m\x1beB\x15\xd5\xd5pX\
-\xea\xfe\x9c@y\x0c\xcd\x10L\xc8\x15\xa4\xe5\x8d\x15\xd5\xa8\xf2\xdbC\x0f/@\
-\x83X\x8c\xd3\xa2?\xc3\xd9W\xea\x99\x1d\x8e\x00\x02\xa4D\xea\x8ap]\x91Hc\x91\
-\x8e\x95\xd38\xd6\x12\x06\x82\x7f\x8dCC\xc5}\x082JK\xf1\x05N\xff4\xcel:\x00B\
-\x80\x90\x00\xc4\x9amV\xdc\xff&E\xa3\x91)n\xae\xa8n\x88Q\x9a\xec\x1fs\xe2\
-\xc7)b\x8bK\xb4\xad;B!x-e\x16 \xd1U\x16\x1c=\xb2\x00u\x0b)AB[\x83\xf0\x8bHM\
-\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9f\x96\xe4\xc7[Yy\x97\xc44~\xc3`\xf8\
-\x9e\x8b\x96!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%?~9$\\\x07\xe9\x96\x01.\
-\x1a\x1bR:aq5\xca- 5\xde\xf7\x01\x04\xa9\xa5&\xa1P\x17f\xb0\x85\x88\xfc\xa8\
-\x1d_7Q\x9a\x8et\x8a $\xbea\xcd7\xd8%4\x05\x8a\xb8_$\x9c_\x8e\xa4D6\x1d\xe3\
-\x9a\xa8ECh\x92\x8c\xfc \xd1\x97\x15\x9fR\x1f\xe8\x9b\x81yM\xaf\x8c\xaf[\xf3\
-Ze{~\x98\x19\xf8\xe87\x80o\x06/\xf2\xb9\xcagC\xaf1\x87*n\xd4R\x0e\x18\x1b0\
-\xf47\x89\xa5\\\xae\xff\x83\x9b\xd0BAP>\xe5\xbc\xcd\xd0\x91>\xc6N\xa6\xb9p0\
-\xc55wDq\x8cs\x14D\x10\xa1<\xccL/f\xa6\x17\xafPB\xa0\xe6\'\x9f@\x00;\xb5\x1c\
-\xa7\xa6\x15\xdek$\xe1\x97\xb1\xe6\xfa0\xa6\xcf\xa3l\x07P\xf3\x13\x84\x11\
-\xa0X\x7f=Z\xb8\x16\x19\xb8\t\xcb\xda\x8d\x96r\xb9\xfe\xb1\xcd\x18\x91 \x00v\
-Y1mD\x90\x01I\xcc\xef\xc3\x9c9\x875\xd7\x8b\xb2]\x94R`\x06\xf1\x82\xb5\x98\
-\xc54J\x81\x13o\xa7\x94\xea\xba\xa4fX\xe8\xd4zs\xe4fV\x80\xdb\x8d\xd0\xa0TX\
-\xcd\x12k\x9c\x11\x03J\xd2\xb8\xbc\xf8\x94O }\x08#\x97F\x1a\x127\xdc\x84V\
-\x98\xc0\xb7\xcb\x08\xd3\xc2\xd1\xeb\x91\xd9I\x84\x14\xd8\x8bW\xe1E\xeb\x010\
-\xd2\xa70f\x86@(\xca\xf1V\xca\xcd\xcb+^\xdb+\r=\xc2\xe9\x8a\x1b5\x84\x8e0k\
-\xd0e\x0e=(0b)2V\x01\x0f\xb0Ba:n[\x8f\x97\xdbIn\xb4\x97B\xe6*\x12\xd6\x18\
-\xba9G${\x16\xbd\x9ca\xe4\xd44\x93\xc7\xb2x\xae\x8f\x1e\xd4i\xde\x94\xa0)6B\
-\xb1\xb8\x88Bp1RyDrgP\xd9Y\x06\xdf\x1c%7l#40#\x06\xb5\xd7E\xa9\x0f\x8da\x876\
-"\x8c\x14\xba\xcc\xa3\x07\xc1\x88\xa6(\x04J\xb8x\xb8A\x17\x87q"j\x84h\xae\
-\x07J\xb3\x8c\x1e\x99$\xd3\x9b\x07\xa0yS\x92xk\x88\xf1\xe3\xb3\xe8a\x9d\xba5\
-\x19r\xbeC(\xd7\xfb\x89\x9a\r\xe1)\xcc\x9a-\x8c\x1e8\xc3\xf0\xbe\x03(\xdfCI\
-\xc1\x99\x1d\xbf`\xf9C\xf7\x91\xd0\x06\xc19vY\xf1\xe9\xaaD,p\x92\xde_\xa6\t\
-\xd5[$\xaf\x1de\xaa\'\xcb\xe4\x899\x96\xdd\x9f$\xe4\xfd\x84\x81_\x87\x89w:$j\
-\xde\xc0\x8elGzY\x02\xee\x0b\xa4\x8f\x061k<\xe2]\x02G\xfd\x11J\x18\x15\xaf\
-\xef\x95\x84\x1ef_\xc5\x8dj$\x11\xdc\x8e\xce4B\x08\x84\na\xf2k<\xa6Q\x9a\xc4\
-\xf3na\xd1\xda.\xfav\xfe+\xf6\xc4\x08\xb1T\x8cDy\x0cQh\xe2\xec\x8f\x0eR\x98\
-\x18\'\x10\x8f!M\x13\'?\xc3\xe8\xde4\xc5t\x07m_]\x89a\x9eBw\x92hv\x1b=?\xfd\
-\x11\xc5\x89q\xcch\x04#\x1c\x06\xe1\x90\xefsi^\xbd\x05\xcd\x1fB\xd0\x86\xce\
-\x14\x9e]\xc4\x9e\x9a\xc5\x08Z\x98BC\x0b\xc4(\xe9\x07\xc0\xcb\x11p;8\xf3\xd2\
-\x8b\xe4GG\t$\xe2H\xcbb\xf2\xd0\x05\xc6\xf7\xdb\xf8n\x99Pc#\xc1M\xb7\xa3\xdb\
-\x19\xe4\xa7i\xae\xb9\x1d\xa5 X\x13\xa1\xa6^\x92\x1f\x1b@HI8\xbe\x04=\x10\
-\xc3Pi\xfc\xcb\x8a\xef$Jz\x98\xc6Z\xfc\xd9\x1e\xc6\xcfO0\xf3N\x88`m\x92\xc5\
-\xeb\xdb\xa9\xa9[\x0eN\x18\xc3?N\xfe]\x8d\xc5\xab\xda(x\x87\x90%\x1f]\xeb\
-\xa2<~\x9cx]\x03\xf1\x9a&\xf2\x1c\xa0z\x0b\xfc\xf9\xd0C\xec\xa9\xb8Q\xc1\x12\
-\x04w\xa3\x8bI\x84\x04!\x82\x04x\x1bE?\x00R\xb3\t\xd6\xdeG\xc0\x1a\xc1\x9e<\
-\x8c\xc6j\x0c\xd1\xc5\xc0\xbe\xe7(O\x1cf\xf1\xcd\xdbi\xb8q\x1b\xa82n\xb1\xc8\
-\xd0\xae\x7f\xa1\xd0\xbf\x9bBz%\x91\xceE\xe0\xd71\xb4\xf7\xbfp\xa7\xde\xa1\
-\xed\xb6GHtm@\x06|4-\x8e\xe7\x14Q\xfa4\xa6\xde\x8dp\xb7\xa0\x8b\t\xdc\xec9\
-\xce\xff\xc7SHS"4I\xf3\xe6\'\x89.[\x86\xf2\xb2d\xce\xf4\xe0\x8c\x1fa\xf1-\
-\x0f\xd0p\xe36\x84\xee\xe3\xdb0\xfc\xfas\xcc\x9e\xdd\x8f\xa1k\x08\xb3\x11\
-\xdd\x8d2\xb4\xf7\x85O\xd5T\xd6.bW\xdfA\xac\xe3I\xce=\xff\x14B\xf7\xe8\xbc\
-\xf7\t\x845\x8d\xd4\x1a\x18\xd8\xf7\xb3K\xc7\xd7\xd1\x88\xb2v"\xcc-\xe8r\x06\
-S\x8e\xd0\xb6\xf5\xcf\x88u\xae\xc2\x17\xfd\xa8\xc0\xdb\x90[F\xe3:\x93\x81W\
-\xff\x93\xd2\xecW\t\x06\x8b(/\xc9L_\x0f:#\xa4V<\x04\xa1A\x82\xe25\xa8\xb6\
-\xc8\xe7B\x0f\x8c/\xc0FN\xd7\xf0\x02\x114["\xa5\x00?\x825\xad\x81;\xaf\xa5\
-\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\xd8\xfd\x03\x84\x82\xcd4lx\x18\xad\xbc\x13\
-\xe9\x1dD\x9a\x0f\xd0\xb0\xf6A\x86zOQ\xea\xeb#\xb6\xf4Q<O`\xf7\x9e\'\x14h\
-\xa0n\xcd\x03H\xf7\'\xc8\xc2>\x90\t4\xa1\x833\x03\xa5$\x9e\tZ\t\xf4"X\xa1\
-\x04\xba\x15E\x1a\x1aV0\x85\xe6\xba(\xd9N\xa6\xfb\xbb\x84\x02\x8d4\xac\xdf\
-\x8e\xee\xfc\x1cQ:\x86o=N\xdd\xca{(\x9e:\x88\xee\xe8\x08\x95\x00/pi\xcd\xdc\
-\x1c\xe8\x19<\xeb\x1b\x98*\x82T\x02M\xafA\xb3_\xc43\x1e\xbf\xac\xf8j\xda\xb6\
-\xa3\x15\xf6\xe2Y14[#\x14^L\xac}\x0b\xba\xf3=p\x8eA\xd6C\xe9%j\x96m%`\xbd\
-\xc6t\xf7!Z\xb6\xff)\x9e\x9f\'{\xf4y\x12-\xab1\x93K\x91\xf9]\x90\x05\xaaw0\
-\x9f\x0b\x9d\xddK+o5V\x0f\x1b\xc7\x10\xa3A\x90\x80=\x06\x07\xeaaV\x81a\xa16l\
-\xa04\xf06\xeat\x08\xab\xb3\x1d9;\x85\'Rxg\x05z\xac\x19\n\x01\xe4\xa1a(\x04\
-\xd1\x9a\xd3XM\xb7\xa0\x8d6\xc3D\x0cUH\xa0\x8aE\xdcw\xc1H4\xe2\xcf\x19\xe8G\
-\xa6\xa0\xf0\xe1\xa3\xe2Z\x88\xd5\xc1\xba4b4\x80\xe5t\xd2\xbe\xfd/\xd0\xa2\
-\x11\xf0}\xfc\xc9a\xe4\xb1s8\xad\x8bpN\x960\x92\xcd\x88r\x02q`\x16rAd\xdb\
-\x10F\xe3\rh#\x8d\x08/\t^\x02\x95S\x97\xd6\xfc\x1f\xdd\xf5\xc3\xc8\xd1\x00B\
-\n(\xa5\xa1\'\x89\xbfT^V|\xe4\x13p\xac\x056\xc4a46\xbfD\xf5S\xd0\x1d\x81L+\
-\x00"PF\xde\x18%\x12\xbf\x91\xec\xde\xb7\xb1o(`\xa7\xd3\x94\x8f\xbb4\xder7\
-\x8c\xe6\xe1@\x00\xfc\x05\xa8\xed\x15\x86>\xfc\xcc\xe3\x157j\xb4\x0b\x12]\
-\x93\x14N/A\xa2\xe1\xe7\xa7\x99\xdd\xbf\x15\xa4\xc2\\\xeb\xa3g]\x86\xbf=B\
-\xe1\xccM\xd4\xdd\xd7L\xf1\xa8\x8d\xb9*\x8f*m"{6\x83\x97\x9d\xc1\t=\x8a\xfd\
-\x8eKh\x99\xc5\\\xf7 \xb3{\xba\x0865\xe1\xcf\xcc B@\xf9f2{\xc6p\x1e\x1e\xa3\
-\xa4~\x0f{\x8f\x8b\xde\xa2c\\\xa5a\x1f)\xe3\xa5\x8b$\x96\x8f\xcf\xfb 4\x10\
-\x052\xff(p\x07\x05\xeep\x1dZS\x13\xc9\xbf-\xe1e\xd6S\xe8\xc9Q\x9e\x1a\xc5\t\
-<Dq\xbfMxY\x80\xb9}}\xcc\xee\xe9"tU\n\xbf\x90FH\xff\x92\x9a\xa5}6\xc6\x12\
-\x9f\xc4\xb5\x93\xe4Ot"\x90\xf8\xf9\t2\xaf\xac\xa3\xe6\xc9\xc2e\xc5\xe7Nf\
-\x99\xde\xf1e\xe2\xd7\x8dP\xe8i\x99?\xe6\xcd\x8f2\xf5\xc3;(\xf7\x96\xdf\xcfq\
-h @l\xed\x83\x0c?;\xc7\xa9?\xd9\x89*\xbaXMw`-\xdeH\xe6\xdb#\x14\x7f\xf5\xfb\
-\x15\xaf\xeb\x95\x88\xfe\xd2\x9a\x8d\x157Z\xdb8\xc7\xdd\xec\xe5B\xaa\x16\xa7\
-(\xa9\x1f\x1e\x86{-\xf2\xd3\x90\x1du\xe8\xfd\x96M&\x97\xe2\x9a?l\xc4X^\xe6\
-\xf5\x1d\xad\\\x17\x1b$\xfaX\'G\xff\xfe,\xa3O\xef\xa5\xe3\xf6E\xc8\xd5AJ\'\
-\xf3\x9cy-C\xb1\xbd\x93\x86\xcdqz\xfa\x1d\x12\xa9,\xe1G:8\xf2\x0f>\x13\xdf\
-\xef\xa6\xe3\xb6F\xd4\x1dQt\x0bt\xc3%\xf9\xb5\x08\x07w\xb5s\xab\xdc\xc5\x85T\
-\x12\xa4F\'\xc3\xbc\x16\xb9\x87\xa9d\x12\x92 5\xc5W\x06\x0e\xa2\xdf\xd7\xce\
-\xd1\x1f\x0cP\xf8\xe1A\x9a\xd7\xd7\xe3o4\x19zO3\xd7\xd2A\xb2\xc1\xa2\xdd\x1d\
- ;c\\R\xf3\xcd\xe8j\x046w\x8b\x97\xe9\xab\xabEI\x83v\x91\xe6W\xc95\xac\xe9\
-\xef\xbf\xbc\xf8\x86\\\xce,]\xc6]\xea\x10\x03\xc9\x18BJ\xaeV\x83\xec\xbef=S\
-\xf1\xf0\xfb9\x8e\xcd\t\xb6\xb5\xbaL\xdf\xba\x9e\xb1\x93#\x10\xd2Y\xfb\xe0ff\
-s5\xbc\xe4\xc4\xb1\xd7T\xf7\x1e\x95@?\xe3\x17*n\xb4\xd9\x9f\xc5\xb6\xfb\x99t\
-JLM\xe8\x0c~3\r\x9a\x8e\xed\x18(\xa1\x81\x90,Y\xe1\xd2\xf5\xbby\x0e\x1f\xeb\
-\xe0\x8d\xbe\x10\xe3z\x98\xc7\xee\x1fg\xf1V\x83\xa3\xbf\xc8q\xfa\xd9\xf3(\
-\xa9\xe1\x0b\x83pB\xb2\xe2.\x89Y7\xc6+;V\xd0\\\xef\xf3\xe0\xb6\t\x1a\xbe\xa4\
-qf\x7f\x9e\xd3\xdf\xe9\x7f\x7flm\x8b\xe4\x9e\xbf2\x98\xd4\x82\xd8\xa5sL\x96\
-\xc3XQ\x89c\x8fs\xbe\x9cc\xcc\x7f\xefb\xcd\x07\xb7;\xc1\xc3\xdbr\x84WI\x8e\
-\xec\x9b\xe4\xe0[\x19\x94\xd4\x88\xd6\x1b,\xbaF2R\x92\x04#y\xec\xe2y\xde:\
-\xba\x8a\xdf\xd9\xfc\xe9\x9a#z\x0b\x8e\xe3S*\xf42j\xd7\x12\x8c9\x94\xedI\xce\
-\x96\xf2\xcc\x1e\xbb\xbc\xf8^\xdd\xb1\x02)gqJg\x99v\nX5\x06e\xfb\x1c\xe7\xcb\
-W3\xe6\x7f\xe8\xb2r\x02ZN\xcf\xd1\xb0\xb9\x85\x93\xa7\x86\t%L\x9a6F\xe8~{\
-\x9ac\xb9`\xc5kz\xa5\xa2\x0f\rU\xfe\xa20\x9f\xcdS\xca\xf7\xd2y\x83\xa0\xdc\
-\x1d\xc2v\x0c|\xa1\x13IH\xea[\x1d\xda\x96\xdb\xb4./\xb1\xaf\xbb\x83\xe7_j\
-\xa1XJ\x93\x1eVH/\xc8\xbd[\x8fP\xdbnp\xeep\x90bN\xc3\x8a\n\xae\xffr\x96p-|\
-\xe7\xdf\xef\xe2xO\x16C\xd7P\xb6\xce\xfd\x8f\xf6p\xd5M\x1a\xc7\xf7F\x98\x99\
-\xb4\x885*V})K_\x7f\x8a\x83G\x96\xf1\x95\xb5\xbd,Y\x1d\xa1\xa6\xde\'=dq\xe2\
-\xd4\x1c\xb6Sz\xdf\xcftZQ\x1b\x81\xadO\x9c\xe5\xc2\xf1\x00\'\xdf\n\xa1\x99\
-\x82u[\xb3\xb4^\x95\xe7\xc0\xae$\xd1\xa4\xc7\xf9s5\xecxe#\xd9\xe9Kh\x1e\xce\
-\x11\xab\xc9R,\xf4\xd1\xb6r\x9a\xa6\x8e"\xbd\xe7\xa3\xbcs"\x8f\x80\xcb\x8e\
-\xaf>\x95\xc1.\x1c\xa1u\x9dN\xac\xc1ghp\x92\x13\'\xa7\xb1\x9d\xecEy\xde\x7f\
-\xd0\xe5\xfe-\x0ey\xa7DKg\x02!\'ymw\x89\xa1!Y\xf1\x9a^\xa9\x88\x8d\x1b_\xad\
-\xf8\\,\x04l\xdb\xdc\xc3\xad\xeb\xfaH%\x8b\x089/\x91\xcd\x9ad\xe6,\xc6\xa7#\
-\xfc\xf27\xcb8\x7f\xa1\x96\xb2+/\xfany\xe7,\x9bV\x8c\xd0\xd6<\x87\xf2\x14>\
-\x1a=}\t\x0e\x9el\xa0o0\xf2\xfeX)\x15+\xaf\x9ef\xf3\xdaaR\xf1\x02\xe5\xb2DI\
-\x9dw\xde\xadeww3\xb9\xbc\xc1\x9d\xb7\x8e\xb0\xb1k\x9a\xb2\xaf\xf1\xf2\x1b\
-\xcd\x1c=]\xf3\x11_\x03\x96\xc7\xcd\xeb\xc7\xb9a\xe5\x08\xd2w\x91\x1a\x8ce"\
-\x9c\xbbP\xc3\xa6\x15#\x80\xe0\xe57\x96r\xf4t\xed%5\xb39\x03!\xe0\xce[\xc7\
-\xd8\xd05\x85\xeb\xcb\x8bt/7\xbey\x1b\xfdl\xea\x1a\xa1\xeck\xbc\xf4F\x07GO_\
-\xfc.\xc1\xd0\xe1o\xbe\x9e\xa3<8\xc2\xab\xdf\xeb\xe7k\xff\xd4E\xdfD\x94o>\
-\x1d\xa1\xfa\x04\xaer\x88E\x8b\xbe\xbf`\xe9\x14\x02B\xc1\x0f\xcc\xbb.\xd8N\
-\xf5\xd8\xb1\x12lXS\xe6\x07O\xcf\xf0\xcc_\x0e\xe1z\x82?\xff\xe7E<\xf1\xf58o\
-\xee\xff\xed<%\xb8R\xd0\x87\x87\x87\xbfh\x1f\xaa|\x06\xae\xdb>\xc5\xccH\x86\
-\x13\x87\xf3<\xf2T\x80\x9eS6\xaf\xee\\\xc4\\\xb6\xba\xbc\xaa$\xd5l\xfe?%\x1c\
-\xb4\x89F\xf3\xdc\xf7\xc7\xb0\xf9N\x9b\xe7^\x08U\x9bc\x01\xd0\xbfh\x07\xaa|6\
-\x9e\xfd\xb7f\x82f\x03\xb51\x9f\xa7\xbf#y\xf1g\x0b\xf3:\xf2JG\xc07\xaa[\xba*\
-U>\x81\xea\x9c\\\xa5\xca\xa7Pm\x90*U>\x85\xff\x062\x9d\x96s,\xcf\xb5\'\x00\
-\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory040Bitmap():
- return wxBitmapFromImage(getDocFactory040Image())
-
-def getDocFactory040Image():
- stream = cStringIO.StringIO(getDocFactory040Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory040')
-catalog['DocFactory040'] = ImageClass()
-catalog['DocFactory040'].getData = getDocFactory040Data
-catalog['DocFactory040'].getImage = getDocFactory040Image
-catalog['DocFactory040'].getBitmap = getDocFactory040Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory041Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rW\
-IDATx\x9c\xed\x9by\x8c]\xd5}\xc7?\xe7\xdc\xed\xad\xf3\x96y\xb3\xda3c\xcf\x8c\
-\x01\xc3\xd8\xc6\xbbY\x9d\x18\x12\xd7f)\x9b\xcb\xd2BU\xb5\x8a\xaa\x82Z\xd1\
-\xf6\x8f\xfc\x19UQ\xa5\xaa\x0bj\x14\x01MRT\xb5\xa2\xa44N\x02!(6$\xc6\x06\xc7\
-\x19\x8fm\x8c\xd71\xb6g\xc6\xb3\xbc\xd9g\xde\xcc[\xef}\xf7\xde\xd3?\x86\x1a\
-\\\x82\xed\xa8\x0fh\xc5\xfb\xfc\xf9t\xee\xf7\xfb[\xde\xd19\xf7\x1e\x1d\xf17\
-\xdfR\x8a*U\xaa\xfcZ\xf4P\xed\xe7\x1dB\x95*\xffw\xd1\x83\xd5\tR\xa5\xca\'\
-\xa2\x87\x13\x95\x15\x14(\x0cl$\xde%\xbf\xbb\x18\xb8\x98\x955\xbb\\\x0c\xc2F\
-\xfb\x1f1(\xa0\xac\x02xh\x9f\x8a\xaf\xc4\xc7\x14%|$ee\xa1\x10\x9f\x8aO\x95\
-\xcf\x0e=\x14\xaf\x9c\x98\xc0\xa7\xa9\xb0\x97\xa8{\x01\xff#\xffM)A\x9a:y7N.\
-\xd8\xc9\xbc\xbe\x04\x97@\xe5\x8c/\x89\xc1\xa3\xc5~\x93\x1a\xaf\xff\x92\x18\
-\x00tKaku\xf4i\xdb)\x13\xaa\xa8\xaf\x86\xc3R\xf7\xa7\x04\xca\xe3h\x86`R\xae \
--o\xae\xa8G\x95\xcf\x1e=\\\xc1\tb1A\x8b\xfe,g_\xabgn$\x02\x08\x90\x12\xa9+\
-\xc2uE"\x8dE:V\xce\xe0XK\x18\x0c\xfe%\x0e\r\x953\xff\x80 c\xb4\x14_\xe2\xf4\
-\x8f\xe3\xcc\xa5\x03 \x04\x08\t@\xac\xd9f\xc5\x03oS4\x1a\x99\xe6\xd6\x8a\xfa\
-\x86\x18\xa3\xc9\xfe!\'~\x98"\xb6\xb8D\xdb\xba#\x14\x82\xd7S\xa6\x82\x05\xae\
-\xf2\x99\xa3G*\xd8\xbf\x90\x12$\xb45\x08\xbf\x88\xd4\x14\xc1\xb8\xc0\x08\x08\
-\x14\x82R>\xc8\xc4iI~\xa2\x95\x95wKL\xe3W\x0c\x85\xef\xbdd\x1b"|\x0f\xe1\x96\
-\x11\xbe\x87\x92\x1aJ7P\xf2\xd7o\x87\x84\xeb \xdd2\xc0%cCJ\',\xaeE\xb9\x05\
-\xa4\xc6\xc5\x18@\x90Zj\x12\nua\x06[\x88\xc8\x8f\xeb\xf8\xba\x89\xd2t\xa4S\
-\x04!\xf1\rka\x82]\xc1S\xa0\x88\xfbE\xc2\xf9\xe5HJd\xd31\xae\x8bZ4\x84\xa6\
-\xc8\xc8\x0f\x0b|U\xf9)\xf5\xa1\xbf\x19X\xf0\xf4\xca\xf8\xba\xb5\xe0U\xb6\
-\x17\x86\x99\x81\x8f?\x03\xf8f\xf0\x92\x98\xab\xfc\xef\xd0k\xcc\xe1\x8a\x89Y\
-\xca\x01c\x03\x86\xfe6\xb1\x94\xcb\x8d\xbfw\x0bZ(\x08\xca\xa7\x9c\xb7\x19>\
-\xd2\xcf\xf8\xc94\x17zR\\\xb75\x8ac\x9c\xa3 \x82\x08\xe5af\xfa03}x\x85\x12\
-\x02\xb5\xb0\xf8\x04\x02\xd8\xa9\xe585\xad\xf0\xc1D\x12~\x19k\xbe\x1fc\xe6<\
-\xcav\x00\xb5\xb0@\x18\x01\x8a\xf57\xa2\x85k\x91\x81[\xb0\xac=h)\x97\x1b\x1f\
-\xdf\x8c\x11\t\x02`\x97\x153F\x04\x19\x90\xc4\xfc~\xcc\xd9sX\xf3}(\xdbE)\x05\
-f\x10/X\x8bYL\xa3\x148\xf1vJ\xa9\xae+z\x86\x85N\xad7Onv\x05\xb8\xdd\x08\rJ\
-\x85\xd5,\xb1&\x185\xa0$\x8d\xab\xcbO\xf9\x04\xd2\x870ri\xa4!q\xc3Mh\x85I|\
-\xbb\x8c0-\x1c\xbd\x1e\x99\x9dBH\x81\xbdx\x15^\xb4\x1e\x00#}\ncv\x18\x84\xa2\
-\x1co\xa5\xdc\xbc\xbcb=\xfd\xa2\xa3G8]11C\xe8\x08\xb3\x06]\xe6\xd0\x83\x02#\
-\x96"c\x15\xf0\x00+\x14\xa6\xe3\x8e\xf5x\xb9]\xe4\xc6\xfa(d\xae!a\x8d\xa3\
-\x9b\xf3D\xb2g\xd1\xcb\x19FO\xcd0u,\x8b\xe7\xfa\xe8A\x9d\xe6M\t\x9ab\xa3\x14\
-\x8b\x8b(\x04\x17#\x95G$w\x06\x95\x9dc\xe8\xed1r#6B\x033bP{C\x94\xfa\xd08vh#\
-\xc2H\xa1\xcb<z\x10\x8ch\x8aB\xa0\x84\x8b\x87\x1btq\x98 \xa2F\x89\xe6z\xa14\
-\xc7\xd8\x91)2}y\x00\x9a7%\x89\xb7\x86\x988>\x87\x1e\xd6\xa9[\x93!\xe7;\x84r\
-}\x9f\xe8\xd9\x10\x9e\xc6\xac\xd9\xc2\xd8\xc13\x8c\xec?\x88\xf2=\x94\x14\x9c\
-\xd9\xf93\x96?|?\tm\x08\x9ccW\x95\x9f\xaeJ\xc4\x02\'\xe9\xfby\x9aP\xbdE\xf2\
-\xfa1\xa6{\xb3L\x9d\x98g\xd9\x03IB\xde\x8f\x18\xfce\x98x\xa7C\xa2\xe6-\xec\
-\xc8\x0e\xa4\x97%\xe0\xbeD\xfah\x10\xb3\xc6#\xde%p\xd4\x1f\xa0\x84Q\xb1\xbe~\
-\x91\xd1\xc3\xec\xaf\x98\x98F\x12\xc1\x9d\xe8\xcc \x84@\xa8\x10&\xbf\xc4c\
-\x06\xa5I<\xef6\x16\xad\xed\xa2\x7f\xd7\xbf`O\x8e\x12K\xc5H\x94\xc7\x11\x85&\
-\xce\xfe\xa0\x87\xc2\xe4\x04\x81x\x0ci\x9a8\xf9Y\xc6\xf6\xa5)\xa6;h\xfb\xeaJ\
-\x0c\xf3\x14\xba\x93D\xb3\xdb\xe8\xfd\xf1\x0f(NN`F#\x18\xe10\x08\x87|\xbfK\
-\xf3\xea-h\xfe0\x826t\xa6\xf1\xec"\xf6\xf4\x1cF\xd0\xc2\x14\x1aZ FI?\x08^\
-\x8e\x80\xdb\xc1\x99W^&?6F \x11GZ\x16S\x87.0q\xc0\xc6w\xcb\x84\x1a\x1b\tn\
-\xba\x13\xdd\xce /\xe7\xb9\xe6N\x94\x82`M\x84\x9azI~|\x10!%\xe1\xf8\x12\xf4@\
-\x0cC\xa5\xf1\xaf*\xbf\x93(\xe9a\x1ak\xf1\xe7z\x998?\xc9\xec{!\x82\xb5I\x16\
-\xafo\xa7\xa6n98a\x0c\xff8\xf9\xf75\x16\xafj\xa3\xe0\x1dB\x96|t\xad\x8b\xf2\
-\xc4q\xe2u\r\xc4k\x9a\xc8s\x90\xea\xe9oe\xd0C\xec\xad\x98\x98`\t\x82{\xd0\
-\xc5\x14B\x82\x10A\x02\xbc\x8bb\x00\x00\xa9\xd9\x04k\xef\'`\x8dbO\x1dFc5\x86\
-\xe8bp\xff\x0b\x94\'\x0f\xb3\xf8\xd6\x1d4\xdc\xbc\x1dT\x19\xb7Xdx\xf7?S\x18\
-\xd8C!\xbd\x92H\xe7"\xf0\xeb\x18\xde\xf7\x9f\xb8\xd3\xef\xd1v\xc7\xa3$\xba6 \
-\x03>\x9a\x16\xc7s\x8a(}\x06S\xefF\xb8[\xd0\xc5$n\xf6\x1c\xe7\xff\xfdi\xa4)\
-\x11\x9a\xa4y\xf3SD\x97-CyY2gzq&\x8e\xb0\xf8\xb6\x07i\xb8y;B\xf7\xf1m\x18y\
-\xf3\x05\xe6\xce\x1e\xc0\xd05\x84\xd9\x88\xeeF\x19\xde\xf7\xd2e=\x95\xb5\x9b\
-\xd8\xb5[\x89u<\xc5\xb9\x17\x9fF\xe8\x1e\x9d\xf7=\x89\xb0f\x90Z\x03\x83\xfb\
-\x7fr\xe5\xfc:\x1aQ\xd6.\x84\xb9\x05]\xceb\xcaQ\xda\xb6\xfd\t\xb1\xceU\xf8b\
-\x00\x15x\x17r\xcbh\\g2\xf8\xfa\x7fP\x9a\xfb*\xc1`\x11\xe5%\x99\xed\xefEg\
-\x94\xd4\x8a\x87!4DP\xbc\x01\xd5)R\x11\xf4\xc0D\x05_\xe8t\r/\x10A\xb3%R\n\
-\xf0#X3\x1a\xb8\x0b\x1e\xca\x8a\xe3\xfaa\xcc\x92\xc0\xf4\xc2\x08\x15\x83\xb2\
-\x8f=0H(\xd8L\xc3\x86G\xd0\xca\xbb\x90^\x0f\xd2|\x90\x86\xb5\x0f1\xdcw\x8aR\
-\x7f?\xb1\xa5\x8f\xe1y\x02\xbb\xef<\xa1@\x03uk\x1eD\xba?B\x16\xf6\x83L\xa0\t\
-\x1d\x9cY(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9v2\
-\xdd\xffD(\xd0H\xc3\xfa\x1d\xe8\xceO\x11\xa5c\xf8\xd6\x13\xd4\xad\xbc\x97\
-\xe2\xa9\x1etGG\xa8\x04x\x81+{\xe6\xe6A\xcf\xe0Y\xdf\xc0T\x11\xa4\x12hz\r\
-\x9a\xfd2\x9e\xf1\xc4U\xe5W\xd3\xb6\x03\xad\xb0\x0f\xcf\x8a\xa1\xd9\x1a\xa1\
-\xf0bb\xed[\xd0\x9d\xef\x80s\x0c\xb2\x1eJ/Q\xb3l\x1b\x01\xeb\rf\xba\x0f\xd1\
-\xb2\xe3\x8f\xf1\xfc<\xd9\xa3/\x92hY\x8d\x99\\\x8a\xcc\xef\x86,P=\x83\xa9\
-\x08:{\x96VN-V\x0f\x1b\xc7\x11cA\x90\x80=\x0e\x07\xebaN\x81a\xa16l\xa04\xf8.\
-\xeat\x08\xab\xb3\x1d97\x8d\'Rxg\x05z\xac\x19\n\x01\xe4\xa1\x11(\x04\xd1\x9a\
-\xd3XM\xb7\xa1\x8d5\xc3d\x0cUH\xa0\x8aE\xdc\xf7\xc1H4\xe2\xcf\x1b\xe8G\xa6\
-\xa1\xf0\xd1O\xc5\xb5\x10\xab\x83ui\xc4X\x00\xcb\xe9\xa4}\xc7\x9f\xa1E#\xe0\
-\xfb\xf8S#\xc8c\xe7pZ\x17\xe1\x9c,a$\x9b\x11\xe5\x04\xe2\xe0\x1c\xe4\x82\xc8\
-\xb6a\x8c\xc6\x9b\xd0F\x1b\x11^\x12\xbc\x04*\xa7\xae\xec\xf9\xdf\xbe\xebG\
-\x90c\x01\x84\x14PJCo\x12\x7f\xa9\xbc\xaa\xfc\xc8\'\xe0X\x0bl\x88\xc3Xla\x8b\
-\xea\xa7\xa0;\x02\x99V\x00D\xa0\x8c\xbc9J$~3\xd9}\xefb\xdfT\xc0N\xa7)\x1fwi\
-\xbc\xed\x1e\x18\xcb\xc3\xc1\x00\xf8\x15\xec\xe9\x17\x1c}\xe4\xd9\'*&f\xb4\
-\x0b\x12]S\x14N/A\xa2\xe1\xe7g\x98;\xb0\r\xa4\xc2\\\xeb\xa3g]F\xbe=J\xe1\xcc\
--\xd4\xdd\xdfL\xf1\xa8\x8d\xb9*\x8f*m"{6\x83\x97\x9d\xc5\t=\x86\xfd\x9eKh\
-\x99\xc5|\xf7\x10s{\xbb\x0865\xe1\xcf\xce"B@\xf9V2{\xc7q\x1e\x19\xa7\xa4~\
-\x07{\xaf\x8b\xde\xa2c\\\xa3a\x1f)\xe3\xa5\x8b$\x96O,\xc4 4\x10\x052\x7f/p\
-\x87\x04\xeeH\x1dZS\x13\xc9\xbf.\xe1e\xd6S\xe8\xcdQ\x9e\x1e\xc3\t<L\xf1\x80M\
-xY\x80\xf9\xfd\xfd\xcc\xed\xed"tM\n\xbf\x90FH\xff\x8a\x9e\xa5\xfd6\xc6\x12\
-\x9f\xc4\xf5S\xe4Ot"\x90\xf8\xf9I2\xaf\xad\xa3\xe6\xa9\xc2U\xe5\xe7Ne\x99\
-\xd9\xf9e\xe27\x8cR\xe8mY\xf8\xcc\x9b\x1fc\xfa\xfb[)\xf7\x95/\xd684\x18 \xb6\
-\xf6!F\x9e\x9b\xe7\xd4\x1f\xedB\x15]\xac\xa6\xadX\x8b7\x92\xf9\xf6(\xc5_\xfc\
-n\xc5\xfaY\x05\xf4W\xd6l\xac\x98Xm\xe3<\xf7\xb0\x8f\x0b\xa9Z\x9c\xa2\xa4~d\
-\x04\xee\xb3\xc8\xcf@v\xcc\xa1\xef[6\x99\\\x8a\xeb~\xbf\x11cy\x997w\xb6rCl\
-\x88\xe8\xe3\x9d\x1c\xfd\xdb\xb3\x8c=\xb3\x8f\x8e;\x17!W\x07)\x9d\xccs\xe6\
-\x8d\x0c\xc5\xf6N\x1a6\xc7\xe9\x1dpH\xa4\xb2\x84\x1f\xed\xe0\xc8\xdf\xf9L~\
-\xb7\x9b\x8e;\x1aQ[\xa3\xe8\x16\xe8\x86K\xf2k\x11zv\xb7s\xbb\xdc\xcd\x85T\
-\x12\xa4F\'#\xbc\x11\xb9\x97\xe9d\x12\x92 5\xc5W\x06{\xd0\xefo\xe7\xe8\xf7\
-\x06)|\xbf\x87\xe6\xf5\xf5\xf8\x1bM\x86?\xf0\xcc\xb5t\x90l\xb0hw\x07\xc9\xce\
-\x1aW\xf4|;\xba\x1a\x81\xcd=\xe2U\xfa\xebjQ\xd2\xa0]\xa4\xf9Er\rk\x06\x06\
-\xae.\xbfa\x973K\x97q\xb7:\xc4`2\x86\x90\x92k\xd5\x10{\xae[\xcft<|\xb1\xc6\
-\xb1y\xc1\xf6V\x97\x99\xdb\xd73~r\x14B:k\x1f\xda\xcc\\\xae\x86W\x9c8\xf6\x9a\
-\xea\xbbG%\xd1\xcf\xf8\x85\x8a\x895\xfbs\xd8\xf6\x00SN\x89\xe9I\x9d\xa1o\xa6\
-A\xd3\xb1\x1d\x03%4\x10\x92%+\\\xba~;\xcf\xe1c\x1d\xbc\xd5\x1fbB\x0f\xf3\xf8\
-\x03\x13,\xdefp\xf4g9N?w\x1e%5|a\x10NHV\xdc-1\xeb\xc6ym\xe7\n\x9a\xeb}\x1e\
-\xda>I\xc3\x974\xce\x1c\xc8s\xfa\xf9\x81\x8bck[$\xf7\xfe\x85\xc1\x94\x16\xc4\
-.\x9dc\xaa\x1c\xc6\x8aJ\x1c{\x82\xf3\xe5\x1c\xe3\xfe\x07\x07k>\xb8\xdd\t\x1e\
-\xd9\x9e#\xbcJrd\xff\x14=\xefdPR#Zo\xb0\xe8:\xc9hI\x12\x8c\xe4\xb1\x8b\xe7y\
-\xe7\xe8*~k\xf3\xe5=G\xf5\x16\x1c\xc7\xa7T\xe8c\xcc\xae%\x18s(\xdbS\x9c-\xe5\
-\x99;vu\xf9\xbd\xbes\x05R\xce\xe1\x94\xce2\xe3\x14\xb0j\x0c\xca\xf69\xce\x97\
-\xafe\xdc\xff\xc8a\xe5$\xb4\x9c\x9e\xa7as\x0b\'O\x8d\x10J\x984m\x8c\xd0\xfd\
-\xee\x0c\xc7r\xc1\x8a\xf5\xb2\xca\x02\xfa\xf0p\xe5\x0e\n\xf3\xd9<\xa5|\x1f\
-\x9d7\t\xca\xdd!l\xc7\xc0\x17:\x91\x84\xa4\xbe\xd5\xa1m\xb9M\xeb\xf2\x12\xfb\
-\xbb;x\xf1\x95\x16\x8a\xa54\xe9\x11\x85\xf4\x82\xdc\xb7\xed\x08\xb5\xed\x06\
-\xe7\x0e\x07)\xe64\xac\xa8\xe0\xc6/g\t\xd7\xc2\xf3\xffv7\xc7{\xb3\x18\xba\
-\x86\xb2u\x1ex\xac\x97kn\xd18\xbe/\xc2\xec\x94E\xacQ\xb1\xeaKY\xfa\x07R\xf4\
-\x1cY\xc6W\xd6\xf6\xb1du\x84\x9az\x9f\xf4\xb0\xc5\x89S\xf3\xd8N\xe9b\x9c\xe9\
-\xb4\xa26\x02\xdb\x9e<\xcb\x85\xe3\x01N\xbe\x13B3\x05\xeb\xb6ei\xbd&\xcf\xc1\
-\xddI\xa2I\x8f\xf3\xe7j\xd8\xf9\xdaF\xb23W\xf0<\x9c#V\x93\xa5X\xe8\xa7m\xe5\
-\x0cM\x1dE\xfa\xceGy\xefD\x1e\x01W\x9d_}*\x83]8B\xeb:\x9dX\x83\xcf\xf0\xd0\
-\x14\'N\xce`;\xd9K\xea|\xa0\xc7\xe5\x81-\x0ey\xa7DKg\x02!\xa7xcO\x89\xe1aY\
-\xb1^VY@l\xdc\xf8z\xc5\xd6d!`\xfb\xe6^n_\xd7O*YD\xc8\x05\xe9l\xd6$3o11\x13\
-\xe1\xe7\xbfZ\xc6\xf9\x0b\xb5\x94]y\xc9s\xcb;\xe7\xd8\xb4b\x94\xb6\xe6y\x94\
-\xa7\xf0\xd1\xe8\xedO\xd0s\xb2\x81\xfe\xa1\xc8\xc5\xb1R*V^;\xc3\xe6\xb5#\xa4\
-\xe2\x05\xcae\x89\x92:\xef\xbd_\xcb\x9e\xeefry\x83\xbbn\x1fec\xd7\x0ce_\xe3\
-\xd5\xb7\x9a9z\xba\xe6c\xb1\x06,\x8f[\xd7Op\xd3\xcaQ\xa4\xef"5\x18\xcfD8w\
-\xa1\x86M+F\x01\xc1\xabo-\xe5\xe8\xe9\xda+zfs\x06B\xc0]\xb7\x8f\xb3\xa1k\x1a\
-\xd7\x97\x97\xf8^m~\x0b\x1a\x03l\xea\x1a\xa5\xeck\xbc\xf2V\x07GO_z\x1f\xc1\
-\xd0\xe1\xaf\xbe\x9e\xa3<4\xca\xeb\xdf\x19\xe0k\xff\xd0E\xffd\x94o>\x13\xa1z\
-\xf5\xad\xf2\x88E\x8b\xbe[\xf1\xb2\n\x01\xa1\xe0\x87\xb2\xae\x0b\xb6S\xfd\
-\xecX\t6\xac)\xf3\xbdgfy\xf6\xcf\x87q=\xc1\x9f\xfe\xe3"\x9e\xfcz\x9c\xb7\x0f\
-|6W\t\xbeh\xe8###\x9fw\x0cU~\x03n\xd81\xcd\xech\x86\x13\x87\xf3<\xfat\x80\
-\xdeS6\xaf\xefZ\xc4|\xb6\xba\xbd\xfa4\xa8V\xf5\xff\x19\xe1\xa0M4\x9a\xe7\xfe\
-?\x84\xcdw\xd9\xbc\xf0R\xa8:9>E\xf4\xcf;\x80*\xbf\x19\xcf\xfdk3A\xb3\x81\xda\
-\x98\xcf3\xcfK^\xfe\xc9\xa7s;\xb2\xca\x02\x02\xbeQ}\xb5\xabR\xe5\x13\xa8\xae\
-\xcdU\xaa\\\x86\xea\x04\xa9R\xe52\xfc\x17\x171\x96s\x9fY\xffI\x00\x00\x00\
-\x00IEND\xaeB`\x82'
-
-def getDocFactory041Bitmap():
- return wxBitmapFromImage(getDocFactory041Image())
-
-def getDocFactory041Image():
- stream = cStringIO.StringIO(getDocFactory041Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory041')
-catalog['DocFactory041'] = ImageClass()
-catalog['DocFactory041'].getData = getDocFactory041Data
-catalog['DocFactory041'].getImage = getDocFactory041Image
-catalog['DocFactory041'].getBitmap = getDocFactory041Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory042Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rZ\
-IDATx\x9c\xed\x9bYl\\\xd7}\x87\xbfs\xee6+g\xe1p\x95HJ$e[6%Y\xbb\xbc*\x91\x9d\
-\xb8\x92\x97zS\xbd\xb4vQ\xb4\x08\x8a\xdah\xe1\xb6\x0fy\x0c\x8a\xa0@\xd1\xc5h\
-\x10\xd8\xd9j\x14-\\\xa7n\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xda,k\xa5,\x89\
-\xa4\xb8\x0cwr\xc8Y\xef\x9d{\xef\xe9\x03]\xd9\x8c\x17\x11 e\xb7\xe8|\x8f\x83\
-s\x7f\xbf\xff2\x07\xe7\xdc{p\xc4\xdf}K)*T\xa8\xf0\x89\xe8\xa1\xea/:\x84\n\
-\x15\xfe\xf7\xa2\x07+\x13\xa4B\x85OE\x0f\'\x16GH\xa00\xb0\x91xs~w1p1\x17\xc7\
-d>1\x08\x1b\xed\xb7bP@Y\x05\xf0\xd0\xae\x8a\xaf\xc4\xc7\x14%|$ee\xa1\x10W\
-\xc5\xa7\xc2\xe7\x8f\x1e\x8a/\\D\xe0\xd3P\xd8G\xd4\xbd\x84\xff\x91\xff\xa6\
-\x94 M\x9d\xbc\x1b\'\x17lgF_\x86K`\xe1\x86\x9f\x18\x83G\x93\xfd&U^\xcf\x9c\
-\x18\x00tKak5tk;(\x13ZT_\r\x87\xe5\xee\xcf\t\x94G\xd0\x0c\xc1\x98\\EZ\xde\
-\xbc\xa8\x1e\x15\xbe8\xf4\xf0"L\x10\x8bQ\x9a\xf4\xe78\xffZ-\xd3\x83\x11@\x80\
-\x94H]\x11\xae)\x12\xa9/\xd2\xb6z\x12\xc7ZF_\xf0\xafq\xa8[\xb8\xe9o\x11d\x98\
-\xa6\xe2K\x9c\xfdi\x9c\xe9t\x00\x84\x00!\x01\x885\xda\xacz\xf0m\x8aF=\x13\
-\xdc\xba\xa8\xbe!\x86i\xb0\x7f\xcc\xa9\x1f\xa7\x88--\xd1\xb2\xe1\x18\x85\xe0\
-\xf5\x94Y\x84\xc2V\xf8\xc2\xd1#\x8b\xd0\xc7\x90\x12$\xb4u\x08\xbf\x88\xd4\
-\x14\xc1\xb8\xc0\x08\x08\x14\x82R>\xc8\xe8YI~\xb4\x99\xd5\xf7HL\xe37\xf4\x87\
-\xef\x9b\xb3\r\x11\xbe\x87p\xcb\x08\xdfCI\r\xa5\x1b(\xf9\xc9\xdb!\xe1:H\xb7\
-\x0c0glH\xe9\x84\xc5\xb5(\xb7\x80\xd4\xb8\x1c\x03\x08R\xcbMB\xa1\x0e\xcc`\
-\x13\x11\xf9q\x1d_7Q\x9a\x8et\x8a $\xbea\xcdN\xb0+x\n\x14q\xbfH8\xbf\x12I\
-\x89l:\xc6uQ\x8b\xba\xd08\x19\xf9aa\xe7\x95\x9fR\x1f\xfa\x9b\x81YO\xaf\x8c\
-\xaf[\xb3^e{v\x98\x19\xf8\xf83\x80o\x06\xe7\xc4\\aq\xd0\xab\xcc\x81\x05\x8bX\
-\xca\x01c\x13\x86\xfe6\xb1\x94\xcb\x8d\x7fp\x0bZ(\x08\xca\xa7\x9c\xb7\x198\
-\xd6\xc3\xc8\xe94\x97\x0e\xa7\xb8\xee\xae(\x8eq\x81\x82\x08"\x94\x87\x99\xe9\
-\xc6\xcct\xe3\x15J\x08\xd4\xec\xe2\x13\x08`\xa7V\xe2T5\xc3\x07\x13I\xf8e\xac\
-\x99\x1e\x8c\xc9\x8b(\xdb\x01\xd4\xec\x02a\x04(\xd6\xde\x88\x16\xaeF\x06n\
-\xc1\xb2\xf6\xa2\xa5\\n|b+F$\x08\x80]VL\x1a\x11d@\x12\xf3{0\xa7.`\xcdt\xa3l\
-\x17\xa5\x14\x98A\xbc`5f1\x8dR\xe0\xc4[)\xa5:\xae\xe8\x19\x16:\xd5\xde\x0c\
-\xb9\xa9U\xe0v"4(\x15\xd6\xb2\xcc\x1ae\xc8\x80\x924\xe6\x97\x9f\xf2\t\xa4\
-\x8f`\xe4\xd2HC\xe2\x86\x1b\xd0\nc\xf8v\x19aZ8z-2;\x8e\x90\x02{\xe9\x1a\xbch\
--\x00F\xfa\x0c\xc6\xd4\x00\x08E9\xdeL\xb9q\xe5\x82{Ya.z\x84\xb3\x0b\x161\x84\
-\x8e0\xab\xd0e\x0e=(0b)2V\x01\x0f\xb0Ba\xda\xee\xd8\x88\x97\xdbMn\xb8\x9bB\
-\xe6\x1a\x12\xd6\x08\xba9C${\x1e\xbd\x9ca\xe8\xcc$\xe3\'\xb2x\xae\x8f\x1e\
-\xd4i\xdc\x92\xa0!6D\xb1\xb8\x84Bp)RyDr\xe7P\xd9i\xfa\xdf\x1e&7h#40#\x06\xd5\
-7D\xa9\r\x8d`\x876#\x8c\x14\xba\xcc\xa3\x07\xc1\x88\xa6(\x04J\xb8x\xb8A\x17\
-\x87Q"j\x88h\xae\x0bJ\xd3\x0c\x1f\x1b\'\xd3\x9d\x07\xa0qK\x92xs\x88\xd1\x93\
-\xd3\xe8a\x9d\x9au\x19r\xbeC(\xd7\xfd\xa9\x9eu\xe1\t\xcc\xaam\x0c\x1f:\xc7\
-\xe0\x81C(\xdfCI\xc1\xb9]\xbf`\xe5#\x0f\x90\xd0\xfa\xc191\xaf\xfctU"\x168M\
-\xf7/\xd3\x84j-\x92\xd7\x0f3\xd1\x95e\xfc\xd4\x0c+\x1eL\x12\xf2~B\xdf\xaf\
-\xc3\xc4\xdb\x1d\x12UoaGv"\xbd,\x01\xf7%\xd2\xc7\x83\x98U\x1e\xf1\x0e\x81\
-\xa3\xfe\x08%\x8c\x05\xf7\xb3\xc2\x87\xe8a\x0e,XD#\x89\xe0Nt&\x11B T\x08\x93\
-_\xe31\x89\xd2$\x9ew\x1bK\xd6w\xd0\xb3\xfb_\xb1\xc7\x86\x88\xa5b$\xca#\x88B\
-\x03\xe7\x7ft\x98\xc2\xd8(\x81x\x0ci\x9a8\xf9)\x86\xf7\xa7)\xa6\xdbh\xf9\xea\
-j\x0c\xf3\x0c\xba\x93D\xb3[\xe8\xfa\xe9\x8f(\x8e\x8dbF#\x18\xe10\x08\x87|\
-\x8fK\xe3\xdamh\xfe\x00\x82\x16t&\xf0\xec"\xf6\xc44F\xd0\xc2\x14\x1aZ FI?\
-\x04^\x8e\x80\xdb\xc6\xb9W^&?<L \x11GZ\x16\xe3G.1z\xd0\xc6w\xcb\x84\xea\xeb\
-\tn\xb9\x13\xdd\xce ?\xcbs\xdd\x9d(\x05\xc1\xaa\x08U\xb5\x92\xfcH\x1fBJ\xc2\
-\xf1e\xe8\x81\x18\x86J\xe3\xcf+\xbf\xd3(\xe9a\x1a\xeb\xf1\xa7\xbb\x18\xbd8\
-\xc6\xd4{!\x82\xd5I\x96nl\xa5\xaaf%8a\x0c\xff$\xf9\xf75\x96\xaei\xa1\xe0\x1d\
-A\x96|t\xad\x83\xf2\xe8I\xe25u\xc4\xab\x1a\xc8s\x88\xca\xa9\xef\xe2\xa2\x87\
-\xd8\xb7`\x11\xc12\x04\xf7\xa2\x8bq\x84\x04!\x82\x04x\x17E/\x00R\xb3\tV?@\
-\xc0\x1a\xc2\x1e?\x8a\xc6Z\x0c\xd1A\xdf\x81\x17(\x8f\x1de\xe9\xad;\xa9\xbby\
-\x07\xa82n\xb1\xc8\xc0\x9e\x7f\xa1\xd0\xbb\x97Bz5\x91\xf6%\xe0\xd70\xb0\xff\
-\xbfp\'\xde\xa3\xe5\x8e\xc7HtlB\x06|4-\x8e\xe7\x14Q\xfa$\xa6\xde\x89p\xb7\
-\xa1\x8b1\xdc\xec\x05.\xfe\xc73HS"4I\xe3\xd6\xa7\x89\xaeX\x81\xf2\xb2d\xceu\
-\xe1\x8c\x1ec\xe9m\x0fQw\xf3\x0e\x84\xee\xe3\xdb0\xf8\xe6\x0bL\x9f?\x88\xa1k\
-\x08\xb3\x1e\xdd\x8d2\xb0\xff\xa5\xcf\xf4T\xd6\x1eb\xd7\xdeE\xac\xedi.\xbc\
-\xf8\x0cB\xf7h\xbf\xff)\x845\x89\xd4\xea\xe8;\xf0\xb3+\xe7\xd7V\x8f\xb2v#\
-\xccm\xe8r\nS\x0e\xd1\xb2\xfd\xcf\x88\xb5\xaf\xc1\x17\xbd\xa8\xc0\xbb\x90[A\
-\xfd\x06\x93\xbe\xd7\xff\x93\xd2\xf4W\t\x06\x8b(/\xc9TO\x17:C\xa4V=\x02\xa1~\
-\x82\xe2\r\xa8L\x91EE\x0f\x8c.\xc2\x8b\x9d\xae\xe1\x05"h\xb6DJ\x01~\x04kR\
-\x03wV[Yq\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\x05\x1b\xa9\xdb\xf4(Zy\
-7\xd2;\x8c4\x1f\xa2n\xfd\xc3\x0ct\x9f\xa1\xd4\xd3Cl\xf9\xe3x\x9e\xc0\xee\xbe\
-H(PG\xcd\xba\x87\x90\xeeO\x90\x85\x03 \x13hB\x07g\nJI<\x13\xb4\x12\xe8E\xb0B\
-\tt+\x8a44\xac`\n\xcduQ\xb2\x95L\xe7w\t\x05\xea\xa9\xdb\xb8\x13\xdd\xf99\xa2\
-t\x02\xdfz\x92\x9a\xd5\xf7Q<s\x18\xdd\xd1\x11*\x01^\xe0\xca\x9e\xb9\x19\xd03\
-x\xd670U\x04\xa9\x04\x9a^\x85f\xbf\x8cg<9\xaf\xfc\xaaZv\xa2\x15\xf6\xe3Y14[#\
-\x14^J\xacu\x1b\xba\xf3=pN@\xd6C\xe9%\xaaVl\'`\xbd\xc1d\xe7\x11\x9av\xfe)\
-\x9e\x9f\'{\xfcE\x12Mk1\x93\xcb\x91\xf9=\x90\x05*g0\x8b\x8a\xce\xde\xe5\x0bW\
-\x89\xd5\xc2\xe6\x11\xc4p\x10$`\x8f\xc0\xa1Z\x98V`X\xa8M\x9b(\xf5\xbd\x8b:\
-\x1b\xc2joENO\xe0\x89\x14\xdey\x81\x1ek\x84B\x00yd\x10\nA\xb4\xc64V\xc3mh\
-\xc3\x8d0\x16C\x15\x12\xa8b\x11\xf7}0\x12\xf5\xf83\x06\xfa\xb1\t(|\xf4Sq5\
-\xc4j`C\x1a1\x1c\xc0r\xdai\xdd\xf9\x17h\xd1\x08\xf8>\xfe\xf8 \xf2\xc4\x05\
-\x9c\xe6%8\xa7K\x18\xc9FD9\x8184\r\xb9 \xb2e\x00\xa3\xfe&\xb4\xa1z\x84\x97\
-\x04/\x81\xca\xa9+{\xfe\x8f\xef\xc6A\xe4p\x00!\x05\x94\xd2\xd0\x95\xc4_.\xe7\
-\x95\x1f\xf9\x04\x9ch\x82Mq\x18\x8e\xcdnQ\xfd\x14tF \xd3\x0c\x80\x08\x94\x91\
-7G\x89\xc4o&\xbb\xff]\xec\x9b\n\xd8\xe94\xe5\x93.\xf5\xb7\xdd\x0b\xc3y8\x14\
-\x00\x7f\x11zYa\x0e\xfa\xe0sO.X\xc4h\x15$:\xc6)\x9c]\x86D\xc3\xcfO2}p;H\x85\
-\xb9\xdeG\xcf\xba\x0c~{\x88\xc2\xb9[\xa8y\xa0\x91\xe2q\x1bsM\x1eU\xdaB\xf6|\
-\x06/;\x85\x13z\x1c\xfb=\x97\xd0\n\x8b\x99\xce~\xa6\xf7u\x10lh\xc0\x9f\x9aB\
-\x84\x80\xf2\xadd\xf6\x8d\xe0<:BI\xfd\x1e\xf6>\x17\xbdI\xc7\xb8F\xc3>V\xc6K\
-\x17I\xac\x1c\x9d\x8dAh \nd\xfeQ\xe0\xf6\x0b\xdc\xc1\x1a\xb4\x86\x06\x92\x7f\
-[\xc2\xcbl\xa4\xd0\x95\xa3<1\x8c\x13x\x84\xe2A\x9b\xf0\x8a\x003\x07z\x98\xde\
-\xd7A\xe8\x9a\x14~!\x8d\x90\xfe\x15=K\x07l\x8ce>\x89\xeb\xc7\xc9\x9fjG \xf1\
-\xf3cd^\xdb@\xd5\xd3\x85y\xe5\xe7\x8eg\x99\xdc\xf5e\xe27\x0cQ\xe8j\x9a\xfd\
-\xcc\x9b\x1ff\xe2\x87wQ\xee._\xaeq\xa8/@l\xfd\xc3\x0c>?\xc3\x99?\xd9\x8d*\
-\xbaX\rwa-\xddL\xe6\xdbC\x14\x7f\xf5\xfb\x0b\xeec\x85\x8f\xa3\xbf\xb2n\xf3\
-\x82E\xaa\xebg\xb8\x97\xfd\\JU\xe3\x14%\xb5\x83\x83p\xbfE~\x12\xb2\xc3\x0e\
-\xdd\xdf\xb2\xc9\xe4R\\\xf7\x87\xf5\x18+\xcb\xbc\xb9\xab\x99\x1bb\xfdD\x9fh\
-\xe7\xf8\xdf\x9fg\xf8\xd9\xfd\xb4\xdd\xb9\x04\xb96H\xe9t\x9esod(\xb6\xb6S\
-\xb75NW\xafC"\x95%\xfcX\x1b\xc7\xfe\xc1g\xec\xfb\x9d\xb4\xddQ\x8f\xba+\x8an\
-\x81n\xb8$\xbf\x16\xe1\xf0\x9eVn\x97{\xb8\x94J\x82\xd4hg\x907"\xf71\x91LB\
-\x12\xa4\xa6\xf8J\xdfa\xf4\x07Z9\xfe\x83>\n?<L\xe3\xc6Z\xfc\xcd&\x03\x1fx\
-\xe6\x9a\xdaH\xd6Y\xb4\xba}d\xa7\x8c+z\xbe\x1d]\x8b\xc0\xe6^\xf1*=5\xd5(i\
-\xd0*\xd2\xfc*\xb9\x8eu\xbd\xbd\xf3\xcbo\xc0\xe5\xdc\xf2\x15\xdc\xa3\x8e\xd0\
-\x97\x8c!\xa4\xe4Z\xd5\xcf\xde\xeb62\x11\x0f_\xaeqlF\xb0\xa3\xd9e\xf2\xf6\
-\x8d\x8c\x9c\x1e\x82\x90\xce\xfa\x87\xb72\x9d\xab\xe2\x15\'\x8e\xbd\xae\xf2\
-\xeeq5\xd0\xcf\xf9\x85\x05\x8b4\xfa\xd3\xd8v/\xe3N\x89\x891\x9d\xfeo\xa6A\
-\xd3\xb1\x1d\x03%4\x10\x92e\xab\\:~7\xcf\xd1\x13m\xbc\xd5\x13bT\x0f\xf3\xc4\
-\x83\xa3,\xddnp\xfc\x179\xce>\x7f\x11%5|a\x10NHV\xdd#1kFxm\xd7*\x1ak}\x1e\
-\xde1F\xdd\x974\xce\x1d\xccs\xf6;\xbd\x97\xc7V7I\xee\xfb+\x83q-\x88]\xba\xc0\
-x9\x8c\x15\x958\xf6(\x17\xcb9F\xfc\x0f\x0e\xd6|p;\x13<\xba#Gx\x8d\xe4\xd8\
-\x81q\x0e\xbf\x93AI\x8dh\xad\xc1\x92\xeb$C%I0\x92\xc7.^\xe4\x9d\xe3k\xf8\x9d\
-\xad\x9f\xed9\xa47\xe18>\xa5B7\xc3v5\xc1\x98C\xd9\x1e\xe7|)\xcf\xf4\x89\xf9\
-\xe5\xf7\xfa\xaeUH9\x8dS:\xcf\xa4S\xc0\xaa2(\xdb\x17\xb8X\xbe\x96\x11\xff#\
-\x87\x95c\xd0tv\x86\xba\xadM\x9c>3H(a\xd2\xb09B\xe7\xbb\x93\x9c\xc8\x05\x17\
-\xdc\xc3\n\x9f\x8c>0\xb0\xf0\x83\xc2|6O)\xdfM\xfbM\x82rg\x08\xdb1\xf0\x85N$!\
-\xa9mvhYi\xd3\xbc\xb2\xc4\x81\xce6^|\xa5\x89b)MzP!\xbd \xf7o?Fu\xab\xc1\x85\
-\xa3A\x8a9\r+*\xb8\xf1\xcbY\xc2\xd5\xf0\x9d\x7f\xbf\x87\x93]Y\x0c]C\xd9:\x0f\
->\xde\xc55\xb7h\x9c\xdc\x1faj\xdc"V\xafX\xf3\xa5,=\xbd)\x0e\x1f[\xc1W\xd6w\
-\xb3lm\x84\xaaZ\x9f\xf4\x80\xc5\xa933\xd8N\xe9r\x9c\xe9\xb4\xa2:\x02\xdb\x9f\
-:\xcf\xa5\x93\x01N\xbf\x13B3\x05\x1b\xb6gi\xbe&\xcf\xa1=I\xa2I\x8f\x8b\x17\
-\xaa\xd8\xf5\xdaf\xb2\x93W\xf0<\x9a#V\x95\xa5X\xe8\xa1e\xf5$\rmE\xba/Fy\xefT\
-\x1e\x01\xf3\xce\xaf6\x95\xc1.\x1c\xa3y\x83N\xac\xceg\xa0\x7f\x9cS\xa7\'\xb1\
-\x9d\xec\x9c:\x1f<\xec\xf2\xe06\x87\xbcS\xa2\xa9=\x81\x90\xe3\xbc\xb1\xb7\
-\xc4\xc0\x80\\p\x0f+|2b\xf3\xe6\xd7\x17\xbc6\x0b\x01;\xb6vq\xfb\x86\x1eR\xc9\
-"B\xceJf\xb3&\x99\x19\x8b\xd1\xc9\x08\xbf\xfc\xcd\n.^\xaa\xa6\xec\xca9\xcf\
-\xadl\x9ff\xcb\xaa!Z\x1agP\x9e\xc2G\xa3\xab\'\xc1\xe1\xd3u\xf4\xf4G.\x8f\x95\
-R\xb1\xfa\xdaI\xb6\xae\x1f$\x15/P.K\x94\xd4y\xef\xfdj\xf6v6\x92\xcb\x1b\xdc}\
-\xfb\x10\x9b;&)\xfb\x1a\xaf\xbe\xd5\xc8\xf1\xb3U\x1f\x8b5`y\xdc\xbaq\x94\x9b\
-V\x0f!}\x17\xa9\xc1H&\xc2\x85KUlY5\x04\x08^}k9\xc7\xcfV_\xd13\x9b3\x10\x02\
-\xee\xbe}\x84M\x1d\x13\xb8\xbe\x9c\xe3;\xdf\xfcf5z\xd9\xd21D\xd9\xd7x\xe5\
-\xad6\x8e\x9f\x9d{\x0f\xc1\xd0\xe1o\xbe\x9e\xa3\xdc?\xc4\xeb\xdf\xeb\xe5k\
-\xff\xd4A\xcfX\x94o>\x1b\xa1r\xe5\xed\xea!\x96,\xf9\xfe\xa2\x95W\x08\x08\x05\
-?\x94s]\xb0\x9d\xcag\xc7\xc5`\xd3\xba2?xv\x8a\xe7\xfer\x00\xd7\x13\xfc\xf9?/\
-\xe1\xa9\xaf\xc7y\xfb\xe0\xe7s\x95\xe0\xff+\xfa\xe0\xe0\xe0\x17\x1dC\x85yp\
-\xc3\xce\t\xa6\x862\x9c:\x9a\xe7\xb1g\x02t\x9d\xb1y}\xf7\x12f\xb2\x95\xed\
-\xd5\xd5\xa4R\xdd\xff#\x84\x836\xd1h\x9e\x07\xfe\x18\xb6\xdem\xf3\xc2K\xa1\
-\xca\xe4\xf8\x1c\xd0\xbf\xe8\x00*\xcc\x8f\xe7\xff\xad\x91\xa0YGu\xcc\xe7\xd9\
-\xefH^\xfe\xd9\xd5\xb9\x1dYa.\x02\xbeQy\xc5\xabP\xe1S\xa8\xac\xd1\x15*|\x06\
-\x95\tR\xa1\xc2g\xf0\xdf\xfb\xb6\x96s\xc2\xab2\x10\x00\x00\x00\x00IEND\xaeB`\
-\x82'
-
-def getDocFactory042Bitmap():
- return wxBitmapFromImage(getDocFactory042Image())
-
-def getDocFactory042Image():
- stream = cStringIO.StringIO(getDocFactory042Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory042')
-catalog['DocFactory042'] = ImageClass()
-catalog['DocFactory042'].getData = getDocFactory042Data
-catalog['DocFactory042'].getImage = getDocFactory042Image
-catalog['DocFactory042'].getBitmap = getDocFactory042Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory043Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ra\
-IDATx\x9c\xed\x9bil]\xc7u\xc7\x7f3w{+\xdf\xc2\xc7U")\x91\x94m\xd9\x94d\xed\
-\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb~\xc8\xc7\xa0\x08\n\x14\
-]\x8c\x06\x81\xed&\xa9Q\xb4p\x9d\xbaQ\x12;\x8e\x11\xc9Nd\xc9V\x14j\xb3\xac\
-\x95\xb2$\x92\xe2\xf2\xb8\x93\x8f|\xeb\xbd\xef\xde;\xfd@G\xb6j[b)\xc96\xd0\
-\xf7\xfbx1\xe7\xfc\xcf93\x83\x99;\x83\x11\x7f\xf7\x1d\xa5\xa8P\xa1\xc2\xa7\
-\xa2\x87\xaa\xbf\xe8\x10*T\xf8\xf2\xa2\x07+\x13\xa4B\x85\xcfD\x0f\'.\xcf\x81\
-@a`#\xf1.\xf8\xeeb\xe0b^\x9e\xf3\xffK\x0c\xc2F\xfb_1(\xa0\xac\x02xhWEW\xe2c\
-\x8a\x12>\x92\xb2\xb2P\x88\xab\xa2S\xe1\x8bC\x0f\xc5\xe7o,\xf0i(\xec"\xea\
-\x9e\xc3\xff\xd8\xd8\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xed\xcc\xe8\x8bp\t\\~\
-\xb4\x9f\x1a\x83G\x93\xfd\x16U^\xcf\x051\x00\xe8\x96\xc2\xd6j\xe8\xd6\xb6P&t\
-Eu5\x1c\x16\xbb?\'P\x1eA3\x04cr\x19iy\xf3\x15\xd5\xa8\xf0\xc5\xa3\x87/c\x82X\
-\x8c\xd2\xa4?\xc7\xe9\xd7k\x99\x1e\x8c\x00\x02\xa4D\xea\x8apM\x91H}\x91\xb6\
-\xe5\x938\xd6"\xfa\x82\x7f\x8dC\xdd\x15\x0b\xfc\xb7\x04\x19\xa6\xa9\xf82\'\
-\x7f\x1ag:\x1d\x00!@H\x00b\x8d6\xcb\x1e|\x87\xa2Q\xcf\x04\xb7^Q\xdd\x10\xc34\
-\xd8?\xe6\xd8\x8fS\xc4\x16\x96hYs\x88B\xf0z\xca\\FA+|\xe9\xd0#\x97\xd1\x9f!%\
-Hh\xab\x10~\x11\xa9)\x82q\x81\x11\x10(\x04\xa5|\x90\xd1\x93\x92\xfch3\xcb\
-\xef\x91\x98\xc6o\xe8\x0f\xdfw\xc16D\xf8\x1e\xc2-#|\x0f%5\x94n\xa0\xe4\xa7o\
-\x87\x84\xeb \xdd2\xc0\x05mCJ\',\xaeE\xb9\x05\xa4\xc6\xf9\x18@\x90Zl\x12\nu`\
-\x06\x9b\x88\xc8O\xfa\xf1u\x13\xa5\xe9H\xa7\x08B\xe2\x1b\xd6\xec\x04\xbb\x84\
-\xa6@\x11\xf7\x8b\x84\xf3K\x91\x94\xc8\xa6c\\\x17\xb5\xa8\x0b\x8d\x93\x91\
-\x1f\x15tN\xf9)\xf5\x91\xbe\x19\x98\xd5\xf4\xca\xf8\xba5\xabU\xb6g\x9b\x99\
-\x81O\xda\x00\xbe\x19\xbc \xe6\nW\x16\xbd\xca\x1c\x98\xb7\xb1\xa5\x1c0\xd6a\
-\xe8\xef\x10K\xb9\xdc\xf8\x07\xb7\xa0\x85\x82\xa0|\xcay\x9b\x81C=\x8c\x1cOsn\
-\x7f\x8a\xeb\xee\x8a\xe2\x18g(\x88 By\x98\x99n\xccL7^\xa1\x84@\xcd.>\x81\x00\
-vj)NU3|8\x91\x84_\xc6\x9a\xe9\xc1\x98<\x8b\xb2\x1d@\xcd.\x10F\x80b\xed\x8dh\
-\xe1jd\xe0\x16,k\'Z\xca\xe5\xc6\'6bD\x82\x00\xd8e\xc5\xa4\x11A\x06$1\xbf\x07\
-s\xea\x0c\xd6L7\xcavQJ\x81\x19\xc4\x0bVc\x16\xd3(\x05N\xbc\x95R\xaa\xe3\x92\
-\x9aa\xa1S\xed\xcd\x90\x9bZ\x06n\'B\x83Ra%\x8b\xacQ\x86\x0c(Icn\xf9)\x9f@\
-\xfa\x00F.\x8d4$n\xb8\x01\xad0\x86o\x97\x11\xa6\x85\xa3\xd7"\xb3\xe3\x08)\
-\xb0\x17\xae\xc0\x8b\xd6\x02`\xa4O`L\r\x80P\x94\xe3\xcd\x94\x1b\x97^\xce\x18\
-\xa8p\x11\xf4\x08\'\xe7ml\x08\x1daV\xa1\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\
-\xc2\xb4\xdd\xb1\x16/\xb7\x9d\xdcp7\x85\xcc5$\xac\x11ts\x86H\xf64z9\xc3\xd0\
-\x89I\xc6\x8fd\xf1\\\x1f=\xa8\xd3\xb8!ACl\x88bq\x01\x85\xe0B\xa4\xf2\x88\xe4\
-N\xa1\xb2\xd3\xf4\xbf3Ln\xd0Fh`F\x0c\xaao\x88R\x1b\x1a\xc1\x0e\xadG\x18)t\
-\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0e\xa3D\xd4\x10\xd1\\\x17\x94\xa6\
-\x19>4N\xa6;\x0f@\xe3\x86$\xf1\xe6\x10\xa3G\xa7\xd1\xc3:5\xab2\xe4|\x87P\xae\
-\xfb35\xeb\xc2\x13\x98U\x9b\x18\xdew\x8a\xc1=\xfbP\xbe\x87\x92\x82S\xdb~\xc1\
-\xd2G\x1e \xa1\xf5\x83sdN\xf9\xe9\xaaD,p\x9c\xee_\xa6\t\xd5Z$\xaf\x1ff\xa2+\
-\xcb\xf8\xb1\x19\x96<\x98$\xe4\xfd\x84\xbe_\x87\x89\xb7;$\xaa\xde\xc6\x8elEz\
-Y\x02\xee\xcb\xa4\x0f\x071\xab<\xe2\x1d\x02G\xfd\x11J\x18WhHT\xf88z\x98=\xf3\
-6\xd6H"\xb8\x13\x9dI\x84\x10\x08\x15\xc2\xe4\xd7xL\xa24\x89\xe7\xdd\xc6\x82\
-\xd5\x1d\xf4l\xff7\xec\xb1!b\xa9\x18\x89\xf2\x08\xa2\xd0\xc0\xe9\x1f\xed\xa7\
-06J \x1eC\x9a&N~\x8a\xe1\xddi\x8a\xe96Z\xbe\xbe\x1c\xc3<\x81\xee$\xd1\xec\
-\x16\xba~\xfa#\x8ac\xa3\x98\xd1\x08F8\x0c\xc2!\xdf\xe3\xd2\xb8r\x13\x9a?\x80\
-\xa0\x05\x9d\t<\xbb\x88=1\x8d\x11\xb40\x85\x86\x16\x88Q\xd2\xf7\x81\x97#\xe0\
-\xb6q\xea\xd5W\xc8\x0f\x0f\x13H\xc4\x91\x96\xc5\xf8\x81s\x8c\xee\xb5\xf1\xdd\
-2\xa1\xfaz\x82\x1b\xeeD\xb73\xc8\x8bi\xae\xba\x13\xa5 X\x15\xa1\xaaV\x92\x1f\
-\xe9CHI8\xbe\x08=\x10\xc3Pi\xfc9\xe5w\x1c%=Lc5\xfet\x17\xa3g\xc7\x98z?D\xb0:\
-\xc9\xc2\xb5\xadT\xd5,\x05\'\x8c\xe1\x1f%\xff\x81\xc6\xc2\x15-\x14\xbc\x03\
-\xc8\x92\x8f\xaeuP\x1e=J\xbc\xa6\x8exU\x03y\xf6Q\xb9\xed\xbd:\xe8!v\xcd\xdbX\
-\xb0\x08\xc1\xbd\xe8b\x1c!A\x88 \x01\xdeC\xd1\x0b\x80\xd4l\x82\xd5\x0f\x10\
-\xb0\x86\xb0\xc7\x0f\xa2\xb1\x12Ct\xd0\xb7\xe7E\xcac\x07Yx\xebV\xean\xde\x02\
-\xaa\x8c[,2\xb0\xe3_)\xf4\xee\xa4\x90^N\xa4}\x01\xf85\x0c\xec\xfeo\xdc\x89\
-\xf7i\xb9\xe31\x12\x1d\xeb\x90\x01\x1fM\x8b\xe39E\x94>\x89\xa9w"\xdcM\xe8b\
-\x0c7{\x86\xb3\xff\xf9\x0c\xd2\x94\x08M\xd2\xb8\xf1i\xa2K\x96\xa0\xbc,\x99S]\
-8\xa3\x87Xx\xdbC\xd4\xdd\xbc\x05\xa1\xfb\xf86\x0c\xbe\xf5"\xd3\xa7\xf7b\xe8\
-\x1a\xc2\xacGw\xa3\x0c\xec~\xf9\xa2\x9a\xca\xdaA\xec\xda\xbb\x88\xb5=\xcd\
-\x99\x97\x9eA\xe8\x1e\xed\xf7?\x85\xb0&\x91Z\x1d}{~v\xe9\xfc\xda\xeaQ\xd6v\
-\x84\xb9\t]Na\xca!Z6\xff\x19\xb1\xf6\x15\xf8\xa2\x17\x15x\x0frK\xa8_c\xd2\
-\xf7\xc6\x7fQ\x9a\xfe:\xc1`\x11\xe5%\x99\xea\xe9Bg\x88\xd4\xb2G \xd4OP\xbc\t\
-\x95)rU\xd0\x03\xa3\x97\xf1\x83\xa7kx\x81\x08\x9a-\x91R\x80\x1f\xc1\x9a\xd4\
-\xc0\x9d\xf5\xa9\xac8\xae\x1f\xc6,\tL/\x8cP1(\xfb\xd8\xbd}\x84\x82\x8d\xd4\
-\xad{\x14\xad\xbc\x1d\xe9\xedG\x9a\x0fQ\xb7\xfaa\x06\xbaOP\xea\xe9!\xb6\xf8q\
-<O`w\x9f%\x14\xa8\xa3f\xd5CH\xf7\'\xc8\xc2\x1e\x90\t4\xa1\x833\x05\xa5$\x9e\
-\tZ\t\xf4"X\xa1\x04\xba\x15E\x1a\x1aV0\x85\xe6\xba(\xd9J\xa6\xf3_\x08\x05\
-\xea\xa9[\xbb\x15\xdd\xf99\xa2t\x04\xdfz\x92\x9a\xe5\xf7Q<\xb1\x1f\xdd\xd1\
-\x11*\x01^\xe0\xd2\x9a\xb9\x19\xd03x\xd6\xb70U\x04\xa9\x04\x9a^\x85f\xbf\x82\
-g<9\xa7\xfc\xaaZ\xb6\xa2\x15v\xe3Y14[#\x14^H\xacu\x13\xba\xf3=p\x8e@\xd6C\
-\xe9%\xaa\x96l&`\xbd\xc9d\xe7\x01\x9a\xb6\xfe)\x9e\x9f\'{\xf8%\x12M+1\x93\
-\x8b\x91\xf9\x1d\x90\x05*w0W\x05\x9d\x9d\x8b\xe7o\x1d\xab\x85\xf5#\x88\xe1 H\
-\xc0\x1e\x81}\xb50\xad\xc0\xb0P\xeb\xd6Q\xea{\x0fu2\x84\xd5\xde\x8a\x9c\x9e\
-\xc0\x13)\xbc\xd3\x02=\xd6\x08\x85\x00\xf2\xc0 \x14\x82h\x8di\xac\x86\xdb\
-\xd0\x86\x1ba,\x86*$P\xc5"\xee\x07`$\xea\xf1g\x0c\xf4C\x13P\xf8\xf8Qq5\xc4j`\
-M\x1a1\x1c\xc0r\xdai\xdd\xfa\x17h\xd1\x08\xf8>\xfe\xf8 \xf2\xc8\x19\x9c\xe6\
-\x058\xc7K\x18\xc9FD9\x81\xd87\r\xb9 \xb2e\x00\xa3\xfe&\xb4\xa1z\x84\x97\x04\
-/\x81\xca\xa9Kk\xfeVw\xed r8\x80\x90\x02Ji\xe8J\xe2/\x96s\xca\x8f|\x02\x8e4\
-\xc1\xba8\x0c\xc7f\xb7\xa8~\n:#\x90i\x06@\x04\xca\xc8\x9b\xa3D\xe27\x93\xdd\
-\xfd\x1e\xf6M\x05\xect\x9a\xf2Q\x97\xfa\xdb\xee\x85\xe1<\xec\x0b\x80\x7f\x19\
-}X\xe1\xa2\xe8\x83\xcf=9oc\xa3U\x90\xe8\x18\xa7pr\x11\x12\r??\xc9\xf4\xde\
-\xcd \x15\xe6j\x1f=\xeb2\xf8\xdd!\n\xa7n\xa1\xe6\x81F\x8a\x87m\xcc\x15yTi\
-\x03\xd9\xd3\x19\xbc\xec\x14N\xe8q\xec\xf7]BK,f:\xfb\x99\xde\xd5A\xb0\xa1\
-\x01\x7fj\n\x11\x02\xca\xb7\x92\xd95\x82\xf3\xe8\x08%\xf5{\xd8\xbb\\\xf4&\
-\x1d\xe3\x1a\r\xfbP\x19/]$\xb1tt6\x06\xa1\x81(\x90\xf9G\x81\xdb/p\x07k\xd0\
-\x1a\x1aH\xfem\t/\xb3\x96BW\x8e\xf2\xc40N\xe0\x11\x8a{m\xc2K\x02\xcc\xec\xe9\
-azW\x07\xa1kR\xf8\x854B\xfa\x97\xd4,\xed\xb11\x16\xf9$\xae\x1f\'\x7f\xac\x1d\
-\x81\xc4\xcf\x8f\x91y}\rUO\x17\xe6\x94\x9f;\x9eer\xdbW\x89\xdf0D\xa1\xabi\
-\xf6\x987?\xcc\xc4\x0f\xef\xa2\xdc]>_\xe3P_\x80\xd8\xea\x87\x19|~\x86\x13\
-\x7f\xb2\x1dUt\xb1\x1a\xee\xc2Z\xb8\x9e\xccw\x87(\xfe\xea\xf7\xaf\xc00\xa8\
-\xf0Y\xe8\xaf\xaeZ?o\xe3\xea\xfa\x19\xeee7\xe7R\xd58EI\xed\xe0 \xdco\x91\x9f\
-\x84\xec\xb0C\xf7wl2\xb9\x14\xd7\xfda=\xc6\xd22omk\xe6\x86X?\xd1\'\xda9\xfc\
-\xf7\xa7\x19~v7mw.@\xae\x0cR:\x9e\xe7\xd4\x9b\x19\x8a\xad\xed\xd4m\x8c\xd3\
-\xd5\xeb\x90He\t?\xd6\xc6\xa1\x7f\xf0\x19\xfb~\'mw\xd4\xa3\xee\x8a\xa2[\xa0\
-\x1b.\xc9oD\xd8\xbf\xa3\x95\xdb\xe5\x0e\xce\xa5\x92 5\xda\x19\xe4\xcd\xc8}L$\
-\x93\x90\x04\xa9)\xbe\xd6\xb7\x1f\xfd\x81V\x0e\xff\xa0\x8f\xc2\x0f\xf7\xd3\
-\xb8\xb6\x16\x7f\xbd\xc9\xc0\x87\x9a\xb9\xa66\x92u\x16\xadn\x1f\xd9)\xe3\x92\
-\x9a\xefDW"\xb0\xb9W\xbcFOM5J\x1a\xb4\x8a4\xbfJ\xaebUo\xef\xdc\xf2\x1bp9\xb5\
-x\t\xf7\xa8\x03\xf4%c\x08)\xb9V\xf5\xb3\xf3\xba\xb5L\xc4\xc3\xe7k\x1c\x9b\
-\x11liv\x99\xbc}-#\xc7\x87 \xa4\xb3\xfa\xe1\x8dL\xe7\xaax\xd5\x89c\xaf\xaa\
-\xfc{\\M\xf4S~a\xde\xc6\x8d\xfe4\xb6\xdd\xcb\xb8SbbL\xa7\xff\xdbi\xd0tl\xc7@\
-\t\r\x84d\xd12\x97\x8e\xdf\xcds\xf0H\x1bo\xf7\x84\x18\xd5\xc3<\xf1\xe0(\x0b7\
-\x1b\x1c\xfeE\x8e\x93\xcf\x9fEI\r_\x18\x84\x13\x92e\xf7H\xcc\x9a\x11^\xdf\
-\xb6\x8c\xc6Z\x9f\x87\xb7\x8cQ\xf7\x15\x8dS{\xf3\x9c|\xa1\xf7|\xdb\xea&\xc9}\
-\x7fe0\xae\x05\xb1Kg\x18/\x87\xb1\xa2\x12\xc7\x1e\xe5l9\xc7\x88\xff\xe1\xc5\
-\x9a\x0fng\x82G\xb7\xe4\x08\xaf\x90\x1c\xda3\xce\xfew3(\xa9\x11\xad5Xp\x9dd\
-\xa8$\tF\xf2\xd8\xc5\xb3\xbc{x\x05\xbf\xb3\xf1\xe2\x9aCz\x13\x8e\xe3S*t3lW\
-\x13\x8c9\x94\xedqN\x97\xf2L\x1f\x99[~ol[\x86\x94\xd38\xa5\xd3L:\x05\xac*\
-\x83\xb2}\x86\xb3\xe5k\x19\xf1?vY9\x06M\'g\xa8\xdb\xd8\xc4\xf1\x13\x83\x84\
-\x12&\r\xeb#t\xbe7\xc9\x91\\\xf0r\xfb\xbf\xc2%\xd0\x07\x06\xe6\x7fQ\x98\xcf\
-\xe6)\xe5\xbbi\xbfIP\xee\x0ca;\x06\xbe\xd0\x89$$\xb5\xcd\x0e-Km\x9a\x97\x96\
-\xd8\xd3\xd9\xc6K\xaf6Q,\xa5I\x0f*\xa4\x17\xe4\xfe\xcd\x87\xa8n58s0H1\xa7aE\
-\x057~5K\xb8\x1a^\xf8\x8f{8\xda\x95\xc5\xd05\x94\xad\xf3\xe0\xe3]\\s\x8b\xc6\
-\xd1\xdd\x11\xa6\xc6-b\xf5\x8a\x15_\xc9\xd2\xd3\x9bb\xff\xa1%|mu7\x8bVF\xa8\
-\xaa\xf5I\x0fX\x1c;1\x83\xed\x94\xce\xc7\x99N+\xaa#\xb0\xf9\xa9\xd3\x9c;\x1a\
-\xe0\xf8\xbb!4S\xb0fs\x96\xe6k\xf2\xec\xdb\x91$\x9a\xf48{\xa6\x8am\xaf\xaf\'\
-;y\t\xcd\x839bUY\x8a\x85\x1eZ\x96O\xd2\xd0V\xa4\xfbl\x94\xf7\x8f\xe5\x110\
-\xe7\xfcjS\x19\xec\xc2!\x9a\xd7\xe8\xc4\xea|\x06\xfa\xc79v|\x12\xdb\xc9^P\
-\xe7\xbd\xfb]\x1e\xdc\xe4\x90wJ4\xb5\'\x10r\x9c7w\x96\x18\x18\x90\xf3\xee\
-\xbb\nsC\xac_\xff\xc6\xbc\xd7h!`\xcb\xc6.n_\xd3C*YD\xc8YW\xd9\xacIf\xc6bt2\
-\xc2/\x7f\xb3\x84\xb3\xe7\xaa)\xbb\xf2\x02\xbb\xa5\xed\xd3lX6DK\xe3\x0c\xcaS\
-\xf8ht\xf5$\xd8\x7f\xbc\x8e\x9e\xfe\xc8\xf9\xb6R*\x96_;\xc9\xc6\xd5\x83\xa4\
-\xe2\x05\xcae\x89\x92:\xef\x7fP\xcd\xce\xceFry\x83\xbbo\x1fb}\xc7$e_\xe3\xb5\
-\xb7\x1b9|\xb2\xea\x13\xb1\x06,\x8f[\xd7\x8er\xd3\xf2!\xa4\xef"5\x18\xc9D8s\
-\xae\x8a\r\xcb\x86\x00\xc1ko/\xe6\xf0\xc9\xeaKjfs\x06B\xc0\xdd\xb7\x8f\xb0\
-\xaec\x02\xd7\x97\x17\xe8\xce5\xbfY\x1f\xbdl\xe8\x18\xa2\xeck\xbc\xfav\x1b\
-\x87O^\xf8\xfe\xc0\xd0\xe1o\xbe\x99\xa3\xdc?\xc4\x1b\xdf\xeb\xe5\x1b\xff\xd4\
-A\xcfX\x94o?\x1b\xa1\xf2\xd4\xed\xea#\x16,\xf8\xfee\x97Y\x08\x08\x05?r\xe3\
-\xba`;\x95c\xc7+\xc1\xbaUe~\xf0\xec\x14\xcf\xfd\xe5\x00\xae\'\xf8\xf3\x7f^\
-\xc0S\xdf\x8c\xf3\xce\xde\xcf\xe7)\xc1\xffw\xf4\xc1\xc1\xc1/:\x86\n\x17\xe1\
-\x86\xad\x13L\re8v0\xcfc\xcf\x04\xe8:a\xf3\xc6\xf6\x05\xccd+\xdb\xab\xcf\x83\
-J\x95\xbf\xe4\x84\x836\xd1h\x9e\x07\xfe\x186\xdem\xf3\xe2\xcb\xa1\xca\xe4\
-\xf8\x1c\xd1\xbf\xe8\x00*\\\x9c\xe7\xff\xbd\x91\xa0YGu\xcc\xe7\xd9\x17$\xaf\
-\xfc\xec\xea\xbc\x8e\xac\xf0\xe9\x08\xf8V\xe5W\xafB\x85\xcf\xa0\xb2VW\xa8p\
-\x11*\x13\xa4B\x85\x8b\xf0?\xe0J\x96s\x1b\xad\x04\x06\x00\x00\x00\x00IEND\
-\xaeB`\x82'
-
-def getDocFactory043Bitmap():
- return wxBitmapFromImage(getDocFactory043Image())
-
-def getDocFactory043Image():
- stream = cStringIO.StringIO(getDocFactory043Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory043')
-catalog['DocFactory043'] = ImageClass()
-catalog['DocFactory043'].getData = getDocFactory043Data
-catalog['DocFactory043'].getImage = getDocFactory043Image
-catalog['DocFactory043'].getBitmap = getDocFactory043Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory044Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r_\
-IDATx\x9c\xed\x9byp]\xd5}\xc7?\xe7\xdc\xed\xadz\x8b\x9eV[\x92-\xc9\x80A\xb6\
-\xf1nV\'\x86\x84\xda,esYZ\xe8t\xda\xc9t\n\xd3\x0em\xff\xc8\x9f\x99N\xa63\x9d\
-.L3\x19\xa0I\xcat\xda\xa1$$N\x02!LlH\x8c\r\x8e#o\x18\xaf2\xb6%Y\xcb\xd3.=\
-\xe9\xad\xf7\xbe{\xef\xe9\x1f\xa2\x06\x17\xb0%\xd7\x06\xfex\x9f?\xef\x9c\xdf\
-\xf9~\x7fg\x99s\xee9s\xc4?|G)*T\xa8\xf0\xa9\xe8\xa1\xea/\xdaB\x85\n_^\xf4`e\
-\x82T\xa8\xf0\x99\xe8\xe1\xc4\xe5\x05\n\x14\x066\x12\xef\x82\xef.\x06.\xe6\
-\x15\xb06G\x0f\xc2F\xfb?\x1e\x14PV\x01<\xb4\xab\xa2+\xf11E\t\x1fIYY(\xc4U\
-\xd1\xa9\xf0\xc5\xa3\x87\xe2\xf3\x0f\x12\xf84\x14v\x11u\xcf\xe1\x7fllJ\t\xd2\
-\xd4\xc9\xbbqr\xc1vf\xf4E\xb8\x04\xae\x9c\xdb\x0b<x4\xd9oQ\xe5\xf5\\\xe0\x01\
-@\xb7\x14\xb6VC\xb7\xb6\x852\xa1+\xaa\xab\xe1\xb0\xd8\xfd%\x81\xf2\x08\x9a!\
-\x18\x93\xcbH\xcb\x9b\xaf\xa8F\x85/\x0fz\xf82&\x88\xc5(M\xfas\x9c~\xbd\x96\
-\xe9\xc1\x08 @J\xa4\xae\x08\xd7\x14\x89\xd4\x17i[>\x89c-\xa2/\xf8\xb78\xd4]q\
-\xe3A\x86i*\xbe\xcc\xc9\x9f\xc7\x99N\x07@\x08\x10\x12\x80X\xa3\xcd\xb2\x07\
-\xdf\xa1h\xd43\xc1\xadWT7\xc40\r\xf6O9\xf6\xd3\x14\xb1\x85%Z\xd6\x1c\xa2\x10\
-\xbc\x9e2\x97\xd1\x90\x15\xbe\xf4\xe8\x91\xcb\xe8\xd7\x90\x12$\xb4U\x08\xbf\
-\x88\xd4\x14\xc1\xb8\xc0\x08\x08\x14\x82R>\xc8\xe8II~\xb4\x99\xe5\xf7HL\xe3w\
-\xf4\x87\xef\xbb`\x1b"|\x0f\xe1\x96\x11\xbe\x87\x92\x1aJ7P\xf2\xd3\xb7C\xc2u\
-\x90n\x19\xe0\x82\xb2!\xa5\x13\x16\xd7\xa2\xdc\x02R\xe3\xbc\x07\x10\xa4\x16\
-\x9b\x84B\x1d\x98\xc1&"\xf2\x93\xf5\xf8\xba\x89\xd2t\xa4S\x04!\xf1\rkv\x82]B\
-S\xa0\x88\xfbE\xc2\xf9\xa5HJd\xd31\xae\x8bZ\xd4\x85\xc6\xc9\xc8\x8f\x1arN\
-\xf9)\xf5\x91\xbe\x19\x98\xd5\xf4\xca\xf8\xba5\xabU\xb6g\x8b\x99\x81O\xc6\
-\x00\xbe\x19\xbc\xc0s\x85\xab\x83^e\x0e\xcc;\xc8R\x0e\x18\xeb0\xf4w\x88\xa5\
-\\n\xfc\xa3[\xd0BAP>\xe5\xbc\xcd\xc0\xa1\x1eF\x8e\xa79\xb7?\xc5uwEq\x8c3\x14\
-D\x10\xa1<\xccL7f\xa6\x1b\xafPB\xa0f\x17\x9f@\x00;\xb5\x14\xa7\xaa\x19>\x9cH\
-\xc2/c\xcd\xf4`L\x9eE\xd9\x0e\xa0f\x17\x08#@\xb1\xf6F\xb4p52p\x0b\x96\xb5\
-\x13-\xe5r\xe3\x13\x1b1"A\x00\xec\xb2b\xd2\x88 \x03\x92\x98\xdf\x839u\x06k\
-\xa6\x1be\xbb(\xa5\xc0\x0c\xe2\x05\xab1\x8bi\x94\x02\'\xdeJ)\xd5qI\xcd\xb0\
-\xd0\xa9\xf6f\xc8M-\x03\xb7\x13\xa1A\xa9\xb0\x92E\xd6(C\x06\x94\xa41\xb7\xfc\
-\x94O }\x00#\x97F\x1a\x127\xdc\x80V\x18\xc3\xb7\xcb\x08\xd3\xc2\xd1k\x91\xd9\
-q\x84\x14\xd8\x0bW\xe0Ek\x010\xd2\'0\xa6\x06@(\xca\xf1f\xca\x8dK\xaf\xc4\x18\
-\xa8p\x11\xf4\x08\'\xe7\x1dd\x08\x1daV\xa1\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\
-\xc2\xb4\xdd\xb1\x16/\xb7\x9d\xdcp7\x85\xcc5$\xac\x11ts\x86H\xf64z9\xc3\xd0\
-\x89I\xc6\x8fd\xf1\\\x1f=\xa8\xd3\xb8!ACl\x88bq\x01\x85\xe0B\xa4\xf2\x88\xe4\
-N\xa1\xb2\xd3\xf4\xbf3Ln\xd0Fh`F\x0c\xaao\x88R\x1b\x1a\xc1\x0e\xadG\x18)t\
-\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0e\xa3D\xd4\x10\xd1\\\x17\x94\xa6\
-\x19>4N\xa6;\x0f@\xe3\x86$\xf1\xe6\x10\xa3G\xa7\xd1\xc3:5\xab2\xe4|\x87P\xae\
-\xfb35\xeb\xc2\x13\x98U\x9b\x18\xdew\x8a\xc1=\xfbP\xbe\x87\x92\x82S\xdb~\xc5\
-\xd2G\x1e \xa1\xf5\x83sdN\xf9\xe9\xaaD,p\x9c\xee_\xa7\t\xd5Z$\xaf\x1ff\xa2+\
-\xcb\xf8\xb1\x19\x96<\x98$\xe4\xfd\x8c\xbe\xdf\x86\x89\xb7;$\xaa\xde\xc6\x8e\
-lEzY\x02\xee\xcb\xa4\x0f\x071\xab<\xe2\x1d\x02G\xfd\tJ\x18WxHT\xf88z\x98=\
-\xf3\x0e\xd2H"\xb8\x13\x9dI\x84\x10\x08\x15\xc2\xe4\xb7xL\xa24\x89\xe7\xdd\
-\xc6\x82\xd5\x1d\xf4l\xff\x0f\xec\xb1!b\xa9\x18\x89\xf2\x08\xa2\xd0\xc0\xe9\
-\x9f\xec\xa706J \x1eC\x9a&N~\x8a\xe1\xddi\x8a\xe96Z\xbe\xbe\x1c\xc3<\x81\xee\
-$\xd1\xec\x16\xba~\xfe\x13\x8ac\xa3\x98\xd1\x08F8\x0c\xc2!\xdf\xe3\xd2\xb8r\
-\x13\x9a?\x80\xa0\x05\x9d\t<\xbb\x88=1\x8d\x11\xb40\x85\x86\x16\x88Q\xd2\xf7\
-\x81\x97#\xe0\xb6q\xea\xd5W\xc8\x0f\x0f\x13H\xc4\x91\x96\xc5\xf8\x81s\x8c\
-\xee\xb5\xf1\xdd2\xa1\xfaz\x82\x1b\xeeD\xb73\xc8\x8bi\xae\xba\x13\xa5 X\x15\
-\xa1\xaaV\x92\x1f\xe9CHI8\xbe\x08=\x10\xc3Pi\xfc9\xe5w\x1c%=Lc5\xfet\x17\xa3\
-g\xc7\x98z?D\xb0:\xc9\xc2\xb5\xadT\xd5,\x05\'\x8c\xe1\x1f%\xff\x81\xc6\xc2\
-\x15-\x14\xbc\x03\xc8\x92\x8f\xaeuP\x1e=J\xbc\xa6\x8exU\x03y\xf6Q\xb9\xe5\
-\xbd\xba\xe8!v\xcd;H\xb0\x08\xc1\xbd\xe8b\x1c!A\x88 \x01\xdeC\xd1\x0b\x80\
-\xd4l\x82\xd5\x0f\x10\xb0\x86\xb0\xc7\x0f\xa2\xb1\x12Ct\xd0\xb7\xe7E\xcac\
-\x07Yx\xebV\xean\xde\x02\xaa\x8c[,2\xb0\xe3\xdf)\xf4\xee\xa4\x90^N\xa4}\x01\
-\xf85\x0c\xec\xfe1\xee\xc4\xfb\xb4\xdc\xf1\x18\x89\x8eu\xc8\x80\x8f\xa6\xc5\
-\xf1\x9c"J\x9f\xc4\xd4;\x11\xee&t1\x86\x9b=\xc3\xd9\xff~\x06iJ\x84&i\xdc\xf8\
-4\xd1%KP^\x96\xcc\xa9.\x9c\xd1C,\xbc\xed!\xean\xde\x82\xd0}|\x1b\x06\xdfz\
-\x91\xe9\xd3{1t\ra\xd6\xa3\xbbQ\x06v\xbf|QMe\xed v\xed]\xc4\xda\x9e\xe6\xccK\
-\xcf t\x8f\xf6\xfb\x9fBX\x93H\xad\x8e\xbe=\xbf\xb8t~m\xf5(k;\xc2\xdc\x84.\
-\xa70\xe5\x10-\x9b\xff\x82X\xfb\n|\xd1\x8b\n\xbc\x07\xb9%\xd4\xaf1\xe9{\xe3G\
-\x94\xa6\xbfN0XDyI\xa6z\xba\xd0\x19"\xb5\xec\x11\x08\xf5\x13\x14oBe\x8a\\U\
-\xf4\xc0\xe8e\xfc\xe8\xe9\x1a^ \x82fK\xa4\x14\xe0G\xb0&5pg\xebRV\x1c\xd7\x0f\
-c\x96\x04\xa6\x17F\xa8\x18\x94}\xec\xde>B\xc1F\xea\xd6=\x8aV\xde\x8e\xf4\xf6\
-#\xcd\x87\xa8[\xfd0\x03\xdd\'(\xf5\xf4\x10[\xfc8\x9e\'\xb0\xbb\xcf\x12\n\xd4\
-Q\xb3\xea!\xa4\xfb3da\x0f\xc8\x04\x9a\xd0\xc1\x99\x82R\x12\xcf\x04\xad\x04z\
-\x11\xacP\x02\xdd\x8a"\r\r+\x98Bs]\x94l%\xd3\xf9o\x84\x02\xf5\xd4\xad\xdd\
-\x8a\xee\xfc\x12Q:\x82o=I\xcd\xf2\xfb(\x9e\xd8\x8f\xee\xe8\x08\x95\x00/pi\
-\xcd\xdc\x0c\xe8\x19<\xeb[\x98*\x82T\x02M\xafB\xb3_\xc13\x9e\x9cS~U-[\xd1\n\
-\xbb\xf1\xac\x18\x9a\xad\x11\n/$\xd6\xba\t\xdd\xf9\x1e8G \xeb\xa1\xf4\x12UK6\
-\x13\xb0\xded\xb2\xf3\x00M[\xff\x1c\xcf\xcf\x93=\xfc\x12\x89\xa6\x95\x98\xc9\
-\xc5\xc8\xfc\x0e\xc8\x02\x95;\x98\xab\x8a\xce\xce\xc5\xf3\x8f\x8a\xd5\xc2\
-\xfa\x11\xc4p\x10$`\x8f\xc0\xbeZ\x98V`X\xa8u\xeb(\xf5\xbd\x87:\x19\xc2joENO\
-\xe0\x89\x14\xdei\x81\x1ek\x84B\x00y`\x10\nA\xb4\xc64V\xc3mh\xc3\x8d0\x16C\
-\x15\x12\xa8b\x11\xf7\x030\x12\xf5\xf83\x06\xfa\xa1\t(|\xfc\xa8\xb8\x1ab5\
-\xb0&\x8d\x18\x0e`9\xed\xb4n\xfd+\xb4h\x04|\x1f\x7f|\x10y\xe4\x0cN\xf3\x02\
-\x9c\xe3%\x8cd#\xa2\x9c@\xec\x9b\x86\\\x10\xd92\x80Q\x7f\x13\xdaP=\xc2K\x82\
-\x97@\xe5\xd4\xa55\xffWw\xed r8\x80\x90\x02Ji\xe8J\xe2/\x96s\xca\x8f|\x02\
-\x8e4\xc1\xba8\x0c\xc7f\xb7\xa8~\n:#\x90i\x06@\x04\xca\xc8\x9b\xa3D\xe27\x93\
-\xdd\xfd\x1e\xf6M\x05\xect\x9a\xf2Q\x97\xfa\xdb\xee\x85\xe1<\xec\x0b\x80\x7f\
-\x19}Wa^\xe8\x83\xcf=9\xef \xa3U\x90\xe8\x18\xa7pr\x11\x12\r??\xc9\xf4\xde\
-\xcd \x15\xe6j\x1f=\xeb2\xf8\xdd!\n\xa7n\xa1\xe6\x81F\x8a\x87m\xcc\x15yTi\
-\x03\xd9\xd3\x19\xbc\xec\x14N\xe8q\xec\xf7]BK,f:\xfb\x99\xde\xd5A\xb0\xa1\
-\x01\x7fj\n\x11\x02\xca\xb7\x92\xd95\x82\xf3\xe8\x08%\xf5\x07\xd8\xbb\\\xf4&\
-\x1d\xe3\x1a\r\xfbP\x19/]$\xb1tt\xd6\x83\xd0@\x14\xc8\xfc\xb3\xc0\xed\x17\
-\xb8\x835h\r\r$\xff\xbe\x84\x97YK\xa1+Gyb\x18\'\xf0\x08\xc5\xbd6\xe1%\x01f\
-\xf6\xf40\xbd\xab\x83\xd05)\xfcB\x1a!\xfdKj\x96\xf6\xd8\x18\x8b|\x12\xd7\x8f\
-\x93?\xd6\x8e@\xe2\xe7\xc7\xc8\xbc\xbe\x86\xaa\xa7\x0bs\xca\xcf\x1d\xcf2\xb9\
-\xed\xab\xc4o\x18\xa2\xd0\xd54{\xcc\x9b\x1ff\xe2\x87wQ\xee.\x9fo\xe3P_\x80\
-\xd8\xea\x87\x19|~\x86\x13\x7f\xb6\x1dUt\xb1\x1a\xee\xc2Z\xb8\x9e\xccw\x87(\
-\xfe\xe6\x0f\xaf\xe00\xa8\xf0Y\xe8\xaf\xaeZ?\xef\xa0\xea\xfa\x19\xeee7\xe7R\
-\xd58EI\xed\xe0 \xdco\x91\x9f\x84\xec\xb0C\xf7wl2\xb9\x14\xd7\xfdq=\xc6\xd22\
-omk\xe6\x86X?\xd1\'\xda9\xfc\x8f\xa7\x19~v7mw.@\xae\x0cR:\x9e\xe7\xd4\x9b\
-\x19\x8a\xad\xed\xd4m\x8c\xd3\xd5\xeb\x90He\t?\xd6\xc6\xa1\x7f\xf2\x19\xfb~\
-\'mw\xd4\xa3\xee\x8a\xa2[\xa0\x1b.\xc9oD\xd8\xbf\xa3\x95\xdb\xe5\x0e\xce\xa5\
-\x92 5\xda\x19\xe4\xcd\xc8}L$\x93\x90\x04\xa9)\xbe\xd6\xb7\x1f\xfd\x81V\x0e\
-\xff\xa0\x8f\xc2\x0f\xf7\xd3\xb8\xb6\x16\x7f\xbd\xc9\xc0\x87\x9a\xb9\xa66\
-\x92u\x16\xadn\x1f\xd9)\xe3\x92\x9a\xefDW"\xb0\xb9W\xbcFOM5J\x1a\xb4\x8a4\
-\xbfI\xaebUo\xef\xdc\xf2\x1bp9\xb5x\t\xf7\xa8\x03\xf4%c\x08)\xb9V\xf5\xb3\
-\xf3\xba\xb5L\xc4\xc3\xe7\xdb86#\xd8\xd2\xec2y\xfbZF\x8e\x0fAHg\xf5\xc3\x1b\
-\x99\xceU\xf1\xaa\x13\xc7^U\xf9\xf7\xf8<\xd0O\xf9\x85y\x075\xfa\xd3\xd8v/\
-\xe3N\x89\x891\x9d\xfeo\xa7A\xd3\xb1\x1d\x03%4\x10\x92E\xcb\\:~?\xcf\xc1#m\
-\xbc\xdd\x13bT\x0f\xf3\xc4\x83\xa3,\xdclp\xf8W9N>\x7f\x16%5|a\x10NH\x96\xdd#\
-1kFx}\xdb2\x1ak}\x1e\xde2F\xddW4N\xed\xcds\xf2\x85\xde\xf3e\xab\x9b$\xf7\xfd\
-\x8d\xc1\xb8\x16\xc4.\x9da\xbc\x1c\xc6\x8aJ\x1c{\x94\xb3\xe5\x1c#\xfe\x87\
-\x17k>\xb8\x9d\t\x1e\xdd\x92#\xbcBrh\xcf8\xfb\xdf\xcd\xa0\xa4F\xb4\xd6`\xc1u\
-\x92\xa1\x92$\x18\xc9c\x17\xcf\xf2\xee\xe1\x15\xfc\xde\xc6\x8bk\x0e\xe9M8\
-\x8eO\xa9\xd0\xcd\xb0]M0\xe6P\xb6\xc79]\xca3}dn\xf9\xbd\xb1m\x19RN\xe3\x94N3\
-\xe9\x14\xb0\xaa\x0c\xca\xf6\x19\xce\x96\xafe\xc4\xff\xd8e\xe5\x184\x9d\x9c\
-\xa1nc\x13\xc7O\x0c\x12J\x984\xac\x8f\xd0\xf9\xde$Gr\xc1+\xd5\xff\x15.\x81>0\
-0\xff\x8b\xc2|6O)\xdfM\xfbM\x82rg\x08\xdb1\xf0\x85N$!\xa9mvhYj\xd3\xbc\xb4\
-\xc4\x9e\xce6^z\xb5\x89b)MzP!\xbd \xf7o>Du\xab\xc1\x99\x83A\x8a9\r+*\xb8\xf1\
-\xabY\xc2\xd5\xf0\xc2\x7f\xdd\xc3\xd1\xae,\x86\xae\xa1l\x9d\x07\x1f\xef\xe2\
-\x9a[4\x8e\xee\x8e05n\x11\xabW\xac\xf8J\x96\x9e\xde\x14\xfb\x0f-\xe1k\xab\
-\xbbY\xb42BU\xadOz\xc0\xe2\xd8\x89\x19l\xa7t\xdeg:\xad\xa8\x8e\xc0\xe6\xa7Ns\
-\xeeh\x80\xe3\xef\x86\xd0L\xc1\x9a\xcdY\x9a\xaf\xc9\xb3oG\x92h\xd2\xe3\xec\
-\x99*\xb6\xbd\xbe\x9e\xec\xe4%4\x0f\xe6\x88Ue)\x16zhY>IC[\x91\xee\xb3Q\xde?\
-\x96G\xc0\x9c\xf3\xabMe\xb0\x0b\x87h^\xa3\x13\xab\xf3\x19\xe8\x1f\xe7\xd8\
-\xf1Il\'{A;\xef\xdd\xef\xf2\xe0&\x87\xbcS\xa2\xa9=\x81\x90\xe3\xbc\xb9\xb3\
-\xc4\xc0\x80\xfc\xff\xf6{\x859"\xd6\xaf\x7fc\xdek\xb5\x10\xb0ec\x17\xb7\xaf\
-\xe9!\x95,"\xe4l\x15\xd9\xacIf\xc6bt2\xc2\xaf\x7f\xb7\x84\xb3\xe7\xaa)\xbb\
-\xf2\x82\xb8\xa5\xed\xd3lX6DK\xe3\x0c\xcaS\xf8ht\xf5$\xd8\x7f\xbc\x8e\x9e\
-\xfe\xc8\xf9\xb2R*\x96_;\xc9\xc6\xd5\x83\xa4\xe2\x05\xcae\x89\x92:\xef\x7fP\
-\xcd\xce\xceFry\x83\xbbo\x1fb}\xc7$e_\xe3\xb5\xb7\x1b9|\xb2\xea\x13^\x03\x96\
-\xc7\xadkG\xb9i\xf9\x10\xd2w\x91\x1a\x8cd"\x9c9W\xc5\x86eC\x80\xe0\xb5\xb7\
-\x17s\xf8d\xf5%5\xb39\x03!\xe0\xee\xdbGX\xd71\x81\xeb\xcb\x0bt\xe7\x9a\xdfl\
-\x1d\xbdl\xe8\x18\xa2\xeck\xbc\xfav\x1b\x87O^\xf8\xee\xc0\xd0\xe1\xef\xbe\
-\x99\xa3\xdc?\xc4\x1b\xdf\xeb\xe5\x1b\xff\xd2A\xcfX\x94o?\x1b\xa1\xf2\xc4\
-\xed\xf3C,X\xf0\xfd\xcbnn! \x14\xfc(\xdcu\xc1v*\xc7\x8eW\x82u\xab\xca\xfc\
-\xe0\xd9)\x9e\xfb\xeb\x01\\O\xf0\x97\xff\xba\x80\xa7\xbe\x19\xe7\x9d\xbd\x9f\
-\xcfS\x82\n\xb3\xe8\x83\x83\x83_\xb4\x87\n\x9f\xc2\r[\'\x98\x1a\xcap\xec`\
-\x9e\xc7\x9e\t\xd0u\xc2\xe6\x8d\xed\x0b\x98\xc9V\xb6W\x9f\'\x95\xd6\xfe\x92\
-\x12\x0e\xdaD\xa3y\x1e\xf8S\xd8x\xb7\xcd\x8b/\x87*\x93\xe3\x0b@\xff\xa2\rT\
-\xf8t\x9e\xff\xcfF\x82f\x1d\xd51\x9fg_\x90\xbc\xf2\x8b\xab\xf3:\xb2\xc2\xc5\
-\x11\xf0\xad\xca/_\x85\n\x9fAe\xcd\xaeP\xe1"T&H\x85\n\x17\xe1\x7f\x00\xc4\
-\xde\x96s\\si\xa2\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory044Bitmap():
- return wxBitmapFromImage(getDocFactory044Image())
-
-def getDocFactory044Image():
- stream = cStringIO.StringIO(getDocFactory044Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory044')
-catalog['DocFactory044'] = ImageClass()
-catalog['DocFactory044'].getData = getDocFactory044Data
-catalog['DocFactory044'].getImage = getDocFactory044Image
-catalog['DocFactory044'].getBitmap = getDocFactory044Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory045Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\r\
-\\IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\
-\xb6lJ\xb2vyU";q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\
-\x8a.F\x83\xc0\xceV\xa3h\xe1:u\xa3$v\x1c#\x92\x9d\xc8\x92\xad(\xd4fY+eI$\xc5\
-\xe5r\'/y\xd7s\xee9g\xfa\x83\xael\xd5\xb1t\x85J\xb2\x0b\xdc\xe7\xe7\xc17\xe7\
-}\xbf\x99\xf90s\xce`\xc4\xdf}K)\xaaT\xa9\xf2[\xd1C\xb5\x9f\xb7\x85*U\xbe\xb8\
-\xe8\xc1j\x81T\xa9\xf2\x99\xe8\xe1\xc4\xe55\x10(\x0cl$\xde\x05\xcf]\x0c\\\
-\xcc+h\xed\x12\x1e\x84\x8d\xf6\xbf<(\xa0\xac\x02xhWEW\xe2c\x8a\x12>\x92\xb2\
-\xb2P\x88\xab\xa2S\xe5\x8b\x83\x1e\x8aW\x1e,\xf0i*\xec"\xea\x9e\xc3\xff\xc4\
-\xdc\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\x9d\xcc\xe9\x8bp\t\\y\xb7\x80\xc0\xa3\
-\xc5~\x9b\x1a\xaf\xef\x02\x0f\x00\xba\xa5\xb0\xb5:z\xb5-\x94\t]Q]\r\x87\xc5\
-\xee\xcf\t\x94\xc7\xd0\x0c\xc1\x84\\FZ\xdezE5\xaa|\xf1\xd0\xc3\x97Q \x16\xe3\
-\xb4\xe8/p\xfa\x8dzf\x87#\x80\x00)\x91\xba"\\W$\xd2X\xa4c\xf94\x8e\xb5\x88\
-\x81\xe0_\xe3\xd0p\xc5\r\x07\x19\xa5\xa5\xf8\n\'\x7f\x1ag6\x1d\x00!@H\x00b\
-\xcd6\xcb\x1e~\x97\xa2\xd1\xc8\x14\xb7_Q\xdd\x10\xa34\xd9?\xe6\xd8\x8fS\xc4\
-\x16\x96h[s\x88B\xf0F\xca\\F\x07V\xf9\x7f\x87\x1e\xb9\x8c\xf1\r)AB[\x85\xf0\
-\x8bHM\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9f\x94\xe4\xc7[Y~\x9f\xc44~\xc3`\
-\xf8\x81\x0b\xb6!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%\x7f\xfbvH\xb8\x0e\xd2\
--\x03\\\x10\x1bR:aq=\xca- 5\xce{\x00Aj\xb1I(\xd4\x85\x19l!"?\xfd\x1e_7Q\x9a\
-\x8et\x8a $\xbea\xcd\x17\xd8%4\x05\x8a\xb8_$\x9c_\x8a\xa4D6\x1d\xe3\x86\xa8E\
-Ch\x92\x8c\xfc\xb8\x03+\xcaO\xa9\x8f\xf5\xcd\xc0\xbc\xa6W\xc6\xd7\xady\xad\
-\xb2=\x1ff\x06>\xdd\x06\xf0\xcd\xe0\x05\x9e\xab\\]\xf4\x1as\xa8\xe2`K9`\xac\
-\xc3\xd0\xdf%\x96r\xb9\xf9\x0fnC\x0b\x05A\xf9\x94\xf36C\x87\xfa\x18;\x9e\xe6\
-\xdc\xfe\x147\xdc\x13\xc51\xceP\x10A\x84\xf203\xbd\x98\x99^\xbcB\t\x81\x9a_|\
-\x02\x01\xec\xd4R\x9c\x9aV\xf8\xa8\x90\x84_\xc6\x9a\xeb\xc3\x98>\x8b\xb2\x1d\
-@\xcd/\x10F\x80b\xfd\xcdh\xe1Zd\xe06,k\'Z\xca\xe5\xe6\xa76bD\x82\x00\xd8e\
-\xc5\xb4\x11A\x06$1\xbf\x0fs\xe6\x0c\xd6\\/\xcavQJ\x81\x19\xc4\x0b\xd6b\x16\
-\xd3(\x05N\xbc\x9dR\xaa\xeb\x92\x9aa\xa1S\xeb\xcd\x91\x9bY\x06n7B\x83Ra%\x8b\
-\xacqF\x0c(I\xa3\xb2\xfc\x94O }\x00#\x97F\x1a\x127\xdc\x84V\x98\xc0\xb7\xcb\
-\x08\xd3\xc2\xd1\xeb\x91\xd9I\x84\x14\xd8\x0bW\xe0E\xeb\x010\xd2\'0f\x86@(\
-\xca\xf1V\xca\xcdK\xaf\xe4\x1c\xa8r\x11\xf4\x08\'+\x0e6\x84\x8e0k\xd0e\x0e=(\
-0b)2V\x01\x0f\xb0Ba:\xeeZ\x8b\x97\xdbNn\xb4\x97B\xe6:\x12\xd6\x18\xba9G${\
-\x1a\xbd\x9ca\xe4\xc44\x93G\xb2x\xae\x8f\x1e\xd4i\xde\x90\xa0)6B\xb1\xb8\x80\
-Bp!RyDr\xa7P\xd9Y\x06\xdf\x1d%7l#40#\x06\xb57E\xa9\x0f\x8da\x87\xd6#\x8c\x14\
-\xba\xcc\xa3\x07\xc1\x88\xa6(\x04J\xb8x\xb8A\x17\x87q"j\x84h\xae\x07J\xb3\
-\x8c\x1e\x9a$\xd3\x9b\x07\xa0yC\x92xk\x88\xf1\xa3\xb3\xe8a\x9d\xbaU\x19r\xbe\
-C(\xd7\xfb\x99\x9a\r\xe1)\xcc\x9aM\x8c\xee;\xc5\xf0\x9e}(\xdfCI\xc1\xa9m\xbf\
-`\xe9c\x0f\x91\xd0\x06\xc19RQ~\xba*\x11\x0b\x1c\xa7\xf7\x97iB\xf5\x16\xc9\
-\x1bG\x99\xea\xc92yl\x8e%\x0f\'\ty?a\xe0\xd7a\xe2\x9d\x0e\x89\x9aw\xb0#[\x91\
-^\x96\x80\xfb\n\xe9\xc3A\xcc\x1a\x8fx\x97\xc0Q\x7f\x84\x12\xc6U\x9a\x12U>\
-\x89\x1efO\xc5\xc1\x1aI\x04w\xa33\x8d\x10\x02\xa1B\x98\xfc\x1a\x8fi\x94&\xf1\
-\xbc;X\xb0\xba\x8b\xbe\xed\xff\x8a=1B,\x15#Q\x1eC\x14\x9a8\xfd\xa3\xfd\x14&\
-\xc6\t\xc4cH\xd3\xc4\xc9\xcf0\xba;M1\xddA\xdbW\x97c\x98\'\xd0\x9d$\x9a\xddF\
-\xcfO\x7fDqb\x1c3\x1a\xc1\x08\x87A8\xe4\xfb\\\x9aWnB\xf3\x87\x10\xb4\xa13\
-\x85g\x17\xb1\xa7f1\x82\x16\xa6\xd0\xd0\x021J\xfa>\xf0r\x04\xdc\x0eN\xbd\xf6\
-*\xf9\xd1Q\x02\x898\xd2\xb2\x98<p\x8e\xf1\xbd6\xbe[&\xd4\xd8Hp\xc3\xdd\xe8v\
-\x06y1\xcdUw\xa3\x14\x04k"\xd4\xd4K\xf2c\x03\x08)\t\xc7\x17\xa1\x07b\x18*\
-\x8d_Q~\xc7Q\xd2\xc34V\xe3\xcf\xf60~v\x82\x99\x0fB\x04k\x93,\\\xdbNM\xddRp\
-\xc2\x18\xfeQ\xf2\x1fj,\\\xd1F\xc1;\x80,\xf9\xe8Z\x17\xe5\xf1\xa3\xc4\xeb\
-\x1a\x88\xd74\x91g\x1f\xd5\xd3\xddk\x83\x1ebW\xc5\xc1\x82E\x08\xeeG\x17\x93\
-\x08\tB\x04\t\xf0>\x8a~\x00\xa4f\x13\xac}\x88\x805\x82=y\x10\x8d\x95\x18\xa2\
-\x8b\x81=/Q\x9e8\xc8\xc2\xdb\xb7\xd2p\xeb\x16Pe\xdcb\x91\xa1\x1d\xffB\xa1\
-\x7f\'\x85\xf4r"\x9d\x0b\xc0\xafch\xf7\x7f\xe1N}@\xdb]O\x90\xe8Z\x87\x0c\xf8\
-hZ\x1c\xcf)\xa2\xf4iL\xbd\x1b\xe1nB\x17\x13\xb8\xd93\x9c\xfd\x8f\xe7\x90\xa6\
-Dh\x92\xe6\x8d\xcf\x12]\xb2\x04\xe5e\xc9\x9c\xea\xc1\x19?\xc4\xc2;\x1e\xa1\
-\xe1\xd6-\x08\xdd\xc7\xb7a\xf8\xed\x97\x98=\xbd\x17C\xd7\x10f#\xba\x1beh\xf7\
-+\x17\xd5T\xd6\x0eb\xd7\xdfC\xac\xe3Y\xce\xbc\xfc\x1cB\xf7\xe8|\xf0\x19\x845\
-\x8d\xd4\x1a\x18\xd8\xf3\xb3K\xe7\xd7\xd1\x88\xb2\xb6#\xccM\xe8r\x06S\x8e\
-\xd0\xb6\xf9\xcf\x88u\xae\xc0\x17\xfd\xa8\xc0\xfb\x90[B\xe3\x1a\x93\x817\xff\
-\x93\xd2\xecW\t\x06\x8b(/\xc9L_\x0f:#\xa4\x96=\x06\xa1A\x82\xe2-\xa8\x96\xc8\
-5A\x0f\x8c_\xc6\x07\x9f\xae\xe1\x05"h\xb6DJ\x01~\x04kZ\x03w\xfe\x1d\xca\x8a\
-\xe3\xfaa\xcc\x92\xc0\xf4\xc2\x08\x15\x83\xb2\x8f\xdd?@(\xd8L\xc3\xba\xc7\
-\xd1\xca\xdb\x91\xde~\xa4\xf9\x08\r\xab\x1fe\xa8\xf7\x04\xa5\xbe>b\x8b\x9f\
-\xc4\xf3\x04v\xefYB\x81\x06\xeaV=\x82t\x7f\x82,\xec\x01\x99@\x13:83PJ\xe2\
-\x99\xa0\x95@/\x82\x15J\xa0[Q\xa4\xa1a\x05Sh\xae\x8b\x92\xedd\xba\xbfK(\xd0H\
-\xc3\xda\xad\xe8\xce\xcf\x11\xa5#\xf8\xd6\xd3\xd4-\x7f\x80\xe2\x89\xfd\xe8\
-\x8e\x8eP\t\xf0\x02\x97\xd6\xcc\xcd\x81\x9e\xc1\xb3\xbe\x81\xa9"H%\xd0\xf4\
-\x1a4\xfbU<\xe3\xe9\x8a\xf2\xabi\xdb\x8aV\xd8\x8dg\xc5\xd0l\x8dPx!\xb1\xf6M\
-\xe8\xce\xf7\xc09\x02Y\x0f\xa5\x97\xa8Y\xb2\x99\x80\xf5\x16\xd3\xdd\x07h\xd9\
-\xfa\xa7x~\x9e\xec\xe1\x97I\xb4\xac\xc4L.F\xe6w@\x16\xa8\x9e\xc1\\\x13tv.\
-\xae<:V\x0f\xeb\xc7\x10\xa3A\x90\x80=\x06\xfb\xeaaV\x81a\xa1\xd6\xad\xa34\
-\xf0>\xead\x08\xab\xb3\x1d9;\x85\'Rx\xa7\x05z\xac\x19\n\x01\xe4\x81a(\x04\
-\xd1\x9a\xd3XMw\xa0\x8d6\xc3D\x0cUH\xa0\x8aE\xdc\x0f\xc1H4\xe2\xcf\x19\xe8\
-\x87\xa6\xa0\xf0\xc9_\xc5\xb5\x10\xab\x835i\xc4h\x00\xcb\xe9\xa4}\xeb_\xa0E#\
-\xe0\xfb\xf8\x93\xc3\xc8#gpZ\x17\xe0\x1c/a$\x9b\x11\xe5\x04b\xdf,\xe4\x82\
-\xc8\xb6!\x8c\xc6[\xd0F\x1a\x11^\x12\xbc\x04*\xa7.\xad\xf9?\xbak\x87\x91\xa3\
-\x01\x84\x14PJCO\x12\x7f\xb1\xac(?\xf2\t8\xd2\x02\xeb\xe20\x1a\x9b\xdf\xa2\
-\xfa)\xe8\x8e@\xa6\x15\x00\x11(#o\x8d\x12\x89\xdfJv\xf7\xfb\xd8\xb7\x14\xb0\
-\xd3i\xcaG]\x1a\xef\xb8\x1fF\xf3\xb0/\x00\xfee\x8cY\x95\xff\x13\xfa\xf0\x0bO\
-W\x1cl\xb4\x0b\x12]\x93\x14N.B\xa2\xe1\xe7\xa7\x99\xdd\xbb\x19\xa4\xc2\\\xed\
-\xa3g]\x86\xbf=B\xe1\xd4m\xd4=\xd4L\xf1\xb0\x8d\xb9"\x8f*m {:\x83\x97\x9d\
-\xc1\t=\x89\xfd\x81Kh\x89\xc5\\\xf7 \xb3\xbb\xba\x0865\xe1\xcf\xcc B@\xf9v2\
-\xbb\xc6p\x1e\x1f\xa3\xa4~\x0f{\x97\x8b\xde\xa2c\\\xa7a\x1f*\xe3\xa5\x8b$\
-\x96\x8e\xcf{\x10\x1a\x88\x02\x99\x7f\x14\xb8\x83\x02w\xb8\x0e\xad\xa9\x89\
-\xe4\xdf\x96\xf02k)\xf4\xe4(O\x8d\xe2\x04\x1e\xa3\xb8\xd7&\xbc$\xc0\xdc\x9e>\
-fwu\x11\xba.\x85_H#\xa4\x7fI\xcd\xd2\x1e\x1bc\x91O\xe2\xc6I\xf2\xc7:\x11H\
-\xfc\xfc\x04\x997\xd6P\xf3l\xa1\xa2\xfc\xdc\xc9,\xd3\xdb\xbeL\xfc\xa6\x11\n=\
--\xf3\xbfy\xf3\xa3L\xfd\xf0\x1e\xca\xbd\xe5\xf3}\x1c\x1a\x08\x10[\xfd(\xc3/\
-\xceq\xe2O\xb6\xa3\x8a.V\xd3=X\x0b\xd7\x93\xf9\xf6\x08\xc5_\xfd\xfeU\x98\x06\
-U>\x0b\xfd\xb5U\xeb+\x0e\xaem\x9c\xe3~vs.U\x8bS\x94\xd4\x0f\x0f\xc3\x83\x16\
-\xf9i\xc8\x8e:\xf4~\xcb&\x93Kq\xc3\x1f6b,-\xf3\xf6\xb6Vn\x8a\r\x12}\xaa\x93\
-\xc3\x7f\x7f\x9a\xd1\xe7w\xd3q\xf7\x02\xe4\xca \xa5\xe3yN\xbd\x95\xa1\xd8\
-\xdeI\xc3\xc68=\xfd\x0e\x89T\x96\xf0\x13\x1d\x1c\xfa\x07\x9f\x89\xefw\xd3qW#\
-\xea\x9e(\xba\x05\xba\xe1\x92\xfcZ\x84\xfd;\xda\xb9S\xee\xe0\\*\tR\xa3\x93a\
-\xde\x8a<\xc0T2\tI\x90\x9a\xe2+\x03\xfb\xd1\x1fj\xe7\xf0\x0f\x06(\xfcp?\xcdk\
-\xeb\xf1\xd7\x9b\x0c}\xa4\x99k\xe9 \xd9`\xd1\xee\x0e\x90\x9d1.\xa9\xf9nt%\
-\x02\x9b\xfb\xc5\xeb\xf4\xd5\xd5\xa2\xa4A\xbbH\xf3\xab\xe4*V\xf5\xf7W\x96\
-\xdf\x90\xcb\xa9\xc5K\xb8O\x1d` \x19CH\xc9\xf5j\x90\x9d7\xace*\x1e>\xdf\xc7\
-\xb19\xc1\x96V\x97\xe9;\xd72v|\x04B:\xab\x1f\xdd\xc8l\xae\x86\xd7\x9c8\xf6\
-\xaa\xea\xb7\xc7\xb5D?\xe5\x17*\x0en\xf6g\xb1\xed~&\x9d\x12S\x13:\x83\xdfL\
-\x83\xa6c;\x06Jh $\x8b\x96\xb9t\xfdn\x9e\x83G:x\xa7/\xc4\xb8\x1e\xe6\xa9\x87\
-\xc7Y\xb8\xd9\xe0\xf0/r\x9c|\xf1,Jj\xf8\xc2 \x9c\x90,\xbbOb\xd6\x8d\xf1\xc6\
-\xb6e4\xd7\xfb<\xbae\x82\x86/i\x9c\xda\x9b\xe7\xe4w\xfa\xcf\xc7\xd6\xb6H\x1e\
-\xf8+\x83I-\x88]:\xc3d9\x8c\x15\x958\xf68g\xcb9\xc6\xfc\x8f\x0e\xd6|p\xbb\
-\x13<\xbe%Gx\x85\xe4\xd0\x9eI\xf6\xbf\x97AI\x8dh\xbd\xc1\x82\x1b$#%I0\x92\
-\xc7.\x9e\xe5\xbd\xc3+\xf8\x9d\x8d\x17\xd7\x1c\xd1[p\x1c\x9fR\xa1\x97Q\xbb\
-\x96`\xcc\xa1lOr\xba\x94g\xf6He\xf9\xbd\xb9m\x19R\xce\xe2\x94N3\xed\x14\xb0j\
-\x0c\xca\xf6\x19\xce\x96\xafg\xcc\xff\xc4a\xe5\x04\xb4\x9c\x9c\xa3ac\x0b\xc7\
-O\x0c\x13J\x984\xad\x8f\xd0\xfd\xfe4Gr\xc1+=\xfeU.\x81>4T\xf9Aa>\x9b\xa7\x94\
-\xef\xa5\xf3\x16A\xb9;\x84\xed\x18\xf8B\'\x92\x90\xd4\xb7:\xb4-\xb5i]ZbOw\
-\x07/\xbf\xd6B\xb1\x94&=\xac\x90^\x90\x077\x1f\xa2\xb6\xdd\xe0\xcc\xc1 \xc5\
-\x9c\x86\x15\x15\xdc\xfc\xe5,\xe1Z\xf8\xce\xbf\xdf\xc7\xd1\x9e,\x86\xae\xa1l\
-\x9d\x87\x9f\xec\xe1\xba\xdb4\x8e\xee\x8e03i\x11kT\xac\xf8R\x96\xbe\xfe\x14\
-\xfb\x0f-\xe1+\xab{Y\xb42BM\xbdOz\xc8\xe2\xd8\x899l\xa7t\xdeg:\xad\xa8\x8d\
-\xc0\xe6gNs\xeeh\x80\xe3\xef\x85\xd0L\xc1\x9a\xcdYZ\xaf\xcb\xb3oG\x92h\xd2\
-\xe3\xec\x99\x1a\xb6\xbd\xb1\x9e\xec\xf4%4\x0f\xe6\x88\xd5d)\x16\xfah[>MSG\
-\x91\xde\xb3Q>8\x96G@\xc5\xf9\xd5\xa72\xd8\x85C\xb4\xae\xd1\x895\xf8\x0c\rNr\
-\xec\xf84\xb6\x93\xbd\xa0\x9f\xf7\xeewyx\x93C\xde)\xd1\xd2\x99@\xc8I\xde\xda\
-YbhH^\xa9q\xafR!b\xfd\xfa7+^\xb3\x85\x80-\x1b{\xb8sM\x1f\xa9d\x11!\xe7\x9bf\
-\xb3&\x999\x8b\xf1\xe9\x08\xbf\xfc\xcd\x12\xce\x9e\xab\xa5\xec\xca\x0b\xda-\
-\xed\x9ce\xc3\xb2\x11\xda\x9a\xe7P\x9e\xc2G\xa3\xa7/\xc1\xfe\xe3\r\xf4\rF\
-\xce\xc7J\xa9X~\xfd4\x1bW\x0f\x93\x8a\x17(\x97%J\xea|\xf0a-;\xbb\x9b\xc9\xe5\
-\r\xee\xbds\x84\xf5]\xd3\x94}\x8d\xd7\xdfi\xe6\xf0\xc9\x9aOy\rX\x1e\xb7\xaf\
-\x1d\xe7\x96\xe5#H\xdfEj0\x96\x89p\xe6\\\r\x1b\x96\x8d\x00\x82\xd7\xdfY\xcc\
-\xe1\x93\xb5\x97\xd4\xcc\xe6\x0c\x84\x80{\xef\x1cc]\xd7\x14\xae//\xd0\xad4\
-\xbf\xf9w\xf4\xb3\xa1k\x84\xb2\xaf\xf1\xda;\x1d\x1c>y\xe1}\x03C\x87\xbf\xf9z\
-\x8e\xf2\xe0\x08o~\xaf\x9f\xaf\xfdS\x17}\x13Q\xbe\xf9|\x84\xea\xd5\xb6k\x8fX\
-\xb0\xe0\xfb\x97\xdd\xedB@(\xf8q3\xd7\x05\xdb\xa9\xfev\xbc\x12\xac[U\xe6\x07\
-\xcf\xcf\xf0\xc2_\x0e\xe1z\x82?\xff\xe7\x05<\xf3\xf58\xef\xee\xbd6W\t\xaa\\\
-\x88><<\xfcy{\xa8\xf2\tn\xda:\xc5\xccH\x86c\x07\xf3<\xf1\\\x80\x9e\x136on_\
-\xc0\\\xb6\xba\xbd\xfa<\xa8\xf6\xfa\x17\x8cp\xd0&\x1a\xcd\xf3\xd0\x1f\xc3\
-\xc6{m^z%T-\x8e\xcf\x11\xfd\xf36P\xe5B^\xfc\xb7f\x82f\x03\xb51\x9f\xe7\xbf#y\
-\xf5gW\xe7vd\x95\xca\x10\xf0\x8d\xea\xa7_\x95*\x9fAu\xed\xaeR\xe5"T\x0b\xa4J\
-\x95\x8b\xf0\xdf\xa9r\x96sLI-\x87\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory045Bitmap():
- return wxBitmapFromImage(getDocFactory045Image())
-
-def getDocFactory045Image():
- stream = cStringIO.StringIO(getDocFactory045Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory045')
-catalog['DocFactory045'] = ImageClass()
-catalog['DocFactory045'].getData = getDocFactory045Data
-catalog['DocFactory045'].getImage = getDocFactory045Image
-catalog['DocFactory045'].getBitmap = getDocFactory045Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory046Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rX\
-IDATx\x9c\xed\x9bil]\xc7y\x86\x9f\x99\xb3\xdd\x95w\xe1\xe5*\x91\x94H\xca\xb6\
-lJ\xb2vyU";Q%/\xf5\xa6zi\xed\xa2h\x11\x14\xb5\xd1\xc2m\x7f\xe4gP\x04\x05\x8a\
-.F\x83\xc0v\x96\x1aE\x0b\xd7\xa9\x1b%\xb1\xe3\x18\x91\xecD\x96lE\xa16\xcb\
-\xdaHY\x12Iq\xb9\xdc\xc9K\xde\xf5\x9c{\xce\x99\xfe\xa0+[\xb5-\xb2\x80d\xb9\
-\xc0}~\x1e\xbcs\xde\xef\xfbf\x063\xe7\x0cF\xfc\xddw\x94\xa2B\x85\n\x9f\x89\
-\x1e\xaa\xbe\xd6!T\xa8\xf0\xe5E\x0fV&H\x85\n\x9f\x8b\x1eN,L(P\x18\xd8H\xbcK\
-\x9e\xbb\x18\xb8\x98W!\xb4\xcf\x89A\xd8h\xff+\x06\x05\x94U\x00\x0f\xed\xaa\
-\xf8J|LQ\xc2GRV\x16\nqU|*|\xf9\xd0C\xf1\xf9E\x02\x9f\x86\xc2^\xa2\xee\x05\
-\xfcO\x8cM)A\x9a:y7N.\xd8\xce\xac\xbe\x04\x97\xc0U\tT\xe0\xd1d\xbfM\x95\xd7{\
-I\x0c\x00\xba\xa5\xb0\xb5\x1az\xb4\xed\x94\t]Q_\r\x87\xa5\xee/\x08\x94G\xd1\
-\x0c\xc1\xb8\\AZ\xdezE=*|y\xd1\xc3\x0b\x98 \x16c4\xe9\xcfs\xf6\x8dZf\x86"\
-\x80\x00)\x91\xba"\\S$R_\xa4m\xe5\x14\x8e\xb5\x84\xfe\xe0_\xe3Pw\xc5\x03\r2B\
-S\xf1\x15\xba~\x16g&\x1d\x00!@H\x00b\x8d6+\x1ez\x97\xa2Q\xcf$\xb7_Q\xdf\x10#\
-4\xd8?\xe1\xe4OR\xc4\x16\x97hYw\x94B\xf0F\xca,\xa0p\x15\xfe\xdf\xa3G\x16\xd0\
-\xcf!%Hhk\x10~\x11\xa9)\x82q\x81\x11\x10(\x04\xa5|\x90\xb1.I~\xac\x99\x95\
-\xf7JL\xe3\xb7\x0c\x84\xef\xbfd\x1b"|\x0f\xe1\x96\x11\xbe\x87\x92\x1aJ7P\xf2\
-\xb3\xb7C\xc2u\x90n\x19\xe0\x12mH\xe9\x84\xc5\xf5(\xb7\x80\xd4\xb8\x18\x03\
-\x08RKMB\xa1\x0e\xcc`\x13\x11\xf9\xe9\xf7\xf8\xba\x89\xd2t\xa4S\x04!\xf1\rkn\
-\x82\xcd\xe3)P\xc4\xfd"\xe1\xfcr$%\xb2\xe9\x187D-\xeaB\x13d\xe4\xc7\x85[P~J}\
-\xeco\x06\xe6<\xbd2\xben\xcdy\x95\xed9\x99\x19\xf8t\x1b\xc07\x83\x97\xc4\\\
-\xe1\x8bA\xaf2\x07\xe7\x15Y\xca\x01c\x03\x86\xfe.\xb1\x94\xcb\xcd\x7fp\x1bZ(\
-\x08\xca\xa7\x9c\xb7\x19<\xda\xcb\xe8\xa94\x17\x0e\xa5\xb8ak\x14\xc78GA\x04\
-\x11\xca\xc3\xcc\xf4`fz\xf0\n%\x04jn\xf1\t\x04\xb0S\xcbq\xaa\x9a\xe1\xa3\x89\
-$\xfc2\xd6l/\xc6\xd4y\x94\xed\x00jn\x810\x02\x14koF\x0bW#\x03\xb7aY{\xd0R.7?\
-\xb9\x19#\x12\x04\xc0.+\xa6\x8c\x082 \x89\xf9\xbd\x98\xd3\xe7\xb0f{P\xb6\x8b\
-R\n\xcc ^\xb0\x1a\xb3\x98F)p\xe2\xad\x94R\x1d\xf3z\x86\x85N\xb57Knz\x05\xb8\
-\x9d\x08\rJ\x85\xd5,\xb1\xc6\x186\xa0$\x8d\x85\xe5\xa7|\x02\xe9\xc3\x18\xb94\
-\xd2\x90\xb8\xe1\x06\xb4\xc28\xbe]F\x98\x16\x8e^\x8b\xccN \xa4\xc0^\xbc\n/Z\
-\x0b\x80\x91>\x8d1=\x08BQ\x8e7Sn\\~5\xc6@\x85\xcb\xa0G\xe8\x9aWd\x08\x1daV\
-\xa1\xcb\x1czP`\xc4Rd\xac\x02\x1e`\x85\xc2\xb4\xdd\xb5\x1e/\xb7\x8b\xdcH\x0f\
-\x85\xccu$\xacQts\x96H\xf6,z9\xc3\xf0\xe9)&\x8eg\xf1\\\x1f=\xa8\xd3\xb8)ACl\
-\x98bq\x11\x85\xe0b\xa4\xf2\x88\xe4\xce\xa0\xb23\x0c\xbc;Bn\xc8Fh`F\x0c\xaao\
-\x8aR\x1b\x1a\xc5\x0emD\x18)t\x99G\x0f\x82\x11MQ\x08\x94p\xf1p\x83.\x0ecD\
-\xd40\xd1\\7\x94f\x189:A\xa6\'\x0f@\xe3\xa6$\xf1\xe6\x10c\'f\xd0\xc3:5k2\xe4\
-|\x87P\xae\xe7s=\xeb\xc2\x93\x98U[\x189x\x86\xa1\xfd\x07Q\xbe\x87\x92\x823;\
-\x7f\xc9\xf2G\x1f$\xa1\r\x80s|A\xf9\xe9\xaaD,p\x8a\x9e_\xa5\t\xd5Z$o\x1ca\
-\xb2;\xcb\xc4\xc9Y\x96=\x94$\xe4\xfd\x94\xfe\xdf\x84\x89\xb7;$\xaa\xde\xc1\
-\x8e\xec@zY\x02\xee+\xa4\x8f\x051\xab<\xe2\x1d\x02G\xfd\x11J\x18WyHT\xf8$z\
-\x98\xfd\xf3\x8a4\x92\x08\xeeFg\n!\x04B\x850\xf9\r\x1eS(M\xe2yw\xb0hm\x07\
-\xbd\xbb\xfe\x15{|\x98X*F\xa2<\x8a(4p\xf6\xc7\x87(\x8c\x8f\x11\x88\xc7\x90\
-\xa6\x89\x93\x9ffd_\x9ab\xba\x8d\x96\xaf\xaf\xc40O\xa3;I4\xbb\x85\xee\x9f\
-\xfd\x98\xe2\xf8\x18f4\x82\x11\x0e\x83p\xc8\xf7\xba4\xae\xde\x82\xe6\x0f"hAg\
-\x12\xcf.bO\xce`\x04-L\xa1\xa1\x05b\x94\xf4\x83\xe0\xe5\x08\xb8m\x9cy\xedU\
-\xf2##\x04\x12q\xa4e1q\xf8\x02c\x07l|\xb7L\xa8\xbe\x9e\xe0\xa6\xbb\xd1\xed\
-\x0c\xf2r\x9ek\xeeF)\x08VE\xa8\xaa\x95\xe4G\xfb\x11R\x12\x8e/A\x0f\xc40T\x1a\
-\x7fA\xf9\x9dBI\x0f\xd3X\x8b?\xd3\xcd\xd8\xf9q\xa6?\x08\x11\xacN\xb2x}+U5\
-\xcb\xc1\tc\xf8\'\xc8\x7f\xa8\xb1xU\x0b\x05\xef0\xb2\xe4\xa3k\x1d\x94\xc7N\
-\x10\xaf\xa9#^\xd5@\x9e\x83TNu\xbfX\xf4\x10{\xe7\x15\t\x96 \xb8\x0f]L $\x08\
-\x11$\xc0\xfb(\xfa\x00\x90\x9aM\xb0\xfaA\x02\xd60\xf6\xc4\x114Vc\x88\x0e\xfa\
-\xf7\xbfDy\xfc\x08\x8bo\xdfA\xdd\xad\xdbA\x95q\x8bE\x06w\xff\x0b\x85\xbe=\
-\x14\xd2+\x89\xb4/\x02\xbf\x86\xc1}\xff\x85;\xf9\x01-w=N\xa2c\x032\xe0\xa3iq\
-<\xa7\x88\xd2\xa70\xf5N\x84\xbb\x05]\x8c\xe3f\xcfq\xfe?\x9eE\x9a\x12\xa1I\
-\x1a7?Ct\xd92\x94\x97%s\xa6\x1bg\xec(\x8b\xefx\x98\xba[\xb7#t\x1f\xdf\x86\
-\xa1\xb7_b\xe6\xec\x01\x0c]C\x98\xf5\xe8n\x94\xc1}\xaf\\\xd6SY\xbb\x89]\xbf\
-\x95X\xdb3\x9c{\xf9Y\x84\xee\xd1\xfe\xc0\xd3\x08k\n\xa9\xd5\xd1\xbf\xff\xe7\
-\xf3\xe7\xd7V\x8f\xb2v!\xcc-\xe8r\x1aS\x0e\xd3\xb2\xed\xcf\x88\xb5\xaf\xc2\
-\x17}\xa8\xc0\xfb\x90[F\xfd:\x93\xfe7\xff\x93\xd2\xcc\xd7\t\x06\x8b(/\xc9to7\
-:\xc3\xa4V<\n\xa1\x01\x82\xe2-\xa8L\x91/\x14=0\xb6\x80\x0f?]\xc3\x0bD\xd0l\
-\x89\x94\x02\xfc\x08\xd6\x94\x06\xee\\[e\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\xee\
-\xeb\'\x14l\xa4n\xc3ch\xe5]H\xef\x10\xd2|\x98\xba\xb5\x8f0\xd8s\x9aRo/\xb1\
-\xa5O\xe0y\x02\xbb\xe7<\xa1@\x1d5k\x1eF\xba?E\x16\xf6\x83L\xa0\t\x1d\x9ci(%\
-\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9V2\x9d\xdf#\x14\
-\xa8\xa7n\xfd\x0et\xe7\x17\x88\xd2q|\xeb)jV\xdeO\xf1\xf4!tGG\xa8\x04x\x81\
-\xf9=s\xb3\xa0g\xf0\xacoa\xaa\x08R\t4\xbd\n\xcd~\x15\xcfxjA\xf9U\xb5\xec@+\
-\xec\xc3\xb3bh\xb6F(\xbc\x98X\xeb\x16t\xe7\xfb\xe0\x1c\x87\xac\x87\xd2KT-\
-\xdbF\xc0z\x8b\xa9\xce\xc34\xed\xf8S<?O\xf6\xd8\xcb$\x9aVc&\x97"\xf3\xbb!\
-\x0bT\xce`\xbePt\xf6,\x9d_\x15\xab\x85\x8d\xa3\x88\x91 H\xc0\x1e\x85\x83\xb5\
-0\xa3\xc0\xb0P\x1b6P\xea\x7f\x1f\xd5\x15\xc2joE\xceL\xe2\x89\x14\xdeY\x81\
-\x1ek\x84B\x00yx\x08\nA\xb4\xc64V\xc3\x1dh#\x8d0\x1eC\x15\x12\xa8b\x11\xf7C0\
-\x12\xf5\xf8\xb3\x06\xfa\xd1I(|\xf2Wq5\xc4j`]\x1a1\x12\xc0r\xdai\xdd\xf1\x17\
-h\xd1\x08\xf8>\xfe\xc4\x10\xf2\xf89\x9c\xe6E8\xa7J\x18\xc9FD9\x8188\x03\xb9 \
-\xb2e\x10\xa3\xfe\x16\xb4\xe1z\x84\x97\x04/\x81\xca\xa9\xf9=\xff\xc7w\xfd\
-\x10r$\x80\x90\x02Ji\xe8N\xe2/\x95\x0b\xca\x8f|\x02\x8e7\xc1\x868\x8c\xc4\
-\xe6\xb6\xa8~\n:#\x90i\x06@\x04\xca\xc8[\xa3D\xe2\xb7\x92\xdd\xf7>\xf6-\x05\
-\xect\x9a\xf2\t\x97\xfa;\xee\x83\x91<\x1c\x0c\x80\xbf\x80\xbe\xaapE\xd1\x87\
-\x9e\x7fj^\x91\xd1*HtLP\xe8Z\x82D\xc3\xcfO1s`\x1bH\x85\xb9\xd6G\xcf\xba\x0c}\
-w\x98\xc2\x99\xdb\xa8y\xb0\x91\xe21\x1bsU\x1eU\xdaD\xf6l\x06/;\x8d\x13z\x02\
-\xfb\x03\x97\xd02\x8b\xd9\xce\x01f\xf6v\x10lh\xc0\x9f\x9eF\x84\x80\xf2\xedd\
-\xf6\x8e\xe2<6JI\xfd\x1e\xf6^\x17\xbdI\xc7\xb8N\xc3>Z\xc6K\x17I,\x1f\x9b\x8b\
-Ah \nd\xfeQ\xe0\x0e\x08\xdc\xa1\x1a\xb4\x86\x06\x92\x7f[\xc2\xcb\xac\xa7\xd0\
-\x9d\xa3<9\x82\x13x\x94\xe2\x01\x9b\xf0\xb2\x00\xb3\xfb{\x99\xd9\xdbA\xe8\
-\xba\x14~!\x8d\x90\xfe\xbc\x9e\xa5\xfd6\xc6\x12\x9f\xc4\x8d\x13\xe4O\xb6#\
-\x90\xf8\xf9q2o\xac\xa3\xea\x99\xc2\x82\xf2s\'\xb2L\xed\xfc*\xf1\x9b\x86)t7\
-\xcd\xfd\xe6\xcd\x8f0\xf9\xa3\xad\x94{\xca\x17k\x1c\xea\x0f\x10[\xfb\x08C/\
-\xccr\xfaOv\xa1\x8a.V\xc3V\xac\xc5\x1b\xc9|w\x98\xe2\xaf\x7f\xff*\x0e\x83\n\
-\x9f\x87\xfe\xda\x9a\x8d\xf3\x8a\xaa\xebg\xb9\x8f}\\HU\xe3\x14%\xb5CC\xf0\
-\x80E~\n\xb2#\x0e=\xdf\xb1\xc9\xe4R\xdc\xf0\x87\xf5\x18\xcb\xcb\xbc\xbd\xb3\
-\x99\x9bb\x03D\x9fl\xe7\xd8\xdf\x9fe\xe4\xb9}\xb4\xdd\xbd\x08\xb9:H\xe9T\x9e\
-3oe(\xb6\xb6S\xb79Nw\x9fC"\x95%\xfcx\x1bG\xff\xc1g\xfc\x07\x9d\xb4\xddU\x8f\
-\xda\x1aE\xb7@7\\\x92\xdf\x88phw+w\xca\xdd\\H%Aj\xb43\xc4[\x91\xfb\x99L&!\tR\
-S|\xad\xff\x10\xfa\x83\xad\x1c\xfba?\x85\x1f\x1d\xa2q}-\xfeF\x93\xc1\x8f<sMm\
-$\xeb,Z\xdd~\xb2\xd3\xc6\xbc\x9e\xefFW#\xb0\xb9O\xbcNoM5J\x1a\xb4\x8a4\xbfN\
-\xaeaM_\xdf\xc2\xf2\x1bt9\xb3t\x19\xf7\xaa\xc3\xf4\'c\x08)\xb9^\r\xb0\xe7\
-\x86\xf5L\xc6\xc3\x17k\x1c\x9b\x15lov\x99\xbas=\xa3\xa7\x86!\xa4\xb3\xf6\x91\
-\xcd\xcc\xe4\xaax\xcd\x89c\xaf\xa9|{\\\x0b\xf43~a^Q\xa3?\x83m\xf71\xe1\x94\
-\x98\x1c\xd7\x19\xf8v\x1a4\x1d\xdb1PB\x03!Y\xb2\xc2\xa5\xe3w\xf3\x1c9\xde\
-\xc6;\xbd!\xc6\xf40O>4\xc6\xe2m\x06\xc7~\x99\xa3\xeb\x85\xf3(\xa9\xe1\x0b\
-\x83pB\xb2\xe2^\x89Y3\xca\x1b;W\xd0X\xeb\xf3\xc8\xf6q\xea\xbe\xa2q\xe6@\x9e\
-\xae\x17\xfb.j\xab\x9b$\xf7\xff\x95\xc1\x84\x16\xc4.\x9dc\xa2\x1c\xc6\x8aJ\
-\x1c{\x8c\xf3\xe5\x1c\xa3\xfeG\x07k>\xb8\x9d\t\x1e\xdb\x9e#\xbcJrt\xff\x04\
-\x87\xde\xcb\xa0\xa4F\xb4\xd6`\xd1\r\x92\xe1\x92$\x18\xc9c\x17\xcf\xf3\xde\
-\xb1U\xfc\xce\xe6\xcb{\x0e\xebM8\x8eO\xa9\xd0\xc3\x88]M0\xe6P\xb6\'8[\xca3s|\
-a\xf9\xbd\xb9s\x05R\xce\xe0\x94\xce2\xe5\x14\xb0\xaa\x0c\xca\xf69\xce\x97\
-\xafg\xd4\xff\xc4a\xe584u\xcdR\xb7\xb9\x89S\xa7\x87\x08%L\x1a6F\xe8|\x7f\x8a\
-\xe3\xb9\xe0\xd5\xea\xff\n\xf3\xa0\x0f\x0e\xce\x7fP\x98\xcf\xe6)\xe5{h\xbfEP\
-\xee\x0ca;\x06\xbe\xd0\x89$$\xb5\xcd\x0e-\xcbm\x9a\x97\x97\xd8\xdf\xd9\xc6\
-\xcb\xaf5Q,\xa5I\x0f)\xa4\x17\xe4\x81mG\xa9n58w$H1\xa7aE\x057\x7f5K\xb8\x1a^\
-\xfc\xf7{9\xd1\x9d\xc5\xd05\x94\xad\xf3\xd0\x13\xdd\\w\x9b\xc6\x89}\x11\xa6\
-\',b\xf5\x8aU_\xc9\xd2\xdb\x97\xe2\xd0\xd1e|mm\x0fKVG\xa8\xaa\xf5I\x0fZ\x9c<\
-=\x8b\xed\x94.\xc6\x99N+\xaa#\xb0\xed\xe9\xb3\\8\x11\xe0\xd4{!4S\xb0n[\x96\
-\xe6\xeb\xf2\x1c\xdc\x9d$\x9a\xf48\x7f\xae\x8a\x9dol$;5\x8f\xe7\x91\x1c\xb1\
-\xaa,\xc5B/-+\xa7hh+\xd2s>\xca\x07\'\xf3\x08Xp~\xb5\xa9\x0cv\xe1(\xcd\xebtbu\
->\x83\x03\x13\x9c<5\x85\xedd/\xa9\xf3\x81C.\x0fmq\xc8;%\x9a\xda\x13\x089\xc1\
-[{J\x0c\x0e\xca+\xdd\xef\x15\x16\x88\xd8\xb8\xf1\xcdy\xd7n!`\xfb\xe6n\xee\\\
-\xd7K*YD\xc8\xb9&\xd9\xacIf\xd6bl*\xc2\xaf~\xbb\x8c\xf3\x17\xaa)\xbb\xf2\x92\
-v\xcb\xdbg\xd8\xb4b\x98\x96\xc6Y\x94\xa7\xf0\xd1\xe8\xeeMp\xe8T\x1d\xbd\x03\
-\x91\x8bZ)\x15+\xaf\x9fb\xf3\xda!R\xf1\x02\xe5\xb2DI\x9d\x0f>\xacfOg#\xb9\
-\xbc\xc1=w\x0e\xb3\xb1c\x8a\xb2\xaf\xf1\xfa;\x8d\x1c\xeb\xaa\xfaT\xac\x01\
-\xcb\xe3\xf6\xf5c\xdc\xb2r\x18\xe9\xbbH\rF3\x11\xce]\xa8b\xd3\x8aa@\xf0\xfa;\
-K9\xd6U=\xafg6g \x04\xdcs\xe7(\x1b:&q}y\x89\xefB\xf3\x9b{G\x1f\x9b:\x86)\xfb\
-\x1a\xaf\xbd\xd3\xc6\xb1\xaeK\xef\x19\x18:\xfc\xcd7s\x94\x07\x86y\xf3\xfb}|\
-\xe3\x9f:\xe8\x1d\x8f\xf2\xed\xe7"T\xae\xb4];\xc4\xa2E?Xp\xf9\x85\x80P\xf0c\
-\xb9\xeb\x82\xedT~;^\t6\xac)\xf3\xc3\xe7\xa6y\xfe/\x07q=\xc1\x9f\xff\xf3"\
-\x9e\xfef\x9cw\x0f|1W\t*|6\xfa\xd0\xd0\xd0\xb5\x8e\xa1\x02p\xd3\x8eI\xa6\x87\
-3\x9c<\x92\xe7\xf1g\x03t\x9f\xb6ys\xd7"f\xb3\x95\xed\xd5\xb5\xa4R\xfd/\t\xe1\
-\xa0M4\x9a\xe7\xc1?\x86\xcd\xf7\xd8\xbc\xf4J\xa829\xbe\x04\xe8\xd7:\x80\ns\
-\xbc\xf0o\x8d\x04\xcd:\xaac>\xcf\xbd(y\xf5\xe7W\xe7vd\x85\xff\x1b\x02\xbeU\
-\xf9\x04\xacP\xe1s\xa8\xac\xe1\x15*\\\x86\xca\x04\xa9P\xe12\xfc7\x8e\x06\x96\
-sW\x86?\'\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory046Bitmap():
- return wxBitmapFromImage(getDocFactory046Image())
-
-def getDocFactory046Image():
- stream = cStringIO.StringIO(getDocFactory046Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory046')
-catalog['DocFactory046'] = ImageClass()
-catalog['DocFactory046'].getData = getDocFactory046Data
-catalog['DocFactory046'].getImage = getDocFactory046Image
-catalog['DocFactory046'].getBitmap = getDocFactory046Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory047Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rY\
-IDATx\x9c\xed\x9bil\\\xd7y\x86\x9fs\xee6+g\xe1p\x95HJ$e[6%Y\xbb\xbc*\x91\x9d\
-\xa8\x92\x97zS\xbd\xb4vQ\xb4\x08\x8a\xdah\xe1\xb6?\xf23(\x82\x02E\x17\xa3A`\
-\xbbIj\x14-\\\xa7n\x94\xc4\x8ecD\xb2\x13Y\xb2\x15\x85\xda,k\xa5,\x89\xa4\xb8\
-\x0cwr\xc8Y\xef\x9d{\xef\xe9\x0f\xba\xb2\x15\x87\x14QX\x96\xd1\xcc\xf3s\xbe\
-\xef\xce\xfb~g\xc19\xf7\x1e\x1c\xf1w\xdfR\x8a\n\x15*\xfcF\xf4P\xf5\xb5\xb6P\
-\xa1\xc2\x17\x17=X\x99 \x15*\xcc\x89\x1eN\xcc\x9f P\x18\xd8H\xbc\xcb~w1p1\
-\xaf\xa2\xb5_\xf3 l\xb4_\xf3\xa0\x80\xb2\n\xe0\xa1]\x15]\x89\x8f)J\xf8H\xca\
-\xcaB!\xae\x8aN\x85/.z(>wP\xe0\xd3P\xd8K\xd4\xbd\x88\xff\x89\xb1)%HS\'\xef\
-\xc6\xc9\x05\xdb\x99\xd1\x97\xe0\x12\xb8*\x06\x05\x1eM\xf6\xdbTy=\x97y\x00\
-\xd0-\x85\xad\xd5\xd0\xadm\xa7L\xe83\xd5\xd5pX\xea\xfe\x94@y\x04\xcd\x10\x8c\
-\xc9\x15\xa4\xe5\xad\x9f\xa9F\x85/>zx\x9e\tb1J\x93\xfe<\xe7\xde\xa8ez0\x02\
-\x08\x90\x12\xa9+\xc25E"\xf5E\xdaVN\xe2XK\xe8\x0b\xfe5\x0eu\x9f\xb9\xc1 \xc3\
-4\x15_\xe1\xcc\x8f\xe3L\xa7\x03 \x04\x08\t@\xac\xd1f\xc5C\xefR4\xea\x99\xe0\
-\xf6\xcfT7\xc40\r\xf6\x0f9\xf9\xc3\x14\xb1\xc5%Z\xd6\x1d\xa5\x10\xbc\x912\
-\xf34X\x85\xffw\xe8\x91y\xfa;\xa4\x04\tm\r\xc2/"5E0.0\x02\x02\x85\xa0\x94\
-\x0f2zF\x92\x1fmf\xe5\xbd\x12\xd3\xf8\x15\xfd\xe1\xfb/\xdb\x86\x08\xdfC\xb8e\
-\x84\xef\xa1\xa4\x86\xd2\r\x94\xfc\xcd\xdb!\xe1:H\xb7\x0cpYnH\xe9\x84\xc5\
-\xf5(\xb7\x80\xd4\xb8\xe4\x01\x04\xa9\xa5&\xa1P\x07f\xb0\x89\x88\xfc\xf4\xff\
-\xf8\xba\x89\xd2t\xa4S\x04!\xf1\rkv\x82]AS\xa0\x88\xfbE\xc2\xf9\xe5HJd\xd31n\
-\x88Z\xd4\x85\xc6\xc9\xc8\x8f\x1blA\xf5)\xf5\xb1\xbe\x19\x98\xd5\xf4\xca\xf8\
-\xba5\xabU\xb6g\xd3\xcc\xc0\xa7\x9f\x01|3x\x99\xe7\n\x9f/z\x9590g\xd0R\x0e\
-\x18\x1b0\xf4w\x89\xa5\\n\xfe\x83\xdb\xd0BAP>\xe5\xbc\xcd\xc0\xd1\x1eFN\xa5\
-\xb9x(\xc5\r[\xa38\xc6y\n"\x88P\x1ef\xa6\x1b3\xd3\x8dW(!P\xb3\x8bO \x80\x9dZ\
-\x8eS\xd5\x0c\x1fM$\xe1\x97\xb1fz0&/\xa0l\x07P\xb3\x0b\x84\x11\xa0X{3Z\xb8\
-\x1a\x19\xb8\r\xcb\xda\x83\x96r\xb9\xf9\xc9\xcd\x18\x91 \x00vY1iD\x90\x01I\
-\xcc\xef\xc1\x9c:\x8f5\xd3\x8d\xb2]\x94R`\x06\xf1\x82\xd5\x98\xc54J\x81\x13o\
-\xa5\x94\xea\xb8\xa2fX\xe8T{3\xe4\xa6V\x80\xdb\x89\xd0\xa0TX\xcd\x12k\x94!\
-\x03J\xd2XX}\xca\'\x90>\x8c\x91K#\r\x89\x1bn@+\x8c\xe1\xdbe\x84i\xe1\xe8\xb5\
-\xc8\xec8B\n\xec\xc5\xab\xf0\xa2\xb5\x00\x18\xe9\xd3\x18S\x03 \x14\xe5x3\xe5\
-\xc6\xe5Ws\x0cT\x98\x07=\xc2\x999\x83\x86\xd0\x11f\x15\xba\xcc\xa1\x07\x05F,\
-E\xc6*\xe0\x01V(L\xdb]\xeb\xf1r\xbb\xc8\rwS\xc8\\G\xc2\x1aA7g\x88d\xcf\xa1\
-\x973\x0c\x9d\x9ed\xfcx\x16\xcf\xf5\xd1\x83:\x8d\x9b\x124\xc4\x86(\x16\x17Q\
-\x08.F*\x8fH\xee,*;M\xff\xbb\xc3\xe4\x06m\x84\x06f\xc4\xa0\xfa\xa6(\xb5\xa1\
-\x11\xec\xd0F\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\x17\x0f7\xe8\xe20JD\r\
-\x11\xcduAi\x9a\xe1\xa3\xe3d\xba\xf3\x004nJ\x12o\x0e1zb\x1a=\xacS\xb3&C\xcew\
-\x08\xe5\xba\xe7\xd4\xac\x0bO`Vma\xf8\xe0Y\x06\xf7\x1fD\xf9\x1eJ\n\xce\xee\
-\xfc\x19\xcb\x1f}\x90\x84\xd6\x0f\xce\xf1\x05\xd5\xa7\xab\x12\xb1\xc0)\xba\
-\x7f\x9e&Tk\x91\xbcq\x98\x89\xae,\xe3\'gX\xf6P\x92\x90\xf7#\xfa~\x19&\xde\
-\xee\x90\xa8z\x07;\xb2\x03\xe9e\t\xb8\xaf\x90>\x16\xc4\xac\xf2\x88w\x08\x1c\
-\xf5G(a|NC\xa2\xc2\'\xd1\xc3\xec\x9f3\xa8\x91Dp7:\x93\x08!\x10*\x84\xc9/\xf1\
-\x98Di\x12\xcf\xbb\x83Ek;\xe8\xd9\xf5o\xd8cC\xc4R1\x12\xe5\x11D\xa1\x81s?8Da\
-l\x94@<\x864M\x9c\xfc\x14\xc3\xfb\xd2\x14\xd3m\xb4|u%\x86y\x1a\xddI\xa2\xd9-\
-t\xfd\xf8\x07\x14\xc7F1\xa3\x11\x8cp\x18\x84C\xbe\xc7\xa5q\xf5\x164\x7f\x00A\
-\x0b:\x13xv\x11{b\x1a#ha\n\r-\x10\xa3\xa4\x1f\x04/G\xc0m\xe3\xeck\xaf\x92\
-\x1f\x1e&\x90\x88#-\x8b\xf1\xc3\x17\x19=`\xe3\xbbeB\xf5\xf5\x047\xdd\x8dng\
-\x90\xf3i\xae\xb9\x1b\xa5 X\x15\xa1\xaaV\x92\x1f\xe9CHI8\xbe\x04=\x10\xc3Pi\
-\xfc\x05\xd5w\n%=Lc-\xfet\x17\xa3\x17\xc6\x98\xfa D\xb0:\xc9\xe2\xf5\xadT\
-\xd5,\x07\'\x8c\xe1\x9f \xff\xa1\xc6\xe2U-\x14\xbc\xc3\xc8\x92\x8f\xaeuP\x1e\
-=A\xbc\xa6\x8exU\x03y\x0eR9\xcd\xbd6\xe8!\xf6\xce\x19\x14,Ap\x1f\xba\x18GH\
-\x10"H\x80\xf7Q\xf4\x02 5\x9b`\xf5\x83\x04\xac!\xec\xf1#h\xac\xc6\x10\x1d\
-\xf4\xed\x7f\x89\xf2\xd8\x11\x16\xdf\xbe\x83\xba[\xb7\x83*\xe3\x16\x8b\x0c\
-\xec\xfeW\n\xbd{(\xa4W\x12i_\x04~\r\x03\xfb\xfe\x1bw\xe2\x03Z\xeez\x9cD\xc7\
-\x06d\xc0G\xd3\xe2xN\x11\xa5Ob\xea\x9d\x08w\x0b\xba\x18\xc3\xcd\x9e\xe7\xc2\
-\x7f>\x8b4%B\x934n~\x86\xe8\xb2e(/K\xe6l\x17\xce\xe8Q\x16\xdf\xf10u\xb7nG\
-\xe8>\xbe\r\x83o\xbf\xc4\xf4\xb9\x03\x18\xba\x860\xeb\xd1\xdd(\x03\xfb^\x99W\
-SY\xbb\x89]\xbf\x95X\xdb3\x9c\x7f\xf9Y\x84\xee\xd1\xfe\xc0\xd3\x08k\x12\xa9\
-\xd5\xd1\xb7\xff\'W\xae\xaf\xad\x1ee\xedB\x98[\xd0\xe5\x14\xa6\x1c\xa2e\xdb\
-\x9f\x11k_\x85/zQ\x81\xf7!\xb7\x8c\xfau&}o\xfe\x17\xa5\xe9\xaf\x12\x0c\x16Q^\
-\x92\xa9\x9e.t\x86H\xadx\x14B\xfd\x04\xc5[P\x99"\xd7\x04=0:\xcf\x0b\xa0\xae\
-\xe1\x05"h\xb6DJ\x01~\x04kR\x03w\xf6\x19e\xc5q\xfd0fI`za\x84\x8aA\xd9\xc7\
-\xee\xed#\x14l\xa4n\xc3ch\xe5]H\xef\x10\xd2|\x98\xba\xb5\x8f0\xd0}\x9aRO\x0f\
-\xb1\xa5O\xe0y\x02\xbb\xfb\x02\xa1@\x1d5k\x1eF\xba?B\x16\xf6\x83L\xa0\t\x1d\
-\x9c)(%\xf1L\xd0J\xa0\x17\xc1\n%\xd0\xad(\xd2\xd0\xb0\x82)4\xd7E\xc9V2\x9d\
-\xffB(PO\xdd\xfa\x1d\xe8\xceO\x11\xa5\xe3\xf8\xd6S\xd4\xac\xbc\x9f\xe2\xe9C\
-\xe8\x8e\x8eP\t\xf0\x02W\xd6\xcc\xcd\x80\x9e\xc1\xb3\xbe\x81\xa9"H%\xd0\xf4*\
-4\xfbU<\xe3\xa9\x05\xd5W\xd5\xb2\x03\xad\xb0\x0f\xcf\x8a\xa1\xd9\x1a\xa1\xf0\
-bb\xad[\xd0\x9d\xef\x80s\x1c\xb2\x1eJ/Q\xb5l\x1b\x01\xeb-&;\x0f\xd3\xb4\xe3O\
-\xf1\xfc<\xd9c/\x93hZ\x8d\x99\\\x8a\xcc\xef\x86,P9\x83\xb9&\xe8\xecY:w4V\x0b\
-\x1bG\x10\xc3A\x90\x80=\x02\x07kaZ\x81a\xa16l\xa0\xd4\xf7>\xeaL\x08\xab\xbd\
-\x159=\x81\'Rx\xe7\x04z\xac\x11\n\x01\xe4\xe1A(\x04\xd1\x1a\xd3X\rw\xa0\r7\
-\xc2X\x0cUH\xa0\x8aE\xdc\x0f\xc1H\xd4\xe3\xcf\x18\xe8G\'\xa0\xf0\xc9O\xc5\
-\xd5\x10\xab\x81ui\xc4p\x00\xcbi\xa7u\xc7_\xa0E#\xe0\xfb\xf8\xe3\x83\xc8\xe3\
-\xe7q\x9a\x17\xe1\x9c*a$\x1b\x11\xe5\x04\xe2\xe04\xe4\x82\xc8\x96\x01\x8c\
-\xfa[\xd0\x86\xea\x11^\x12\xbc\x04*\xa7\xae\xac\xf9\xbf\xba\xeb\x07\x91\xc3\
-\x01\x84\x14PJCW\x12\x7f\xa9\\P}\xe4\x13p\xbc\t6\xc4a86\xbbE\xf5S\xd0\x19\
-\x81L3\x00"PF\xde\x1a%\x12\xbf\x95\xec\xbe\xf7\xb1o)`\xa7\xd3\x94O\xb8\xd4\
-\xdfq\x1f\x0c\xe7\xe1`\x00\xfcy\xfa\xa8\xc2UE\x1f|\xfe\xa99\x83F\xab \xd11N\
-\xe1\xcc\x12$\x1a~~\x92\xe9\x03\xdb@*\xcc\xb5>z\xd6e\xf0\xdbC\x14\xce\xdeF\
-\xcd\x83\x8d\x14\x8f\xd9\x98\xab\xf2\xa8\xd2&\xb2\xe72x\xd9)\x9c\xd0\x13\xd8\
-\x1f\xb8\x84\x96Y\xcct\xf63\xbd\xb7\x83`C\x03\xfe\xd4\x14"\x04\x94o\'\xb3w\
-\x04\xe7\xb1\x11J\xea\xf7\xb0\xf7\xba\xe8M:\xc6u\x1a\xf6\xd12^\xbaHb\xf9\xe8\
-\xac\x07\xa1\x81(\x90\xf9G\x81\xdb/p\x07k\xd0\x1a\x1aH\xfem\t/\xb3\x9eBW\x8e\
-\xf2\xc40N\xe0Q\x8a\x07l\xc2\xcb\x02\xcc\xec\xefazo\x07\xa1\xebR\xf8\x854B\
-\xfaW\xd4,\xed\xb71\x96\xf8$n\x1c\'\x7f\xb2\x1d\x81\xc4\xcf\x8f\x91yc\x1dU\
-\xcf\x14\x16T\x9f;\x9eer\xe7\x97\x89\xdf4D\xa1\xabi\xf63o~\x98\x89\xefo\xa5\
-\xdc]\xbe\xd4\xc6\xa1\xbe\x00\xb1\xb5\x8f0\xf8\xc2\x0c\xa7\xffd\x17\xaa\xe8b\
-5l\xc5Z\xbc\x91\xcc\xb7\x87(\xfe\xe2\xf7?\x87aPa.\xf4\xd7\xd6l\x9c3X]?\xc3}\
-\xec\xe3b\xaa\x1a\xa7(\xa9\x1d\x1c\x84\x07,\xf2\x93\x90\x1dv\xe8\xfe\x96M&\
-\x97\xe2\x86?\xac\xc7X^\xe6\xed\x9d\xcd\xdc\x14\xeb\'\xfad;\xc7\xfe\xfe\x1c\
-\xc3\xcf\xed\xa3\xed\xeeE\xc8\xd5AJ\xa7\xf2\x9c}+C\xb1\xb5\x9d\xba\xcdq\xbaz\
-\x1d\x12\xa9,\xe1\xc7\xdb8\xfa\x0f>c\xdf\xed\xa4\xed\xaez\xd4\xd6(\xba\x05\
-\xba\xe1\x92\xfcZ\x84C\xbb[\xb9S\xee\xe6b*\tR\xa3\x9dA\xde\x8a\xdc\xcfD2\tI\
-\x90\x9a\xe2+}\x87\xd0\x1fl\xe5\xd8\xf7\xfa(|\xff\x10\x8d\xebk\xf17\x9a\x0c|\
-\xa4\x99kj#Yg\xd1\xea\xf6\x91\x9d2\xae\xa8\xf9nt5\x02\x9b\xfb\xc4\xeb\xf4\
-\xd4T\xa3\xa4A\xabH\xf3\x8b\xe4\x1a\xd6\xf4\xf6.\xac\xbe\x01\x97\xb3K\x97q\
-\xaf:L_2\x86\x90\x92\xebU?{nX\xcfD<|\xa9\x8dc3\x82\xed\xcd.\x93w\xaeg\xe4\
-\xd4\x10\x84t\xd6>\xb2\x99\xe9\\\x15\xaf9q\xec5\x95w\x8fk\x89~\xd6/\xcc\x19l\
-\xf4\xa7\xb1\xed^\xc6\x9d\x12\x13c:\xfd\xdfL\x83\xa6c;\x06Jh $KV\xb8t\xfcn\
-\x9e#\xc7\xdbx\xa7\'\xc4\xa8\x1e\xe6\xc9\x87FY\xbc\xcd\xe0\xd8\xcfr\x9cy\xe1\
-\x02Jj\xf8\xc2 \x9c\x90\xac\xb8Wb\xd6\x8c\xf0\xc6\xce\x154\xd6\xfa<\xb2}\x8c\
-\xba/i\x9c=\x90\xe7\xcc\x8b\xbd\x97r\xab\x9b$\xf7\xff\x95\xc1\xb8\x16\xc4.\
-\x9dg\xbc\x1c\xc6\x8aJ\x1c{\x94\x0b\xe5\x1c#\xfeG\x07k>\xb8\x9d\t\x1e\xdb\
-\x9e#\xbcJrt\xff8\x87\xde\xcb\xa0\xa4F\xb4\xd6`\xd1\r\x92\xa1\x92$\x18\xc9c\
-\x17/\xf0\xde\xb1U\xfc\xce\xe6\xf95\x87\xf4&\x1c\xc7\xa7T\xe8f\xd8\xae&\x18s\
-(\xdb\xe3\x9c+\xe5\x99>\xbe\xb0\xfa\xde\xdc\xb9\x02)\xa7qJ\xe7\x98t\nXU\x06e\
-\xfb<\x17\xca\xd73\xe2\x7f\xe2\xb0r\x0c\x9a\xce\xccP\xb7\xb9\x89S\xa7\x07\t%\
-L\x1a6F\xe8|\x7f\x92\xe3\xb9\xe0\xd5\xee\xff\nW@\x1f\x18\x98\xfb\xa00\x9f\
-\xcdS\xcaw\xd3~\x8b\xa0\xdc\x19\xc2v\x0c|\xa1\x13IHj\x9b\x1dZ\x96\xdb4//\xb1\
-\xbf\xb3\x8d\x97_k\xa2XJ\x93\x1eTH/\xc8\x03\xdb\x8eR\xddjp\xfeH\x90bN\xc3\
-\x8a\nn\xfer\x96p5\xbc\xf8\x1f\xf7r\xa2+\x8b\xa1k([\xe7\xa1\'\xba\xb8\xee6\
-\x8d\x13\xfb"L\x8d[\xc4\xea\x15\xab\xbe\x94\xa5\xa77\xc5\xa1\xa3\xcb\xf8\xca\
-\xdan\x96\xac\x8ePU\xeb\x93\x1e\xb08yz\x06\xdb)]\xf2\x99N+\xaa#\xb0\xed\xe9s\
-\\<\x11\xe0\xd4{!4S\xb0n[\x96\xe6\xeb\xf2\x1c\xdc\x9d$\x9a\xf4\xb8p\xbe\x8a\
-\x9dol$;y\x05\xcd#9bUY\x8a\x85\x1eZVN\xd2\xd0V\xa4\xfbB\x94\x0fN\xe6\x11\xb0\
-\xe0\xfajS\x19\xec\xc2Q\x9a\xd7\xe9\xc4\xea|\x06\xfa\xc79yj\x12\xdb\xc9^\xd6\
-\xce\x07\x0e\xb9<\xb4\xc5!\xef\x94hjO \xe48o\xed)10 \xafV\xbfWX b\xe3\xc67\
-\xe7\\\xc3\x85\x80\xed\x9b\xbb\xb8s]\x0f\xa9d\x11!gS\xb3Y\x93\xcc\x8c\xc5\
-\xe8d\x84\x9f\xffj\x19\x17.VSv\xe5e\xcf-o\x9ff\xd3\x8a!Z\x1agP\x9e\xc2G\xa3\
-\xab\'\xc1\xa1Su\xf4\xf4G.\xe5J\xa9Xy\xfd$\x9b\xd7\x0e\x92\x8a\x17(\x97%J\
-\xea|\xf0a5{:\x1b\xc9\xe5\r\xee\xb9s\x88\x8d\x1d\x93\x94}\x8d\xd7\xdfi\xe4\
-\xd8\x99\xaaOy\rX\x1e\xb7\xaf\x1f\xe5\x96\x95CH\xdfEj0\x92\x89p\xfeb\x15\x9b\
-V\x0c\x01\x82\xd7\xdfY\xca\xb13\xd5W\xd4\xcc\xe6\x0c\x84\x80{\xee\x1caC\xc7\
-\x04\xae//\xd3]h}\xb3\xff\xd1\xcb\xa6\x8e!\xca\xbe\xc6k\xef\xb4q\xec\xcc\xe5\
-\xf7\x0b\x0c\x1d\xfe\xe6\xeb9\xca\xfdC\xbc\xf9\x9d^\xbe\xf6O\x1d\xf4\x8cE\
-\xf9\xe6s\x11*W\xd9\xae=b\xd1\xa2\xef^\xb1\x1b\x84\x80P\xf0\xe34\xd7\x05\xdb\
-\xa9|v\xfc,\xd8\xb0\xa6\xcc\xf7\x9e\x9b\xe2\xf9\xbf\x1c\xc0\xf5\x04\x7f\xfe\
-\xcf\x8bx\xfa\xebq\xde=\xf0\xf9\\%\xa80?\xfa\xe0\xe0\xe0\xb5\xf6\xf0[\xcdM;&\
-\x98\x1a\xcap\xf2H\x9e\xc7\x9f\r\xd0u\xda\xe6\xcd]\x8b\x98\xc9V\xb6W_\x04*\
-\xbdp\x8d\t\x07m\xa2\xd1<\x0f\xfe1l\xbe\xc7\xe6\xa5WB\x95\xc9\xf1\x05B\xbf\
-\xd6\x06~\xdby\xe1\xdf\x1b\t\x9auT\xc7|\x9e{Q\xf2\xeaO\xae\xce\xed\xc8\n\xff\
-7\x04|\xa3\xf2*X\xa1\xc2\x1cT\xd6\xf2\n\x15\xe6\xa12A*T\x98\x87\xff\x01r\x9a\
-\x96s\xed>\x96&\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory047Bitmap():
- return wxBitmapFromImage(getDocFactory047Image())
-
-def getDocFactory047Image():
- stream = cStringIO.StringIO(getDocFactory047Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory047')
-catalog['DocFactory047'] = ImageClass()
-catalog['DocFactory047'].getData = getDocFactory047Data
-catalog['DocFactory047'].getImage = getDocFactory047Image
-catalog['DocFactory047'].getBitmap = getDocFactory047Bitmap
-
-
-#----------------------------------------------------------------------
-def getDocFactory048Data():
- return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\x19\x08\x06\
-\x00\x00\x00t:a\x14\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\rZ\
-IDATx\x9c\xed\x9bil]\xc7u\xc7\x7f3w{+\xdf\xc2\xc7U")\x91\x94m\xd9\x94d\xed\
-\xf2\xaaDv\xe2J^\xeaM\xf5\xd2\xdaE\xd1"(j\xa3\x85\xdb~\xc8\xc7\xa0\x08\n\x14\
-]\x8c\x06\x81\xed&\xa9Q\xb4p\x9d8Q\x12;\x8e\x11\xc9Nd\xc9V\x14j\xb3\xac\x95\
-\xb2$\x92\xe2\xf2\xb8\x93\x8f|\xeb\xbd\xef\xde;\xfd@W\xb6JY"P[R\x9b\xf7\xfbx\
-\xee\xdc\xfb?g\xce\x1c\xcc\xcc\x1d\x8c\xf8\xbbo)E\x85\n\x15.\x8a\x1e\xaa\xbe\
-\xda.T\xa8p\xed\xa2\x07+\x05R\xa1\xc2g\xa2\x87\x13\x17\x7f P\x18\xd8H\xbc\
-\x0b\xec.\x06.\xe6\x15p\xedc\x1f\x84\x8d\xf6?|P@Y\x05\xf0\xd0\xbe\x10]\x89\
-\x8f)J\xf8H\xca\xcaB!\xbe\x10\x9d\n\xd7>z(>\xd7(\xf0i(\xec"\xea\x9e\xc3\xff\
-\xd4\xd8\x94\x12\xa4\xa9\x93w\xe3\xe4\x82\xed\xcc\xe8\x8bp\t|!\x8e\t<\x9a\
-\xecw\xa8\xf2z.\xf0\x01@\xb7\x14\xb6VC\xb7\xb6\x852\xa1\xcfUW\xc3a\xb1\xfbs\
-\x02\xe5\x114C0&\x97\x91\x96\xb7~\xae\x1a\x15\xfe\xef\xa0\x87/R \x16\xa34\
-\xe9/p\xfa\xcdZ\xa6\x07#\x80\x00)\x91\xba"\\S$R_\xa4m\xf9$\x8e\xb5\x88\xbe\
-\xe0_\xe3P\xf7\xb9;\x16d\x98\xa6\xe2\xab\x9c\xfci\x9c\xe9t\x00\x84\x00!\x01\
-\x885\xda,{\xf8=\x8aF=\x13\xdc\xfe\xb9\xea\x86\x18\xa6\xc1\xfe1\xc7~\x9c"\
-\xb6\xb0D\xcb\x9aC\x14\x827R\xe6"\x1dU\xe1\xff=z\xe4"y\x0f)AB[\x85\xf0\x8bHM\
-\x11\x8c\x0b\x8c\x80@!(\xe5\x83\x8c\x9e\x94\xe4G\x9bY~\x9f\xc44~C\x7f\xf8\
-\x81\x0b\x96!\xc2\xf7\x10n\x19\xe1{(\xa9\xa1t\x03%/\xbe\x1c\x12\xae\x83t\xcb\
-\x00\x17\xb4\r)\x9d\xb0\xb8\x1e\xe5\x16\x90\x1a\xe7}\x00Aj\xb1I(\xd4\x81\x19\
-l""\xe7~\xc7\xd7M\x94\xa6#\x9d"\x08\x89oX\xb3\x05v\x19M\x81"\xee\x17\t\xe7\
-\x97")\x91M\xc7\xb8!jQ\x17\x1a\'#?\xe9\xa8y\xc5\xa7\xd4\'\xfaf`V\xd3+\xe3\
-\xeb\xd6\xacV\xd9\x9emf\x06\xe6\xbe\x03\xf8f\xf0\x02\x9f+\\\x1d\xf4*s`\x8e\
-\xd1R\x0e\x18\xeb0\xf4\xf7\x88\xa5\\n\xfe\x83\xdb\xd0BAP>\xe5\xbc\xcd\xc0\
-\xa1\x1eF\x8e\xa79\xb7?\xc5\r\xf7Dq\x8c3\x14D\x10\xa1<\xccL7f\xa6\x1b\xafPB\
-\xa0f\'\x9f@\x00;\xb5\x14\xa7\xaa\x19>.$\xe1\x97\xb1fz0&\xcf\xa2l\x07P\xb3\
-\x13\x84\x11\xa0X{3Z\xb8\x1a\x19\xb8\r\xcb\xda\x89\x96r\xb9\xf9\xa9\x8d\x18\
-\x91 \x00vY1iD\x90\x01I\xcc\xef\xc1\x9c:\x835\xd3\x8d\xb2]\x94R`\x06\xf1\x82\
-\xd5\x98\xc54J\x81\x13o\xa5\x94\xea\xb8\xacfX\xe8T{3\xe4\xa6\x96\x81\xdb\x89\
-\xd0\xa0TX\xc9"k\x94!\x03J\xd2\x98_|\xca\'\x90>\x80\x91K#\r\x89\x1bn@+\x8c\
-\xe1\xdbe\x84i\xe1\xe8\xb5\xc8\xec8B\n\xec\x85+\xf0\xa2\xb5\x00\x18\xe9\x13\
-\x18S\x03 \x14\xe5x3\xe5\xc6\xa5Wb\x0cT\xb8\x04z\x84\x93s\x8c\x86\xd0\x11f\
-\x15\xba\xcc\xa1\x07\x05F,E\xc6*\xe0\x01V(L\xdb]k\xf1r\xdb\xc9\rwS\xc8\\G\
-\xc2\x1aA7g\x88dO\xa3\x973\x0c\x9d\x98d\xfcH\x16\xcf\xf5\xd1\x83:\x8d\x1b\
-\x124\xc4\x86(\x16\x17P\x08.D*\x8fH\xee\x14*;M\xff{\xc3\xe4\x06m\x84\x06f\
-\xc4\xa0\xfa\xa6(\xb5\xa1\x11\xec\xd0z\x84\x91B\x97y\xf4 \x18\xd1\x14\x85@\t\
-\x17\x0f7\xe8\xe20JD\r\x11\xcduAi\x9a\xe1C\xe3d\xba\xf3\x004nH\x12o\x0e1zt\
-\x1a=\xacS\xb3*C\xcew\x08\xe5\xba?S\xb3.<\x81Y\xb5\x89\xe1}\xa7\x18\xdc\xb3\
-\x0f\xe5{()8\xb5\xed\x17,}\xec!\x12Z?8G\xe6\x15\x9f\xaeJ\xc4\x02\xc7\xe9\xfe\
-e\x9aP\xadE\xf2\xc6a&\xba\xb2\x8c\x1f\x9ba\xc9\xc3IB\xdeO\xe8\xfbu\x98x\xbbC\
-\xa2\xea]\xec\xc8V\xa4\x97%\xe0\xbeJ\xfap\x10\xb3\xca#\xde!p\xd4\x1f\xa1\x84\
-q\x85\x87D\x85O\xa3\x87\xd93\xc7\xa8\x91Dp7:\x93\x08!\x10*\x84\xc9\xaf\xf1\
-\x98Di\x12\xcf\xbb\x83\x05\xab;\xe8\xd9\xfeo\xd8cC\xc4R1\x12\xe5\x11D\xa1\
-\x81\xd3?\xdaOal\x94@<\x864M\x9c\xfc\x14\xc3\xbb\xd3\x14\xd3m\xb4|u9\x86y\
-\x02\xddI\xa2\xd9-t\xfd\xf4G\x14\xc7F1\xa3\x11\x8cp\x18\x84C\xbe\xc7\xa5q\
-\xe5&4\x7f\x00A\x0b:\x13xv\x11{b\x1a#ha\n\r-\x10\xa3\xa4\xef\x03/G\xc0m\xe3\
-\xd4\xeb\xaf\x91\x1f\x1e&\x90\x88#-\x8b\xf1\x03\xe7\x18\xddk\xe3\xbbeB\xf5\
-\xf5\x047\xdc\x8dng\x90\x97\xd2\\u7JA\xb0*BU\xad$?\xd2\x87\x90\x92p|\x11z \
-\x86\xa1\xd2\xf8\xf3\x8a\xef8Jz\x98\xc6j\xfc\xe9.F\xcf\x8e1\xf5a\x88`u\x92\
-\x85k[\xa9\xaaY\nN\x18\xc3?J\xfe#\x8d\x85+Z(x\x07\x90%\x1f]\xeb\xa0<z\x94xM\
-\x1d\xf1\xaa\x06\xf2\xec\xa3r\x8a{u\xd1C\xec\x9ac\x14,Bp?\xba\x18GH\x10"H\
-\x80\x0fP\xf4\x02 5\x9b`\xf5C\x04\xac!\xec\xf1\x83h\xac\xc4\x10\x1d\xf4\xedy\
-\x99\xf2\xd8A\x16\xde\xbe\x95\xba[\xb7\x80*\xe3\x16\x8b\x0c\xec\xf8W\n\xbd;)\
-\xa4\x97\x13i_\x00~\r\x03\xbb\x7f\x88;\xf1!-w=A\xa2c\x1d2\xe0\xa3iq<\xa7\x88\
-\xd2\'1\xf5N\x84\xbb\t]\x8c\xe1f\xcfp\xf6?\x9fC\x9a\x12\xa1I\x1a7>Kt\xc9\x12\
-\x94\x97%s\xaa\x0bg\xf4\x10\x0b\xefx\x84\xba[\xb7 t\x1f\xdf\x86\xc1w^f\xfa\
-\xf4^\x0c]C\x98\xf5\xe8n\x94\x81\xdd\xaf^RSY;\x88]\x7f\x0f\xb1\xb6g9\xf3\xca\
-s\x08\xdd\xa3\xfd\xc1g\x10\xd6$R\xab\xa3o\xcf\xcf.\x1f_[=\xca\xda\x8e07\xa1\
-\xcb)L9D\xcb\xe6?#\xd6\xbe\x02_\xf4\xa2\x02\x1f@n\t\xf5kL\xfa\xde\xfa\x01\
-\xa5\xe9\xaf\x12\x0c\x16Q^\x92\xa9\x9e.t\x86H-{\x0cB\xfd\x04\xc5\xdbP)\x91\
-\xab\x8a\x1e\x18\xbd\xc8FP\xd7\xf0\x02\x114["\xa5\x00?\x825\xa9\x81;\xdbVYq\
-\\?\x8cY\x12\x98^\x18\xa1bP\xf6\xb1{\xfb\x08\x05\x1b\xa9[\xf78Zy;\xd2\xdb\
-\x8f4\x1f\xa1n\xf5\xa3\x0ct\x9f\xa0\xd4\xd3Cl\xf1\x93x\x9e\xc0\xee>K(PG\xcd\
-\xaaG\x90\xeeO\x90\x85= \x13hB\x07g\nJI<\x13\xb4\x12\xe8E\xb0B\tt+\x8a44\xac\
-`\n\xcduQ\xb2\x95L\xe7\xbf\x10\n\xd4S\xb7v+\xba\xf3sD\xe9\x08\xbe\xf545\xcb\
-\x1f\xa0xb?\xba\xa3#T\x02\xbc\xc0\xe55s3\xa0g\xf0\xaco`\xaa\x08R\t4\xbd\n\
-\xcd~\r\xcfxz^\xf1U\xb5lE+\xec\xc6\xb3bh\xb6F(\xbc\x90X\xeb&t\xe7;\xe0\x1c\
-\x81\xac\x87\xd2KT-\xd9L\xc0z\x9b\xc9\xce\x034m\xfdS<?O\xf6\xf0+$\x9aVb&\x17\
-#\xf3; \x0bT\xce`\xae*:;\x17\xcf\xb5\xc6ja\xfd\x08b8\x08\x12\xb0G`_-L+0,\xd4\
-\xbau\x94\xfa>@\x9d\x0ca\xb5\xb7"\xa7\'\xf0D\n\xef\xb4@\x8f5B!\x80<0\x08\x85\
- Zc\x1a\xab\xe1\x0e\xb4\xe1F\x18\x8b\xa1\n\tT\xb1\x88\xfb\x11\x18\x89z\xfc\
-\x19\x03\xfd\xd0\x04\x14>\xfd\xab\xb8\x1ab5\xb0&\x8d\x18\x0e`9\xed\xb4n\xfd\
-\x0b\xb4h\x04|\x1f\x7f|\x10y\xe4\x0cN\xf3\x02\x9c\xe3%\x8cd#\xa2\x9c@\xec\
-\x9b\x86\\\x10\xd92\x80Q\x7f\x0b\xdaP=\xc2K\x82\x97@\xe5\xd4\xe55\xff[w\xed \
-r8\x80\x90\x02Ji\xe8J\xe2/\x96\xf3\x8a\x8f|\x02\x8e4\xc1\xba8\x0c\xc7f\x97\
-\xa8~\n:#\x90i\x06@\x04\xca\xc8[\xa3D\xe2\xb7\x92\xdd\xfd\x01\xf6-\x05\xect\
-\x9a\xf2Q\x97\xfa;\xee\x87\xe1<\xec\x0b\x80\x7f\x91\xdcT\xb8\xa2\xe8\x83/<=\
-\xc7h\xb4\n\x12\x1d\xe3\x14N.B\xa2\xe1\xe7\'\x99\xde\xbb\x19\xa4\xc2\\\xed\
-\xa3g]\x06\xbf=D\xe1\xd4m\xd4<\xd4H\xf1\xb0\x8d\xb9"\x8f*m {:\x83\x97\x9d\
-\xc2\t=\x89\xfd\xa1Kh\x89\xc5Lg?\xd3\xbb:\x0864\xe0OM!B@\xf9v2\xbbFp\x1e\x1f\
-\xa1\xa4~\x0f{\x97\x8b\xde\xa4c\\\xa7a\x1f*\xe3\xa5\x8b$\x96\x8e\xce\xfa 4\
-\x10\x052\xff(p\xfb\x05\xee`\rZC\x03\xc9\xbf-\xe1e\xd6R\xe8\xcaQ\x9e\x18\xc6\
-\t<Fq\xafMxI\x80\x99==L\xef\xea t]\n\xbf\x90FH\xff\xb2\x9a\xa5=6\xc6"\x9f\
-\xc4\x8d\xe3\xe4\x8f\xb5#\x90\xf8\xf912o\xae\xa1\xea\xd9\xc2\xbc\xe2s\xc7\
-\xb3Ln\xfb2\xf1\x9b\x86(t5\xcd\xfe\xe6\xcd\x0f3\xf1\xfd{(w\x97\xcf\xf7q\xa8/\
-@l\xf5\xa3\x0c\xbe8\xc3\x89?\xd9\x8e*\xbaX\r\xf7`-\\O\xe6\xdbC\x14\x7f\xf5\
-\xfbWp\x18T\xf8,\xf4\xd7W\xad\x9fc\xac\xae\x9f\xe1~vs.U\x8dS\x94\xd4\x0e\x0e\
-\xc2\x83\x16\xf9I\xc8\x0e;t\x7f\xcb&\x93Kq\xc3\x1f\xd6c,-\xf3\xce\xb6fn\x8a\
-\xf5\x13}\xaa\x9d\xc3\x7f\x7f\x9a\xe1\xe7w\xd3v\xf7\x02\xe4\xca \xa5\xe3yN\
-\xbd\x9d\xa1\xd8\xdaN\xdd\xc68]\xbd\x0e\x89T\x96\xf0\x13m\x1c\xfa\x07\x9f\
-\xb1\xefv\xd2vW=\xea\x9e(\xba\x05\xba\xe1\x92\xfcZ\x84\xfd;Z\xb9S\xee\xe0\\*\
-\tR\xa3\x9dA\xde\x8e<\xc0D2\tI\x90\x9a\xe2+}\xfb\xd1\x1fj\xe5\xf0\xf7\xfa(|\
-\x7f?\x8dkk\xf1\xd7\x9b\x0c|\xac\x99kj#Yg\xd1\xea\xf6\x91\x9d2.\xab\xf9^t%\
-\x02\x9b\xfb\xc5\x1b\xf4\xd4T\xa3\xa4A\xabH\xf3\xab\xe4*V\xf5\xf6\xce/\xbe\
-\x01\x97S\x8b\x97p\x9f:@_2\x86\x90\x92\xebU?;oX\xcbD<|\xbe\x8fc3\x82-\xcd.\
-\x93w\xaee\xe4\xf8\x10\x84tV?\xba\x91\xe9\\\x15\xaf;q\xecU\x95\xbd\xc7\xb5\
-\x80~\xca/\xcc16\xfa\xd3\xd8v/\xe3N\x89\x891\x9d\xfeo\xa6A\xd3\xb1\x1d\x03%4\
-\x10\x92E\xcb\\:~7\xcf\xc1#m\xbc\xdb\x13bT\x0f\xf3\xd4\xc3\xa3,\xdclp\xf8\
-\x179N\xbex\x16%5|a\x10NH\x96\xdd\'1kFxs\xdb2\x1ak}\x1e\xdd2F\xdd\x974N\xed\
-\xcds\xf2\xa5\xde\xf3m\xab\x9b$\x0f\xfc\x95\xc1\xb8\x16\xc4.\x9da\xbc\x1c\
-\xc6\x8aJ\x1c{\x94\xb3\xe5\x1c#\xfe\xc7\x07k>\xb8\x9d\t\x1e\xdf\x92#\xbcBrh\
-\xcf8\xfb\xdf\xcf\xa0\xa4F\xb4\xd6`\xc1\r\x92\xa1\x92$\x18\xc9c\x17\xcf\xf2\
-\xfe\xe1\x15\xfc\xce\xc6Kk\x0e\xe9M8\x8eO\xa9\xd0\xcd\xb0]M0\xe6P\xb6\xc79]\
-\xca3}d~\xf1\xbd\xb5m\x19RN\xe3\x94N3\xe9\x14\xb0\xaa\x0c\xca\xf6\x19\xce\
-\x96\xafg\xc4\xff\xd4a\xe5\x184\x9d\x9c\xa1nc\x13\xc7O\x0c\x12J\x984\xac\x8f\
-\xd0\xf9\xc1$Gr\xc1+\x95\xff\n\x97A\x1f\x18\x98{P\x98\xcf\xe6)\xe5\xbbi\xbfE\
-P\xee\x0ca;\x06\xbe\xd0\x89$$\xb5\xcd\x0e-Km\x9a\x97\x96\xd8\xd3\xd9\xc6+\
-\xaf7Q,\xa5I\x0f*\xa4\x17\xe4\xc1\xcd\x87\xa8n58s0H1\xa7aE\x057\x7f9K\xb8\
-\x1a^\xfa\x8f\xfb8\xda\x95\xc5\xd05\x94\xad\xf3\xf0\x93]\\w\x9b\xc6\xd1\xdd\
-\x11\xa6\xc6-b\xf5\x8a\x15_\xca\xd2\xd3\x9bb\xff\xa1%|eu7\x8bVF\xa8\xaa\xf5I\
-\x0fX\x1c;1\x83\xed\x94\xce\xfb\x99N+\xaa#\xb0\xf9\x99\xd3\x9c;\x1a\xe0\xf8\
-\xfb!4S\xb0fs\x96\xe6\xeb\xf2\xec\xdb\x91$\x9a\xf48{\xa6\x8amo\xae\';y\x19\
-\xcd\x839bUY\x8a\x85\x1eZ\x96O\xd2\xd0V\xa4\xfbl\x94\x0f\x8f\xe5\x110\xef\
-\xf8jS\x19\xec\xc2!\x9a\xd7\xe8\xc4\xea|\x06\xfa\xc79v|\x12\xdb\xc9^\xd0\xcf\
-{\xf7\xbb<\xbc\xc9!\xef\x94hjO \xe48o\xef,10 \xbf\xe8\xbcW\x98\'b\xfd\xfa\
-\xb7\xe6\xcc\xe5B\xc0\x96\x8d]\xdc\xb9\xa6\x87T\xb2\x88\x90\xb3M\xb2Y\x93\
-\xcc\x8c\xc5\xe8d\x84_\xfef\tg\xcfUSv\xe5\x05\xef-m\x9ff\xc3\xb2!Z\x1agP\x9e\
-\xc2G\xa3\xab\'\xc1\xfe\xe3u\xf4\xf4G\xce\xb7\x95R\xb1\xfc\xfaI6\xae\x1e$\
-\x15/P.K\x94\xd4\xf9\xf0\xa3jvv6\x92\xcb\x1b\xdc{\xe7\x10\xeb;&)\xfb\x1ao\
-\xbc\xdb\xc8\xe1\x93Us\x02\x08X\x1e\xb7\xaf\x1d\xe5\x96\xe5CH\xdfEj0\x92\x89\
-p\xe6\\\x15\x1b\x96\r\x01\x827\xde]\xcc\xe1\x93\xd5\x97\xd5\xcc\xe6\x0c\x84\
-\x80{\xef\x1ca]\xc7\x04\xae//\xd0\x9do|\xb3\xdf\xe8eC\xc7\x10e_\xe3\xf5w\xdb\
-8|\xf2\xc2{\x05\x86\x0e\x7f\xf3\xf5\x1c\xe5\xfe!\xde\xfaN/_\xfb\xa7\x0ez\xc6\
-\xa2|\xf3\xf9\x08\x95+l\xd7\x0eb\xc1\x82\xef~f:\x84\x80P\xf0\x93\xc7\xae\x0b\
-\xb6S\xf9\xed\xf8y\xb0nU\x99\xef=?\xc5\x0b\x7f9\x80\xeb\t\xfe\xfc\x9f\x17\
-\xf0\xcc\xd7\xe3\xbc\xb7\xf7\xca\\%\xa80?\xf4\xc1\xc1\xc1\xab\xed\xc3o%7m\
-\x9d`j(\xc3\xb1\x83y\x9ex.@\xd7\t\x9b\xb7\xb6/`&[Y^]KT\xb2q\x95\x08\x07m\xa2\
-\xd1<\x0f\xfd1l\xbc\xd7\xe6\xe5WC\x95\xe2\xb8\x06\xd1\xaf\xb6\x03\xbf\xad\
-\xbc\xf8\xef\x8d\x04\xcd:\xaac>\xcf\xbf$y\xedg_\xcc\xed\xc8\n\xff;\x04|\xa3\
-\xb2%\xacP\xe13\xa8\xcc\xe9\x15*\\\x82J\x81T\xa8p\t\xfe\x0bW.\x96s\xf9\x9f\
-\x89\xa7\x00\x00\x00\x00IEND\xaeB`\x82'
-
-def getDocFactory048Bitmap():
- return wxBitmapFromImage(getDocFactory048Image())
-
-def getDocFactory048Image():
- stream = cStringIO.StringIO(getDocFactory048Data())
- return wxImageFromStream(stream)
-
-index.append('DocFactory048')
-catalog['DocFactory048'] = ImageClass()
-catalog['DocFactory048'].getData = getDocFactory048Data
-catalog['DocFactory048'].getImage = getDocFactory048Image
-catalog['DocFactory048'].getBitmap = getDocFactory048Bitmap
-
-
diff --git a/sandbox/gschwant/docfactory/setup.py b/sandbox/gschwant/docfactory/setup.py
deleted file mode 100755
index a79869899..000000000
--- a/sandbox/gschwant/docfactory/setup.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-
-from distutils.core import setup
-
-LONG_DESCRIPTION = """\
-DocFactory is a wxPython-GUI for Docutils. It is distributed as
-a subpackage of Docutils (docutils.factory). The main front-end
-(docfactory.py) is installed as a "script". After installation
-you should find it in the scripts-directory of your Python
-environment.
-
-System requirements:
-
-* Python 2.1.1 or later (http://www.python.org).
-* wxPython 2.3.4.2 or later (http://wxpython.org). Be sure to get the
- build matching the version of Python you're using.
-* Docutils 0.2.2 or later (http://docutils.sourceforge.net). Use the
- CVS snapshot.
-"""
-
-def do_setup():
- dist = setup(
- name = 'DocFactory',
- description = 'wxPython-GUI for Docutils',
- long_description = LONG_DESCRIPTION,
- url = ('http://docutils.sourceforge.net/sandbox/gschwant/'
- 'docfactory/'),
- version = '0.2',
- author = 'Dr. Gunnar Schwant',
- author_email = 'g.schwant@gmx.de',
- license = 'BSD (see LICENSE.txt)',
- packages = ['docutils.factory'],
- package_dir = {'docutils.factory': 'factory'},
- scripts = ['docfactory.py'])
- return dist
-
-
-if __name__ == '__main__' :
- do_setup()
diff --git a/sandbox/gschwant/htmlnav/README.txt b/sandbox/gschwant/htmlnav/README.txt
deleted file mode 100644
index 370a8991f..000000000
--- a/sandbox/gschwant/htmlnav/README.txt
+++ /dev/null
@@ -1,183 +0,0 @@
-==================
- README: htmlnav_
-==================
-
-----------------------------------------------------------
-An HTML writer for docutils which supports navigation-bars
-----------------------------------------------------------
-
-:Author: Gunnar Schwant
-:Contact: g.schwant@gmx.de
-:Date: $Date$
-
-.. contents::
-
-Introduction
-============
-
-This is the writer which I use to build my homepage: http://schwant.gmxhome.de.
-[#]_ The name **htmlnav** is a short term for *HTML with navigation-bars*.
-
-System Requirements
-===================
-
-Docutils and everything needed to use docutils has to be
-installed.
-
-Installation
-============
-
-Perform the usual ``setup.py install`` procedure.
-
-Usage
-=====
-
-Most parts of the writer are inherited from David Goodger's ``html4css1``.
-In fact, if no ``.nav``-files do exist in the destination directory, it
-produces the same output as David's writer.
-
-Short example
--------------
-
-1. Go to docutils' "``tools``"-directory and create a file called
- "``left.nav``" with the following contents::
-
- colors | #000000 | #8E8E8E
- section | Home
- link | Python | http://www.python.org
- link | Docutils | http://docutils.sf.net
- raw | <br>
- raw | &copy; 2003 MyCompany
-
-2. Process "``test.txt``" to HTML using "``rst2htmlnav.py``"::
-
- rst2htmlnav.py test.txt test.html
-
- Open "``test.html``" in your browser. You will notice the left
- navigation-bar.
-
-3. Create a file called "``right.nav``" in docutils' "``tools``"-directory.
- This time the contents are::
-
- colors | #000000 | #8E8E8E
- section | Contact
- link | me@MyCompany.org | mailto:me@mycompany.org
-
-4. Now perform step 2 again and open "``test.html``" in your browser.
- You will notice that there is a right navigation-bar now.
-
-5. Create a file called "``top.nav``" in docutils' "``tools``"-directory
- with the following contents::
-
- color | #C8DBEB
- cornerpic | ../docs/rst/images/ball1.gif
- link | Home | test.html
- link | Python | http://www.python.org
- link | Docutils | http://docutils.sf.net
- link | Search | http://www.google.com
-
-6. Once again perform step 2 and open "``test.html``" in your browser.
- Now a top navigation-bar is there, too.
-
-.nav-files
-----------
-
-In order to get navigation-bars in the output-page you have to create
-``.nav``-files in the destination directory. There are 4 types of
-``.nav``-files:
-
-[file].nav
- This defines the left navigation-bar of the output-file ``[file].html``.
- (``[file]`` is the name of the output-file without extension.)
-
-left.nav
- This defines the left navigation-bar of all output-files for which
- no ``[file].nav``-file is present.
-
-right.nav
- This defines the right navigation-bar of all output-files.
-
-top.nav
- This defines the top navigation-bar of all output-files.
-
-.. important:: At least one of the files ``[file].nav`` and ``left.nav``
- has to be present. Otherwise no navigation-bars will be
- added to the output file.
-
-.nav-file-entries
------------------
-
-``.nav``-files contain a one-liner for each navigation-bar-entry.
-In general such a one-liner is of the form
-
-::
-
- parameter | value 1 | value 2
-
-These are the different types of parameters:
-
-color
-~~~~~
-
-:Used in: ``top.nav``
-:Value 1: Background-color of all navigation-bars.
-:Value 2: Not used.
-:Example: ``color | #8E8E8E`` sets the navigation-bars' background-color
- to ``#8E8E8E``. (The default color is white.)
-
-colors
-~~~~~~
-
-:Used in: ``[file].nav``, ``left.nav``, ``right.nav``
-:Value 1: Background-color of section entries.
-:Value 2: Background-color of any other (non-section) entry.
-:Example: ``colors | #000000 | #8E8E8E`` sets the background-color to be
- ``#000000`` (black) for sections to be ``#8E8E8E`` (gray) for
- any other entry.
-
-cornerpic
-~~~~~~~~~
-
-:Used in: ``top.nav``
-:Value 1: Path to the graphics file which will be displayed in the upper
- left corner of the top navigation-bar. (The *width* of a
- corner-picture should be 150 pixel.)
-:Value 2: Not used.
-:Example: ``cornerpic | pics/home.png`` sets the path of the corner-picture
- to ``pics/home.png``.
-
-raw
-~~~
-
-:Used in: ``[file].nav``, ``left.nav``, ``right.nav``
-:Value 1: Any kind of text.
-:Value 2: Not used.
-:Example: ``raw | <br>`` will create an empty cell (a spacer) in
- the navigation-bar.
-
-section
-~~~~~~~
-
-:Used in: ``[file].nav``, ``left.nav``, ``right.nav``
-:Value 1: Title of the section.
-:Value 2: Not used.
-:Example: ``section | Home`` will create a section with title *Home* in
- the navigation-bar.
-
-link
-~~~~
-
-:Used in: ``[file].nav``, ``left.nav``, ``right.nav``, ``top.nav``
-:Value 1: Text to be displayed.
-:Value 2: URL
-:Example: ``link | Docutils | http://docutils.sf.net`` creates a link to
- Docutils' homepage in the navigation-bar.
-
-Footnotes
-=========
-
-.. [#] Sorry, my homepage is in german language. However, even if you
- don't understand what the text says, you'll get an impression of the
- writers output.
-
-.. _htmlnav: writer/htmlnav.py \ No newline at end of file
diff --git a/sandbox/gschwant/htmlnav/rst2htmlnav.py b/sandbox/gschwant/htmlnav/rst2htmlnav.py
deleted file mode 100644
index 7d68bfce8..000000000
--- a/sandbox/gschwant/htmlnav/rst2htmlnav.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Gunnar Schwant
-# Contact: g.schwant@gmx.de
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-description = (default_description)
-
-publish_cmdline(writer_name='htmlnav', description=description)
diff --git a/sandbox/gschwant/htmlnav/setup.py b/sandbox/gschwant/htmlnav/setup.py
deleted file mode 100644
index 22a200ce7..000000000
--- a/sandbox/gschwant/htmlnav/setup.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python
-
-from distutils.core import setup
-
-def do_setup():
- dist = setup(
- name='html-with-navigation-bars-writer',
- description='A HTML writer for Docutils which supports navigation bars',
- url='http://docutils.sourceforg.net/sandbox/gschwant/htmlwnav/',
- version='0.1',
- author='Gunnar Schwant',
- author_email='g.schwant@gmx.de',
- license='Public Domain',
- packages=['docutils.writers'],
- package_dir={'docutils.writers':'writer'},
- scripts=['rst2htmlnav.py']
- )
- return dist
-
-if __name__ == '__main__':
- do_setup()
diff --git a/sandbox/gschwant/htmlnav/writer/htmlnav.py b/sandbox/gschwant/htmlnav/writer/htmlnav.py
deleted file mode 100644
index 40b17b778..000000000
--- a/sandbox/gschwant/htmlnav/writer/htmlnav.py
+++ /dev/null
@@ -1,193 +0,0 @@
-# Author: Gunnar Schwant
-# Contact: g.schwant@gmx.de
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-from docutils import writers, nodes, languages
-import docutils, html4css1, os
-
-class Writer(html4css1.Writer):
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = HTMLTranslator
-
-class HTMLTranslator(html4css1.HTMLTranslator):
-
- def __init__(self, document):
- html4css1.HTMLTranslator.__init__(self, document)
- self.navigation_bgcolor = '#FFFFFF'
- self.body_prefix = [self.get_body_prefix()]
- self.body_suffix = [self.get_body_suffix()]
-
- def get_body_prefix(self):
- navtop = os.path.join(os.path.split(self.settings._destination)[0],
- 'top.nav')
- navright = os.path.join(os.path.split(self.settings._destination)[0],
- 'right.nav')
- if os.path.exists(navright):
- colspan = 3
- width = '70%'
- else:
- colspan = 2
- width = '85%'
- navleft = '%s%s' % (os.path.splitext(self.settings._destination)[0],
- '.nav')
- bgcolor = color1 = color2 = self.navigation_bgcolor
- cornerpic = None
- if not os.path.exists(navleft):
- navleft = os.path.join(os.path.split(self.settings._destination)[0],
- 'left.nav')
- if os.path.exists(navleft):
- if os.path.exists(navtop):
- f = open(navtop, 'rt')
- lines = f.readlines()
- f.close()
- for line in lines:
- val = line.split('|')
- for i in range(len(val)):
- val[i] = val[i].strip()
- if val[0] == 'color':
- bgcolor = color1 = color2 = val[1]
- self.navigation_bgcolor = bgcolor
- if val[0] == 'cornerpic':
- cornerpic = val[1]
- body_prefix = '<style type="text/css"><!--\n' \
- 'a.navigation, a.navigation-top { ' \
- 'text-decoration: none ; color: #000000 }\n' \
- 'a.navigation-top { font-weight: bold }\n' \
- 'a.navigation:hover, a.navigation-top:hover { ' \
- 'text-decoration: underline }\n' \
- 'table.navigation { font-size: 10pt ; ' \
- 'border-collapse: collapse ; border-width: 0pt ' \
- '; border-color: #FFFFFF }\n' \
- 'td.navigation { font-size: 8pt ; padding-left: ' \
- '0em ; padding-right: 0em }\n' \
- '--></style>\n</head>\n<body>\n<table width="100%" ' \
- 'class="navigation" border="0" cellspacing="0" ' \
- 'cellpadding="0">'
- if os.path.exists(navtop):
- body_prefix = body_prefix + '\n<tr><td width="15%" '
- body_prefix = '%s class="navigation" bgcolor="%s">' \
- % (body_prefix, bgcolor)
- if cornerpic != None:
- body_prefix = '%s\n<center><img src="%s"></center>' \
- % (body_prefix, cornerpic)
- body_prefix = '%s\n</td><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;&nbsp;</td>' \
- '<td bgcolor="%s" colspan="%d" ' \
- 'class="navigation">' % (body_prefix,
- bgcolor, bgcolor,
- colspan)
- body_prefix = body_prefix + '\n<table class="navigation" ' \
- 'width="100%" border="0" cellspacing="0" ' \
- 'cellpadding="0">'
- body_prefix = '%s\n<tr align="left">' % body_prefix
- for line in lines:
- val = line.split('|')
- for i in range(len(val)):
- val[i] = val[i].strip()
- if val[0] == 'link':
- body_prefix = '%s\n<td class="navigation"><ul><li>' \
- '<a href="%s" class="navigation-top">' \
- '%s</a></li></ul></td>' \
- % (body_prefix, val[2], val[1])
- elif val[0] == 'raw':
- body_prefix = '%s\n<td class="navigation">%s</td>' \
- % (body_prefix, val[1])
- body_prefix = '%s\n</tr></table></td></tr>' % body_prefix
- f = open(navleft, 'rt')
- lines = f.readlines()
- f.close()
- body_prefix = '%s\n<tr><td class="navigation" bgcolor="%s" ' \
- % (body_prefix, bgcolor)
- body_prefix = body_prefix + ' width="15%" valign="top">'
- body_prefix = body_prefix + '\n<table class="navigation" ' \
- 'width="100%" border="0" cellspacing="0" ' \
- 'cellpadding="3">'
- for line in lines:
- val = line.split('|')
- for i in range(len(val)):
- val[i] = val[i].strip()
- if val[0] == 'colors':
- (color1, color2) = (val[1], val[2])
- elif val[0] == 'link':
- body_prefix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;<a href="%s" ' \
- 'class="navigation">%s</a></td></tr>' \
- % (body_prefix, color2, val[2], val[1])
- elif val[0] == 'section':
- body_prefix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;<b>' \
- % (body_prefix, color1)
- if color1 != bgcolor:
- body_prefix = '%s<font color="#FFFFFF">%s</font>' \
- '</b></td></tr>' \
- % (body_prefix, val[1])
- else:
- body_prefix = '%s%s</b></td></tr>' \
- % (body_prefix, val[1])
- elif val[0] == 'raw':
- body_prefix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;%s</td></tr>' \
- % (body_prefix, color2, val[1])
- body_prefix = '%s\n</table>\n</td>\n<td ' \
- 'width="15">&nbsp;&nbsp;</td>\n<td width="%s">' \
- % (body_prefix, width)
- else:
- body_prefix = '</head>\n<body>\n'
- return body_prefix
-
- def get_body_suffix(self):
- bgcolor = color1 = color2 = self.navigation_bgcolor
- navleft = '%s%s' % (os.path.splitext(self.settings._destination)[0],
- '.nav')
- if not os.path.exists(navleft):
- navleft = os.path.join(os.path.split(self.settings._destination)[0],
- 'left.nav')
- navright = os.path.join(os.path.split(self.settings._destination)[0],
- 'right.nav')
- if os.path.exists(navleft) and os.path.exists(navright):
- f = open(navright, 'rt')
- lines = f.readlines()
- f.close()
- body_suffix = '</td><td width="15">&nbsp;&nbsp;</td>\n<td ' \
- 'class="navigation" width="15%" valign="top" '
- body_suffix = '%s bgcolor="%s">' % (body_suffix, bgcolor)
- body_suffix = body_suffix + '\n<table class="navigation" ' \
- 'width="100%" border="0" cellspacing="0" ' \
- 'cellpadding="3">'
- for line in lines:
- val = line.split('|')
- for i in range(len(val)):
- val[i] = val[i].strip()
- if val[0] == 'link':
- body_suffix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;<a href="%s" ' \
- 'class="navigation">%s</a></td></tr>' \
- % (body_suffix, color2, val[2], val[1])
- elif val[0] == 'colors':
- (color1, color2) = (val[1], val[2])
- elif val[0] == 'section':
- body_suffix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;<b>' \
- % (body_suffix, color1)
- if color1 != bgcolor:
- body_suffix = '%s<font color="#FFFFFF">%s</font>' \
- '</b></td></tr>' \
- % (body_suffix, val[1])
- else:
- body_suffix = '%s%s</b></td></tr>' % (body_suffix,
- val[1])
- elif val[0] == 'raw':
- body_suffix = '%s\n<tr><td bgcolor="%s" ' \
- 'class="navigation">&nbsp;%s</td></tr>' \
- % (body_suffix, color2, val[1])
- body_suffix = '%s\n</table>\n</td></tr></table>\n</head>\n' \
- '</body>\n' % body_suffix
- elif os.path.exists(navleft):
- body_suffix = '</td></tr></table>\n</head>\n</body>\n'
- else:
- body_suffix = '</head>\n</body>\n'
- return body_suffix
diff --git a/sandbox/holdenweb/asyncore.rst b/sandbox/holdenweb/asyncore.rst
deleted file mode 100644
index 42854763c..000000000
--- a/sandbox/holdenweb/asyncore.rst
+++ /dev/null
@@ -1,275 +0,0 @@
-==========
- asyncore
-==========
-
------------------------------
- Asynchronous socket handler
------------------------------
-
-Synopsis: A base class for developing asynchronous socket
- handling services.
-Type: module builtin
-Module-Author: Sam Rushing <rushing@nightmare.com>
-Author: Christopher Petrilli <petrilli@amber.org>
-Author: Steve Holden <sholden@holdenweb.com>
-
-.. Type: ... builtin, standard, various others: any specific usages required?
-..
-.. Heavily adapted from original documentation by Sam Rushing.
-..
-.. ............................................
-.. This is the (first) RFC822-reader strawman
-.. ............................................
-.. Presumes a custom reader appropriate to docpy
-.. RFC822 continuation IS allowed (see Synopsis)
-.. Needtocheck: RFC822-readers and multiple entities? (Author lines)
-.. Dunno about implication of \section in the original
-.. Dunno about comments (#?); "Credit: Sam Rushing?"
-.. Note in passing: names of new roles and directives made similar to
-.. the existing docpy macros on purpose (for existing corpus & community)
-..
-.. Markups needed, used, and existing in rst:
-.. *emphasis*
-..
-.. Markups needed, used, and modified by this strawman:
-.. ``code``
-..
-.. Roles needed below by this strawman:
-.. :cfunction:``
-.. :module:``
-.. :refmodule:``
-.. :class:``
-.. :function:``
-.. :var:``
-.. :label:``
-..
-.. Directives needed below by this strawman:
-.. .. funcdesc::
-.. need to parse for optional argumnents shown as [...]
-.. .. classdesc::
-.. .. datadesc::
-..
-.. TBS - formals, e.g., funcdesc - several alternatives proposed
-.. below (see funcdesc) in this draft
-.. the one shown first seems on track for consensus 04.3.20
-.. (the directive will parse brackets, etc. - easier to use!)
-
-This module provides the basic infrastructure for writing asynchronous
-socket service clients and servers.
-
-There are only two ways to have a program on a single processor do
-"more than one thing at a time." Multi-threaded programming is the
-simplest and most popular way to do it, but there is another very
-different technique, that lets you have nearly all the advantages of
-multi-threading, without actually using multiple threads. It's really
-only practical if your program is largely I/O bound. If your program
-is processor bound, then pre-emptive scheduled threads are probably what
-you really need. Network servers are rarely processor bound, however.
-
-If your operating system supports the :cfunction:`select()` system call
-in its I/O library (and nearly all do), then you can use it to juggle
-multiple communication channels at once; doing other work while your
-I/O is taking place in the "background." Although this strategy can
-seem strange and complex, especially at first, it is in many ways
-easier to understand and control than multi-threaded programming.
-The :module:`asyncore` module solves many of the difficult problems for
-you, making the task of building sophisticated high-performance
-network servers and clients a snap. For "conversational" applications
-and protocols the companion :refmodule:`asynchat` module is invaluable.
-
-The basic idea behind both modules is to create one or more network
-*channels*, instances of class :class:`asyncore.dispatcher` and
-:class:`asynchat.async_chat`. Creating the channels adds them to a global
-map, used by the :function:`loop()` function if you do not provide it
-with your own :var:`map`.
-
-Once the initial channel(s) is(are) created, calling the :function:`loop()`
-function activates channel service, which continues until the last
-channel (including any that have been added to the map during asynchronous
-service) is closed.
-
-.. funcdesc:: loop([timeout [, use_poll [, map]]])
-
- Enter a polling loop that only terminates after all open channels
- have been closed. All arguments are optional. The :var:`timeout`
- argument sets the timeout parameter for the appropriate
- :function:`select()` or :function:`poll()` call, measured in seconds;
- the default is 30 seconds. The :var:`use_poll` parameter, if true,
- indicates that :function:`poll()` should be used in preference to
- :function:`select()` (the default is ``False``). The :var:`map` parameter
- is a dictionary whose items are the channels to watch. As channels
- are closed they are deleted from their map. If :var:`map` is
- omitted, a global map is used (this map is updated by the default
- class :method:`__init__()`
- -- make sure you extend, rather than override, :method:`__init__()`
- if you want to retain this behavior).
-
- Channels (instances of :class:`asyncore.dispatcher`, :class:`asynchat.async_chat`
- and subclasses thereof) can freely be mixed in the map.
-
-.. classdesc:: dispatcher()
-
- The :class:`dispatcher` class is a thin wrapper around a low-level socket object.
- To make it more useful, it has a few methods for event-handling which are called
- from the asynchronous loop.
- Otherwise, it can be treated as a normal non-blocking socket object.
-
- Two class attributes can be modified, to improve performance,
- or possibly even to conserve memory.
-
- .. datadesc:: ac_in_buffer_size
- The asynchronous input buffer size (default ``4096``).
-
- .. datadesc:: ac_out_buffer_size
- The asynchronous output buffer size (default ``4096``).
-
- The firing of low-level events at certain times or in certain connection
- states tells the asynchronous loop that certain higher-level events have
- taken place. For example, if we have asked for a socket to connect to
- another host, we know that the connection has been made when the socket
- becomes writable for the first time (at this point you know that you may
- write to it with the expectation of success). The implied higher-level
- events are:
-
- =================== ===============================================
- ``Event`` Description
- ------------------- -----------------------------------------------
- ``handle_connect()`` Implied by the first write event
- ``handle_close()`` Implied by a read event with no data available
- ``handle_accept()`` Implied by a read event on a listening socket
- =================== ===============================================
-
-
- During asynchronous processing, each mapped channel's :method:`readable()`
- and :method:`writable()` methods are used to determine whether the channel's
- socket should be added to the list of channels :cfunction:`select()`\ ed or
- :cfunction:`poll()`\ ed for read and write events.
-
-Thus, the set of channel events is larger than the basic socket events.
-The full set of methods that can be overridden in your subclass follows:
-
-.. methoddesc:: handle_read()
- Called when the asynchronous loop detects that a :method:`read()`
- call on the channel's socket will succeed.
-
-.. methoddesc:: handle_write()
- Called when the asynchronous loop detects that a writable socket
- can be written.
- Often this method will implement the necessary buffering for
- performance. For example::
-
-
- def handle_write(self):
- sent = self.send(self.buffer)
- self.buffer = self.buffer[sent:]
-
-.. methoddesc:: handle_expt()
- Called when there is out of band (OOB) data for a socket
- connection. This will almost never happen, as OOB is
- tenuously supported and rarely used.
-
-.. methoddesc:: handle_connect()
- Called when the active opener's socket actually makes a connection.
- Might send a ``welcome'' banner, or initiate a protocol
- negotiation with the remote endpoint, for example.
-
-.. methoddesc:: handle_close()
- Called when the socket is closed.
-
-.. methoddesc:: handle_error()
- Called when an exception is raised and not otherwise handled. The default
- version prints a condensed traceback.
-
-.. methoddesc:: handle_accept()
- Called on listening channels (passive openers) when a
- connection can be established with a new remote endpoint that
- has issued a :method:`connect() call for the local endpoint.
-
-.. methoddesc:: readable()
- Called each time around the asynchronous loop to determine whether a
- channel's socket should be added to the list on which read events can
- occur. The default method simply returns ``True``,
- indicating that by default, all channels will be interested in
- read events.
-
-.. methoddesc:: writable()
- Called each time around the asynchronous loop to determine whether a
- channel's socket should be added to the list on which write events can
- occur. The default method simply returns ``True``,
- indicating that by default, all channels will be interested in
- write events.
-
-In addition, each channel delegates or extends many of the socket methods.
-Most of these are nearly identical to their socket partners.
-
-.. methoddesc:: create_socket(family, type)
- This is identical to the creation of a normal socket, and
- will use the same options for creation. Refer to the
- :refmodule:`socket` documentation for information on creating
- sockets.
-
-.. methoddesc:: connect(address)
- As with the normal socket object, :var:`address` is a
- tuple with the first element the host to connect to, and the
- second the port number.
-
-.. methoddesc:: send(data)
- Send :var:`data` to the remote end-point of the socket.
-
-.. methoddesc:: recv(buffer_size)
- Read at most :var:`buffer_size` bytes from the socket's remote end-point.
- An empty string implies that the channel has been closed from the other
- end.
-
-.. methoddesc:: listen(backlog)
- Listen for connections made to the socket. The :var:`backlog`
- argument specifies the maximum number of queued connections
- and should be at least 1; the maximum value is
- system-dependent (usually 5).
-
-.. methoddesc:: bind(address)
- Bind the socket to :var:`address`. The socket must not already
- be bound. (The format of :var:`address` depends on the address
- family --- see above.)
-
-.. methoddesc:: accept()
- Accept a connection. The socket must be bound to an address
- and listening for connections. The return value is a pair
- ``(conn , address)`` where :var:`conn` is a
- *new* socket object usable to send and receive data on
- the connection, and :var:`address` is the address bound to the
- socket on the other end of the connection.
-
-.. methoddesc:: close()
- Close the socket. All future operations on the socket object
- will fail. The remote end-point will receive no more data (after
- queued data is flushed). Sockets are automatically closed
- when they are garbage-collected.
-
-
- asyncore Example basic HTTP client :label:`asyncore-example`
- ------------------------------------------------------------
- As a basic example, below is a very basic HTTP client that uses the
- :class:`dispatcher` class to implement its socket handling::
-
- class http_client(asyncore.dispatcher):
- def __init__(self, host,path):
- asyncore.dispatcher.__init__(self)
- self.path = path
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.connect( (host, 80) )
- self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % self.path
-
- def handle_connect(self):
- pass
-
- def handle_read(self):
- data = self.recv(8192)
- print data
-
- def writable(self):
- return (len(self.buffer) > 0)
-
- def handle_write(self):
- sent = self.send(self.buffer)
- self.buffer = self.buffer[sent:]
diff --git a/sandbox/ianb/extractor/default.css b/sandbox/ianb/extractor/default.css
deleted file mode 100644
index 05e43aab5..000000000
--- a/sandbox/ianb/extractor/default.css
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:date: $Date$
-:version: $Revision$
-:copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-*/
-
-.topic {
- margin-left: 5em;
-}
-
-.topic-title {
- margin-left: -1em;
-}
-
-body {
- background-color: #eeeeee;
- font-family: Arial, sans-serif;
-}
-
-em {
- font-family: Times New Roman, Times, serif;
-}
-
-li {
- list-style-type: circle;
-}
-
-a.target {
- color: blue }
-
-a.toc-backref {
- text-decoration: none ;
- color: black }
-
-a:hover {
- background-color: #cccccc;
-}
-
-cite {
- font-style: normal;
- font-family: monospace;
- font-weight: bold;
-}
-
-dd {
- margin-bottom: 0.5em }
-
-div.abstract {
- margin: 2em 5em }
-
-div.abstract p.topic-title {
- font-weight: bold ;
- text-align: center }
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning {
- // margin: 2em ;
- background-color: #cccccc;
- align: center;
- //width: 60%;
- // border: medium outset ;
- padding: 3px;
- }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: red ;
- font-weight: bold ;
- font-family: sans-serif;
- text-align: center }
-
-div.hint p.admonition-title, div.important p.admonition-title,
-div.note p.admonition-title, div.tip p.admonition-title {
- font-weight: bold ;
- font-family: sans-serif;
- text-align: center }
-
-div.dedication {
- margin: 2em 5em ;
- text-align: center ;
- font-style: italic }
-
-div.dedication p.topic-title {
- font-weight: bold ;
- font-style: normal }
-
-div.figure {
- margin-left: 2em }
-
-div.footer, div.header {
- font-size: smaller }
-
-div.system-messages {
- margin: 5em }
-
-div.system-messages h1 {
- color: red }
-
-div.system-message {
- border: medium outset ;
- padding: 1em }
-
-div.system-message p.system-message-title {
- color: red ;
- font-weight: bold }
-
-div.topic {
- margin: 2em }
-
-h1, h2, h3, h4, h5, h6 {
- font-family: Helvetica, Arial, sans-serif;
- border: thin solid black;
- background-color: #cccccc;
- -moz-border-radius: 8px;
- padding: 4px;
- }
-
-h1.title {
- text-align: center;
- background-color: #444499;
- color: #eeeeee;
- border: medium solid black;
- -moz-border-radius: 20px;
- }
-
-h2.subtitle {
- text-align: center }
-
-hr {
- width: 75% }
-
-ol.simple, ul.simple {
- margin-bottom: 1em }
-
-ol.arabic {
- list-style: decimal }
-
-ol.loweralpha {
- list-style: lower-alpha }
-
-ol.upperalpha {
- list-style: upper-alpha }
-
-ol.lowerroman {
- list-style: lower-roman }
-
-ol.upperroman {
- list-style: upper-roman }
-
-p.caption {
- font-style: italic }
-
-p.credits {
- font-style: italic ;
- font-size: smaller }
-
-p.first {
- margin-top: 0 }
-
-p.label {
- white-space: nowrap }
-
-p.topic-title {
- font-weight: bold }
-
-pre.address {
- margin-bottom: 0 ;
- margin-top: 0 ;
- font-family: serif ;
- font-size: 100% }
-
-pre.line-block {
- font-family: serif ;
- font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
- margin-left: 2em ;
- margin-right: 2em ;
- background-color: #ffffff;
- border: thin black solid;
- padding: 5px;
-}
-
-span.classifier {
- font-family: sans-serif ;
- font-style: oblique }
-
-span.classifier-delimiter {
- font-family: sans-serif ;
- font-weight: bold }
-
-span.interpreted {
- font-family: sans-serif }
-
-span.option-argument {
- font-style: italic }
-
-span.pre {
- white-space: pre }
-
-span.problematic {
- color: red }
-
-table {
- margin-top: 0.5em ;
- margin-bottom: 0.5em }
-
-table.citation {
- border-left: solid thin gray ;
- padding-left: 0.5ex }
-
-table.docinfo {
- margin: 2em 4em }
-
-table.footnote {
- border-left: solid thin black ;
- padding-left: 0.5ex }
-
-td, th {
- padding-left: 0.5em ;
- padding-right: 0.5em ;
- vertical-align: top }
-
-td > p:first-child, th > p:first-child {
- margin-top: 0em }
-
-th.docinfo-name, th.field-name {
- font-weight: bold ;
- text-align: left ;
- white-space: nowrap }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 100% }
-
-tt {
- //background-color: #eeeeee;
- color: #000066 }
-
-ul.auto-toc {
- list-style-type: none }
diff --git a/sandbox/ianb/extractor/extractor.py b/sandbox/ianb/extractor/extractor.py
deleted file mode 100644
index 9411ecf6a..000000000
--- a/sandbox/ianb/extractor/extractor.py
+++ /dev/null
@@ -1,336 +0,0 @@
-#!/usr/bin/env python
-"""
-This module extracts the documentation from a module, and converts
-it into a single reST document.
-
-Usage:
- ./extractor.py some_module.py > some_module.txt
-For more:
- ./extractor.py --help
-
-The document is based on the module's docstring -- no other
-documentation is implicitly included.
-
-Other documentation can be explicitly included by using the directives
-``.. inline:: function_or_class`` or ``.. inline-all::``.
-
-The first directive includes the docstring from that function or
-class. When the directive is encountered inside a class, it can refer
-either to the global or local namespace, as in ``..inline::
-Document.add_child`` or ``.. inline:: add_child``.
-
-The second directive will include all children of the module or class,
-except those which start with a ``"_"`` (i.e., private), those that
-have ``:ignore:`` anywhere in their docstring, or those that have
-already been included.
-
-You can also force a docstring to be ignored by using
-``.. ignore:: function_or_class``. This is useful for properties,
-whose documentation will not be extracted, or other times when
-you want to document the function or class separately from its
-docstring.
-
-TODO
-----
-
-* Allow docstrings to override the normal function argument
- list (e.g., to hide non-public optional arguments).
-* Some sort of table of contents support.
-
-"""
-
-
-import os, re, sys
-from docutils.readers.python import moduleparser
-
-class Document:
-
- def __init__(self, node, module):
- self.node = node
- self.parts = []
- self.children = {}
- self.module = module
-
- def add_child(self, child):
- self.children[child.name] = child
- self.parts.append(child)
-
- def process(self):
- for child in self.node.children:
- self.process_node(child)
-
- def process_node(self, node):
- if isinstance(node, moduleparser.Docstring):
- self.parts.append(node.text)
- elif isinstance(node, moduleparser.Class):
- self.add_child(Class(node, self.module))
- elif isinstance(node, moduleparser.Function):
- self.add_child(Function(node, self.module))
-
- def documentation(self, context=None):
- if context is None:
- return Document.documentation(self, DocContext())
- newParts = []
- for part in self.parts:
- if type(part) is type(""):
- doc = self.module.substitute(part, self, context)
- newParts.append(doc + "\n")
- continue
- if part.name.startswith('_') \
- and not part.name.startswith('__'):
- continue
- if context.seen(part):
- continue
- doc = part.documentation(context)
- if doc.lower().find(':ignore:') != -1:
- continue
- newParts.append(indent(doc))
- context.setSeen(self)
- return '\n'.join(newParts)
-
-class DocContext:
-
- def __init__(self):
- self.partsSeen = {}
-
- def seen(self, obj):
- return self.partsSeen.has_key(obj)
-
- def setSeen(self, obj):
- self.partsSeen[obj] = 1
-
-class Module(Document):
-
- def __init__(self, filename, text=None):
- self.filename = filename
- if text is None:
- text = open(filename).read()
- self.module_text = text
- self.name = os.path.splitext(os.path.basename(filename))[0]
- node = moduleparser.parse_module(text, filename)
- Document.__init__(self, node, self)
- self.imports = []
- self.subber = InlineSubstitution(self)
- self.process()
-
- def substitute(self, s, currentNode=None, context=None):
- return self.subber.substitute(s, currentNode, context)
-
- def process_node(self, node):
- if isinstance(node, moduleparser.Import):
- self.imports.append((node.names, node.from_name))
- else:
- Document.process_node(self, node)
-
- def documentation(self, context=None):
- return "%s\n%s\n\n%s" % \
- (self.name,
- "=" * len(self.name),
- Document.documentation(self, context=None))
-
- def importText(self, im):
- if im[1]:
- return 'from %s import %s' % (im[1], im[0])
- else:
- return 'import %s' % im[0]
-
-class InlineSubstitution:
-
- def __init__(self, rootNode):
- self.rootNode = rootNode
-
- _inlineRE = re.compile(r'( *).. +inline:: *(.*)')
- _inlineAllRE = re.compile(r'( *).. +inline-all:: *')
- _ignoreRE = re.compile(r'( *).. ignore:: *(.*)\n?')
-
- def substitute(self, s, currentNode=None, context=None):
- if currentNode is None:
- currentNode = self.rootNode
- s = self._ignoreRE.sub(
- lambda m, cur=currentNode, con=context, : self._ignoreSubber(m, cur, con),
- s)
- s = self._inlineRE.sub(
- lambda m, cur=currentNode, con=context: self._inlineSubber(m, cur, con),
- s)
- s = self._inlineAllRE.sub(
- lambda m, cur=currentNode, con=context: self._inlineAllSubber(m, cur, con),
- s)
- return s
-
- def _inlineSubber(self, match, currentNode, context):
- level = len(match.group(1))
- name = match.group(2).strip().split('.')
- child = self._getChild(name, currentNode)
- return indent(self.substitute(child.documentation(context), child), level)
-
- def _ignoreSubber(self, match, currentNode, context):
- name = match.group(2).strip().split('.')
- child = self._getChild(name, currentNode)
- context.setSeen(child)
- return ''
-
- def _getChild(self, name, currentNode):
- nameList = name
- obj = currentNode
- while 1:
- if not nameList:
- return obj
- if not obj.children.has_key(nameList[0]):
- if currentNode is self.rootNode:
- raise NameError, '%s not found' % '.'.join(name)
- else:
- return self._getChild(name, self.rootNode)
- obj = obj.children[nameList[0]]
- nameList = nameList[1:]
-
- def _inlineAllSubber(self, match, currentNode, context):
- level = len(match.group(1))
- children = currentNode.children.keys()
- children.sort()
- children = [currentNode.children[name] for name in children]
- allDocs = []
- for child in children:
- if child.name.startswith('_'):
- continue
- doc = child.documentation(context)
- if doc.lower().find(':ignore:') != -1:
- continue
- allDocs.append(self.substitute(doc, child))
- return indent('\n'.join(allDocs), level)
-
-
-
-class Function(Document):
-
- def __init__(self, node, module):
- Document.__init__(self, node, module)
- self.name = node.name
- self.parameters = []
- self.process()
-
- def process_node(self, node):
- if isinstance(node, moduleparser.ParameterList):
- for parameter in node.children:
- self.process_parameter(parameter)
- else:
- Document.process_node(self, node)
-
- def process_parameter(self, param):
- ## @@: handle defaults, *args, etc.
- if param.name == 'self':
- return
- if param.children:
- val = ('default', (param.name, param.children[0].text))
- elif isinstance(param, moduleparser.ExcessPositionalArguments):
- val = ('*', param.name)
- elif isinstance(param, moduleparser.ExcessKeywordArguments):
- val = ('**', param.name)
- else:
- val = ('normal', param.name)
- self.parameters.append(val)
-
- def documentation(self, context):
- d = "`%s(%s)`:\n" % (self.name,
- ', '.join([self.parameterText(p)
- for p in self.parameters]))
- doc = Document.documentation(self, context)
- if not doc:
- doc = "Not documented."
- return d + indent(doc) + "\n"
-
- def parameterText(self, param):
- t, name = param
- if t == 'normal':
- return name
- elif t == 'default':
- return '%s=%s' % (name[0], name[1])
- elif t == '*':
- return '*%s' % name
- elif t == '**':
- return '**%s' % name
- else:
- assert 0
-
-class Class(Document):
-
- def __init__(self, node, module):
- Document.__init__(self, node, module)
- self.bases = []
- self.name = node.name
- for attr, value in node.attlist():
- if attr == 'bases':
- self.bases = value
- self.process()
-
- def documentation(self, context):
- if self.bases:
- base = 'class `%s(%s)`:' % (self.name, self.bases)
- else:
- base = 'class `%s`:' % self.name
- return base + "\n" + indent(Document.documentation(self, context))
-
-
-def indent(text, amount=4):
- return '\n'.join([(' '*amount) + line for line in text.split('\n')])
-
-def create_documentation(filename, output):
- if type(output) is type(""):
- output = open(output, 'w')
- mod = Module(filename)
- doc = mod.documentation()
- if doc.lower().find(':ignore:') == -1:
- output.write(mod.documentation())
-
-########################################
-## Command-line interface
-########################################
-
-def main(options, args):
- for arg in args:
- if os.path.isdir(arg) and options.recurse:
- main(options, [os.path.join(arg, f) for f in os.listdir(arg)])
- continue
- if options.recurse and not arg.endswith('.py'):
- continue
- filename = os.path.splitext(arg)[0] + ".txt"
- filename = os.path.join(options.output, filename)
- filename = os.path.normpath(filename)
- if not options.quiet:
- sys.stdout.write('%s -> %s ...' % (os.path.normpath(arg),
- filename))
- sys.stdout.flush()
- create_documentation(arg, filename)
- if not options.quiet:
- sys.stdout.write('done.\n')
- sys.stdout.flush()
-
-if __name__ == '__main__':
- from optparse import OptionParser
- parser = OptionParser()
- parser.add_option('-r', '--recurse',
- action="store_true",
- dest="recurse",
- default=0,
- help="recurse into subdirectories")
- parser.add_option('-o', '--output',
- dest="output",
- help="write documentation to FILE (or directory)",
- metavar="FILE")
- parser.add_option('-q', '--quiet',
- dest="quiet",
- default=0,
- action="store_true",
- help="be quiet")
- (options, args) = parser.parse_args()
- if len(args) == 1 and options.output \
- and not os.path.isdir(options.output):
- if options.output == '-':
- options.output = sys.stdout
- create_documentation(args[0], options.output)
- else:
- if not options.output:
- options.output = '.'
- main(options, args)
-
-
-
diff --git a/sandbox/ianb/wiki/Wiki.py b/sandbox/ianb/wiki/Wiki.py
deleted file mode 100644
index b7cfb3eef..000000000
--- a/sandbox/ianb/wiki/Wiki.py
+++ /dev/null
@@ -1,250 +0,0 @@
-"""
-The Wiki module primarily exports the `WikiPage` class:
-"""
-
-import os, re, time
-from docutils import core, io
-from docutils import readers
-
-__all__ = ['WikiPage', 'allPages', 'recentPages',
- 'searchTitles', 'search', 'css']
-
-## All the Wiki pages will be kept in this directory:
-pageDir = '/usr/home/ianb/w/pypaper/pages/'
-
-class WikiPage(object):
- """
- WikiPage is a class to represent one page in a WikiWikiWeb [#]_.
- The page may or may not yet exist -- that is, it may not yet
- have content.
-
- .. [#] http://c2.com/cgi-bin/wiki
-
- It has the following properties and methods:
-
- `html`:
- A read-only property giving the HTML for the page.
- If the page does not yet have content the text
- ``"This page has not yet been created"`` is returned.
- `text`:
- The text for the page. To save new text, simply
- assign to this property.
- `title`:
- The title of the page.
- `name`:
- The name of the page -- a canonical identifier.
- Related to the title, but not necessarily the
- same.
- .. ignore: html
- .. ignore: text
- .. ignore: setText
- .. ignore: title
-
- """
-
- def __init__(self, pageName):
- """
- Each page has a name, which is a unique identifier, for example
- ``"FrontPage"``, which identifies the page in the URL and
- for linking.
- """
- self.name = pageName
-
- def basePath(self):
- """
- :Ignore: yes
- Returns the base path (sans extension) for this page
- """
- return _basePath(self.name)
-
- basePath = property(basePath)
-
- def exists(self):
- """Does this page have content yet?"""
- return _exists(self.name)
-
- def html(self):
- """Returns text of HTML for page (HTML fragment only)"""
- if self.exists():
- html = open(self.basePath + ".html").read()
- html = self._subWikiLinks(html)
- return html
- else:
- return 'This page has not yet been created.'
-
- html = property(html)
-
- def preview(self, text):
- """Returns an HTML preview of the text"""
- return self._subWikiLinks(self._convertText(text))
-
- _wikiLinkRE = re.compile(r'(<a [^>]* href=")!(.*?)("[^>]*>)(.*?)(</a>)',
- re.I+re.S)
-
- def _subWikiLinks(self, text):
- return self._wikiLinkRE.sub(self._subLink, ' %s ' % text)
-
- def _subLink(self, match):
- if _exists(match.group(2)):
- return match.group(1) + match.group(2) + match.group(3) + match.group(4) + match.group(5)
- else:
- return '<span class="nowiki">%s%s%s%s?%s</span>' \
- % (match.group(4), match.group(1), match.group(2),
- match.group(3), match.group(5))
-
- def text(self):
- """
- The text of the page. ReStructuredText is used, though the
- parsing is internal to the module. You can assign to this
- property to save new text for the page.
- """
- if self.exists():
- return open(self.basePath + ".txt").read()
- else:
- return ''
-
- def setText(self, text):
- """Sets the text for the page (and updates cached HTML at the
- same time)"""
- f = open(self.basePath + ".txt", 'w')
- f.write(text)
- f.close()
- f = open(self.basePath + ".html", 'w')
- f.write(self._convertText(text))
- f.close()
-
- def _convertText(self, text):
- return self._cleanHTML(core.publish_string(
- source=text,
- reader=Reader(),
- parser_name='restructuredtext',
- writer_name='html'))
-
- def _cleanHTML(self, html):
- return html[html.find('<body>'):html.find('</body>')]
-
- text = property(text, setText)
-
- def searchMatches(self, text):
- """
- :Ignore: yes
- """
- return self.searchTitleMatches(text) \
- or self.text().lower().find(text.lower()) != -1
-
- def searchTitleMatches(self, text):
- """
- :Ignore: yes
- """
- return self.title().lower().find(text.lower()) != -1
-
- def modifiedDate(self):
- """Date modified (integer timestamp)"""
- return os.stat(self.basePath + ".txt").st_mtime
-
- modifiedDate = property(modifiedDate)
-
- def modifiedDateText(self):
- """Text representation of modified date"""
- return time.strftime("%a %m/%d/%y", time.gmtime(self.modifiedDate()))
-
- modifiedDateText = property(modifiedDateText)
-
- def title(self):
- """Page title"""
- return self.name
-
- title = property(title)
-
-"""
-Methods for searching the wiki pages:
-"""
-
-def allPages():
- """All pages with content in the system"""
- return [WikiPage(page[:-4])
- for page in os.listdir(pageDir)
- if page.endswith('.txt')]
-
-def recentPages():
- """All pages, sorted by date modified, most recent first"""
- pages = allPages()
- pages.sort(lambda a, b: cmp(b.modifiedDate(), a.modifiedDate()))
- return pages
-
-def searchTitles(text):
- """Search page titles for ``text``, returning list of pages"""
- return [page for page in allPages()
- if page.searchTitleMatches(text)]
-
-def search(text):
- """Search titles and bodies of pages for ``text``, returning list
- of pages"""
- return [page for page in allPages()
- if page.searchMatches(text)]
-
-
-def _basePath(name):
- return os.path.join(pageDir, name)
-
-def _exists(name):
- return os.path.exists(_basePath(name) + ".html")
-
-"""
-There is one module global to be printed at the top of
-every Wiki page:
-
- `css`:
- The HTML to put the proper CSS at the top of the page. This
- should be put in the ``<head>`` section of the page.
-"""
-
-try:
- f = open('default.css')
-except IOError:
- css = ""
-else:
- css = '<style type="text/css">\n%s</style>\n' % f.read()
- f.close()
-
-########################################
-## reST-specific stuff
-########################################
-
-
-from docutils import nodes
-from docutils.readers import standalone
-from docutils.transforms import Transform
-
-class WikiLinkResolver(nodes.SparseNodeVisitor):
- ":Ignore: yes"
-
- def visit_reference(self, node):
- if node.resolved or not node.hasattr('refname'):
- return
- refname = node['refname']
- node.resolved = 1
- node['class'] = 'wiki'
- # I put a ! here to distinguish Wiki links from other
- # links -- Wiki links have to be fixed up at view time,
- # to distinguish between dangling and resolved Wiki
- # links.
- node['refuri'] = '!' + refname
- del node['refname']
-
-class WikiLink(Transform):
- ":Ignore: yes"
-
- default_priority = 800
-
- def apply(self):
- visitor = WikiLinkResolver(self.document)
- self.document.walk(visitor)
-
-class Reader(standalone.Reader):
- ":Ignore: yes"
-
- supported = standalone.Reader.supported + ('wiki',)
-
- def get_transforms(self):
- return standalone.Reader.get_transforms(self) + [WikiLink]
diff --git a/sandbox/ianb/wiki/docs/Wiki.txt b/sandbox/ianb/wiki/docs/Wiki.txt
deleted file mode 100644
index c63094529..000000000
--- a/sandbox/ianb/wiki/docs/Wiki.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-Wiki
-====
-
-The Wiki module primarily exports the `WikiPage` class:
-
- class `WikiPage(object)`:
- WikiPage is a class to represent one page in a WikiWikiWeb [#]_.
- The page may or may not yet exist -- that is, it may not yet
- have content.
-
- .. [#] http://c2.com/cgi-bin/wiki
-
- It has the following properties and methods:
-
- `html`:
- A read-only property giving the HTML for the page.
- If the page does not yet have content the text
- ``"This page has not yet been created"`` is returned.
- `text`:
- The text for the page. To save new text, simply
- assign to this property.
- `title`:
- The title of the page.
- `name`:
- The name of the page -- a canonical identifier.
- Related to the title, but not necessarily the
- same.
- `exists()`:
- Does this page have content yet?
- `modifiedDate()`:
- Date modified (integer timestamp)
- `modifiedDateText()`:
- Text representation of modified date
- `preview(text)`:
- Returns an HTML preview of the text
-
-There are also several searching methods:
-
- `allPages()`:
- All pages with content in the system
- `recentPages()`:
- All pages, sorted by date modified, most recent first
- `search(text)`:
- Search titles and bodies of pages for ``text``, returning list
- of pages
- `searchTitles(text)`:
- Search page titles for ``text``, returning list of pages
-
-There is one module global to be printed at the top of
-every Wiki page:
-
- `css`:
- The HTML to put the proper CSS at the top of the page. This
- should be put in the ``<head>`` section of the page. \ No newline at end of file
diff --git a/sandbox/infrastructure/cvs-reorg.sh b/sandbox/infrastructure/cvs-reorg.sh
deleted file mode 100644
index c2bb56aca..000000000
--- a/sandbox/infrastructure/cvs-reorg.sh
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/bin/sh
-# $Id$
-# CVS reorganization script for Docutils (docutils.sf.net).
-# By Felix Wiemann and David Goodger
-# Implemented on 2004-06-02; see
-# <http://docutils.sf.net/HISTORY.html#documentation-cleanup-reorganization>.
-
-# Paths should be absolute (implied by
-# http://sf.net/docman/display_doc.php?docid=768&group_id=1#repositoryrestructure).
-
-# Exit on error.
-set -e
-
-############################################################
-
-echo
-echo 'Remove module & files added by mistake...'
-
-rm -rfv /cvsroot/docutils/modulename # duplicate of sandbox module
-rm -rfv /cvsroot/docutils/docutils/Attic # duplicates of CVSROOT files
-rm -rfv /cvsroot/docutils/docutils/CVSROOT # another duplicate
-
-############################################################
-
-echo
-echo 'Create new empty directory structure...'
-
-# introductory/tutorial material for end-users
-mkdir -v /cvsroot/docutils/docutils/docs/user/
-
-# for core-developers
-mkdir -v /cvsroot/docutils/docutils/docs/dev/
-mkdir -v /cvsroot/docutils/docutils/docs/dev/rst/
-
-# reference material for all groups
-mkdir -v /cvsroot/docutils/docutils/docs/ref/
-mkdir -v /cvsroot/docutils/docutils/docs/ref/rst/
-
-# Python Enhancement Proposals
-mkdir -v /cvsroot/docutils/docutils/docs/peps/
-
-############################################################
-
-echo
-echo 'Move entire subdirectories...'
-
-mv -iv /cvsroot/docutils/docutils/docs/rst \
- /cvsroot/docutils/docutils/docs/user/rst
-
-# for component-developers and core-developers
-mv -iv /cvsroot/docutils/docutils/spec/howto \
- /cvsroot/docutils/docutils/docs/howto
-
-############################################################
-
-echo
-echo 'Move (& rename) individual files...'
-
-# All file names have to end with ",v"; this is the CVS repository!
-
-mv -iv /cvsroot/docutils/docutils/docs/config.txt,v \
- /cvsroot/docutils/docutils/docs/user/
-mv -iv /cvsroot/docutils/docutils/docs/latex.txt,v \
- /cvsroot/docutils/docutils/docs/user/
-mv -iv /cvsroot/docutils/docutils/docs/tools.txt,v \
- /cvsroot/docutils/docutils/docs/user/
-
-mv -iv /cvsroot/docutils/docutils/spec/pysource.dtd,v \
- /cvsroot/docutils/docutils/docs/dev/
-mv -iv /cvsroot/docutils/docutils/spec/pysource.txt,v \
- /cvsroot/docutils/docutils/docs/dev/
-mv -iv /cvsroot/docutils/docutils/spec/semantics.txt,v \
- /cvsroot/docutils/docutils/docs/dev/
-mv -iv /cvsroot/docutils/docutils/spec/notes.txt,v \
- /cvsroot/docutils/docutils/docs/dev/todo.txt,v # rename
-
-mv -iv /cvsroot/docutils/docutils/spec/doctree.txt,v \
- /cvsroot/docutils/docutils/docs/ref/
-mv -iv /cvsroot/docutils/docutils/spec/docutils.dtd,v \
- /cvsroot/docutils/docutils/docs/ref/
-mv -iv /cvsroot/docutils/docutils/spec/soextblx.dtd,v \
- /cvsroot/docutils/docutils/docs/ref/
-
-mv -iv /cvsroot/docutils/docutils/spec/transforms.txt,v \
- /cvsroot/docutils/docutils/docs/ref/
-
-mv -iv /cvsroot/docutils/docutils/spec/rst/alternatives.txt,v \
- /cvsroot/docutils/docutils/docs/dev/rst/
-mv -iv /cvsroot/docutils/docutils/spec/rst/problems.txt,v \
- /cvsroot/docutils/docutils/docs/dev/rst/
-
-mv -iv /cvsroot/docutils/docutils/spec/rst/reStructuredText.txt,v \
- /cvsroot/docutils/docutils/docs/ref/rst/restructuredtext.txt,v # rename
-mv -iv /cvsroot/docutils/docutils/spec/rst/directives.txt,v \
- /cvsroot/docutils/docutils/docs/ref/rst/
-mv -iv /cvsroot/docutils/docutils/spec/rst/interpreted.txt,v \
- /cvsroot/docutils/docutils/docs/ref/rst/roles.txt,v # rename
-mv -iv /cvsroot/docutils/docutils/spec/rst/introduction.txt,v \
- /cvsroot/docutils/docutils/docs/ref/rst/
-
-mv -iv /cvsroot/docutils/docutils/spec/pep-????.txt,v \
- /cvsroot/docutils/docutils/docs/peps/
-
-############################################################
-
-echo
-echo 'Remove old, unused, empty directories...'
-
-# nothing interesting in here
-rm -rfv /cvsroot/docutils/docutils/spec/Attic
-
-# empty
-rmdir -v /cvsroot/docutils/docutils/spec/rst
-rmdir -v /cvsroot/docutils/docutils/spec
-
-############################################################
-
-echo
-echo Finished.
diff --git a/sandbox/infrastructure/docutils-update b/sandbox/infrastructure/docutils-update
deleted file mode 100755
index b2aa96386..000000000
--- a/sandbox/infrastructure/docutils-update
+++ /dev/null
@@ -1,307 +0,0 @@
-#! /bin/bash
-# $Id$
-#
-# This script is installed as a cron job to automatically update the
-# Docutils web site whenever the SVN files change. Any .html document
-# with a corresponding .txt file is regenerated whenever the .txt
-# changes.
-#
-# Options:
-# -f Do not give feedback.
-# -t Run the script in trace mode ("set -o xtrace").
-# -u Regenerate .html unconditionally.
-# -v Run verbosely.
-#
-# Prerequisites:
-#
-# - Checked out trunk at $snapshotdir.
-# - Checked out main tree at $lib.
-
-# exit on error
-set -e
-
-# make all newly created files group writeable
-umask 002
-
-basedir=/home/groups/docutils/htdocs
-project=docutils
-# $auxdir is non-public.
-auxdir=$basedir/aux
-# $htdocsdest is the destination for htdocs and will be moved to
-# another server later; so we keep it non-public (under $auxdir).
-htdocsdest=$auxdir/htdocs
-# Where to create the snapshots (non-public).
-snapshotdir=$auxdir/snapshots
-# Where to publish the snapshots (public).
-snapshotdest=/home/groups/ftp/pub/docutils
-bindir=$auxdir/bin
-htdocs_patchfile=$auxdir/htdocs.patch
-htdocs_tarball=$auxdir/htdocs.tar
-htdocs_new_tarball=$auxdir/htdocs.new.tar
-# htdocs directory on SF.net
-remotehtdocs=/home/groups/d/do/docutils/htdocs
-pylib=$auxdir/lib/python
-lib=$pylib/$project
-# Lock directory.
-lockdir=$auxdir/lock
-# SSH stuff.
-sshdir=$auxdir/.ssh
-sshhost=docutilsupdate@shell.sourceforge.net
-sshcommand="ssh -i $lockdir/id_dsa
- -o UserKnownHostsFile=$sshdir/known_hosts $sshhost"
-# Project base URL (for sitemap) without trailing slash.
-baseurl="http://docutils.sourceforge.net"
-
-export PYTHONPATH=$pylib:$lib:$lib/extras
-export PATH=$lib/tools:$PATH
-
-trace=0
-unconditional=0
-verbose=0
-feedback=1
-
-while getopts ftuv opt
-do
- case $opt in
- f) feedback=;;
- t) trace=1;;
- u) unconditional=1;;
- v) verbose=1;;
- \?) exit 2;;
- esac
-done
-shift `expr $OPTIND - 1`
-
-test $feedback && echo 'Starting docutils-update run...' || true
-
-if [ $trace -eq 1 -o $verbose -eq 1 ] ; then
- set -o xtrace
-fi
-
-# Acquire lock.
-if ! mkdir $lockdir; then
- echo
- echo Could not create lock directory at
- echo $lockdir
- echo
- echo Please ensure no other user is running this script
- echo and delete the directory.
- exit 1
-fi
-# Always clean up on exit.
-trap "rm -rf $lockdir; trap - 0; exit 1" 0 1 2 3 15
-# Make sure the lock directory is deletable (i.e. rwx) by other group
-# members (in case this script crashes after copying files into the
-# directory) and un-readable by world (because we'll be storing the
-# key in it).
-chmod 0770 $lockdir
-
-
-# update library area
-cd $lib
-svn up --quiet
-
-# -------------------- Snapshots: --------------------
-
-# gather the materials
-cd $snapshotdir
-svn -q revert $project/$project/__init__.py
-haschanges="`svn up | grep -v '^At revision '; true`"
-
-# update __version_details__ string
-version_details="snapshot `date --utc --iso`, r`svn info | grep ^Revision: | sed 's/^Revision: //'`"
-(echo ",s/^__version_details__ = .*\$/__version_details__ = '$version_details'/";
- echo wq) | ed $project/$project/__init__.py 2> /dev/null
-
-# Ensure proper directory permissions are set so that the files can be
-# modified by several users. Changing permissions of files is
-# probably not necessary because files can be deleted and re-created.
-# Do not change permissions of aux directory to keep it non-public
-# (but change permissions for all subdirectories).
-#find $basedir -type f -print0 | xargs -0 chmod ug+rw 2> /dev/null || true
-find $basedir -name aux -o -type d -print0 | xargs -0 chmod ug+rwxs 2> /dev/null || true
-
-# create the snapshots
-exclude='--exclude=.svn'
-tar -cz $exclude -f $project-snapshot.tgz $project
-tar -cz $exclude -f $project-sandbox-snapshot.tgz sandbox
-tar -cz $exclude -f $project-web-snapshot.tgz web
-( cd sandbox/gschwant ;
- tar -cz $exclude -f ../../docfactory-snapshot.tgz docfactory )
-
-# plant the snapshots
-mv -f *snapshot.tgz $snapshotdest
-
-# revert and touch (to avoid updating the web site only because of the
-# changed timestamp)
-svn -q revert $project/$project/__init__.py
-touch $project/$project/__init__.py --date \
- "`svn info $project/$project/__init__.py | \
- grep 'Last Changed Date:' | sed 's/[^:]*: //'`"
-
-# -------------------- htdocs: --------------------
-
-cd $snapshotdir
-
-function copy_to_htdocsdest() {
- find "$@" -type d -name .svn -prune -o -type f -print0 | \
- xargs -0 cp --update --parents --target-directory=$htdocsdest
-}
-
-# update htdocs
-copy_to_htdocsdest sandbox
-(cd $project; copy_to_htdocsdest *)
-(cd web; copy_to_htdocsdest * .[^.]*)
-
-# update HTML docs
-cd $htdocsdest/tools
-
-if [ $trace -eq 0 ] ; then
- set +o xtrace
-fi
-
-for makefile in `find .. -name Makefile.docutils-update` ; do
- dir=`dirname $makefile`
- ( cd $dir ; make -f Makefile.docutils-update -s )
-done
-
-for htmlfile in `find .. -name '*.html'` ; do
- dir=`dirname $htmlfile`
- base=`basename $htmlfile .html`
- txtfile=$dir/$base.txt
- if [ -e $txtfile ] ; then
- if [ $unconditional -eq 1 -o $txtfile -nt $htmlfile ] ; then
- if [ "${base:0:4}" == "pep-" ] ; then
- test $feedback && echo "$txtfile (PEP)" || true
- python $lib/tools/rstpep2html.py --config=$dir/docutils.conf $txtfile $htmlfile
- haschanges=1
- else
- test $feedback && echo $txtfile || true
- python $lib/tools/rst2html.py --config=$dir/docutils.conf $txtfile $htmlfile
- haschanges=1
- fi
- fi
- fi
-done
-
-if [ $trace -eq 1 -o $verbose -eq 1 ] ; then
- set -o xtrace
-fi
-
-# -------------------- XML sitemap for search engines: --------------------
-
-cd $htdocsdest
-
-# Update the sitemap only if something has changed because it takes
-# very much CPU time.
-if test -n "$haschanges"; then
- (
- echo '<?xml version="1.0" encoding="UTF-8"?>'
- echo '<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">'
- if [ $trace -eq 0 ] ; then
- set +o xtrace
- fi
- find . -name '.[^.]*' -prune -o -type d -printf '%p/\n' -o -type f -print | \
- while read i; do
- # i is the file name.
- if test "$i" == ./; then
- # Homepage.
- i=index.html
- url="$baseurl/"
- elif test "$i" == ./sitemap -o "${i: -1}" == / -a -f "${i}index.html"; then
- # This is a directory and it has an index.html, so we
- # don't need to include it.
- continue
- else
- url="$baseurl${i:1}"
- url="${url// /%20}"
- fi
- lastmod="`date --iso-8601=seconds -u -r "$i"`"
- # Google wants a colon in front of the last two digits.
- lastmod="${lastmod::22}:00"
- if test "${i: -5}" == .html; then
- # HTML files (including the home page) have highest priority.
- priority=1.0
- elif test "${i: -4}" == .txt; then
- # Text files have medium priority.
- priority=0.5
- else
- # Everything else (source files etc.) has low priority.
- priority=0.2
- fi
- echo "<url><loc>$url</loc><lastmod>$lastmod</lastmod><priority>$priority</priority></url>"
- done
- if [ $trace -eq 1 -o $verbose -eq 1 ] ; then
- set -o xtrace
- fi
- echo '</urlset>'
- ) > sitemap
- # sitemap is compressed on the remote site for smaller patch sizes.
-fi
-
-# -------------------- Push changes to remote server. --------------------
-
-# SSH doesn't want to read id_dsa files which don't have 0600
-# permissions. This is getting into our way here, but we work around
-# this by copying id_dsa to $lockdir/id_dsa and setting the
-# permissions of the resulting id_dsa file to 0600.
-
-# Copy the key.
-cp $sshdir/id_dsa $lockdir/id_dsa
-# SSH wants this.
-chmod 0600 $lockdir/id_dsa
-
-rm -f $htdocs_patchfile
-# Create new tarball.
-cd $htdocsdest
-tar cf $htdocs_new_tarball .
-
-# If there is no old tarball, we have to transmit the whole tarball.
-if test ! -f $htdocs_tarball; then
- test $feedback && echo Transmitting entire tarball. || true
- gzip -c $htdocs_new_tarball | $sshcommand \
- "
- set -e
- umask 002
- gunzip -c > ~/htdocs.tar
- cd $remotehtdocs
- tar xmf ~/htdocs.tar
- gzip -f sitemap
- "
-# If the current and the new tarball differ, transmit patch file.
-elif ! diff -q $htdocs_tarball $htdocs_new_tarball > /dev/null; then
- # Create patch.
- $bindir/bsdiff $htdocs_tarball $htdocs_new_tarball $htdocs_patchfile
- test $feedback && echo Patch size: `du -h $htdocs_patchfile | sed 's/\t.*//'` || true
- # Delete current tarball. If something goes wrong with uploading
- # and applying the patch file, docutils-update will notice that
- # the tarball isn't present at the next run and transfer the whole
- # tarball, because we're left in an undefined state (the servers
- # are out of sync).
- rm -f $htdocs_tarball
- # Upload patch file.
- $sshcommand \
- "
- set -e
- umask 002
- cat > ~/htdocs.patch
- ~/bin/bspatch ~/htdocs.tar ~/htdocs.new.tar ~/htdocs.patch
- cd $remotehtdocs
- tar xmf ~/htdocs.new.tar
- gzip -f sitemap
- mv ~/htdocs.new.tar ~/htdocs.tar
- rm -f ~/htdocs.patch
- " \
- < $htdocs_patchfile
-fi
-mv $htdocs_new_tarball $htdocs_tarball
-
-# Tidy up.
-rm -f $htdocs_patchfile
-trap - 0 1 2 3 15
-rm -rf $lockdir
-test $feedback && echo '...docutils-update done.' || true
-
-# Local Variables:
-# indent-tabs-mode: nil
-# End:
diff --git a/sandbox/jensj/latex_math/README.txt b/sandbox/jensj/latex_math/README.txt
deleted file mode 100644
index 63abb49d9..000000000
--- a/sandbox/jensj/latex_math/README.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-==================
-LaTeX-math plug-in
-==================
-
-The plug-in adds a latex-math role and directive that transforms ReST
-+ LaTeX-math to html + MathML. The script (in the ``tools`` directory)
-does exactly what rst2html.py does - only difference is that a
-latex-math role and directive is added to the parser before parsing.
-
-It works like this::
-
- python rst2mathml.py document.txt > document.xhtml
-
-(try the test file from the ``test`` directory).
-
-Documentation is in the ``docs`` directory.
-
-The script is a quick hack that we can use for testing until we have
-real plug-in support.
-
-Any feedback is appreciated.
diff --git a/sandbox/jensj/latex_math/docs/latex_math.txt b/sandbox/jensj/latex_math/docs/latex_math.txt
deleted file mode 100644
index b2471bca7..000000000
--- a/sandbox/jensj/latex_math/docs/latex_math.txt
+++ /dev/null
@@ -1,269 +0,0 @@
-==================================
-Using LaTeX syntax for mathematics
-==================================
-
-.. role:: m(latex-math)
-.. contents::
-
-.. |latex| replace:: L\ :sup:`A`\ T\ :sub:`E`\ X
-
-
-Introduction
-============
-
-This document describes a LaTeX-math plug-in for reStructuredText.
-The html-writer will generate a combination of html and MathML.
-
-.. warning::
-
- This document contains MathML. Your browser may not be able to
- display it correctly!
-
-
-ftp://ftp.ams.org/pub/tex/doc/amsmath/short-math-guide.pdf
-
-
-Role and directive
-==================
-
-There is a role called ``latex-math`` that can be used for inline
-mathematical expressions: ``:latex-math:`\psi(r) = \exp(-2r)``` will
-produce :m:`\psi(r)=\exp(-2r)`. Inside the back-tics you can write
-anything you would write between dollar signs in a LaTeX ducument.
-
-For producing displayed math (like an ``equation*`` environment in a
-LaTeX document) there is a ``latex-math`` role. If you write::
-
- .. latex-math::
-
- \psi(r) = e^{-2r}
-
-you will get:
-
-.. latex-math::
-
- \psi(r) = e^{-2r}
-
-
-
-Commands and symbols
-====================
-
-The parser does not understand *all* LaTeX-math, but basic
-everyday-math works. If a command or a special symbol is not desribed
-in this document, then it is probably not implemented.
-
-The following tables are adapted from the first edition of
-"The LaTeX Companion" (Goossens, Mittelbach, Samarin).
-
-
-Accents
--------
-
- ============================ ========================
- :m:`\tilde{n}` ``\tilde{n}`` :m:`\hat{H}` ``\hat{H}``
- :m:`\bar{v}` ``\bar{v}`` :m:`\vec{R}` ``\vec{R}``
- ============================ ========================
-
-
-Negated binary relations
-------------------------
-
- ================================ ======================
- :m:`\not\in` ``\not\in`` :m:`\not =` ``\not =``
- :m:`\not \equiv` ``\not \equiv``
- ================================ ======================
-
-
-Braces
-------
-
- ============ ============ ============ ============== ========================
- :m:`(` ``(`` :m:`[` ``[`` :m:`|` ``|`` :m:`\{` ``\{`` :m:`\langle` ``\langle``
- :m:`)` ``)`` :m:`]` ``]`` :m:`|` ``|`` :m:`\}` ``\}`` :m:`\rangle` ``\rangle``
- ============ ============ ============ ============== ========================
-
-
-LaTeX commands
---------------
-
- ===================== ============================== ===============================
- command example result
- ===================== ============================== ===============================
- ``\sqrt`` ``\sqrt{x^2-1}`` :m:`\sqrt{x^2-1}`
- ``\frac`` ``\frac{1}{2}`` :m:`\frac{1}{2}`
- ``\text`` ``k_{\text{B}}T`` :m:`k_{\text{B}}T`
- ``\left``, ``\right`` ``\left(\frac{1}{2}\right)^n`` :m:`\left(\frac{1}{2}\right)^n`
- ``\mathbf`` ``\mathbf{r}^2=x^2+y^2+z^2`` :m:`\mathbf{r}^2=x^2+y^2+z^2`
- ``\mathbb`` ``\mathbb{C}`` :m:`\mathbb{C}`
- ===================== ============================== ===============================
-
-
-Greek letters
--------------
-
- ================================ ================================ ================================ ================================
- :m:`\Delta` ``\Delta`` :m:`\Gamma` ``\Gamma`` :m:`\Lambda` ``\Lambda`` :m:`\Omega` ``\Omega``
- :m:`\Phi` ``\Phi`` :m:`\Pi` ``\Pi`` :m:`\Psi` ``\Psi`` :m:`\Sigma` ``\Sigma``
- :m:`\Theta` ``\Theta`` :m:`\Upsilon` ``\Upsilon`` :m:`\Xi` ``\Xi`` :m:`\alpha` ``\alpha``
- :m:`\beta` ``\beta`` :m:`\chi` ``\chi`` :m:`\delta` ``\delta`` :m:`\epsilon` ``\epsilon``
- :m:`\eta` ``\eta`` :m:`\gamma` ``\gamma`` :m:`\iota` ``\iota`` :m:`\kappa` ``\kappa``
- :m:`\lambda` ``\lambda`` :m:`\mu` ``\mu`` :m:`\nu` ``\nu`` :m:`\omega` ``\omega``
- :m:`\phi` ``\phi`` :m:`\pi` ``\pi`` :m:`\psi` ``\psi`` :m:`\rho` ``\rho``
- :m:`\sigma` ``\sigma`` :m:`\tau` ``\tau`` :m:`\theta` ``\theta`` :m:`\upsilon` ``\upsilon``
- :m:`\varepsilon` ``\varepsilon`` :m:`\varkappa` ``\varkappa`` :m:`\varphi` ``\varphi`` :m:`\varpi` ``\varpi``
- :m:`\varrho` ``\varrho`` :m:`\varsigma` ``\varsigma`` :m:`\vartheta` ``\vartheta`` :m:`\xi` ``\xi``
- :m:`\zeta` ``\zeta``
- ================================ ================================ ================================ ================================
-
-
-Binary operation symbols
-------------------------
-
- ========================================== ========================================== ==========================================
- :m:`\amalg` ``\amalg`` :m:`\ast` ``\ast`` :m:`\bigcirc` ``\bigcirc``
- :m:`\bigtriangledown` ``\bigtriangledown`` :m:`\bigtriangleup` ``\bigtriangleup`` :m:`\bullet` ``\bullet``
- :m:`\cap` ``\cap`` :m:`\cdot` ``\cdot`` :m:`\circ` ``\circ``
- :m:`\cup` ``\cup`` :m:`\dagger` ``\dagger`` :m:`\ddagger` ``\ddagger``
- :m:`\diamond` ``\diamond`` :m:`\div` ``\div`` :m:`\mp` ``\mp``
- :m:`\odot` ``\odot`` :m:`\ominus` ``\ominus`` :m:`\oplus` ``\oplus``
- :m:`\oslash` ``\oslash`` :m:`\otimes` ``\otimes`` :m:`\pm` ``\pm``
- :m:`\setminus` ``\setminus`` :m:`\sqcap` ``\sqcap`` :m:`\sqcup` ``\sqcup``
- :m:`\star` ``\star`` :m:`\times` ``\times`` :m:`\triangleleft` ``\triangleleft``
- :m:`\triangleright` ``\triangleright`` :m:`\uplus` ``\uplus`` :m:`\vee` ``\vee``
- :m:`\wedge` ``\wedge`` :m:`\wr` ``\wr``
- ========================================== ========================================== ==========================================
-
-
-Relation symbols
-----------------
-
- ================================ ================================ ================================ ================================
- :m:`\Join` ``\Join`` :m:`\approx` ``\approx`` :m:`\asymp` ``\asymp`` :m:`\bowtie` ``\bowtie``
- :m:`\cong` ``\cong`` :m:`\dashv` ``\dashv`` :m:`\doteq` ``\doteq`` :m:`\equiv` ``\equiv``
- :m:`\frown` ``\frown`` :m:`\ge` ``\ge`` :m:`\geq` ``\geq`` :m:`\gg` ``\gg``
- :m:`\in` ``\in`` :m:`\le` ``\le`` :m:`\leq` ``\leq`` :m:`\ll` ``\ll``
- :m:`\mid` ``\mid`` :m:`\models` ``\models`` :m:`\neq` ``\neq`` :m:`\ni` ``\ni``
- :m:`\parallel` ``\parallel`` :m:`\perp` ``\perp`` :m:`\prec` ``\prec`` :m:`\precsim` ``\precsim``
- :m:`\propto` ``\propto`` :m:`\sim` ``\sim`` :m:`\simeq` ``\simeq`` :m:`\smile` ``\smile``
- :m:`\sqsubset` ``\sqsubset`` :m:`\sqsubseteq` ``\sqsubseteq`` :m:`\sqsupset` ``\sqsupset`` :m:`\sqsupseteq` ``\sqsupseteq``
- :m:`\subset` ``\subset`` :m:`\subseteq` ``\subseteq`` :m:`\succ` ``\succ`` :m:`\succsim` ``\succsim``
- :m:`\supset` ``\supset`` :m:`\supseteq` ``\supseteq`` :m:`\vdash` ``\vdash``
- ================================ ================================ ================================ ================================
-
-
-Arrow symbols
--------------
- ================================================ ================================================
- :m:`\Downarrow` ``\Downarrow`` :m:`\Leftarrow` ``\Leftarrow``
- :m:`\Leftrightarrow` ``\Leftrightarrow`` :m:`\Longleftarrow` ``\Longleftarrow``
- :m:`\Longleftrightarrow` ``\Longleftrightarrow`` :m:`\Longrightarrow` ``\Longrightarrow``
- :m:`\Rightarrow` ``\Rightarrow`` :m:`\Uparrow` ``\Uparrow``
- :m:`\Updownarrow` ``\Updownarrow`` :m:`\downarrow` ``\downarrow``
- :m:`\hookleftarrow` ``\hookleftarrow`` :m:`\hookrightarrow` ``\hookrightarrow``
- :m:`\leftarrow` ``\leftarrow`` :m:`\leftharpoondown` ``\leftharpoondown``
- :m:`\leftharpoonup` ``\leftharpoonup`` :m:`\leftrightarrow` ``\leftrightarrow``
- :m:`\longleftarrow` ``\longleftarrow`` :m:`\longleftrightarrow` ``\longleftrightarrow``
- :m:`\longmapsto` ``\longmapsto`` :m:`\longrightarrow` ``\longrightarrow``
- :m:`\mapsto` ``\mapsto`` :m:`\nearrow` ``\nearrow``
- :m:`\nwarrow` ``\nwarrow`` :m:`\rightarrow` ``\rightarrow``
- :m:`\rightharpoondown` ``\rightharpoondown`` :m:`\rightharpoonup` ``\rightharpoonup``
- :m:`\searrow` ``\searrow`` :m:`\swarrow` ``\swarrow``
- :m:`\uparrow` ``\uparrow`` :m:`\updownarrow` ``\updownarrow``
-
- ================================================ ================================================
-
-
-Miscellaneous symbols
----------------------
-
- ================================== ================================== ================================== ==================================
- :m:`\Im` ``\Im`` :m:`\Re` ``\Re`` :m:`\aleph` ``\aleph`` :m:`\angle` ``\angle``
- :m:`\bot` ``\bot`` :m:`\cdots` ``\cdots`` :m:`\clubsuit` ``\clubsuit`` :m:`\ddots` ``\ddots``
- :m:`\diamondsuit` ``\diamondsuit`` :m:`\ell` ``\ell`` :m:`\emptyset` ``\emptyset`` :m:`\exists` ``\exists``
- :m:`\flat` ``\flat`` :m:`\forall` ``\forall`` :m:`\hbar` ``\hbar`` :m:`\heartsuit` ``\heartsuit``
- :m:`\imath` ``\imath`` :m:`\infty` ``\infty`` :m:`\nabla` ``\nabla`` :m:`\natural` ``\natural``
- :m:`\neg` ``\neg`` :m:`\partial` ``\partial`` :m:`\prime` ``\prime`` :m:`\sharp` ``\sharp``
- :m:`\spadesuit` ``\spadesuit`` :m:`\surd` ``\surd`` :m:`\top` ``\top`` :m:`\vdots` ``\vdots``
- :m:`\wp` ``\wp``
- ================================== ================================== ================================== ==================================
-
-
-Variable-sized symbols
-----------------------
-
- ============================== ============================== ============================== ============================== ==============================
- :m:`\bigcap` ``\bigcap`` :m:`\bigcup` ``\bigcup`` :m:`\bigodot` ``\bigodot`` :m:`\bigoplus` ``\bigoplus`` :m:`\bigotimes` ``\bigotimes``
- :m:`\biguplus` ``\biguplus`` :m:`\bigvee` ``\bigvee`` :m:`\bigwedge` ``\bigwedge`` :m:`\coprod` ``\coprod`` :m:`\int` ``\int``
- :m:`\oint` ``\oint`` :m:`\prod` ``\prod`` :m:`\sum` ``\sum``
- ============================== ============================== ============================== ============================== ==============================
-
-Log-like symbols
-----------------
-
- =============== =============== =============== =============== =============== ===============
- ``\arccos`` ``\arcsin`` ``\arctan`` ``\arg`` ``\cos`` ``\cosh``
- ``\cot`` ``\coth`` ``\csc`` ``\deg`` ``\det`` ``\dim``
- ``\exp`` ``\gcd`` ``\hom`` ``\inf`` ``\ker`` ``\lg``
- ``\lim`` ``\liminf`` ``\limsup`` ``\ln`` ``\log`` ``\max``
- ``\min`` ``\Pr`` ``\sec`` ``\sin`` ``\sinh`` ``\sup``
- ``\tan`` ``\tanh`` ``\injlim`` ``\varinjlim`` ``\varlimsup`` ``\projlim``
- ``\varliminf`` ``\varprojlim``
- =============== =============== =============== =============== =============== ===============
-
-
-
-
-
-
-
-Miscellaneous
-=============
-
-Displayed math can use ``\\`` and ``&`` for line shifts and
-allignments::
-
- .. latex-math::
-
- a & = (x + y)^2 \\
- & = x^2 + 2xy + y^2
-
-The result is:
-
-.. latex-math::
-
- a & = (x + y)^2 \\
- & = x^2 + 2xy + y^2
-
-The LaTeX writer will put displayed equations inside a ``split``
-environment inside an ``equation*`` environment::
-
- \begin{equation*}
- \begin{split}
- a & = (x + y)^2 \\
- & = x^2 + 2xy + y^2
- \end{split}
- \end{equation*}
-
-The ``matrix`` environment can also contain ``\\`` and ``&``::
-
- .. latex-math::
-
- \left(\begin{matrix} a & b \\ c & d \end{matrix}\right)
-
-Result:
-
-.. latex-math::
-
- \left(\begin{matrix} a & b \\ c & d \end{matrix}\right)
-
-
-
-ToDo
-====
-
-* Math inside text: ``n - 1 \text{if $n$ is odd}``.
-* Spaces ...
-* Remove circular refs.
-* Decimal numbers.
-* ``\mathbb{ABC}`` does not work (use ``\mathbb{A}\mathbb{B}\mathbb{C}``).
diff --git a/sandbox/jensj/latex_math/test/test.txt b/sandbox/jensj/latex_math/test/test.txt
deleted file mode 100644
index 0fc7674f8..000000000
--- a/sandbox/jensj/latex_math/test/test.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-Testing MathML
---------------
-
-Inline math: :latex-math:`\sin(x_n^2)`. And displayed math:
-
-.. latex-math::
-
- f(\epsilon) = \frac{1}{1 + \exp\left(\frac{\varepsilon}{k_\text{B}T}\right)}
-
-.. latex-math::
-
- N = \frac{\text{number of apples}}{7}
-
-.. latex-math::
-
- \mathbf{M} = \left(\begin{matrix}a&b\\c&d\end{matrix}\right)
-
-We have :latex-math:`|\mathbf{M}| = ad - bc`.
-
-.. latex-math::
-
- \int_0^1 x^n dx = \frac{1}{n + 1}
-
-.. latex-math::
-
- \sum_{n=1}^m n = \frac{m(m+1)}{2}
-
-* tilde: :latex-math:`\tilde{n}`
-* hat: :latex-math:`\hat{H}`
-* bar: :latex-math:`\bar{v}`
-
-Quantum mechanics:
-
-.. latex-math::
-
- -\frac{1}{2}\nabla^2 \psi + v \psi = \varepsilon \psi
-
-Math split over two lines:
-
-.. latex-math::
-
- g(\alpha) = & (1 + \alpha + \alpha^2 + \alpha^3 + \alpha^4\\
- & + \alpha^5)
-
-.. latex-math::
-
- f(x) = \left\{
- \begin{matrix}
- 1 - x, & x < 1 \\
- 0, & x > 1
- \end{matrix}\right.
diff --git a/sandbox/jensj/latex_math/tools/rst2latex.py b/sandbox/jensj/latex_math/tools/rst2latex.py
deleted file mode 100644
index 1966523af..000000000
--- a/sandbox/jensj/latex_math/tools/rst2latex.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python
-
-"""
-A minimal front end to the Docutils Publisher, producing LaTeX.
-"""
-
-try:
- import locale
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.parsers.rst.roles import register_canonical_role
-from docutils import nodes
-from docutils.writers.latex2e import LaTeXTranslator
-from docutils.parsers.rst.directives import _directives
-from docutils.core import publish_cmdline, default_description
-
-
-# Define LaTeX math node:
-class latex_math(nodes.Element):
- tagname = '#latex-math'
- def __init__(self, rawsource, latex):
- nodes.Element.__init__(self, rawsource)
- self.latex = latex
-
-# Register role:
-def latex_math_role(role, rawtext, text, lineno, inliner,
- options={}, content=[]):
- i = rawtext.find('`')
- latex = rawtext[i+1:-1]
- node = latex_math(rawtext, latex)
- return [node], []
-register_canonical_role('latex-math', latex_math_role)
-
-
-# Register directive:
-def latex_math_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- latex = ''.join(content)
- node = latex_math(block_text, latex)
- return [node]
-latex_math_directive.arguments = None
-latex_math_directive.options = {}
-latex_math_directive.content = 1
-_directives['latex-math'] = latex_math_directive
-
-
-# Add visit/depart methods to HTML-Translator:
-def visit_latex_math(self, node):
- inline = isinstance(node.parent, nodes.TextElement)
- if inline:
- self.body.append('$%s$' % node.latex)
- else:
- self.body.extend(['\\begin{equation*}\\begin{split}',
- node.latex,
- '\\end{split}\\end{equation*}'])
-def depart_latex_math(self, node):
- pass
-LaTeXTranslator.visit_latex_math = visit_latex_math
-LaTeXTranslator.depart_latex_math = depart_latex_math
-
-
-description = ('Generates LaTeX documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='latex', description=description)
diff --git a/sandbox/jensj/latex_math/tools/rst2mathml.py b/sandbox/jensj/latex_math/tools/rst2mathml.py
deleted file mode 100644
index b7b1aa0fa..000000000
--- a/sandbox/jensj/latex_math/tools/rst2mathml.py
+++ /dev/null
@@ -1,522 +0,0 @@
-#!/usr/bin/env python
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML + MathML.
-"""
-
-try:
- import locale
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.parsers.rst.roles import register_canonical_role
-from docutils import nodes
-from docutils.writers.html4css1 import HTMLTranslator
-from docutils.parsers.rst.directives import _directives
-from docutils.core import publish_cmdline, default_description
-
-
-# Define LaTeX math node:
-class latex_math(nodes.Element):
- tagname = '#latex-math'
- def __init__(self, rawsource, mathml_tree):
- nodes.Element.__init__(self, rawsource)
- self.mathml_tree = mathml_tree
-
-# Register role:
-def latex_math_role(role, rawtext, text, lineno, inliner,
- options={}, content=[]):
- i = rawtext.find('`')
- latex = rawtext[i+1:-1]
- try:
- mathml_tree = parse_latex_math(latex, inline=True)
- except SyntaxError, msg:
- msg = inliner.reporter.error(msg, line=lineno)
- prb = inliner.problematic(rawtext, rawtext, msg)
- return [prb], [msg]
- node = latex_math(rawtext, mathml_tree)
- return [node], []
-register_canonical_role('latex-math', latex_math_role)
-
-
-# Register directive:
-def latex_math_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- latex = ''.join(content)
- try:
- mathml_tree = parse_latex_math(latex, inline=False)
- except SyntaxError, msg:
- error = state_machine.reporter.error(
- msg, nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- node = latex_math(block_text, mathml_tree)
- return [node]
-latex_math_directive.arguments = None
-latex_math_directive.options = {}
-latex_math_directive.content = 1
-_directives['latex-math'] = latex_math_directive
-
-
-# Add visit/depart methods to HTML-Translator:
-def visit_latex_math(self, node):
- mathml = ''.join(node.mathml_tree.xml())
- string = """<math xmlns="http://www.w3.org/1998/Math/MathML">
- <semantics>
- %s
- </semantics>
- </math>
- """ % mathml
- inline = isinstance(node.parent, nodes.TextElement)
- if not inline:
- string += '<br/>\n'
- self.body.append(string)
- if not self.has_mathml_dtd:
- doctype = ('<!DOCTYPE html'
- ' PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"'
- ' "http://www.w3.org/Math/DTD/mathml2/'
- 'xhtml-math11-f.dtd">\n')
- if self.settings.xml_declaration:
- self.head_prefix[1] = doctype
- else:
- self.head_prefix[0] = doctype
- self.has_mathml_dtd = True
-def depart_latex_math(self, node):
- pass
-HTMLTranslator.visit_latex_math = visit_latex_math
-HTMLTranslator.depart_latex_math = depart_latex_math
-HTMLTranslator.has_mathml_dtd = False
-
-
-# LaTeX to MathML translation stuff:
-class math:
- """Base class for MathML elements."""
-
- nchildren = 1000000
- """Required number of children"""
-
- def __init__(self, children=None):
- """math([children]) -> MathML element
-
- children can be one child or a list of children."""
-
- self.children = []
- if children is not None:
- if type(children) is list:
- for child in children:
- self.append(child)
- else:
- # Only one child:
- self.append(children)
-
- def __repr__(self):
- if hasattr(self, 'children'):
- return self.__class__.__name__ + '(%s)' % \
- ','.join([repr(child) for child in self.children])
- else:
- return self.__class__.__name__
-
- def full(self):
- """Room for more children?"""
-
- return len(self.children) >= self.nchildren
-
- def append(self, child):
- """append(child) -> element
-
- Appends child and returns self if self is not full or first
- non-full parent."""
-
- assert not self.full()
- self.children.append(child)
- child.parent = self
- node = self
- while node.full():
- node = node.parent
- return node
-
- def delete_child(self):
- """delete_child() -> child
-
- Delete last child and return it."""
-
- child = self.children[-1]
- del self.children[-1]
- return child
-
- def close(self):
- """close() -> parent
-
- Close element and return first non-full element."""
-
- parent = self.parent
- while parent.full():
- parent = parent.parent
- return parent
-
- def xml(self):
- """xml() -> xml-string"""
-
- return self.xml_start() + self.xml_body() + self.xml_end()
-
- def xml_start(self):
- return ['<%s>' % self.__class__.__name__]
-
- def xml_end(self):
- return ['</%s>' % self.__class__.__name__]
-
- def xml_body(self):
- xml = []
- for child in self.children:
- xml.extend(child.xml())
- return xml
-
-class mrow(math): pass
-class mtable(math): pass
-class mtr(mrow): pass
-class mtd(mrow): pass
-
-class mx(math):
- """Base class for mo, mi, and mn"""
-
- nchildren = 0
- def __init__(self, data):
- self.data = data
-
- def xml_body(self):
- return [self.data]
-
-class mo(mx):
- translation = {'<': '&lt;', '>': '&gt;'}
- def xml_body(self):
- return [self.translation.get(self.data, self.data)]
-
-class mi(mx): pass
-class mn(mx): pass
-
-class msub(math):
- nchildren = 2
-
-class msup(math):
- nchildren = 2
-
-class msqrt(math):
- nchildren = 1
-
-class mroot(math):
- nchildren = 2
-
-class mfrac(math):
- nchildren = 2
-
-class msubsup(math):
- nchildren = 3
- def __init__(self, children=None, reversed=False):
- self.reversed = reversed
- math.__init__(self, children)
-
- def xml(self):
- if self.reversed:
-## self.children[1:3] = self.children[2:0:-1]
- self.children[1:3] = [self.children[2], self.children[1]]
- self.reversed = False
- return math.xml(self)
-
-class mfenced(math):
- translation = {'\\{': '{', '\\langle': u'\u2329',
- '\\}': '}', '\\rangle': u'\u232A',
- '.': ''}
- def __init__(self, par):
- self.openpar = par
- math.__init__(self)
-
- def xml_start(self):
- open = self.translation.get(self.openpar, self.openpar)
- close = self.translation.get(self.closepar, self.closepar)
- return ['<mfenced open="%s" close="%s">' % (open, close)]
-
-class mspace(math):
- nchildren = 0
-
-class mstyle(math):
- def __init__(self, children=None, nchildren=None, **kwargs):
- if nchildren is not None:
- self.nchildren = nchildren
- math.__init__(self, children)
- self.attrs = kwargs
-
- def xml_start(self):
- return ['<mstyle '] + ['%s="%s"' % item
- for item in self.attrs.items()] + ['>']
-
-class mover(math):
- nchildren = 2
- reversed = True
- def xml(self):
- if self.reversed:
- self.children.reverse()
- self.reversed = False
- return math.xml(self)
-
-class mtext(math):
- nchildren = 0
- def __init__(self, text):
- self.text = text
-
- def xml_body(self):
- return [self.text]
-
-
-over = {'tilde': '~',
- 'hat': '^',
- 'bar': '_',
- 'vec': u'\u20D7'}
-
-Greek = {
- # Upper case greek letters:
- 'Phi': u'\u03a6', 'Xi': u'\u039e', 'Sigma': u'\u03a3', 'Psi': u'\u03a8', 'Delta': u'\u0394', 'Theta': u'\u0398', 'Upsilon': u'\u03d2', 'Pi': u'\u03a0', 'Omega': u'\u03a9', 'Gamma': u'\u0393', 'Lambda': u'\u039b'}
-greek = {
- # Lower case greek letters:
- 'tau': u'\u03c4', 'phi': u'\u03d5', 'xi': u'\u03be', 'iota': u'\u03b9', 'epsilon': u'\u03f5', 'varrho': u'\u03f1', 'varsigma': u'\u03c2', 'beta': u'\u03b2', 'psi': u'\u03c8', 'rho': u'\u03c1', 'delta': u'\u03b4', 'alpha': u'\u03b1', 'zeta': u'\u03b6', 'omega': u'\u03c9', 'varepsilon': u'\u03b5', 'kappa': u'\u03ba', 'vartheta': u'\u03d1', 'chi': u'\u03c7', 'upsilon': u'\u03c5', 'sigma': u'\u03c3', 'varphi': u'\u03c6', 'varpi': u'\u03d6', 'mu': u'\u03bc', 'eta': u'\u03b7', 'theta': u'\u03b8', 'pi': u'\u03c0', 'varkappa': u'\u03f0', 'nu': u'\u03bd', 'gamma': u'\u03b3', 'lambda': u'\u03bb'}
-
-special = {
- # Binary operation symbols:
- 'wedge': u'\u2227', 'diamond': u'\u22c4', 'star': u'\u22c6', 'amalg': u'\u2a3f', 'ast': u'\u2217', 'odot': u'\u2299', 'triangleleft': u'\u25c1', 'bigtriangleup': u'\u25b3', 'ominus': u'\u2296', 'ddagger': u'\u2021', 'wr': u'\u2240', 'otimes': u'\u2297', 'sqcup': u'\u2294', 'oplus': u'\u2295', 'bigcirc': u'\u25cb', 'oslash': u'\u2298', 'sqcap': u'\u2293', 'bullet': u'\u2219', 'cup': u'\u222a', 'cdot': u'\u22c5', 'cap': u'\u2229', 'bigtriangledown': u'\u25bd', 'times': u'\xd7', 'setminus': u'\u2216', 'circ': u'\u2218', 'vee': u'\u2228', 'uplus': u'\u228e', 'mp': u'\u2213', 'dagger': u'\u2020', 'triangleright': u'\u25b7', 'div': u'\xf7', 'pm': u'\xb1',
- # Relation symbols:
- 'subset': u'\u2282', 'propto': u'\u221d', 'geq': u'\u2265', 'ge': u'\u2265', 'sqsubset': u'\u228f', 'Join': u'\u2a1d', 'frown': u'\u2322', 'models': u'\u22a7', 'supset': u'\u2283', 'in': u'\u2208', 'doteq': u'\u2250', 'dashv': u'\u22a3', 'gg': u'\u226b', 'leq': u'\u2264', 'succ': u'\u227b', 'vdash': u'\u22a2', 'cong': u'\u2245', 'simeq': u'\u2243', 'subseteq': u'\u2286', 'parallel': u'\u2225', 'equiv': u'\u2261', 'ni': u'\u220b', 'le': u'\u2264', 'approx': u'\u2248', 'precsim': u'\u227e', 'sqsupset': u'\u2290', 'll': u'\u226a', 'sqsupseteq': u'\u2292', 'mid': u'\u2223', 'prec': u'\u227a', 'succsim': u'\u227f', 'bowtie': u'\u22c8', 'perp': u'\u27c2', 'sqsubseteq': u'\u2291', 'asymp': u'\u224d', 'smile': u'\u2323', 'supseteq': u'\u2287', 'sim': u'\u223c', 'neq': u'\u2260',
- # Arrow symbols:
- 'searrow': u'\u2198', 'updownarrow': u'\u2195', 'Uparrow': u'\u21d1', 'longleftrightarrow': u'\u27f7', 'Leftarrow': u'\u21d0', 'longmapsto': u'\u27fc', 'Longleftarrow': u'\u27f8', 'nearrow': u'\u2197', 'hookleftarrow': u'\u21a9', 'downarrow': u'\u2193', 'Leftrightarrow': u'\u21d4', 'longrightarrow': u'\u27f6', 'rightharpoondown': u'\u21c1', 'longleftarrow': u'\u27f5', 'rightarrow': u'\u2192', 'Updownarrow': u'\u21d5', 'rightharpoonup': u'\u21c0', 'Longleftrightarrow': u'\u27fa', 'leftarrow': u'\u2190', 'mapsto': u'\u21a6', 'nwarrow': u'\u2196', 'uparrow': u'\u2191', 'leftharpoonup': u'\u21bc', 'leftharpoondown': u'\u21bd', 'Downarrow': u'\u21d3', 'leftrightarrow': u'\u2194', 'Longrightarrow': u'\u27f9', 'swarrow': u'\u2199', 'hookrightarrow': u'\u21aa', 'Rightarrow': u'\u21d2',
- # Miscellaneous symbold:
- 'infty': u'\u221e', 'surd': u'\u221a', 'partial': u'\u2202', 'ddots': u'\u22f1', 'exists': u'\u2203', 'flat': u'\u266d', 'diamondsuit': u'\u2662', 'wp': u'\u2118', 'spadesuit': u'\u2660', 'Re': u'\u211c', 'vdots': u'\u22ee', 'aleph': u'\u2135', 'clubsuit': u'\u2663', 'sharp': u'\u266f', 'angle': u'\u2220', 'prime': u'\u2032', 'natural': u'\u266e', 'ell': u'\u2113', 'neg': u'\xac', 'top': u'\u22a4', 'nabla': u'\u2207', 'bot': u'\u22a5', 'heartsuit': u'\u2661', 'cdots': u'\u22ef', 'Im': u'\u2111', 'forall': u'\u2200', 'imath': u'\u0131', 'hbar': u'\u210f', 'emptyset': u'\u2205',
- # Variable-sized symbols:
- 'bigotimes': u'\u2a02', 'coprod': u'\u2210', 'int': u'\u222b', 'sum': u'\u2211', 'bigodot': u'\u2a00', 'bigcup': u'\u22c3', 'biguplus': u'\u2a04', 'bigcap': u'\u22c2', 'bigoplus': u'\u2a01', 'oint': u'\u222e', 'bigvee': u'\u22c1', 'bigwedge': u'\u22c0', 'prod': u'\u220f',
- # Braces:
- 'langle': u'\u2329', 'rangle': u'\u232A'}
-
-functions = ['arccos', 'arcsin', 'arctan', 'arg', 'cos', 'cosh',
- 'cot', 'coth', 'csc', 'deg', 'det', 'dim',
- 'exp', 'gcd', 'hom', 'inf', 'ker', 'lg',
- 'lim', 'liminf', 'limsup', 'ln', 'log', 'max',
- 'min', 'Pr', 'sec', 'sin', 'sinh', 'sup',
- 'tan', 'tanh',
- 'injlim', 'varinjlim', 'varlimsup',
- 'projlim', 'varliminf', 'varprojlim']
-
-
-def parse_latex_math(string, inline=True):
- """parse_latex_math(string [,inline]) -> MathML-tree
-
- Returns a MathML-tree parsed from string. inline=True is for
- inline math and inline=False is for displayed math.
-
- tree is the whole tree and node is the current element."""
-
- # Normalize white-space:
- string = ' '.join(string.split())
-
- if inline:
- node = mrow()
- tree = node
- else:
- node = mtd()
- tree = mstyle(mtable(mtr(node)), displaystyle='true')
-
- while len(string) > 0:
- n = len(string)
- c = string[0]
- skip = 1 # number of characters consumed
- if n > 1:
- c2 = string[1]
- else:
- c2 = ''
-## print n, string, c, c2, node.__class__.__name__
- if c == ' ':
- pass
- elif c == '\\':
- if c2 in '{}':
- node = node.append(mo(c2))
- skip = 2
- elif c2 == ' ':
- node = node.append(mspace())
- skip = 2
- elif c2.isalpha():
- # We have a LaTeX-name:
- i = 2
- while i < n and string[i].isalpha():
- i += 1
- name = string[1:i]
- node, skip = handle_keyword(name, node, string[i:])
- skip += i
- elif c2 == '\\':
- # End of a row:
- entry = mtd()
- row = mtr(entry)
- node.close().close().append(row)
- node = entry
- skip = 2
- else:
- raise SyntaxError, 'Syntax error!'
- elif c.isalpha():
- node = node.append(mi(c))
- elif c.isdigit():
- node = node.append(mn(c))
- elif c in '+-/()[]|=<>,.':
- node = node.append(mo(c))
- elif c == '_':
- child = node.delete_child()
- if isinstance(child, msup):
- sub = msubsup(child.children[0:2], reversed=True)
- else:
- sub = msub(child)
- node.append(sub)
- node = sub
- elif c == '^':
- child = node.delete_child()
- if isinstance(child, msub):
- sup = msubsup(child.children[0:2])
- else:
- sup = msup(child)
- node.append(sup)
- node = sup
- elif c == '{':
- row = mrow()
- node.append(row)
- node = row
- elif c == '}':
- node = node.close()
- elif c == '&':
- entry = mtd()
- node.close().append(entry)
- node = entry
- else:
- raise SyntaxError, 'Syntax error!'
- string = string[skip:]
- return tree
-
-
-mathbb = {'A': u'\U0001D538',
- 'B': u'\U0001D539',
- 'C': u'\u2102',
- 'D': u'\U0001D53B',
- 'E': u'\U0001D53C',
- 'F': u'\U0001D53D',
- 'G': u'\U0001D53E',
- 'H': u'\u210D',
- 'I': u'\U0001D540',
- 'J': u'\U0001D541',
- 'K': u'\U0001D542',
- 'L': u'\U0001D543',
- 'M': u'\U0001D544',
- 'N': u'\u2115',
- 'O': u'\U0001D546',
- 'P': u'\u2119',
- 'Q': u'\u211A',
- 'R': u'\u211D',
- 'S': u'\U0001D54A',
- 'T': u'\U0001D54B',
- 'U': u'\U0001D54C',
- 'V': u'\U0001D54D',
- 'W': u'\U0001D54E',
- 'X': u'\U0001D54F',
- 'Y': u'\U0001D550',
- 'Z': u'\u2124'}
-
-negatables = {'=': u'\u2260',
- '\in': u'\u2209',
- '\equiv': u'\u2262'}
-
-
-def handle_keyword(name, node, string):
- skip = 0
- if len(string) > 0 and string[0] == ' ':
- string = string[1:]
- skip = 1
- if name == 'begin':
- if not string.startswith('{matrix}'):
- raise SyntaxError, 'Expected "\begin{matrix}"!'
- skip += 8
- entry = mtd()
- table = mtable(mtr(entry))
- node.append(table)
- node = entry
- elif name == 'end':
- if not string.startswith('{matrix}'):
- raise SyntaxError, 'Expected "\end{matrix}"!'
- skip += 8
- node = node.close().close().close()
- elif name == 'text':
- if string[0] != '{':
- raise SyntaxError, 'Expected "\text{...}"!'
- i = string.find('}')
- if i == -1:
- raise SyntaxError, 'Expected "\text{...}"!'
- node = node.append(mtext(string[1:i]))
- skip += i + 1
- elif name == 'sqrt':
- sqrt = msqrt()
- node.append(sqrt)
- node = sqrt
- elif name == 'frac':
- frac = mfrac()
- node.append(frac)
- node = frac
- elif name == 'left':
- for par in ['(', '[', '|', '\\{', '\\langle', '.']:
- if string.startswith(par):
- break
- else:
- raise SyntaxError, 'Missing left-brace!'
- fenced = mfenced(par)
- node.append(fenced)
- node = fenced
- skip += len(par)
- elif name == 'right':
- for par in [')', ']', '|', '\\}', '\\rangle', '.']:
- if string.startswith(par):
- break
- else:
- raise SyntaxError, 'Missing right-brace!'
- node.closepar = par
- node = node.close()
- skip += len(par)
- elif name == 'not':
- for operator in negatables:
- if string.startswith(operator):
- break
- else:
- raise SyntaxError, 'Expected something to negate: "\\not ..."!'
- node = node.append(mo(negatables[operator]))
- skip += len(operator)
- elif name == 'mathbf':
- style = mstyle(nchildren=1, fontweight='bold')
- node.append(style)
- node = style
- elif name == 'mathbb':
- if string[0] != '{' or not string[1].isupper() or string[2] != '}':
- raise SyntaxError, 'Expected something like "\mathbb{A}"!'
- node = node.append(mi(mathbb[string[1]]))
- skip += 3
- elif name in greek:
- node = node.append(mi(greek[name]))
- elif name in Greek:
- node = node.append(mo(Greek[name]))
- elif name in special:
- node = node.append(mo(special[name]))
- elif name in functions:
- node = node.append(mo(name))
- else:
- chr = over.get(name)
- if chr is not None:
- ovr = mover(mo(chr))
- node.append(ovr)
- node = ovr
- else:
- raise SyntaxError, 'Unknown LaTeX command: ' + name
-
- return node, skip
-
-
-description = ('Generates (X)HTML documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='html', description=description)
diff --git a/sandbox/lalo/lout_writer/README.txt b/sandbox/lalo/lout_writer/README.txt
deleted file mode 100644
index 67fd268b7..000000000
--- a/sandbox/lalo/lout_writer/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-Please explain requirements, purpose/goals, and usage.
diff --git a/sandbox/lalo/lout_writer/lout.py b/sandbox/lalo/lout_writer/lout.py
deleted file mode 100644
index c6fd084f9..000000000
--- a/sandbox/lalo/lout_writer/lout.py
+++ /dev/null
@@ -1,1304 +0,0 @@
-"""
-:Author: Lalo Martins
-:Contact: lalo@laranja.org
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-Lout document tree Writer. See http://lout.sf.net/
-"""
-
-__docformat__ = 'reStructuredText'
-
-# initial code based on copy-pastes from the latex and html writers.
-#
-# convention: deactivate code by two # e.g. ##.
-
-import sys
-import time
-import re
-import string
-from types import ListType
-from docutils import frontend, nodes, languages, writers
-
-try:
- True
-except NameError:
- True, False = 1, 0
-
-class Writer(writers.Writer):
-
- supported = ('lout', 'loutdoc', 'loutbook', 'loutreport')
- """Formats this writer supports."""
-
- settings_spec = (
- 'Lout-Specific Options',
- 'The Lout "--output-encoding" default is "latin-1:strict".',
- (('Specify document type. Default is "doc". '
- 'If you don\'t specify a setup file, the document type should '
- 'be the name of a system include file, which will be "@SysInclude"d '
- 'by Lout in the document header. If you specify a setup file, no '
- '@SysInclude will be generated, but you still must specify the '
- 'document type, because the writer will take some decisions based '
- 'on known document types (for example, "doc" has no titlepage). '
- 'Accepted values are "doc", "book" and "report".',
- ['--doctype'],
- {'default': 'doc', }),
- ('Specify a setup file. The file will be "@Includ"ed by Lout in '
- 'the document header. Default is no setup file (""). '
- 'See --doctype; overridden by --setupfile-path.',
- ['--setupfile'],
- {'default': '', 'metavar': '<file>'}),
- ('Specify a setupfile file, relative to the current working '
- 'directory. Overrides --setupfile; see also --doctype.',
- ['--setupfile-path'],
- {'metavar': '<file>'}),
- ('Let Lout print docutils document info in the title page.',
- ['--use-lout-docinfo'], #not implemented
- {'default': 0, 'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Insert "smart-quotes" (replace "foo" by ``foo\'\'). '
- 'Default: yes',
- ['--smart-quotes'],
- {'default': 1, 'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Do not insert "smart-quotes". ',
- ['--no-smart-quotes'],
- {'dest': 'smart_quotes', 'action': 'store_false',
- 'validator': frontend.validate_boolean}),
- ('Mark the first chapter as a preface. '
- 'Optionally, any non-titled text before the first chapter '
- 'is a preface - but then it cannot have sections. '
- '("book" doctype only)',
- ['--has-preface'],
- {'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Mark the first chapter as an introduction '
- '(or the second if the first is a preface) '
- '("book" doctype only)',
- ['--has-introduction'],
- {'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('The first level divisions are parts, not chapters. '
- '("book" doctype only)',
- ['--has-parts'],
- {'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Use dashes (Lout --). See dashes-regexp.',
- ['--use-dashes'],
- {'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Regular expression used to find dashes, if use-dashes is true. '
- 'Default: `(?<![\\w"{-])[-](?![\\w"}-])\'.',
- ['--dashes-regexp'],
- {'default': r'(?<![\w"{-])[-](?![\w"}-])', 'metavar': '<regexp>'}),
- ))
-
- settings_defaults = {'output_encoding': 'latin-1'}
- # FIXME: default doctype should depend on the writer name
-
- config_section = 'lout writer'
- config_section_dependencies = ('writers',)
-
- output = None
- """Final translated form of `document`."""
-
- def translate(self):
- visitor = LoutTranslator(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- self.body = visitor.body
-
-
-_language_names = {
- 'it': 'it',
- 'cs': 'cs',
- 'no': 'no',
- 'da': 'da',
- 'pl': 'pl',
- 'nl': 'nl',
- 'pt': 'pt',
- 'pt-br': 'pt-BR', # depends on patch to Lout, comment out if it breaks for you
- 'en': 'en',
- 'ru': 'ru',
- 'en-gb': 'en-GB',
- 'fi': 'fi',
- 'sl': 'sl',
- 'fr': 'fr',
- 'es': 'es',
- 'de': 'de',
- 'sv': 'sv',
- 'hu': 'hu',
- 'hr': 'Croatian',
- 'sk': 'Slovak',
- 'hsb': 'UpperSorbian',
-}
-
-def _get_language_name(lcode):
- lcode = lcode.lower()
- if _language_names.has_key(lcode):
- return _language_names[lcode]
- # support dialects
- l = lcode.split('-')[0]
- if _language_names.has_key(l):
- return _language_names[l]
- raise KeyError, 'Language %s not supported by Lout' % lcode
-
-_lout_header = '''
-# This document was generated automatically by the Python Docutils
-# package. It is not meant to be edited manually.
-# http://docutils.sourceforge.net/
-
-extend @BasicSetup @DocumentSetup
-
- def @SideBar
- right @Text
- {
- def @Send into { @ColTopPlace&&following }
- right x
- {
- x
- }
- @Send @CurveBox margin { 1m } paint { rgb 1 1 0.93 } @Text
- }
-''' # the @SideBar command
-
-_book_options = {
- 'title': '@Title',
- 'author': '@Author',
- 'version': '@Edition',
- 'organization': '@Publisher',
- 'beforetitlepage': '@BeforeTitlePage',
- 'ontitlepage': '@OnTitlePage',
- 'aftertitlepage': '@AfterTitlePage',
- 'copyright': '@AfterTitlePage',
- 'atend': '@AtEnd',
- 'initialfont': '@InitialFont',
- 'initialbreak': '@InitialBreak',
- 'initialspace': '@InitialSpace',
- 'initiallanguage': '@InitialLanguage',
- 'pageorientation': '@PageOrientation',
- 'pageheaders': '@PageHeaders',
- 'columnnumber': '@ColumnNumber',
- 'firstpagenumber': '@FirstPageNumber',
- 'introfirstpagenumber': '@IntroFirstPageNumber',
- 'optimizepages': '@OptimizePages',
- 'glossarytext': '@GlossaryText',
- 'indextext': '@IndexText',
- 'indexatext': '@IndexAText',
- 'indexbtext': '@IndexBText',
-}
-
-class LoutTranslator(nodes.NodeVisitor):
-
- """
- WRITEME
- """
- _special_chars = '#&/@^{|}~'
- words_and_spaces = re.compile(r'\S+| +|\n') # REMOVEME
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = settings = document.settings
- lcode = settings.language_code
- self.language = languages.get_language(lcode)
- self.language_name = _get_language_name(lcode)
- self.section_level = 0
- self.section_title = None
- self.section_commands = []
- self.section_nesting = 0
- self.section_nesting_stack = []
- self.body = []
- self.literal_block = self.literal = None
- self.in_dquote = None
- self.docinfo = {}
- self.doctype = self.settings.doctype.lower()
- if self.doctype == 'book':
- self.chapters = []
- self.parts = []
- self.preface = []
- self.introduction = []
- self.topic_class = ''
- self.kill_next_paragraph = False
- self.dashes_re = re.compile(settings.dashes_regexp)
-
- def astext(self):
- return ''.join(self.body)
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- # small complication: must encode " and \ at the same time
- if (not self.settings.smart_quotes) or self.literal_block or self.literal:
- newt = []
- for part in text.split('"'):
- newt.append(part.replace('\\', r'"\\"'))
- text = '"\\""'.join(newt)
- else:
- oldt = text.split('"')
- newt = [oldt[0].replace('\\', r'"\\"')]
- for part in range(1, len(oldt)):
- if oldt[part-1] and oldt[part-1][-1] == '\\':
- newt[-1] = oldt[part-1][:-1] + '"\\""'
- elif not (oldt[part-1] and oldt[part-1][-1].isalnum()):
- newt.append("``")
- self.in_dquote = 1
- elif self.in_dquote and not (oldt[part] and oldt[part][0].isalnum()):
- newt.append("''")
- self.in_dquote = 1
- else:
- newt.append('"\\""')
- newt.append(oldt[part].replace('\\', r'"\\"'))
- text = ''.join(newt)
- # special chars
- for c in self._special_chars:
- text = text.replace(c, '"%s"' % c)
- # Lout replaces -- and --- for wide dash characters - we don't want that
- newt = []
- for part in text.split('---'):
- newt.append(part.replace('--', '"--"'))
- text = '{@OneRow {- |2p {-} |2p -}}'.join(newt)
- # insert dashes, if requested
- # FIXME: have to document how this interacts with previous replacements
- if self.settings.use_dashes:
- text = self.dashes_re.sub('--', text)
- # done
- return text
-
- def attval(self, text, whitespace=re.compile('[\n\r\t\v\f]')):
- """REMOVEME"""
- return ''
-
- def starttag(self, node, tagname, suffix='\n', infix='', **attributes):
- """REMOVEME"""
- return '\n@CurveBox paint { red } { %s %s }\n' % (tagname,
- self.encode(repr(attributes)))
-
- def emptytag(self, node, tagname, suffix='\n', **attributes):
- """REMOVEME"""
- return ''
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_abbreviation(self, node):
- # @@@ implementation incomplete ("title" attribute)
- self.body.append(self.starttag(node, 'abbr', ''))
-
- def depart_abbreviation(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" abbr }\n')
-
- def visit_acronym(self, node):
- # @@@ implementation incomplete ("title" attribute)
- self.body.append(self.starttag(node, 'acronym', ''))
-
- def depart_acronym(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" acronym }\n')
-
- def visit_address(self, node):
- self.visit_docinfo_item(node, 'address', meta=None)
- self.body.append(self.starttag(node, 'pre', CLASS='address'))
-
- def depart_address(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" pre }\n')
- self.depart_docinfo_item()
-
- def visit_admonition(self, node, name=''):
- self.body.append(self.starttag(node, 'div',
- CLASS=(name or 'admonition')))
- if name:
- self.body.append('\n@CurveBox paint { red } { p class="admonition-title" }\n'
- + self.language.labels[name] + '\n@CurveBox paint { red } { "/" p }\n')
-
- def depart_admonition(self, node=None):
- self.body.append('\n@CurveBox paint { red } { "/" div }\n')
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- attribution_formats = {'dash': ('&mdash;', ''),
- 'parentheses': ('(', ')'),
- 'parens': ('(', ')'),
- 'none': ('', '')}
-
- def visit_attribution(self, node):
- pass
-
- def depart_attribution(self, node):
- pass
-
- def visit_author(self, node):
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- self.body.append('\n@QuotedDisplay {\n')
- self.kill_next_paragraph = True
-
- def depart_block_quote(self, node):
- self.body.append('\n}\n')
-
- def visit_bullet_list(self, node):
- if self.topic_class == 'contents':
- # we let Lout generate contents, thank you sir
- raise nodes.SkipNode
- self.body.append('\n@')
- if self.kill_next_paragraph:
- self.kill_next_paragraph = False
- self.body.append('Raw')
- self.body.append('BulletList\n')
-
- def depart_bullet_list(self, node):
- self.body.append('\n@RawEndList\n')
-
- def visit_caption(self, node):
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" p }\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.body.append('\n@CurveBox paint { red } { colgroup }@CurveBox paint { red } { col class="label" "/" }@CurveBox paint { red } { col "/" }@CurveBox paint { red } { "/" colgroup }\n'
- '\n@CurveBox paint { red } { col "/" }\n'
- '\n@CurveBox paint { red } { tbody valign="top" }\n'
- '\n@CurveBox paint { red } { tr }\n')
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" td }@CurveBox paint { red } { "/" tr }\n'
- '\n@CurveBox paint { red } { "/" tbody }\n@CurveBox paint { red } { "/" table }\n')
-
- def visit_citation_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- self.body.append(']@CurveBox paint { red } { "/" a }\n')
-
- def visit_classifier(self, node):
- self.body.append(' @CurveBox paint { red } { span class="classifier-delimiter" }:@CurveBox paint { red } { "/" span } ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" span }\n')
-
- def visit_colspec(self, node):
- raise nodes.SkipNode
-
- def depart_colspec(self, node):
- pass
-
- def visit_comment(self, node):
- for line in node.astext().split('\n'):
- self.body.append('# %s\n' % line)
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- self.visit_docinfo_item(node, 'contact', meta=None)
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- self.body.append(' { ')
- self.kill_next_paragraph = True
-
- def depart_definition(self, node):
- self.body.append(' }\n')
-
- def visit_definition_list(self, node):
- self.body.append('\n@')
- if self.kill_next_paragraph:
- self.kill_next_paragraph = False
- self.body.append('Raw')
- self.body.append('TaggedList\n')
-
- def depart_definition_list(self, node):
- self.body.append('\n@RawEndList\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- self.body.append(self.starttag(node, 'td', ''))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_description(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" td }\n')
-
- def visit_docinfo(self, node):
- pass
-
- def depart_docinfo(self, node):
- pass
-
- def visit_docinfo_item(self, node, name, meta=1):
- if self.docinfo.get(name):
- self.docinfo[name] = ', '.join((self.docinfo[name], node.astext()))
- else:
- self.docinfo[name] = node.astext()
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'tr', ''))
- self.body.append('\n@CurveBox paint { red } { th class="docinfo-name" }%s:@CurveBox paint { red } { "/" th }\n@CurveBox paint { red } { td }\n'
- % self.language.labels[name])
- if len(node):
- if isinstance(node[0], nodes.Element):
- node[0].set_class('first')
- if isinstance(node[-1], nodes.Element):
- node[-1].set_class('last')
-
- def depart_docinfo_item(self):
- return
- self.body.append('\n@CurveBox paint { red } { "/" td }@CurveBox paint { red } { "/" tr }\n')
-
- def visit_doctest_block(self, node):
- self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
- def depart_doctest_block(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" pre }\n')
-
- def visit_document(self, node):
- if self.doctype == 'report':
- raise NotImplemented
- pass
-
- def depart_document(self, node):
- if self.doctype == 'doc':
- # FIXME: add docinfo as a table?
- self.body.insert(0, "@SysInclude { doc }\n")
- self.body.insert(1, "@Doc @Text @Begin\n")
- self.body.append("\n@End @Text\n")
- elif self.doctype == 'book':
- # FIXME: add docinfo
- self.body = ["@SysInclude { book }\n",
- "@Book\n"
- " @InitialLanguage { %s }\n"
- % self.language_name]
- extra_docinfo = []
- if self.docinfo.has_key('subtitle'):
- title = self.encode(self.docinfo.get('title', ''))
- subt = self.encode(self.docinfo['subtitle'])
- del self.docinfo['title'], self.docinfo['subtitle']
- self.body.append(" @Title {\n%s\n@LLP\n-6p @Font @II { %s }\n}\n" % (
- title, subt))
- for name, value in self.docinfo.items():
- key = name.lower()
- if key in _book_options.keys():
- self.body.append(" %s { %s }\n" % (_book_options[key],
- self.encode(value)))
- else:
- if name == key:
- name = name.capitalize()
- extra_docinfo.append('%s: %s' % (name, self.encode(value)))
- if extra_docinfo:
- if not self.docinfo.has_key('beforetitlepage'):
- self.body.append(" @BeforeTitlePage { %s }\n" % ('\n'.join(extra_docinfo)))
- elif not self.docinfo.has_key('aftertitlepage'):
- self.body.append(" @AfterTitlePage { %s }\n" % ('\n'.join(extra_docinfo)))
- self.body.append("//\n")
- if self.preface:
- self.body.extend(self.preface)
- if self.introduction:
- self.body.extend(self.introduction)
- if self.settings.has_parts:
- for part in self.parts:
- for chapter in part:
- self.body.extend(chapter)
- else:
- for chapter in self.chapters:
- self.body.extend(chapter)
- elif self.doctype == 'report':
- raise NotImplemented
- if self.settings.setupfile_path or self.settings.setupfile:
- if self.settings.setupfile_path:
- name = self.settings.setupfile_path
- else:
- name = self.settings.setupfile
- self.body[0] = '@Include { "%s" }\n' % name
- else:
- self.body.insert(0, '@SysInclude { tbl }\n')
- self.body.insert(1, _lout_header)
-
- def visit_emphasis(self, node):
- self.body.append('@II { ')
-
- def depart_emphasis(self, node):
- self.body.append(' }')
-
- def visit_entry(self, node):
- letter = chr(node.parent.index(node) + 65)
- self.body.append('%s { ' % letter)
- if isinstance(node.parent.parent, nodes.thead):
- self.body.append('@Heading { ')
- self.kill_next_paragraph = True
- return
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, '', **atts))
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
- else:
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_entry(self, node):
- if isinstance(node.parent.parent, nodes.thead):
- self.body.append(' }')
- self.body.append(' }\n')
-
- def visit_enumerated_list(self, node):
- self.body.append('\n@')
- if self.kill_next_paragraph:
- self.kill_next_paragraph = False
- self.body.append('Raw')
- if node.get('prefix', '') == '(' and node.get('suffix', '') == ')':
- self.body.append('Paren')
- if not node.has_key('enumtype'):
- self.body.append('NumberedList\n')
- elif node['enumtype'] == 'arabic':
- self.body.append('NumberedList\n')
- elif node['enumtype'] == 'loweralpha':
- self.body.append('AlphaList\n')
- elif node['enumtype'] == 'upperalpha':
- self.body.append('UCAlphaList\n')
- elif node['enumtype'] == 'lowerroman':
- self.body.append('RomanList\n')
- elif node['enumtype'] == 'upperroman':
- self.body.append('UCRomanList\n')
- if node.has_key('start'):
- self.body.append(' start { %s }\n' % node['start'])
-
- def depart_enumerated_list(self, node):
- self.body.append('\n@RawEndList\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- if isinstance(node.parent, nodes.docinfo):
- self.docinfo[node[0].astext()] = node[1].astext()
- raise nodes.SkipNode
-
- def depart_field(self, node):
- pass
-
- def visit_field_body(self, node):
- self.body.append(' { ')
- self.kill_next_paragraph = True
-
- def depart_field_body(self, node):
- self.body.append(' }\n')
-
- def visit_field_list(self, node):
- self.body.append('\n@')
- if self.kill_next_paragraph:
- self.kill_next_paragraph = False
- self.body.append('Raw')
- self.body.append('WideTaggedList\n')
- return
-
- def depart_field_list(self, node):
- self.body.append('\n@RawEndList\n')
-
- def visit_field_name(self, node):
- if len(node.astext()) > 7:
- self.body.append('@DropTagItem { ')
- else:
- self.body.append('@TagItem { ')
-
- def depart_field_name(self, node):
- self.body.append(' }')
-
- def visit_figure(self, node):
- atts = {'class': 'figure'}
- if node.get('width'):
- atts['style'] = 'width: %spx' % node['width']
- self.body.append(self.starttag(node, 'div', **atts))
-
- def depart_figure(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" div }\n')
-
- def visit_footer(self, node):
- pass
-
- def depart_footer(self, node):
- footer = (['\n@CurveBox paint { red } { hr class="footer" "/" }\n',
- self.starttag(node, 'div', CLASS='footer')]
- + self.body[start:] + ['\n@CurveBox paint { red } { "/" div }\n'])
- self.body_suffix[:0] = footer
- del self.body[start:]
-
- def visit_footnote(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='footnote',
- frame="void", rules="none"))
- self.body.append('\n@CurveBox paint { red } { colgroup }@CurveBox paint { red } { col class="label" "/" }@CurveBox paint { red } { col "/" }@CurveBox paint { red } { "/" colgroup }\n'
- '\n@CurveBox paint { red } { tbody valign="top" }\n'
- '\n@CurveBox paint { red } { tr }\n')
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- pass
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('\n@CurveBox paint { red } { a class="fn-backref" href="#%s" }%s@CurveBox paint { red } { "/" a }\n'
- % (backref, i))
- i += 1
-
- def depart_footnote(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" td }@CurveBox paint { red } { "/" tr }\n'
- '\n@CurveBox paint { red } { "/" tbody }\n@CurveBox paint { red } { "/" table }\n')
-
- def visit_footnote_reference(self, node):
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- elif format == 'superscript':
- suffix = '\n@CurveBox paint { red } { sup }\n'
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.body.append(self.starttag(node, 'a', suffix, href=href,
- CLASS='footnote-reference'))
-
- def depart_footnote_reference(self, node):
- pass
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- pass
-
- def depart_header(self, node):
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('\n@CurveBox paint { red } { hr "/" }\n@CurveBox paint { red } { "/" div }\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- atts = node.attributes.copy()
- if atts.has_key('class'):
- del atts['class'] # prevent duplication with node attrs
- atts['src'] = atts['uri']
- del atts['uri']
- if not atts.has_key('alt'):
- atts['alt'] = atts['src']
- if isinstance(node.parent, nodes.TextElement):
- pass
- else:
- if atts.has_key('align'):
- self.body.append('\n@CurveBox paint { red } { p align="%s" }\n' %
- (self.attval(atts['align'],)))
- else:
- self.body.append('\n@CurveBox paint { red } { p }\n')
- self.body.append(self.emptytag(node, 'img', '', **atts))
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_inline(self, node):
- self.body.append(self.starttag(node, 'span', ''))
-
- def depart_inline(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" span }\n')
-
- def visit_label(self, node):
- pass
-
- def depart_label(self, node):
- pass
-
- def visit_legend(self, node):
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" div }\n')
-
- def visit_line_block(self, node):
- self.body.append(self.starttag(node, 'pre', CLASS='line-block'))
-
- def depart_line_block(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" pre }\n')
-
- def visit_list_item(self, node):
- self.body.append('\n@ListItem { ')
- self.kill_next_paragraph = True
-
- def depart_list_item(self, node):
- self.body.append(' }\n')
-
- def visit_literal(self, node):
- """Process text to prevent tokens from wrapping."""
- self.body.append(self.starttag(node, 'tt', '', CLASS='literal'))
- text = node.astext()
- for token in self.words_and_spaces.findall(text):
- if token.strip():
- # Protect text like "--an-option" from bad line wrapping:
- self.body.append('\n@CurveBox paint { red } { span class="pre" }%s@CurveBox paint { red } { "/" span }\n'
- % self.encode(token))
- elif token in ('\n', ' '):
- # Allow breaks at whitespace:
- self.body.append(token)
- else:
- # Protect runs of multiple spaces; the last space can wrap:
- self.body.append('&nbsp;' * (len(token) - 1) + ' ')
- self.body.append('\n@CurveBox paint { red } { "/" tt }\n')
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_literal_block(self, node):
- self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
-
- def depart_literal_block(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" pre }\n')
-
- def visit_meta(self, node):
- pass
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- pass
-
- def depart_option(self, node):
- pass
-
- def visit_option_argument(self, node):
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" var }\n')
-
- def visit_option_group(self, node):
- atts = {}
- if len(node.astext()) > 10:
- atts['colspan'] = 2
- self.body.append(self.starttag(node, 'td', **atts))
- self.body.append('\n@CurveBox paint { red } { kbd }\n')
-
- def depart_option_group(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" kbd }@CurveBox paint { red } { "/" td }\n')
-
- def visit_option_list(self, node):
- self.body.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none"))
- self.body.append('\n@CurveBox paint { red } { col class="option" "/" }\n'
- '\n@CurveBox paint { red } { col class="description" "/" }\n'
- '\n@CurveBox paint { red } { tbody valign="top" }\n')
-
- def depart_option_list(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" tbody }\n@CurveBox paint { red } { "/" table }\n')
- #self.kill_next_paragraph = True
-
- def visit_option_list_item(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" tr }\n')
-
- def visit_option_string(self, node):
- self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" span }\n')
-
- def visit_organization(self, node):
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- if self.kill_next_paragraph:
- self.kill_next_paragraph = False
- else:
- self.body.append('\n@PP\n')
-
- def depart_paragraph(self, node):
- pass
-
- def visit_problematic(self, node):
- if node.hasattr('refid'):
- self.body.append('\n@CurveBox paint { red } { a href="#%s" name="%s" }\n' % (node['refid'],
- node['id']))
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" span }\n')
-
- def visit_raw(self, node):
- if node.get('format') == 'lout':
- self.body.extend(['\n', node.astext(), '\n'])
- # Keep non-Lout raw text out of output:
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- if node.has_key('refuri'):
- self.body.append('{"%s"} @ExternalLink { ' % node['refuri'])
- return
- elif node.has_key('refid'):
- href = node['refid']
- elif node.has_key('refname'):
- href = node['refid'] = self.document.nameids[node['refname']]
- self.body.append('%s @CrossLink { ' % href)
-
- def depart_reference(self, node):
- if node.has_key('refid'):
- # FIXME should be a setting
- self.body.append(' (p. @PageOf {%s})' % node['refid'])
- self.body.append(' }')
-
- def visit_revision(self, node):
- self.visit_docinfo_item(node, 'revision', meta=None)
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- self.body.append('@Row format { ')
- col = 65
- for child in node:
- # FIXME: support spans
- self.body.append('@Cell %s' % chr(col))
- self.body.append(' | ')
- col += 1
- self.body[-1] = ' }\n'
-
- def depart_row(self, node):
- pass
-
- def visit_rubric(self, node):
- # red perhaps?
- self.body.append('@RightDisplay @I {')
-
-
- def depart_rubric(self, node):
- self.body.append('}\n')
- self.kill_next_paragraph = True
-
- def visit_section(self, node):
- #print 'visit section level', self.section_level, node.__dict__
- self.section_level += 1
- if self.doctype == 'doc':
- pass
- elif self.doctype == 'book':
- if self.section_level == 1:
- if not (self.chapters or self.parts):
- # first one
- if self.body and not (self.preface or self.introduction):
- # text before first chapter is always a preface
- self.body.insert(0, '@Preface\n'
- '@Begin\n')
- self.body.append('\n@End @Preface\n')
- self.preface = self.body
- self.body = []
- # don't return, as we're actually starting the *next* chapter
- # after the preface
- elif self.settings.has_preface and not self.preface:
- self.body = self.preface = [
- '@Preface\n'
- ' @Title { ',
- '', # title placeholder
- ' }\n'
- '@Begin\n']
- self.section_commands.append('@Preface')
- self.section_title = 1
- return
- if self.settings.has_introduction and not self.introduction:
- self.body = self.introduction = [
- '\n@Introduction\n'
- ' @Title { ',
- '', # title placeholder
- ' }\n'
- '@Begin\n']
- self.section_commands.append('@Introduction')
- self.section_title = 1
- return
- # no, it's actually a chapter or part
- self.body = []
- self.chapters.append(self.body)
- if self.settings.has_parts:
- self.body.extend([0, ''])
- self.section_title = 1
- self.parts.append(self.chapters)
- elif self.settings.has_parts:
- # new part (not first)
- self.body = [0, '']
- self.section_title = 1
- self.chapters = [self.body]
- self.parts.append(self.chapters)
- level = self.section_level
- extra = ''
- if self.settings.has_parts:
- level -= 1
- if level > 1 and (self.body is self.introduction or self.body is self.preface):
- # prefaces and introductions have no sections (why?)
- # IMPROVEME: perhaps allow two or three different levels?
- self.body.extend(['\n@Display @Heading { ',
- '', # title placeholder
- ' }\n'])
- self.section_title = len(self.body) - 2
- self.section_commands.append(None)
- # reset state stuff that may be left over
- self.kill_next_paragraph = True
- return
- if level == 1: # chapter
- if self.body and type(self.body[0]) is type(0): # first real chapter in a part
- del self.chapters[0] # we don't want it on the output
- del self.body[0] # delete the marker too
- ptitle = self.body.pop(0)
- if self.body and self.body[0] == '\n@PP\n': # always is
- del self.body[0]
- ptext = ''.join(self.body).strip()
- extra = ' @PartTitle { %s }\n' % self.encode(ptitle)
- if ptext:
- extra += '\n @PartText {\n%s\n}\n' % ptext
- self.body = []
- self.chapters.append(self.body)
- self.section_commands.append('@Chapter')
- elif level == 2:
- self.section_commands.append('@Section')
- elif level == 3:
- self.section_commands.append('@SubSection')
- elif level == 4:
- self.section_commands.append('@SubSubSection')
- if 0 < level <= 4:
- if level > 1 and self.section_nesting < self.section_level:
- self.section_nesting_stack.append((self.section_nesting,
- self.section_commands[-1][1:]))
- self.body.append('\n@Begin%ss\n' % self.section_nesting_stack[-1][1])
- self.section_nesting = self.section_level
- self.body.append('\n%s @Title { ' % self.section_commands[-1])
- self.section_title = len(self.body)
- self.body.extend(['', ' }\n'])
- if node.hasattr('id'):
- self.body.append(' @Tag { %s }\n' % node['id'])
- if extra:
- self.body.append(extra)
- self.body.append('@Begin\n')
- elif level > 4: # unsupported level, let's cheat
- # IMPROVEME: perhaps allow two or three different levels?
- self.body.extend(['\n@Display @Heading { ',
- '', # title placeholder
- ' }\n'])
- self.section_title = len(self.body) - 2
- self.section_commands.append(None)
- self.kill_next_paragraph = True
- return
- # reset state stuff that may be left over
- self.kill_next_paragraph = False
-
- def depart_section(self, node):
- while self.section_nesting > self.section_level:
- self.section_nesting, cmd = self.section_nesting_stack.pop()
- self.body.append('\n@End%ss\n' % cmd)
- self.section_level -= 1
- if self.section_commands:
- cmd = self.section_commands.pop()
- if cmd:
- self.body.append('\n@End %s\n' % cmd)
-
- def visit_sidebar(self, node):
- self.body.append('\n@SideBar { ')
- self.in_sidebar = 1
- self.kill_next_paragraph = False
-
- def depart_sidebar(self, node):
- self.body.append(' }\n')
- self.in_sidebar = None
-
- def visit_status(self, node):
- self.visit_docinfo_item(node, 'status', meta=None)
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- self.body.append('@B { ')
-
- def depart_strong(self, node):
- self.body.append(' }')
-
- def visit_subscript(self, node):
- self.body.append(self.starttag(node, 'sub', ''))
-
- def depart_subscript(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" sub }\n')
-
- def visit_substitution_definition(self, node):
- """Internal only."""
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- if isinstance(node.parent, nodes.sidebar):
- self.body.append('@LLP @RawCentredDisplay @I { ')
- else:
- self.docinfo['subtitle'] = node.astext()
- raise nodes.SkipNode
-
- def depart_subtitle(self, node):
- self.body.append(' }\n')
-
- def visit_superscript(self, node):
- self.body.append(self.starttag(node, 'sup', ''))
-
- def depart_superscript(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" sup }\n')
-
- def visit_system_message(self, node):
- if node['level'] < self.document.reporter['writer'].report_level:
- # Level is too low to display:
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'div', CLASS='system-message'))
- #self.body.append('\n@CurveBox paint { red } { p class="system-message-title" }\n')
- attr = {}
- backref_text = ''
- if node.hasattr('id'):
- attr['name'] = node['id']
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- backref_text = ('; @CurveBox paint { red } { : backlink }\n'
- % backrefs[0])
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('\n@CurveBox paint { red } { -> %s %s }\n' % (backref, i))
- i += 1
- backref_text = ('; @CurveBox paint { red } { -> %s }\n'
- % ', '.join(backlinks))
- if node.hasattr('line'):
- line = ', line %s' % node['line']
- else:
- line = ''
- if attr:
- a_start = self.starttag({}, 'a', '', **attr)
- a_end = '\n@CurveBox paint { red } { "/" a }\n'
- else:
- a_start = a_end = ''
- self.body.append('System Message: %s%s/%s%s (%s %s)%s\n'
- % (a_start, node['type'], node['level'], a_end,
- self.encode(node['source']), line, backref_text))
-
- def depart_system_message(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" div }\n')
-
- def visit_table(self, node):
- self.body.append('\n@Display @Tbl\n')
- if node.get('class', '') != 'norules':
- self.body.append(' rule { yes }\n')
- self.body.append('{\n')
-
- def depart_table(self, node):
- self.body.append('\n}\n')
- self.kill_next_paragraph = True
-
- def visit_target(self, node):
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- self.body.append(' @PageMark { %s } ' % node.parent['id'])
-
- def depart_target(self, node):
- pass
-
- def visit_tbody(self, node):
- pass
-
- def depart_tbody(self, node):
- pass
-
- def visit_term(self, node):
- if len(node.astext()) > 3:
- self.body.append('\n@DropTagItem { ')
- else:
- self.body.append('\n@TagItem { ')
-
- def depart_term(self, node):
- self.body.append(' }\n')
-
- def visit_tgroup(self, node):
- pass
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- pass
-
- def depart_thead(self, node):
- pass
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- # there is a limited number of title levels in Lout;
- # worse, the number (and the commands, in fact) depends
- # on the doctype
- check_id = 0
- if isinstance(node.parent, nodes.topic):
- self.body.append(
- self.starttag(node, 'p', '', CLASS='topic-title'))
- check_id = 1
- elif isinstance(node.parent, nodes.sidebar):
- self.body.append('@RawDisplay @Heading { ')
- check_id = 1
- elif isinstance(node.parent, nodes.admonition):
- self.body.append(
- self.starttag(node, 'p', '', CLASS='admonition-title'))
- check_id = 1
- else:
- if self.section_level == 0: # book title
- self.docinfo['title'] = node.astext()
- else: # regular title, handled in visit_section
- self.body[self.section_title] = self.encode(node.astext())
- raise nodes.SkipNode
- if check_id:
- if node.parent.hasattr('id'):
- self.body.append('@PageMark { %s }\n' % node.parent['id'])
-
- def depart_title(self, node):
- if (isinstance(node.parent, nodes.sidebar)):
- self.body.append(' }\n')
-
- def visit_title_reference(self, node):
- self.body.append(self.starttag(node, 'cite', ''))
-
- def depart_title_reference(self, node):
- self.body.append('\n@CurveBox paint { red } { "/" cite }\n')
-
- def visit_topic(self, node):
- self.topic_class = node.get('class')
- if self.topic_class == 'contents':
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'div', CLASS='topic'))
-
- def depart_topic(self, node):
- if self.topic_class != 'contents':
- self.body.append('\n@CurveBox paint { red } { "/" div }\n')
- self.topic_class = ''
-
- def visit_transition(self, node):
- self.body.append('\n@LP @FullWidthRule @PP\n')
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- self.visit_docinfo_item(node, 'version', meta=None)
-
- def depart_version(self, node):
- self.depart_docinfo_item()
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
diff --git a/sandbox/lalo/lout_writer/setup.py b/sandbox/lalo/lout_writer/setup.py
deleted file mode 100644
index dcb608868..000000000
--- a/sandbox/lalo/lout_writer/setup.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Use Distutils to install the component
-# code and tools/ files into the right
-# places in Docutils.
diff --git a/sandbox/lalo/lout_writer/tools/rst2lout.py b/sandbox/lalo/lout_writer/tools/rst2lout.py
deleted file mode 100755
index c2f3ac5a0..000000000
--- a/sandbox/lalo/lout_writer/tools/rst2lout.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Lalo Martins
-# Contact: lalo@laranja.org
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing Lout.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates Lout documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='lout', description=description)
diff --git a/sandbox/mly/restblog/Makefile b/sandbox/mly/restblog/Makefile
deleted file mode 100755
index d3403e589..000000000
--- a/sandbox/mly/restblog/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-DOCUTILTOOLPATH = /home/mly/palanga/python/docutils/docutils/tools/
-HTML = $(DOCUTILTOOLPATH)html.py
-MAIN_INDEX = ./main_index.py
-DATE_INDEX = ./date_index.py
-SUBJ_INDEX = ./subj_index.py
-KEYW_INDEX = ./keyw_index.py
-
-.SUFFIXES: .html .txt
-
-blogs := $(patsubst %.txt,%.html,$(wildcard *.txt))
-
-all: $(blogs) index.html date_index.html subject_index.html keyword_index.html
-
-index.html: $(blogs)
- $(MAIN_INDEX)
-
-date_index.html: $(blogs)
- $(DATE_INDEX)
-
-subject_index.html: $(blogs)
- $(SUBJ_INDEX)
-
-keyword_index.html: $(blogs)
- $(KEYW_INDEX)
-
-# --trim-footnote-reference-space ersätter --snap... och funkar även i
-# HTML
-
-.txt.html:
- $(HTML) -len -o iso-8859-1 $< > $@
-
-install:
- scp *.html default.css thinkwar@thinkware.se:/home/t/thinkwar/www/home/magnus/blog/
-
-clean:
- rm *~ *.html
diff --git a/sandbox/mly/restblog/README.txt b/sandbox/mly/restblog/README.txt
deleted file mode 100755
index 132c2272c..000000000
--- a/sandbox/mly/restblog/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is just a very early start of a web log
-system. No documentation yet. Mail me for more
-info:
-
- magnus@thinkware.se
diff --git a/sandbox/mly/restblog/date_index.py b/sandbox/mly/restblog/date_index.py
deleted file mode 100755
index f430fb08f..000000000
--- a/sandbox/mly/restblog/date_index.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/python -tt
-
-# date_index.py
-#
-# Create chronological index for reStructuredBlog
-#
-# (C) Magnus Lyckå, Thinkware AB, 2003
-
-import glob, restblog
-import cPickle as pickle
-
-IX_FILE_NAME = 'date_index.dat'
-
-try:
- db = pickle.load(file(IX_FILE_NAME))
-except:
- db = {'filenames':[], 'index':[]}
-
-for fn in glob.glob(restblog.source_pattern):
- if not fn in db['filenames']:
- db['filenames'].append(fn)
- meta = restblog.Metadata(fn)
- db['index'].append((meta.timestamp(),
- meta.targetname(),
- meta.subject()))
-db['index'].sort()
-db['index'].reverse()
-pickle.dump(db, file(IX_FILE_NAME, 'w'))
-
-body = ['Index By Date\n--------------------\n\n']
-oldMonthYear = ''
-for ts, fn, subj in db['index']:
- monthYear = ts.strftime('%B %Y')
- if monthYear != oldMonthYear:
- body.append("\n\n%s\n.............................\n\n" % monthYear)
- oldMonthYear = monthYear
- body.append("* `%s %s`__\n\n__ %s\n" % (
- ts.strftime('%Y-%m-%d %H:%M'), subj, fn))
-restblog.makepage('date_index', "\n".join(body))
diff --git a/sandbox/mly/restblog/default.css b/sandbox/mly/restblog/default.css
deleted file mode 100755
index f396362af..000000000
--- a/sandbox/mly/restblog/default.css
+++ /dev/null
@@ -1,43 +0,0 @@
-body {color: #600; background-color: #fed;
- margin-left: 10%; margin-right: 10%;
- text-align: left;
- font-family: Verdana, Arial, sans-serif}
-/*p { text-indent: 2em; margin-top: 0; margin-bottom: 0; }*/
-.title, .subtitle {text-align: center}
-h1, h2, h3, h4, h5, h5 {font-family: Times, Times-New, Serif;}
-pre.address {font-family: Verdana, Arial, sans-serif}
-table{margin-top: 1em; margin-bottom: 1em}
-table.table {text-align: center}
-table.field-list{margin-top: 0.3em; margin-bottom: 0.3em}
-.topic-title {margin-top: 1em}
-tr {text-align: left}
-th {text-align: left}
-td {text-align: left}
-dt {font-weight: bold; margin-top: 0.5em; margin-bottom: 0.2em}
-dd p {margin-top: 0em}
-dl, ol, ul {margin-top: 0.3em}
-blockquote.last {margin-top: 0em}
-.literal-block {color: #006; background-color: #def;
- font-family: courier, monospace}
-.literal {color: #006 ; font-family: courier, monospace}
-.literal-block {margin-left: 10%; margin-right: 10%;
- padding: 1ex}
-div.document {
- float:left;
- width:70%;
- background:#ffe;
- border:2px solid #630;
- margin:5px;
- padding:10px;
-}
-
-hr.footer { float:left; width:0%; height:0%}
-
-div.footer {
- float:right;
- width:20%;
- background:#cfc;
- border:2px solid #630;
- margin:5px;
- padding:10px;
-}
diff --git a/sandbox/mly/restblog/keyw_index.py b/sandbox/mly/restblog/keyw_index.py
deleted file mode 100755
index 34261a721..000000000
--- a/sandbox/mly/restblog/keyw_index.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/python
-
-pass
diff --git a/sandbox/mly/restblog/main_index.py b/sandbox/mly/restblog/main_index.py
deleted file mode 100755
index ed1b68cea..000000000
--- a/sandbox/mly/restblog/main_index.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/python -tt
-
-# main_index.py
-#
-# Create main index for reStructuredBlog
-#
-# (C) Magnus Lyckå, Thinkware AB, 2003
-
-import glob, restblog
-import cPickle as pickle
-
-BLOGS_TO_SHOW = 5
-
-db = []
-for fn in glob.glob(restblog.source_pattern):
- meta = restblog.Metadata(fn)
- db.append((meta.timestamp(), fn))
-
-db.sort()
-db.reverse()
-
-name = "Magnus Lyckå's Web Log".decode('latin1')
-body = ['%s\n%s' % (name, '-'*len(name))]
-body.append('*Here are my latest web logs*')
-for ts, fn in db[:5]:
- body.append("-----\n\n*%s*" % ts.strftime('%Y-%m-%d %H:%M'))
- body.append(".. include:: %s" % fn)
-restblog.makepage('index', "\n\n".join(body))
diff --git a/sandbox/mly/restblog/restblog.py b/sandbox/mly/restblog/restblog.py
deleted file mode 100755
index 3c7862de5..000000000
--- a/sandbox/mly/restblog/restblog.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/python -tt
-
-# restblog.py
-#
-# Base functions for reStructuredBlog
-#
-# (C) Magnus Lyckå, Thinkware AB, 2003
-import mx.DateTime, locale, os
-locale.setlocale(locale.LC_ALL, 'C') # I want English month names etc
-from docutils.core import publish_string, default_description
-
-source_pattern = 'blog*.txt'
-timestamp_format = '%Y-%m-%d %H:%M'
-
-class Metadata:
- def __init__(self, fn):
- self.fn = fn
-
- def timestamp(self):
- return mx.DateTime.localtime(os.stat(self.fn)[-2])
-
- def subject(self):
- return file(self.fn).readline().strip()
-
- def targetname(self):
- return self.fn[:-3]+'html'
-
-def makepage(fn, text):
- #text = ('<html><head><title>%s</title><head>\n'
- # '<body>%s</body></html>')
- #file(fn+'.html', 'w').write(text % (title, body))
- file(fn+'.html', 'w').write(publish_string(text, writer_name='html'))
diff --git a/sandbox/mly/restblog/subj_index.py b/sandbox/mly/restblog/subj_index.py
deleted file mode 100755
index 34261a721..000000000
--- a/sandbox/mly/restblog/subj_index.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/python
-
-pass
diff --git a/sandbox/mmgilbe/rst.py b/sandbox/mmgilbe/rst.py
deleted file mode 100644
index b2ad961c6..000000000
--- a/sandbox/mmgilbe/rst.py
+++ /dev/null
@@ -1,497 +0,0 @@
-# -*- coding: iso-8859-1 -*-
-"""
- MoinMoin - ReStructured Text Parser
-
- @copyright: 2004 by Matthew Gilbert <gilbert AT voxmea DOT net>
- and by Alexander Schremmer <alex AT alexanderweb DOT de>
- @license: GNU GPL, see COPYING for details.
-
- REQUIRES docutils 0.3.3 or later
-"""
-
-#############################################################################
-### ReStructured Text Parser
-#############################################################################
-
-import re
-import new
-import StringIO
-import __builtin__
-import sys
-import copy
-
-# docutils imports are below
-import MoinMoin.parser.wiki
-from MoinMoin.Page import Page
-
-Dependencies = [] # this parser just depends on the raw text
-
-# --- make docutils safe by overriding all module-scoped names related to IO ---
-
-# TODO: Add an error message to dummyOpen so that the user knows what they did
-# requested an unsupported feature of docutils in MoinMoin.
-def dummyOpen(x, y=None, z=None): return
-
-class dummyIO(StringIO.StringIO):
- def __init__(self, destination=None, destination_path=None,
- encoding=None, error_handler='', autoclose=1,
- handle_io_errors=1, source_path=None):
- StringIO.StringIO.__init__(self)
- pass
-
-class dummyUrllib2:
- def urlopen(a):
- return StringIO.StringIO()
- urlopen = staticmethod(urlopen)
-
-# # # All docutils imports must be contained below here
-import docutils
-from docutils.core import publish_parts
-from docutils.writers import html4css1
-from docutils.nodes import fully_normalize_name, reference
-from docutils.parsers import rst
-from docutils.parsers.rst import directives, roles
-# # # All docutils imports must be contained above here
-
-def safe_import(name, globals = None, locals = None, fromlist = None):
- mod = __builtin__.__import__(name, globals, locals, fromlist)
- if mod:
- mod.open = dummyOpen
- mod.urllib2 = dummyUrllib2
- return mod
-
-# Go through and change all docutils modules to use a dummyOpen and dummyUrllib2
-# module. Also make sure that any docutils imported modules also get the dummy
-# implementations.
-for i in sys.modules.keys():
- if i.startswith('docutils') and sys.modules[i]:
- sys.modules[i].open = dummyOpen
- sys.modules[i].urllib2 = dummyUrllib2
- sys.modules[i].__import__ = safe_import
-
-docutils.io.FileInput = dummyIO
-docutils.io.FileOutput = dummyIO
-
-# --- End of dummy-code --------------------------------------------------------
-
-def html_escape_unicode(node):
- # Find Python function that does this for me. string.encode('ascii',
- # 'xmlcharrefreplace') only 2.3 and above.
- for i in node:
- if ord(i) > 127:
- node = node.replace(i, '&#%d;' % (ord(i)))
- return node
-
-class MoinWriter(html4css1.Writer):
-
- config_section = 'MoinMoin writer'
- config_section_dependencies = ('writers',)
-
- #"""Final translated form of `document`."""
- output = None
-
- def wiki_resolver(self, node):
- """
- Normally an unknown reference would be an error in an reST document.
- However, this is how new documents are created in the wiki. This
- passes on unknown references to eventually be handled by the
- MoinMoin formatter.
- """
- # TODO: Need to better document the attributes here.
- if getattr(node, 'indirect_reference_name', None):
- node['refuri'] = node.indirect_reference_name
- return 1
- elif 'id' in node.attributes:
- # I'm pretty sure the first test should catch any targets or
- # references with the "id" attribute. Therefore, if we get to here
- # its probably an internal link that didn't work so we let it go
- # through as an error.
- return 0
- node['refuri'] = node['refname']
- del node['refname']
- self.nodes.append(node)
- return 1
-
- wiki_resolver.priority = 001
-
- def __init__(self, formatter, request):
- html4css1.Writer.__init__(self)
- self.formatter = formatter
- self.request = request
- # Add our wiki unknown_reference_resolver to our list of functions to
- # run when a target isn't found
- self.unknown_reference_resolvers = [self.wiki_resolver]
- # We create a new parser to process MoinMoin wiki style links in the
- # reST.
- self.wikiparser = MoinMoin.parser.wiki.Parser('', self.request)
- self.wikiparser.formatter = self.formatter
- self.wikiparser.hilite_re = None
- self.nodes = []
-
-
- def translate(self):
- visitor = MoinTranslator(self.document,
- self.formatter,
- self.request,
- self.wikiparser,
- self)
- self.document.walkabout(visitor)
- self.visitor = visitor
- self.output = html_escape_unicode(visitor.astext())
-
-
-class Parser:
-
- # allow caching - This should be turned off when testing.
- caching = 1
-
- def __init__(self, raw, request, **kw):
- self.raw = raw
- self.request = request
- self.form = request.form
-
- def format(self, formatter):
- # Create our simple parser
- parser = MoinDirectives(self.request)
-
- parts = publish_parts(source = self.raw,
- writer = MoinWriter(formatter, self.request))
-
- text = ''
- if parts['title']:
- text += '<h2>' + parts['title'] + '</h2>'
- # If there is only one subtitle then it is held in parts['subtitle'].
- # However, if there is more than one subtitle then this is empty and
- # fragment contains all of the subtitles.
- if parts['subtitle']:
- text += '<h3>' + parts['subtitle'] + '</h3>'
- if parts['docinfo']:
- text += parts['docinfo']
- text += parts['fragment']
- self.request.write(html_escape_unicode(text))
-
-
-class MoinTranslator(html4css1.HTMLTranslator):
-
- def __init__(self, document, formatter, request, parser, writer):
- html4css1.HTMLTranslator.__init__(self, document)
- self.formatter = formatter
- self.request = request
- # MMG: Using our own writer when needed. Save the old one to restore
- # after the page has been processed by the html4css1 parser.
- self.original_write, self.request.write = self.request.write, self.capture_wiki_formatting
- self.wikiparser = parser
- self.wikiparser.request = request
- # MoinMoin likes to start the initial headers at level 3 and the title
- # gets level 2, so to comply with their styles, we do here also.
- # TODO: Could this be fixed by passing this value in settings_overrides?
- self.initial_header_level = 3
- # Temporary place for wiki returned markup. This will be filled when
- # replacing the default writer with the capture_wiki_formatting
- # function (see visit_image for an example).
- self.wiki_text = ''
- self.setup_wiki_handlers()
-
- def capture_wiki_formatting(self, text):
- """
- Captures MoinMoin generated markup to the instance variable
- wiki_text.
- """
- # For some reason getting empty strings here which of course overwrites
- # what we really want (this is called multiple times per MoinMoin
- # format call, which I don't understand).
- self.wiki_text += text
-
- def process_wiki_text(self, text):
- """
- This sequence is repeated numerous times, so its captured as a
- single call here. Its important that wiki_text is blanked before we
- make the format call. format will call request.write which we've
- hooked to capture_wiki_formatting. If wiki_text is not blanked
- before a call to request.write we will get the old markup as well as
- the newly generated markup.
-
- TODO: Could implement this as a list so that it acts as a stack. I
- don't like having to remember to blank wiki_text.
- """
- self.wiki_text = ''
- self.wikiparser.raw = text
- self.wikiparser.format(self.formatter)
-
- def add_wiki_markup(self):
- """
- Place holder in case this becomes more elaborate someday. For now it
- only appends the MoinMoin generated markup to the html body and
- raises SkipNode.
- """
- self.body.append(self.wiki_text)
- self.wiki_text = ''
- raise docutils.nodes.SkipNode
-
- def astext(self):
- self.request.write = self.original_write
- return html4css1.HTMLTranslator.astext(self)
-
- def process_inline(self, node, uri_string):
- """
- Process the "inline:" link scheme. This can either ome from
- visit_reference or from visit_image. The uri_string changes
- depending on the caller. The uri is passed to MoinMoin to handle the
- inline link. If it is an image, the src line is extracted and passed
- to the html4css1 writer to allow the reST image attributes.
- Otherwise, the html from MoinMoin is inserted into the reST document
- and SkipNode is raised.
- """
- self.process_wiki_text(node[uri_string])
- # Only pass the src and alt parts to the writer. The reST writer
- # inserts its own tags so we don't need the MoinMoin html markup.
- src = re.search('src="([^"]+)"', self.wiki_text)
- if src:
- node['uri'] = src.groups()[0]
- if not 'alt' in node.attributes:
- alt = re.search('alt="([^"]*)"', self.wiki_text)
- if alt:
- node['alt'] = alt.groups()[0]
- else:
- # Image doesn't exist yet for the page so just use what's
- # returned from MoinMoin verbatim
- self.add_wiki_markup()
-
- def process_wiki_target(self, target):
- self.process_wiki_text(target)
- # MMG: May need a call to fixup_wiki_formatting here but I
- # don't think so.
- self.add_wiki_markup()
-
- def fixup_wiki_formatting(self, text):
- replacement = {'<p>': '', '</p>': '', '\n': '', '> ': '>'}
- for src, dst in replacement.items():
- text = text.replace(src, dst)
- # Everything seems to have a space ending the text block. We want to
- # get rid of this
- if text and text[-1] == ' ':
- text = text[:-1]
- return text
-
- def visit_reference(self, node):
- """
- Pass links to MoinMoin to get the correct wiki space url. Extract
- the url and pass it on to the html4css1 writer to handle. Inline
- images are also handled by visit_image. Not sure what the "drawing:"
- link scheme is used for, so for now it is handled here.
-
- Also included here is a hack to allow MoinMoin macros. This routine
- checks for a link which starts with "[[". This link is passed to the
- MoinMoin formatter and the resulting markup is inserted into the
- document in the place of the original link reference.
- """
- moin_link_schemes = ['wiki:', 'attachment:', 'drawing:', '[[',
- 'inline:']
-
- if 'refuri' in node.attributes:
- target = None
- refuri = node['refuri']
-
- # MMG: Fix this line
- if [scheme for scheme in moin_link_schemes if
- refuri.lstrip().startswith(scheme)]:
- # For a macro, We want the actuall text from the user in target,
- # not the fully normalized version that is contained in refuri.
- if refuri.startswith('[['):
- target = node['name']
- else:
- target = refuri
- # TODO: Figure out the following two elif's and comment
- # appropriately.
- # The node should have a whitespace normalized name if the docutlis
- # reStructuredText parser would normally fully normalize the name.
- elif ('name' in node.attributes and
- fully_normalize_name(node['name']) == refuri):
- target = ':%s:' % (node['name'])
- # If its not a uri containing a ':' then its probably destined for
- # wiki space.
- elif ':' not in refuri:
- target = ':%s:' % (refuri)
-
- if target:
- if target.startswith('inline:'):
- self.process_inline(node, 'refuri')
- elif target.startswith('[[') and target.endswith(']]'):
- self.process_wiki_target(target)
- else:
- # Not a macro or inline so hopefully its a link. Put the target in
- # brackets so that MoinMoin knows its a link. Extract the
- # href, if it exists, and let docutils handle it from there.
- # If there is no href just add whatever MoinMoin returned.
- node_text = node.astext().replace('\n', ' ')
- self.process_wiki_text('[%s %s]' % (target, node_text))
- href = re.search('href="([^"]+)"', self.wiki_text)
- if href:
- # dirty hack in order to undo the HTML entity quoting
- node['refuri'] = href.groups()[0].replace("&amp;", "&")
- else:
- self.wiki_text = self.fixup_wiki_formatting(self.wiki_text)
- self.add_wiki_markup()
- html4css1.HTMLTranslator.visit_reference(self, node)
-
- def visit_image(self, node):
- """
- Need to intervene in the case of inline images. We need MoinMoin to
- give us the actual src line to the image and then we can feed this
- to the default html4css1 writer. NOTE: Since the writer can't "open"
- this image the scale attribute doesn't work without directly
- specifying the height or width (or both).
-
- TODO: Need to handle figures similarly.
- """
- uri = node['uri'].lstrip()
- prefix = '' # assume no prefix
- if ':' in uri:
- prefix = uri.split(':',1)[0]
- # if prefix isn't URL, try to display in page
- if not prefix.lower() in ('file', 'http', 'https', 'ftp'):
- # no prefix given, so fake "inline:"
- if not prefix:
- node['uri'] = 'inline:' + uri
- self.process_inline(node, 'uri')
- html4css1.HTMLTranslator.visit_image(self, node)
-
- def create_wiki_functor(self, moin_func):
- moin_callable = getattr(self.formatter, moin_func)
- def visit_func(self, node):
- self.wiki_text = ''
- self.request.write(moin_callable(1))
- self.body.append(self.wiki_text)
- def depart_func(self, node):
- self.wiki_text = ''
- self.request.write(moin_callable(0))
- self.body.append(self.wiki_text)
- return visit_func, depart_func
-
- def setup_wiki_handlers(self):
- """
- Have the MoinMoin formatter handle markup when it makes sense. These
- are portions of the document that do not contain reST specific
- markup. This allows these portions of the document to look
- consistent with other wiki pages.
-
- Setup dispatch routines to handle basic document markup. The
- hanlders dict is the html4css1 handler name followed by the wiki
- handler name.
- """
- handlers = {
- # Text Markup
- 'emphasis': 'emphasis',
- 'strong': 'strong',
- 'literal': 'code',
- # Blocks
- 'literal_block': 'preformatted',
- # Simple Lists
- 'bullet_list': 'bullet_list',
- 'list_item': 'listitem',
- # Definition List
- 'definition_list': 'definition_list',
- # Admonitions
- 'warning': 'highlight'}
- for rest_func, moin_func in handlers.items():
- visit_func, depart_func = self.create_wiki_functor(moin_func)
- visit_func = new.instancemethod(visit_func, self, MoinTranslator)
- depart_func = new.instancemethod(depart_func, self, MoinTranslator)
- setattr(self, 'visit_%s' % (rest_func), visit_func)
- setattr(self, 'depart_%s' % (rest_func), depart_func)
-
- # Enumerated list takes an extra paramter so we handle this differently
- def visit_enumerated_list(self, node):
- self.wiki_text = ''
- self.request.write(self.formatter.number_list(1, start=node.get('start', None)))
- self.body.append(self.wiki_text)
-
- def depart_enumerated_list(self, node):
- self.wiki_text = ''
- self.request.write(self.formatter.number_list(0))
- self.body.append(self.wiki_text)
-
-
-class MoinDirectives:
- """
- Class to handle all custom directive handling. This code is called as
- part of the parsing stage.
- """
-
- def __init__(self, request):
- self.request = request
-
- # include MoinMoin pages
- directives.register_directive('include', self.include)
-
- # used for MoinMoin macros
- directives.register_directive('macro', self.macro)
-
- # disallow a few directives in order to prevent XSS
- # disallowed include because it suffers from these bugs:
- # * recursive includes are possible
-
- # for directive in ('meta', 'include', 'raw'):
- for directive in ('meta', 'raw'):
- directives.register_directive(directive, None)
-
- # disable the raw role
- roles._roles['raw'] = None
-
- # As a quick fix to handle recursive includes we limit the times a
- # document can be included to one.
- self.included_documents = []
-
- # Handle the include directive rather than letting the default docutils
- # parser handle it. This allows the inclusion of MoinMoin pages instead of
- # something from the filesystem.
- def include(self, name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- # content contains the included file name
-
- _ = self.request.getText
-
- if len(content):
- if content[0] in self.included_documents:
- lines = [_("**Duplicate included files are not permitted**")]
- state_machine.insert_input(lines, 'MoinDirectives')
- return
- self.included_documents.append(content[0])
- page = Page(page_name = content[0], request = self.request)
- if page.exists():
- text = page.get_raw_body()
- lines = text.split('\n')
- # Remove the "#format rst" line
- if lines[0].startswith("#format"):
- del lines[0]
- else:
- lines = [_("**Could not find the referenced page: %s**") % (content[0],)]
- # Insert the text from the included document and then continue
- # parsing
- state_machine.insert_input(lines, 'MoinDirectives')
- return
-
- include.content = True
-
- # Add additional macro directive.
- # This allows MoinMoin macros to be used either by using the directive
- # directly or by using the substitution syntax. Much cleaner than using the
- # reference hack (`[[SomeMacro]]`_). This however simply adds a node to the
- # document tree which is a reference, but through a much better user
- # interface.
- def macro(self, name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- # content contains macro to be called
- if len(content):
- # Allow either with or without brackets
- if content[0].startswith('[['):
- macro = content[0]
- else:
- macro = '[[%s]]' % content[0]
- ref = reference(macro, refuri = macro)
- ref['name'] = macro
- return [ref]
- return
-
- macro.content = True
- \ No newline at end of file
diff --git a/sandbox/mwh/README b/sandbox/mwh/README
deleted file mode 100644
index 99910158e..000000000
--- a/sandbox/mwh/README
+++ /dev/null
@@ -1,2 +0,0 @@
-Just the one file at the moment: advopostwriter.py which subclasses
-writers.html4css1.Writer to format reST like I like my advogato entries.
diff --git a/sandbox/mwh/advopostwriter.py b/sandbox/mwh/advopostwriter.py
deleted file mode 100644
index e2f98be0d..000000000
--- a/sandbox/mwh/advopostwriter.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from docutils.writers import html4css1
-from docutils import nodes
-
-class Writer(html4css1.Writer):
- W_init = html4css1.Writer.__init__
- def __init__(self):
- self.W_init()
- self.translator_class = MyHTMLTranslator
-
-def find_visible_child(node, starting_index, direction):
- if direction == "forwards":
- step = 1
- end = len(node)
- else:
- step = -1
- end = -1
- for i in range(starting_index, end, step):
- if not isinstance(node[i], nodes.Invisible):
- return node[i]
- else:
- return None
-
-class MyHTMLTranslator(html4css1.HTMLTranslator):
- def visit_title(self, node):
- self.body.append(self.starttag(node, 'b', '',
- STYLE="font-variant: small-caps"))
- self.context.append('</b>\n')
- def visit_document(self, node):
- pass
- def depart_document(self, node):
- pass
- def visit_paragraph(self, node):
- if isinstance(node.parent, nodes.section):
- index = node.parent.index(node)
- prev = find_visible_child(node.parent, index - 1, "backwards")
- if isinstance(prev, nodes.title):
- self.body.append(self.starttag(node, 'blockquote', '\n'))
- else:
- self.body.append('<p>\n')
- else:
- html4css1.HTMLTranslator.visit_paragraph(self, node)
-
- def depart_paragraph(self, node):
- if isinstance(node.parent, nodes.section):
- index = node.parent.index(node)
- next = find_visible_child(node.parent, index + 1, "forwards")
- if not next:
- self.body.append('\n</blockquote>\n')
- else:
- self.body.append("\n");
- else:
- # this tends to include "</p>"s which advogato then
- # discards. I don't care that much...
- html4css1.HTMLTranslator.depart_paragraph(self, node)
-
- def visit_section(self, node):
- pass
- def depart_section(self, node):
- pass
diff --git a/sandbox/oliverr/docbook/CHANGES.txt b/sandbox/oliverr/docbook/CHANGES.txt
deleted file mode 100644
index 42116071d..000000000
--- a/sandbox/oliverr/docbook/CHANGES.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-Doctils DocBook Writer ChangeLog
-================================
-
-2004-03-22
-----------
-
-* general tidying & bugfixes
-
-2003-07-21
-----------
-
-* ``title`` element placed before ``{doctype}info`` element.
-
-
-2003-07-19
-----------
-
-* Added support for ``address``, ``admonition``, ``attribution``,
- ``dedication`` (topic class), ``subscript``, ``superscript``,
- and ``rubric`` [#]_ elments.
-
-* Changed ``title_reference`` mapping from ``emphasis`` to ``citetitle``.
-
-* Character in attribute names & values >= 128, are encoded as numeric
- entities (that might not be the correct name). Here's what I mean::
-
- chr(128) -> &#128;
-
- I added this becuase converting "tools\test.txt" failed on input line 303.
- The attribute value for the label was ``u'\u2020'``.
-
-* Removed insertion of `` : `` from ``visit_classifier``. There was
- discussion on one of the docutils lists that the writers should not be
- inserting anything.
-
-* If the parent element of an image is a paragraph, it maps to
- ``inlinemediaobject``, otherwise as ``mediaobject``.
-
-* Using DocBook 4.2 instead of DocBook 4.
-
-.. [#] `rubric` is mapped to `bridgehead`, which seemed to be the best
- match. However, I've never heard of either of these, so it's just a
- best guess.
-
-.. :lineSeparator=\n:maxLineLen=72:mode=rest:noTabs=false:tabSize=4:wrap=hard:
diff --git a/sandbox/oliverr/docbook/QUESTIONS.txt b/sandbox/oliverr/docbook/QUESTIONS.txt
deleted file mode 100644
index 2417b4e35..000000000
--- a/sandbox/oliverr/docbook/QUESTIONS.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-=================================
-Docutils DocBook Writer Questions
-=================================
-
-Open Issues
-===========
-
-* Docutils ``transition`` elements don't seem to have any equivlent in
- DocBook. How should these be handled?
-
-* Currently, Docutil ``topic`` elements with no classes are treated get
- mapped to ``section`` elements. Should this be handled differently?
-
-* How should Docutils System Messages be handled? Could generate an
- appendix or section at the end of the document which contained all
- system messages handled as ``note`` elements.
-
-* How should ``problematic`` elements be handled? One idea is to
- generate a ``remark`` element with a reference to an error message
- somewhere else in the document.
-
-* Bibliographic/DocInfo elements are the biggest pain the arse! In
- order to get a release out, why not just try to display them, instead
- of mapping them to DocBook elements? A mixed approach could be to
- write a separate visitor for DocInfo elements which could collect the
- data, then the primary writer could use ``author``, ``copyright``,
- etc... for inclusion in the info section of the generated document,
- and the rest could be displayed.
-
-* DocBook XSL Stylesheets don't seem to respect the ``label`` attribute
- for footnotes. Is this a bug with the stylesheets or is it not used?
-
- Current feelings: that's a DocBook XSL Stylesheet problem. However,
- I should look into it.
-
-* Can author element be inserted regardless of whether there is text?
-
-.. :lineSeparator=\n:maxLineLen=72:mode=rest:noTabs=false:tabSize=4:wrap=hard:
diff --git a/sandbox/oliverr/docbook/README.txt b/sandbox/oliverr/docbook/README.txt
deleted file mode 100644
index 9c2ed523d..000000000
--- a/sandbox/oliverr/docbook/README.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-2004-07-23
-
-A DocBook writer for Docutils.
-
-It works okay so far, but still needs work.
-
-The main missing pieces are bibliography elements citations.
-
-See docbook.txt, CHANGES.txt, QUESTIONS.txt, and TODO.txt for more
-information.
-
-I don't know DocBook very well, so if you use this writer and get something
-other than what you'd expect. Please e-mail me the rst source, what you got,
-and would you'd like to see.
-
-Ollie Rutherfurd
-oliver@rutherfurd.net
-
diff --git a/sandbox/oliverr/docbook/TODO.txt b/sandbox/oliverr/docbook/TODO.txt
deleted file mode 100644
index e7fae5dbb..000000000
--- a/sandbox/oliverr/docbook/TODO.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Docutils DocBook Writer Todo List
-=================================
-
-* use xml:space where needed -- use HTML writer as a guide
-* handle docinfo elements
-* tests
-
diff --git a/sandbox/oliverr/docbook/rst2docbook.py b/sandbox/oliverr/docbook/rst2docbook.py
deleted file mode 100755
index 75699c8c9..000000000
--- a/sandbox/oliverr/docbook/rst2docbook.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Ollie Rutherfurd
-# Contact: oliver@rutherfurd.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing DocBook XML.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates DocBook XML documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='docbook', description=description)
-
-
-# :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4:
diff --git a/sandbox/oliverr/docbook/setup.py b/sandbox/oliverr/docbook/setup.py
deleted file mode 100644
index 31ed45521..000000000
--- a/sandbox/oliverr/docbook/setup.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python
-
-from distutils.core import setup
-
-def do_setup():
- dist = setup(
- name='Docutils DocBook XML Writer',
- description='A DocBook XML Writer for Docutils',
- url='http://docutils.sourceforge.net/sandbox/oliverr/docbook/',
- version='0.2',
- author='Ollie Rutherfurd',
- author_email='oliver@rutherfurd.net',
- license='Public Domain',
- packages=['docutils.writers'],
- package_dir={'docutils.writers':'writer'},
- scripts=['rst2docbook.py']
- )
- return dist
-
-if __name__ == '__main__':
- do_setup()
-
-#:indentSize=4:lineSeparator=\n:maxLineLen=76:noTabs=true:tabSize=4:wrap=hard:
diff --git a/sandbox/oliverr/docbook/writer/docbook.py b/sandbox/oliverr/docbook/writer/docbook.py
deleted file mode 100644
index 1a5a0a685..000000000
--- a/sandbox/oliverr/docbook/writer/docbook.py
+++ /dev/null
@@ -1,1091 +0,0 @@
-#!/usr/bin/env python
-
-"""
-:Author: Ollie Rutherfurd
-:Contact: oliver@rutherfurd.net
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-
-DocBook XML document tree Writer.
-
-This Writer converts a reST document tree to a subset
-of DocBook.
-
-**This is an unfinished work in progress.**
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-import string
-from docutils import writers, nodes, languages
-from types import ListType
-
-class Writer(writers.Writer):
-
- settings_spec = (
- 'DocBook-Specific Options',
- None,
- (('Set DocBook document type. '
- 'Choices are "article", "book", and "chapter". '
- 'Default is "article".',
- ['--doctype'],
- {'default': 'article',
- 'metavar': '<name>',
- 'type': 'choice',
- 'choices': ('article', 'book', 'chapter',)
- }
- ),
- )
- )
-
-
- """DocBook does it's own section numbering"""
- settings_default_overrides = {'enable_section_numbering': 0}
-
- output = None
- """Final translated form of `document`."""
-
- def translate(self):
- visitor = DocBookTranslator(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class DocBookTranslator(nodes.NodeVisitor):
-
- XML_DECL = '<?xml version="1.0" encoding="%s"?>\n'
-
- DOCTYPE_DECL = """<!DOCTYPE %s
- PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">\n"""
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.language = languages.get_language(
- document.settings.language_code)
- self.doctype = document.settings.doctype
- self.doc_header = [
- self.XML_DECL % (document.settings.output_encoding,),
- self.DOCTYPE_DECL % (self.doctype,),
- '<%s>\n' % (self.doctype,),
- ]
- self.doc_footer = [
- '</%s>\n' % (self.doctype,)
- ]
- self.body = []
- self.section = 0
- self.context = []
- self.colnames = []
- self.footnotes = {}
- self.footnote_map = {}
- self.docinfo = []
- self.title = ''
- self.subtitle = ''
-
- def astext(self):
- return ''.join(self.doc_header
- + self.docinfo
- + self.body
- + self.doc_footer)
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- # @@@ A codec to do these and all other
- # HTML entities would be nice.
- text = text.replace("&", "&amp;")
- text = text.replace("<", "&lt;")
- text = text.replace('"', "&quot;")
- text = text.replace(">", "&gt;")
- return text
-
- def encodeattr(self, text):
- """Encode attributes characters > 128 as &#XXX;"""
- buff = []
- for c in text:
- if ord(c) >= 128:
- buff.append('&#%d;' % ord(c))
- else:
- buff.append(c)
- return ''.join(buff)
-
- def rearrange_footnotes(self):
- """
- Replaces ``foonote_reference`` placeholders with
- ``footnote`` element content as DocBook and reST
- handle footnotes differently.
-
- DocBook defines footnotes inline, whereas they
- may be anywere in reST. This function replaces the
- first instance of a ``footnote_reference`` with
- the ``footnote`` element itself, and later
- references of the same a footnote with
- ``footnoteref`` elements.
- """
- for (footnote_id,refs) in self.footnote_map.items():
- ref_id, context, pos = refs[0]
- context[pos] = ''.join(self.footnotes[footnote_id])
- for ref_id, context, pos in refs[1:]:
- context[pos] = '<footnoteref linkend="%s"/>' \
- % (footnote_id,)
-
- def attval(self, text,
- transtable=string.maketrans('\n\r\t\v\f', ' ')):
- """Cleanse, encode, and return attribute value text."""
- return self.encode(text.translate(transtable))
-
- def starttag(self, node, tagname, suffix='\n', infix='', **attributes):
- """
- Construct and return a start tag given a node
- (id & class attributes are extracted), tag name,
- and optional attributes.
- """
- atts = {}
- for (name, value) in attributes.items():
- atts[name.lower()] = value
-
- for att in ('id',): # node attribute overrides
- if node.has_key(att):
- atts[att] = node[att]
-
- attlist = atts.items()
- attlist.sort()
- parts = [tagname.lower()]
- for name, value in attlist:
- if value is None: # boolean attribute
- # this came from the html writer, but shouldn't
- # apply here, as an element with no attribute
- # isn't well-formed XML.
- parts.append(name.lower())
- elif isinstance(value, ListType):
- values = [str(v) for v in value]
- parts.append('%s="%s"' % (name.lower(),
- self.attval(' '.join(values))))
- else:
- name = self.encodeattr(name.lower())
- value = str(self.encodeattr(unicode(value)))
- value = self.attval(value)
- parts.append('%s="%s"' % (name,value))
-
- return '<%s%s>%s' % (' '.join(parts), infix, suffix)
-
- def emptytag(self, node, tagname, suffix='\n', **attributes):
- """Construct and return an XML-compatible empty tag."""
- return self.starttag(node, tagname, suffix, infix=' /', **attributes)
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- # handled by visit_docinfo
- pass
-
- def depart_address(self, node):
- # handled by visit_docinfo
- pass
-
- def visit_admonition(self, node, name=''):
- self.body.append(self.starttag(node, 'note'))
-
- def depart_admonition(self, node=None):
- self.body.append('</note>\n')
-
- def visit_attention(self, node):
- self.body.append(self.starttag(node, 'note'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_attention(self, node):
- self.body.append('</note>\n')
-
- def visit_attribution(self, node):
- # attribution must precede blockquote content
- if isinstance(node.parent, nodes.block_quote):
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'attribution', ''))
-
- def depart_attribution(self, node):
- # attribution must precede blockquote content
- if not isinstance(node.parent, nodes.block_quote):
- self.body.append('</attribution>\n')
-
- # author is handled in ``visit_docinfo()``
- def visit_author(self, node):
- raise nodes.SkipNode
-
- # authors is handled in ``visit_docinfo()``
- def visit_authors(self, node):
- raise nodes.SkipNode
-
- def visit_block_quote(self, node):
- self.body.append(self.starttag(node, 'blockquote'))
- if isinstance(node[-1], nodes.attribution):
- self.body.append('<attribution>%s</attribution>\n' % node[-1].astext())
-
- def depart_block_quote(self, node):
- self.body.append('</blockquote>\n')
-
- def visit_bullet_list(self, node):
- self.body.append(self.starttag(node, 'itemizedlist'))
-
- def depart_bullet_list(self, node):
- self.body.append('</itemizedlist>\n')
-
- def visit_caption(self, node):
- # NOTE: ideally, this should probably be stuffed into
- # the mediaobject as a "caption" element
- self.body.append(self.starttag(node, 'para'))
-
- def depart_caption(self, node):
- self.body.append('</para>')
-
- def visit_caution(self, node):
- self.body.append(self.starttag(node, 'caution'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_caution(self, node):
- self.body.append('</caution>\n')
-
- # reST & DocBook ciations are somewhat
- # different creatures.
- #
- # reST seems to handle citations as a labled
- # footnotes, whereas DocBook doesn't from what
- # I can tell. In DocBook, it looks like they're
- # an abbreviation for a published work, which
- # might be in the bibliography.
- #
- # Quote:
- #
- # The content of a Citation is assumed to be a reference
- # string, perhaps identical to an abbreviation in an entry
- # in a Bibliography.
- #
- # I hoped to have citations behave look footnotes,
- # using the citation label as the footnote label,
- # which would seem functionally equivlent, however
- # the DocBook stylesheets for generating HTML & FO
- # output don't seem to be using the label for foonotes
- # so this doesn't work very well.
- #
- # Any ideas or suggestions would be welcome.
-
- def visit_citation(self, node):
- self.visit_footnote(node)
-
- def depart_citation(self, node):
- self.depart_footnote(node)
-
- def visit_citation_reference(self, node):
- self.visit_footnote_reference(node)
-
- def depart_citation_reference(self, node):
- # there isn't a a depart_footnote_reference
- pass
-
- def visit_classifier(self, node):
- self.body.append(self.starttag(node, 'type'))
-
- def depart_classifier(self, node):
- self.body.append('</type>\n')
-
- def visit_colspec(self, node):
- self.colnames.append('col_%d' % (len(self.colnames) + 1,))
- atts = {'colname': self.colnames[-1]}
- self.body.append(self.emptytag(node, 'colspec', **atts))
-
- def depart_colspec(self, node):
- pass
-
- def visit_comment(self, node, sub=re.compile('-(?=-)').sub):
- """Escape double-dashes in comment text."""
- self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
- raise nodes.SkipNode
-
- # contact is handled in ``visit_docinfo()``
- def visit_contact(self, node):
- raise nodes.SkipNode
-
- # copyright is handled in ``visit_docinfo()``
- def visit_copyright(self, node):
- raise nodes.SkipNode
-
- def visit_danger(self, node):
- self.body.append(self.starttag(node, 'caution'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_danger(self, node):
- self.body.append('</caution>\n')
-
- # date is handled in ``visit_docinfo()``
- def visit_date(self, node):
- raise nodes.SkipNode
-
- def visit_decoration(self, node):
- pass
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- # "term" is not closed in depart_term
- self.body.append('</term>\n')
- self.body.append(self.starttag(node, 'listitem'))
-
- def depart_definition(self, node):
- self.body.append('</listitem>\n')
-
- def visit_definition_list(self, node):
- self.body.append(self.starttag(node, 'variablelist'))
-
- def depart_definition_list(self, node):
- self.body.append('</variablelist>\n')
-
- def visit_definition_list_item(self, node):
- self.body.append(self.starttag(node, 'varlistentry'))
-
- def depart_definition_list_item(self, node):
- self.body.append('</varlistentry>\n')
-
- def visit_description(self, node):
- self.body.append(self.starttag(node, 'entry'))
-
- def depart_description(self, node):
- self.body.append('</entry>\n')
-
- def visit_docinfo(self, node):
- """
- Collects all docinfo elements for the document.
-
- Since reST's bibliography elements don't map very
- cleanly to DocBook, rather than maintain state and
- check dependencies within the different visitor
- fuctions all processing of bibliography elements
- is dont within this function.
-
- .. NOTE:: Skips processing of all child nodes as
- everything should be collected here.
- """
-
- # XXX There are a number of fields in docinfo elements
- # which don't map nicely to docbook elements and
- # reST allows one to insert arbitrary fields into
- # the header, We need to be able to handle fields
- # which either don't map or nicely or are unexpected.
- # I'm thinking of just using DocBook to display these
- # elements in some sort of tabular format -- but
- # to collecting them is not straight-forward.
- # Paragraphs, links, lists, etc... can all live within
- # the values so we either need a separate visitor
- # to translate these elements, or to maintain state
- # in any possible child elements (not something I
- # want to do).
-
- docinfo = ['<%sinfo>\n' % self.doctype]
-
- address = ''
- authors = []
- author = ''
- contact = ''
- date = ''
- legalnotice = ''
- orgname = ''
- releaseinfo = ''
- revision,version = '',''
-
- docinfo.append('<title>%s</title>\n' % self.title)
- if self.subtitle:
- docinfo.append('<subtitle>%s</subtitle>\n' % self.subtitle)
-
- for n in node:
- if isinstance(n, nodes.address):
- address = n.astext()
- elif isinstance(n, nodes.author):
- author = n.astext()
- elif isinstance(n, nodes.authors):
- for a in n:
- authors.append(a.astext())
- elif isinstance(n, nodes.contact):
- contact = n.astext()
- elif isinstance(n, nodes.copyright):
- legalnotice = n.astext()
- elif isinstance(n, nodes.date):
- date = n.astext()
- elif isinstance(n, nodes.organization):
- orgname = n.astext()
- elif isinstance(n, nodes.revision):
- # XXX yuck
- revision = 'Revision ' + n.astext()
- elif isinstance(n, nodes.status):
- releaseinfo = n.astext()
- elif isinstance(n, nodes.version):
- # XXX yuck
- version = 'Version ' + n.astext()
- elif isinstance(n, nodes.field):
- # XXX
- import sys
- print >> sys.stderr, "I don't do 'field' yet"
- print n.astext()
- # since all child nodes are handled here raise an exception
- # if node is not handled, so it doesn't silently slip through.
- else:
- print dir(n)
- print n.astext()
- raise self.unimplemented_visit(n)
-
- # can only add author if name is present
- # since contact is associate with author, the contact
- # can also only be added if an author name is given.
- if author:
- docinfo.append('<author>\n')
- docinfo.append('<othername>%s</othername>\n' % author)
- if contact:
- docinfo.append('<email>%s</email>\n' % contact)
- docinfo.append('</author>\n')
-
- if authors:
- docinfo.append('<authorgroup>\n')
- for name in authors:
- docinfo.append(
- '<author><othername>%s</othername></author>\n' % name)
- docinfo.append('</authorgroup>\n')
-
- if revision or version:
- edition = version
- if edition and revision:
- edition += ', ' + revision
- elif revision:
- edition = revision
- docinfo.append('<edition>%s</edition>\n' % edition)
-
- if date:
- docinfo.append('<date>%s</date>\n' % date)
-
- if orgname:
- docinfo.append('<orgname>%s</orgname>\n' % orgname)
-
- if releaseinfo:
- docinfo.append('<releaseinfo>%s</releaseinfo>\n' % releaseinfo)
-
- if legalnotice:
- docinfo.append('<legalnotice>\n')
- docinfo.append('<para>%s</para>\n' % legalnotice)
- docinfo.append('</legalnotice>\n')
-
- if address:
- docinfo.append('<address xml:space="preserve">' +
- address + '</address>\n')
-
- if len(docinfo) > 1:
- docinfo.append('</%sinfo>\n' % self.doctype)
-
- self.docinfo = docinfo
-
- raise nodes.SkipChildren
-
- def depart_docinfo(self, node):
- pass
-
- def visit_doctest_block(self, node):
- self.body.append('<informalexample>\n')
- self.body.append(self.starttag(node, 'programlisting'))
-
- def depart_doctest_block(self, node):
- self.body.append('</programlisting>\n')
- self.body.append('</informalexample>\n')
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- self.rearrange_footnotes()
-
- def visit_emphasis(self, node):
- self.body.append('<emphasis>')
-
- def depart_emphasis(self, node):
- self.body.append('</emphasis>')
-
- def visit_entry(self, node):
- tagname = 'entry'
- atts = {}
- if node.has_key('morerows'):
- atts['morerows'] = node['morerows']
- if node.has_key('morecols'):
- atts['namest'] = self.colnames[self.entry_level]
- atts['nameend'] = self.colnames[self.entry_level \
- + node['morecols']]
- self.entry_level += 1 # for tracking what namest and nameend are
- self.body.append(self.starttag(node, tagname, '', **atts))
-
- def depart_entry(self, node):
- self.body.append('</entry>\n')
-
- def visit_enumerated_list(self, node):
- # TODO: need to specify "mark" type used for list items
- self.body.append(self.starttag(node, 'orderedlist'))
-
- def depart_enumerated_list(self, node):
- self.body.append('</orderedlist>\n')
-
- def visit_error(self, node):
- self.body.append(self.starttag(node, 'caution'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_error(self, node):
- self.body.append('</caution>\n')
-
- # TODO: wrap with some element (filename used in DocBook example)
- def visit_field(self, node):
- self.body.append(self.starttag(node, 'varlistentry'))
-
- def depart_field(self, node):
- self.body.append('</varlistentry>\n')
-
- # TODO: see if this should be wrapped with some element
- def visit_field_argument(self, node):
- self.body.append(' ')
-
- def depart_field_argument(self, node):
- pass
-
- def visit_field_body(self, node):
- # NOTE: this requires that a field body always
- # be present, which looks like the case
- # (from docutils.dtd)
- self.body.append(self.context.pop())
- self.body.append(self.starttag(node, 'listitem'))
-
- def depart_field_body(self, node):
- self.body.append('</listitem>\n')
-
- def visit_field_list(self, node):
- self.body.append(self.starttag(node, 'variablelist'))
-
- def depart_field_list(self, node):
- self.body.append('</variablelist>\n')
-
- def visit_field_name(self, node):
- self.body.append(self.starttag(node, 'term'))
- # popped by visit_field_body, so "field_argument" is
- # content within "term"
- self.context.append('</term>\n')
-
- def depart_field_name(self, node):
- pass
-
- def visit_figure(self, node):
- self.body.append(self.starttag(node, 'informalfigure'))
- self.body.append('<blockquote>')
-
- def depart_figure(self, node):
- self.body.append('</blockquote>')
- self.body.append('</informalfigure>\n')
-
- # TODO: footer (this is where 'generated by docutils' arrives)
- # if that's all that will be there, it could map to "colophon"
- def visit_footer(self, node):
- raise nodes.SkipChildren
-
- def depart_footer(self, node):
- pass
-
- def visit_footnote(self, node):
- self.footnotes[node['id']] = []
- atts = {'id': node['id']}
- if isinstance(node[0], nodes.label):
- atts['label'] = node[0].astext()
- self.footnotes[node['id']].append(
- self.starttag(node, 'footnote', **atts))
-
- # replace body with this with a footnote collector list
- # which will hold all the contents for this footnote.
- # This needs to be kept separate so it can be used to replace
- # the first ``footnote_reference`` as DocBook defines
- # ``footnote`` elements inline.
- self._body = self.body
- self.body = self.footnotes[node['id']]
-
- def depart_footnote(self, node):
- # finish footnote and then replace footnote collector
- # with real body list.
- self.footnotes[node['id']].append('</footnote>')
- self.body = self._body
- self._body = None
-
- def visit_footnote_reference(self, node):
- if node.has_key('refid'):
- refid = node['refid']
- else:
- refid = self.document.nameids[node['refname']]
-
- # going to replace this footnote reference with the actual
- # footnote later on, so store the footnote id to replace
- # this reference with and the list and position to replace it
- # in. Both list and position are stored in case a footnote
- # reference is within a footnote, in which case ``self.body``
- # won't really be ``self.body`` but a footnote collector
- # list.
- refs = self.footnote_map.get(refid, [])
- refs.append((node['id'], self.body, len(self.body),))
- self.footnote_map[refid] = refs
-
- # add place holder list item which should later be
- # replaced with the contents of the footnote element
- # and it's child elements
- self.body.append('<!-- REPLACE WITH FOOTNOTE -->')
-
- raise nodes.SkipNode
-
- def visit_header(self, node):
- pass
- def depart_header(self, node):
- pass
-
- # ??? does anything need to be done for generated?
- def visit_generated(self, node):
- pass
- def depart_generated(self, node):
- pass
-
- def visit_hint(self, node):
- self.body.append(self.starttag(node, 'note'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_hint(self, node):
- self.body.append('</note>\n')
-
- def visit_image(self, node):
- if isinstance(node.parent, nodes.paragraph):
- element = 'inlinemediaobject'
- elif isinstance(node.parent, nodes.reference):
- element = 'inlinemediaobject'
- else:
- element = 'mediaobject'
- atts = node.attributes.copy()
- atts['fileref'] = atts['uri']
- alt = None
- del atts['uri']
- if atts.has_key('alt'):
- alt = atts['alt']
- del atts['alt']
- if atts.has_key('height'):
- atts['depth'] = atts['height']
- del atts['height']
- self.body.append('<%s>' % element)
- self.body.append('<imageobject>')
- self.body.append(self.emptytag(node, 'imagedata', **atts))
- self.body.append('</imageobject>')
- if alt:
- self.body.append('<textobject><phrase>' \
- '%s</phrase></textobject>\n' % alt)
- self.body.append('</%s>' % element)
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.body.append(self.starttag(node, 'important'))
-
- def depart_important(self, node):
- self.body.append('</important>')
-
- # @@@ Incomplete, pending a proper implementation on the
- # Parser/Reader end.
- # XXX see if the default for interpreted should be ``citetitle``
- def visit_interpreted(self, node):
- self.body.append('<constant>\n')
-
- def depart_interpreted(self, node):
- self.body.append('</constant>\n')
-
- def visit_label(self, node):
- # getting label for "footnote" in ``visit_footnote``
- # because label is an attribute for the ``footnote``
- # element.
- if isinstance(node.parent, nodes.footnote):
- raise nodes.SkipNode
- # citations are currently treated as footnotes
- elif isinstance(node.parent, nodes.citation):
- raise nodes.SkipNode
-
- def depart_label(self, node):
- pass
-
- def visit_legend(self, node):
- # legend is placed inside the figure's ``blockquote``
- # so there's nothing special to be done for it
- pass
-
- def depart_legend(self, node):
- pass
-
- def visit_line_block(self, node):
- self.body.append(self.starttag(node, 'literallayout'))
-
- def depart_line_block(self, node):
- self.body.append('</literallayout>\n')
-
- def visit_list_item(self, node):
- self.body.append(self.starttag(node, 'listitem'))
-
- def depart_list_item(self, node):
- self.body.append('</listitem>\n')
-
- def visit_literal(self, node):
- self.body.append('<literal>')
-
- def depart_literal(self, node):
- self.body.append('</literal>')
-
- def visit_literal_block(self, node):
- self.body.append(self.starttag(node, 'programlisting'))
-
- def depart_literal_block(self, node):
- self.body.append('</programlisting>\n')
-
- def visit_note(self, node):
- self.body.append(self.starttag(node, 'note'))
- self.body.append('\n<title>%s</title>\n'
- % (self.language.labels[node.tagname],))
-
- def depart_note(self, node):
- self.body.append('</note>\n')
-
- def visit_option(self, node):
- self.body.append(self.starttag(node, 'command'))
- if self.context[-1]:
- self.body.append(', ')
-
- def depart_option(self, node):
- self.context[-1] += 1
- self.body.append('</command>')
-
- def visit_option_argument(self, node):
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'replaceable', ''))
-
- def depart_option_argument(self, node):
- self.body.append('</replaceable>')
-
- def visit_option_group(self, node):
- self.body.append(self.starttag(node, 'entry'))
- self.context.append(0)
-
- def depart_option_group(self, node):
- self.context.pop()
- self.body.append('</entry>\n')
-
- def visit_option_list(self, node):
- self.body.append(self.starttag(node, 'informaltable', frame='all'))
- self.body.append('<tgroup cols="2">\n')
- self.body.append('<colspec colname="option_col"/>\n')
- self.body.append('<colspec colname="description_col"/>\n')
- self.body.append('<tbody>\n')
-
- def depart_option_list(self, node):
- self.body.append('</tbody>')
- self.body.append('</tgroup>\n')
- self.body.append('</informaltable>\n')
-
- def visit_option_list_item(self, node):
- self.body.append(self.starttag(node, 'row'))
-
- def depart_option_list_item(self, node):
- self.body.append('</row>\n')
-
- def visit_option_string(self, node):
- pass
-
- def depart_option_string(self, node):
- pass
-
- # organization is handled in ``visit_docinfo()``
- def visit_organization(self, node):
- raise nodes.SkipNode
-
- def visit_paragraph(self, node):
- self.body.append(self.starttag(node, 'para', ''))
-
- def depart_paragraph(self, node):
- self.body.append('</para>')
-
- # TODO: problematic
- visit_problematic = depart_problematic = lambda self, node: None
-
- def visit_raw(self, node):
- if node.has_key('format') and node['format'] == 'docbook':
- self.body.append(node.astext())
- raise node.SkipNode
-
- def visit_reference(self, node):
- atts = {}
- if node.has_key('refuri'):
- atts['url'] = node['refuri']
- self.context.append('ulink')
- elif node.has_key('refid'):
- atts['linkend'] = node['refid']
- self.context.append('link')
- elif node.has_key('refname'):
- atts['linkend'] = self.document.nameids[node['refname']]
- self.context.append('link')
- # if parent is a section,
- # wrap link in a para
- if isinstance(node.parent, nodes.section):
- self.body.append('<para>')
- self.body.append(self.starttag(node, self.context[-1], '', **atts))
-
- def depart_reference(self, node):
- self.body.append('</%s>' % (self.context.pop(),))
- # if parent is a section,
- # wrap link in a para
- if isinstance(node.parent, nodes.section):
- self.body.append('</para>')
-
- # revision is handled in ``visit_docinfo()``
- def visit_revision(self, node):
- raise nodes.SkipNode
-
- def visit_row(self, node):
- self.entry_level = 0
- self.body.append(self.starttag(node, 'row'))
-
- def depart_row(self, node):
- self.body.append('</row>\n')
-
- def visit_rubric(self, node):
- self.body.append(self.starttag(node, 'bridgehead'))
-
- def depart_rubric(self, node):
- self.body.append('</bridgehead>')
-
- def visit_section(self, node):
- if self.section == 0 and self.doctype == 'book':
- self.body.append(self.starttag(node, 'chapter'))
- else:
- self.body.append(self.starttag(node, 'section'))
- self.section += 1
-
- def depart_section(self, node):
- self.section -= 1
- if self.section == 0 and self.doctype == 'book':
- self.body.append('</chapter>\n')
- else:
- self.body.append('</section>\n')
-
- def visit_sidebar(self, node):
- self.body.append(self.starttag(node, 'sidebar'))
- if isinstance(node[0], nodes.title):
- self.body.append('<sidebarinfo>\n')
- self.body.append('<title>%s</title>\n' % node[0].astext())
- if isinstance(node[1], nodes.subtitle):
- self.body.append('<subtitle>%s</subtitle>\n' % node[1].astext())
- self.body.append('</sidebarinfo>\n')
-
- def depart_sidebar(self, node):
- self.body.append('</sidebar>\n')
-
- # author is handled in ``visit_docinfo()``
- def visit_status(self, node):
- raise nodes.SkipNode
-
- def visit_strong(self, node):
- self.body.append('<emphasis role="strong">')
-
- def depart_strong(self, node):
- self.body.append('</emphasis>')
-
- def visit_subscript(self, node):
- self.body.append(self.starttag(node, 'subscript', ''))
-
- def depart_subscript(self, node):
- self.body.append('</subscript>')
-
- def visit_substitution_definition(self, node):
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- # document title needs to go into
- # <type>info/subtitle, so save it for
- # when we do visit_docinfo
- if isinstance(node.parent, nodes.document):
- self.subtitle = node.astext()
- raise nodes.SkipNode
- else:
- # sidebar subtitle needs to go into a sidebarinfo element
- #if isinstance(node.parent, nodes.sidebar):
- # self.body.append('<sidebarinfo>')
- if isinstance(node.parent, nodes.sidebar):
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'subtitle', ''))
-
- def depart_subtitle(self, node):
- if not isinstance(node.parent, nodes.document):
- self.body.append('</subtitle>\n')
- #if isinstance(node.parent, nodes.sidebar):
- # self.body.append('</sidebarinfo>\n')
-
- def visit_superscript(self, node):
- self.body.append(self.starttag(node, 'superscript', ''))
-
- def depart_superscript(self, node):
- self.body.append('</superscript>')
-
- # TODO: system_message
- visit_system_message = depart_system_message = lambda self, node: None
-
- def visit_table(self, node):
- self.body.append(
- self.starttag(node, 'informaltable', frame='all')
- )
-
- def depart_table(self, node):
- self.body.append('</informaltable>\n')
-
- # don't think anything is needed for targets
- def visit_target(self, node):
- # XXX this would like to be a transform!
- # XXX comment this mess!
- handled = 0
- siblings = node.parent.children
- for i in range(len(siblings)):
- if siblings[i] is node:
- if i+1 < len(siblings):
- next = siblings[i+1]
- if isinstance(next,nodes.Text):
- pass
- elif not next.attributes.has_key('id'):
- next['id'] = node['id']
- handled = 1
- if not handled:
- if not node.parent.attributes.has_key('id'):
- node.parent.attributes['id'] = node['id']
- handled = 1
- # might need to do more...
- # (if not handled, update the referrer to refer to the parent's id)
-
- def depart_target(self, node):
- pass
-
- def visit_tbody(self, node):
- self.body.append(self.starttag(node, 'tbody'))
-
- def depart_tbody(self, node):
- self.body.append('</tbody>\n')
-
- def visit_term(self, node):
- self.body.append(self.starttag(node, 'term'))
- self.body.append('<varname>')
-
- def depart_term(self, node):
- # Leave the end tag "term" to ``visit_definition()``,
- # in case there's a classifier.
- self.body.append('</varname>')
-
- def visit_tgroup(self, node):
- self.colnames = []
- atts = {'cols': node['cols']}
- self.body.append(self.starttag(node, 'tgroup', **atts))
-
- def depart_tgroup(self, node):
- self.body.append('</tgroup>\n')
-
- def visit_thead(self, node):
- self.body.append(self.starttag(node, 'thead'))
-
- def depart_thead(self, node):
- self.body.append('</thead>\n')
-
- def visit_tip(self, node):
- self.body.append(self.starttag(node, 'tip'))
-
- def depart_tip(self, node):
- self.body.append('</tip>\n')
-
- def visit_title(self, node):
- # document title needs to go inside
- # <type>info/title
- if isinstance(node.parent, nodes.document):
- self.title = node.astext()
- raise nodes.SkipNode
- elif isinstance(node.parent, nodes.sidebar):
- # sidebar title and subtitle are collected in visit_sidebar
- raise nodes.SkipNode
- else:
- self.body.append(self.starttag(node, 'title', ''))
-
- def depart_title(self, node):
- if not isinstance(node.parent, nodes.document):
- self.body.append('</title>\n')
-
- def visit_title_reference(self, node):
- self.body.append('<citetitle>')
-
- def depart_title_reference(self, node):
- self.body.append('</citetitle>')
-
- def visit_topic(self, node):
- # let DocBook handle Table of Contents generation
- if node.get('class') == 'contents':
- raise nodes.SkipChildren
- elif node.get('class') == 'abstract':
- self.body.append(self.starttag(node, 'abstract'))
- self.context.append('abstract')
- elif node.get('class') == 'dedication':
- # docbook only supports dedication in a book,
- # so we're faking it for article & chapter
- if self.doctype == 'book':
- self.body.append(self.starttag(node, 'dedication'))
- self.context.append('dedication')
- else:
- self.body.append(self.starttag(node, 'section'))
- self.context.append('section')
-
- # generic "topic" element treated as a section
- elif node.get('class','') == '':
- self.body.append(self.starttag(node, 'section'))
- self.context.append('section')
- else:
- # XXX DEBUG CODE
- print 'class:', node.get('class')
- print node.__class__.__name__
- print node
- print `node`
- print dir(node)
- self.unimplemented_visit(node)
-
- def depart_topic(self, node):
- if len(self.context):
- self.body.append('</%s>\n' % (self.context.pop(),))
-
- def visit_transition(self, node):
- pass
- def depart_transition(self, node):
- pass
-
- # author is handled in ``visit_docinfo()``
- def visit_version(self, node):
- raise nodes.SkipNode
-
- def visit_warning(self, node):
- self.body.append(self.starttag(node, 'warning'))
-
- def depart_warning(self, node):
- self.body.append('</warning>\n')
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
-# :collapseFolds=0:folding=indent:indentSize=4:
-# :lineSeparator=\n:noTabs=true:tabSize=4:
diff --git a/sandbox/oliverr/ht/MANIFEST b/sandbox/oliverr/ht/MANIFEST
deleted file mode 100644
index 416bbcfcb..000000000
--- a/sandbox/oliverr/ht/MANIFEST
+++ /dev/null
@@ -1,4 +0,0 @@
-README.txt
-setup.py
-writer\hthtml.py
-rst2ht.py
diff --git a/sandbox/oliverr/ht/README.txt b/sandbox/oliverr/ht/README.txt
deleted file mode 100644
index 96dacfedb..000000000
--- a/sandbox/oliverr/ht/README.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-=================
-.ht Writer README
-=================
-
-:Date: $Date$
-
-This writer generates an .ht (HTML Template) file from reST for
-consumption by ht2html_.
-
-* `hthtml.py <hthtml.py>`_ is the Writer.
-* `rst2ht.py <rst2ht.py>`_ is the front end script.
-
-Written by Ollie Rutherfurd, oliver@rutherfurd.net
-
-See http://www.rutherfurd.net/articles/rst-ht2html.html for information on
-using this writer with ht2html_.
-
-.. _ht2html: http://ht2html.sourceforge.net/
-
-.. :lineSeparator=\n:maxLineLen=76:noTabs=true:tabSize=4:wrap=hard:
diff --git a/sandbox/oliverr/ht/TODO.txt b/sandbox/oliverr/ht/TODO.txt
deleted file mode 100644
index a91834c5f..000000000
--- a/sandbox/oliverr/ht/TODO.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-=========
-TODO List
-=========
-
-:Date: $Date$
-
-* convert all chars > 128 to &#n;?
-* add an option to try to break document to use all of page
- below sections?
-
diff --git a/sandbox/oliverr/ht/rst2ht.py b/sandbox/oliverr/ht/rst2ht.py
deleted file mode 100755
index 7da7f1c2c..000000000
--- a/sandbox/oliverr/ht/rst2ht.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Ollie Rutherfurd
-# Contact: oliver@rutherfurd.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing an .ht
-(HTML Template) file.
-"""
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates .ht (HTML Template) documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='hthtml', description=description)
-
-
-# :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4:
diff --git a/sandbox/oliverr/ht/setup.py b/sandbox/oliverr/ht/setup.py
deleted file mode 100644
index ca836a980..000000000
--- a/sandbox/oliverr/ht/setup.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-
-from distutils.core import setup
-
-def do_setup():
- dist = setup(
- name='rst2ht',
- description='A ht template Writer for Docutils',
- url='http://docutils.sf.net/',
- version='0.1',
- author='Ollie Rutherfurd',
- author_email='oliver@rutherfurd.net',
- license='Public Domain',
- packages=['docutils.writers'],
- package_dir={'docutils.writers':'writer'},
- scripts=['rst2ht.py']
- )
- return dist
-
-
-if __name__ == '__main__':
- do_setup()
-
-#:indentSize=4:lineSeparator=\n:maxLineLen=76:noTabs=true:tabSize=4:wrap=hard:
diff --git a/sandbox/oliverr/ht/writer/hthtml.py b/sandbox/oliverr/ht/writer/hthtml.py
deleted file mode 100644
index e04d334e4..000000000
--- a/sandbox/oliverr/ht/writer/hthtml.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Author: Ollie Rutherfurd
-# Contact: oliver@rutherfurd.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple .ht (HyperText Template) document tree Writer.
-
-.ht tmeplate files are essentially normal HTML, with
-an option set of RFC 2822-like headers at the top of
-the file. There must be at least one blank line between
-the last header and the start of the body HTML.
-
-See http://ht2html.sf.net/ for more information on
-.ht files and ht2html..
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-from docutils import nodes
-from docutils import writers
-from docutils.writers.html4css1 import frontend, HTMLTranslator, utils
-
-
-class Writer(writers.Writer):
-
- supported = ('ht',)
- """Formats this writer supports."""
-
- settings_spec = (
- '.ht template-Specific Options',
- None,
- (('Specify base section (i.e. if 3, a top-level section '
- 'would be written as H3, 2nd level H4, etc...). Default is 3.',
- ['--base-section'],
- {'choices': ['1','2','3','4'],
- 'default': '3',
- 'metavar': '<NUMBER>'}),
- ('Specify the initial header level. Default is 1 for "<h1>". '
- 'Does not affect document title & subtitle (see --no-doc-title).',
- ['--initial-header-level'],
- {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
- 'metavar': '<level>'}),
- ('Specify a stylesheet URL, used verbatim. Default is '
- '"default.css".',
- ['--stylesheet'],
- {'default': 'default.css', 'metavar': '<URL>'}),
- ('Specify a stylesheet file, relative to the current working '
- 'directory. The path is adjusted relative to the output HTML '
- 'file. Overrides --stylesheet.',
- ['--stylesheet-path'],
- {'metavar': '<file>'}),
- ('Format for footnote references: one of "superscript" or '
- '"brackets". Default is "superscript".',
- ['--footnote-references'],
- {'choices': ['superscript', 'brackets'], 'default': 'superscript',
- 'metavar': '<FORMAT>'}),
- ('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.',
- ['--compact-lists'],
- {'default': 1, 'action': 'store_true'}),
- ('Disable compact simple bullet and enumerated lists.',
- ['--no-compact-lists'],
- {'dest': 'compact_lists', 'action': 'store_false'}),
- ('Omit the XML declaration. Use with caution.',
- ['--no-xml-declaration'], {'dest': 'xml_declaration', 'default': 1,
- 'action': 'store_false'}),
- ('Scramble email addresses to confuse harvesters. '
- 'For example, "abc@example.org" will become '
- '``<a href="mailto:%61%62%63%40...">abc at example dot org</a>``.',
- ['--cloak-email-addresses'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),))
-
- relative_path_settings = ('stylesheet_path',)
-
- output = None
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = HTTranslator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- self.stylesheet = visitor.stylesheet
- self.body = visitor.body
-
-
-class HTTranslator(HTMLTranslator):
-
- def __init__(self, document):
-
- # I don't believe we can embed any style content
- # the header, so always link to the stylesheet.
- document.settings.embed_stylesheet = 0
- document.settings.base_section = int(document.settings.base_section)
-
- HTMLTranslator.__init__(self, document)
- # ht2html likes having a title, so add a default one
- self.headers = {'title': 'None'}
- stylesheet = utils.get_stylesheet_reference(document.settings,
- os.path.join(os.getcwd(),'dummy'))
- if stylesheet:
- self.headers['stylesheet']= stylesheet
- # using first author found for .ht 'Author' header
- self.has_author = 0
-
- def astext(self):
- headers = ''.join(['%s: %s\n' % (k,v) \
- for (k,v) in self.headers.items()])
- # kludge! want footer, but not '</body></html>'
- body = self.body_pre_docinfo + self.docinfo + self.body + \
- self.body_suffix[:-1]
-
- return ''.join([headers + '\n'] + body)
-
- def visit_author(self, node):
- if not self.headers.has_key('author'):
- self.headers['author'] = self.encode(node.astext())
- HTMLTranslator.visit_author(self, node)
-
- def visit_contact(self, node):
- if not self.headers.has_key('author-email'):
- self.headers['author-email'] = self.encode(node.astext())
- HTMLTranslator.visit_contact(self, node)
-
- def visit_title(self, node):
- """Only 6 section levels are supported by HTML."""
- if isinstance(node.parent, nodes.topic):
- HTMLTranslator.visit_title(self, node)
- elif self.section_level == 0:
- HTMLTranslator.visit_title(self, node)
- # document title
- title = node.astext()
- self.headers['title'] = self.encode(title)
- else:
- # offset section level to account for ``base_section``.
- self.section_level += (self.settings.base_section - 1)
- HTMLTranslator.visit_title(self, node)
- self.section_level -= (self.settings.base_section - 1)
-
-
-# :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4:
diff --git a/sandbox/paultremblay/README.txt b/sandbox/paultremblay/README.txt
deleted file mode 100644
index 4fde07092..000000000
--- a/sandbox/paultremblay/README.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-============================
- README: Docutils Extensions
-============================
-
-:Author: Paul Tremblay
-
-:Contact: phthenry@earthlink.net
-
-:Date: $Date$
-
-:Web site: http://docutils.sourceforge.net/
-
-
-
-========
-Overview
-========
-
-This directory contains a number of modules that add functionality to
-docutils.
-
-1. The package docutils_nest adds functionality to docutils. XML authors
- and developers might find it useful. Others will not find it useful.
-
- As its name implies, docutils_nest allows users to add nested inline
- structure to a rst document.
-
- See the README.txt in /docutils_nest.
-
-2. rst_to_docbook
-
- This script has not been written. It will convert rst to docbook,
- using xml tools such as xslt.
-
-
-
diff --git a/sandbox/paultremblay/docutils_nest/README.txt b/sandbox/paultremblay/docutils_nest/README.txt
deleted file mode 100644
index 9908f8bb5..000000000
--- a/sandbox/paultremblay/docutils_nest/README.txt
+++ /dev/null
@@ -1,238 +0,0 @@
-.. WARNING TO PAUL: DON'T EDIT THIS FILE
-
-README: |scriptName|
-^^^^^^^^^^^^^^^^^^^^^
-:Author: Paul Tremblay
-
-:Contact: phthenry@earthlink.net
-
-:Date: $Date$
-
-:Web site: http://docutils.sourceforge.net/
-
-.. contents::
-
-.. |scriptName| replace:: docultils-nest-xml.py
-
-.. |moduleName| replace:: docutils_nest
-
-========
-Overview
-========
-
-The script |scriptName| extends the power of docultils by allowing XML authors
-and developers to include nested inline markup in their documents. While
-docutils allows for infinite nesting on the block level, it limits inline
-markup to one level. The script |scriptName| elminates this shortcomming. An
-XML author could write a document in rst format, and then with |scriptName|
-translate it to robust XML, which he could then further transform to docbook
-or any other form of XML he desired. Any type of XML markup is possible using
-|script_name|.
-
-In addition to allowing for nested markup, |scriptName| allows you to choose
-any type of inline markup you wish.
-
-Because users of docutils expressed differences as to how they wanted to mark
-inline text, |scriptName| allows you to customize the markup.
-
-Quick Example
-=============
-
-You wantd to include a comment with emphasized text in your final XML
-document. You type::
-
- [:comment: Maybe I should include *The Sun Also Rises?*]
-
-
-You then issue the command:
-
-|scriptName| --output my_document.rst
-
-The output is::
-
- <inline arg1 = "comment">Maye I should include <emphasis>The Sun Also
- Rises?</emphasis></inline>
-
-
-Installation
-============
-
-1. Install python. (http://www.python.org)
-
-2. Install the docutils package. (http://docutils.sourceforge.net/)
-
-3. Install the PyXml package. (http://pyxml.sourceforge.net/)
-
-4. Install the |moduleName|. You will need to have cvs installed on
-your machine.
-
- 1. Open a shell. Type
-
- ::
-
- cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/docutils login
-
- When asked for a password, simpy hit return.
-
-
- 2. Download the |moduleName|. Type
-
- ::
-
- cvs -z3
- -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/docutils co
- sandbox/paultremblay
-
- This command will download the directory sandbox/paultremblay to your
- current directory. Change to the directory /sandbox/paultremblay.
-
- 3. Run the configuration script to set the path and location of the configuration file.
-
- ::
-
- python configure.py target = <desired location of configuration file>
-
- If no target is provided (or you choose not to run the configuration file),
- the configuration file will be placed in /etc/|moduleName|.
-
-
- 4. Install the modules in the usual way:
-
- python setup.py build
-
- python setup.py install
-
-
-Use
-===
-
-|scriptName| ``--output <outfile> file.rst``
-
-You *must* specify an output option.
-
-In addition, you can specify any options you would if running docutils-xml.py:
-
-|scriptName| --indents --quiet --output otupt.xml file.rst
-
-
-How to markup your document
-===========================
-
-By default, the nested_inline module uses the following structure to markup text::
-
- [:some-tag test example: text [:nested: more text [text with brackets]]]
-
-This markup gets converted to::
-
- <inline arg1 = "some-tag" arg2 = "test" arg3 = "example">text <inline arg1 =
- "nested" more text [text with brackets]</inline></inline>
-
-You begin inline markup with an opening bracket followed by a colon, with no
- space. You then fill in the arguments by typing in words after the colon. A
- colon marks the end of the beginning tag and begins the text. A closing
- bracket marks the end of the inline text.
-
-Note that you can nest your markup to as many levels as you wish. You can also
-use brackets just as you norally would and not worry that nest_inline will
-confuse regular brackets with text meant to be treated as markup. However, the
-brackets must be matched. Consider this markup:
-
-[:math-formula-containing-closing-bracket: 2x ] ]
-
-You might mean for the first closing bracket to be part of the formula, but
-the nested_inline module will think it marks the end of your inline text. The
-script will produce this output::
-
- <inline arg1 = "math-forumla-containing-closing-bracket">2x</inline><problematic
- description = "solitary closing bracket my produce output you don't want"/>]
-
-In order to overcome this problem, escape the first closing bracket
-with literal markup::
-
- [:math-forumula-containing-closing-bracket: 2x ``]`` ]
-
-Errors
-======
-
-The module nested_inline will not produce invalid XML. If you write a file
-that has the potential to result in ill-formed XML, nested_inline produces an
-error message, along with an error tag. Consider the following document::
-
-
- .. If the script converted the brackets to tag, you would get
-
- .. <emphasis><inline arg1 = "markup">text</emphasis></inline>
-
- *[:markup: text*]
-
-The result is::
-
- <emphasis><problematic descrition = "tagging text would result in ill-formed XML"/>[:markup: text</emphasis>]
-
-Customizing Markup
-==================
-
-The nested_inline module reads from a customization file in order to determine how inline text is marked up. Change this document in order to change how you want to markup your text.
-
-The configuration file takes 6 values:
-
-- start-role: the way to mark the start of a role. The default is ":".
-
-- end-role: the way to mark the end of a role. The default is ":".
-
-- start-group: the way to mark the start of a group. The default is "[".
-
-- end-group: the way to mark the end of a group. The default is "]".
-
-- tag-name: the name of the inline tag. The default is "inline".
-
-- warning: the name of the warning messge for errors. The default is "problematic".
-
-Let's say you wanted to markup your text using parenethesis rather than brackets, and that you wanted your role to go outside of the parenthesis. You want your tag name to be "inline-tag", and your warning to be "warning." Your configuration file would look like this::
-
-
- <configure>
- <start-role string = ':'/>
- <end-role string = ':'/>
- <start-group string = '('/>
- <end-group string = ')'/>
- <place-of-role place = 'outside'/>
- <tag-name name = 'inline-tag'/>
- <warning name = 'warning'/>
- </configure>
-
-You would then markup your text as::
-
- :comment:(This is a comment with *italics*)
-
-The output would be::
-
- <inline-tag arg1 = "comment">This is a comment with <emhasis>italics</emphasis></inline-tag>
-
-Project Files & Directories
-===========================
-
-* README.txt: You're reading it.
-
-*|moduleName|: Contains all the modules for the script to run
-
-*doc: The documentation for the module, including a copy of this
-README.txt.
-
-*scripts: the script |scriptName|.
-
-*test_files: Files to test the script.
-
-
-Getting Help
-============
-
-Contact me.
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/sandbox/paultremblay/docutils_nest/configure.py b/sandbox/paultremblay/docutils_nest/configure.py
deleted file mode 100644
index baa44d3c1..000000000
--- a/sandbox/paultremblay/docutils_nest/configure.py
+++ /dev/null
@@ -1,146 +0,0 @@
-
-# /usr/bin/env python
-
-import sys, os
-import docutils_nest.options_trem
-
-"""
-
-The configuration script gets the target from the command line. It creates a file with the configuration variable, and a short script for the rest of script to be able to read and locate he configuration files.
-
-"""
-
-def configure():
- target = get_target()
- make_var_file(target)
- make_location(target)
-
-def get_target():
- """
- This functions uses a module I wrote to parse options. If no options are
- determined on the command line, the function returnst the default
- /etc/nest_docutis
-
- """
- options_dict = {
- 'target': [1, 't'],
- }
- options_obj = docutils_nest.options_trem.ParseOptions(sys.argv,
- options_dict)
- opt_dict, args = options_obj.parse_options()
- if opt_dict == 0:
- sys.stderr.write('invalid way to run configure:\n'
- 'python configure.py --target <directory of choice>'
- )
- sys.exit(1)
- target = opt_dict.get('target')
- if not target:
- target = default_target()
- return target
-
-def default_target():
- sys.stdout.write('using default /etc for configuration directory\n')
- return '/etc'
-
-def make_var_file(target):
- write_obj = open('var_file', 'w')
- # write_obj.write('[global]\n')
- write_obj.write(target)
- write_obj.close()
-
-def make_location(target):
- write_obj = open('docutils_nest/location.py', 'w')
- write_obj.write(
- """
-def get_location():
- return '%s'
-
-
- """
- % target)
-
-
-if __name__ == '__main__':
- configure()
-
-
-
-
-
-"""
-# /usr/bin/env python
-
-import sys, os
-import options_trem
-
-
-def configure():
- target = get_target()
- change_setup(target)
- change_script(target)
-
-def get_target():
- options_dict = {
- 'target': [1, 't'],
- }
- options_obj = options_trem.ParseOptions(sys.argv,
- options_dict)
- opt_dict, args = options_obj.parse_options()
- if opt_dict == 0:
- sys.stdout.write('Will use the default configuration of /etc/nest_docutils\n')
- return '/etc/docutils_nest'
- target = opt_dict.get('target')
- if not target:
- return '/etc/docutils_nest'
- return target
-
-def change_setup(target):
- read_obj = open('setup.py', 'r')
- write_obj = open('temp', 'w')
- line = 1
- while line:
- line = read_obj.readline()
- index = line.find('data_files=')
- if index > -1:
- write_obj.write('data_files = [("%s", ["data/configure.xml"])],\n' % target)
- else:
- write_obj.write(line)
- read_obj.close()
- write_obj.close()
- read_obj = open('temp', 'r')
- write_obj = open('setup.py', 'w')
- line = 1
- while line:
- line = read_obj.readline()
- write_obj.write(line)
- read_obj.close()
- write_obj.close()
-
-
-def change_script(target):
-
- read_obj = open('docutils_nest/nest_docutils.py', 'r')
- write_obj = open('temp', 'w')
- line = 1
- while line:
- line = read_obj.readline()
- index = line.find('$configure$')
- if index > -1:
- write_obj.write("ext_location = '%s' # $configure$" % \
- target)
- else:
- write_obj.write(line)
- read_obj.close()
- write_obj.close()
- read_obj = open('temp', 'r')
- write_obj = open('docutils_nest/nest_docutils.py', 'w')
- line = 1
- while line:
- line = read_obj.readline()
- write_obj.write(line)
- read_obj.close()
- write_obj.close()
-
-if __name__ == '__main__':
- configure()
-"""
diff --git a/sandbox/paultremblay/docutils_nest/data/configure.xml b/sandbox/paultremblay/docutils_nest/data/configure.xml
deleted file mode 100644
index 9d60fd139..000000000
--- a/sandbox/paultremblay/docutils_nest/data/configure.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<configure>
- <start-role string = ':'/>
- <end-role string = ':'/>
- <start-group string = '['/>
- <end-group string = ']'/>
- <place-of-role place = 'inside'/>
- <tag-name name = 'inline'/>
- <warning name = 'problematic'/>
-</configure>
diff --git a/sandbox/paultremblay/docutils_nest/doc/README.txt b/sandbox/paultremblay/docutils_nest/doc/README.txt
deleted file mode 100644
index 6d62f8764..000000000
--- a/sandbox/paultremblay/docutils_nest/doc/README.txt
+++ /dev/null
@@ -1,236 +0,0 @@
-README: |scriptName|
-^^^^^^^^^^^^^^^^^^^^^
-:Author: Paul Tremblay
-
-:Contact: phthenry@earthlink.net
-
-:Date: $Date$
-
-:Web site: http://docutils.sourceforge.net/
-
-.. contents::
-
-.. |scriptName| replace:: docultils-nest-xml.py
-
-.. |moduleName| replace:: docutils_nest
-
-========
-Overview
-========
-
-The script |scriptName| extends the power of docultils by allowing XML authors
-and developers to include nested inline markup in their documents. While
-docutils allows for infinite nesting on the block level, it limits inline
-markup to one level. The script |scriptName| elminates this shortcomming. An
-XML author could write a document in rst format, and then with |scriptName|
-translate it to robust XML, which he could then further transform to docbook
-or any other form of XML he desired. Any type of XML markup is possible using
-|script_name|.
-
-In addition to allowing for nested markup, |scriptName| allows you to choose
-any type of inline markup you wish.
-
-Because users of docutils expressed differences as to how they wanted to mark
-inline text, |scriptName| allows you to customize the markup.
-
-Quick Example
-=============
-
-You wantd to include a comment with emphasized text in your final XML
-document. You type::
-
- [:comment: Maybe I should include *The Sun Also Rises?*]
-
-
-You then issue the command:
-
-|scriptName| --output my_document.rst
-
-The output is::
-
- <inline arg1 = "comment">Maye I should include <emphasis>The Sun Also
- Rises?</emphasis></inline>
-
-
-Installation
-============
-
-1. Install python. (http://www.python.org)
-
-2. Install the docutils package. (http://docutils.sourceforge.net/)
-
-3. Install the PyXml package. (http://pyxml.sourceforge.net/)
-
-4. Install the |moduleName|. You will need to have cvs installed on
-your machine.
-
- 1. Open a shell. Type
-
- ::
-
- cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/docutils login
-
- When asked for a password, simpy hit return.
-
-
- 2. Download the |moduleName|. Type
-
- ::
-
- cvs -z3
- -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/docutils co
- sandbox/paultremblay
-
- This command will download the directory sandbox/paultremblay to your
- current directory. Change to the directory /sandbox/paultremblay.
-
- 3. Run the configuration script to set the path and location of the configuration file.
-
- ::
-
- python configure.py target = <desired location of configuration file>
-
- If no target is provided (or you choose not to run the configuration file),
- the configuration file will be placed in /etc/|moduleName|.
-
-
- 4. Install the modules in the usual way:
-
- python setup.py build
-
- python setup.py install
-
-
-Use
-===
-
-|scriptName| ``--output <outfile> file.rst``
-
-You *must* specify an output option.
-
-In addition, you can specify any options you would if running docutils-xml.py:
-
-|scriptName| --indents --quiet --output otupt.xml file.rst
-
-
-How to markup your document
-===========================
-
-By default, the nested_inline module uses the following structure to markup text::
-
- [:some-tag test example: text [:nested: more text [text with brackets]]]
-
-This markup gets converted to::
-
- <inline arg1 = "some-tag" arg2 = "test" arg3 = "example">text <inline arg1 =
- "nested" more text [text with brackets]</inline></inline>
-
-You begin inline markup with an opening bracket followed by a colon, with no
- space. You then fill in the arguments by typing in words after the colon. A
- colon marks the end of the beginning tag and begins the text. A closing
- bracket marks the end of the inline text.
-
-Note that you can nest your markup to as many levels as you wish. You can also
-use brackets just as you norally would and not worry that nest_inline will
-confuse regular brackets with text meant to be treated as markup. However, the
-brackets must be matched. Consider this markup:
-
-[:math-formula-containing-closing-bracket: 2x ] ]
-
-You might mean for the first closing bracket to be part of the formula, but
-the nested_inline module will think it marks the end of your inline text. The
-script will produce this output::
-
- <inline arg1 = "math-forumla-containing-closing-bracket">2x</inline><problematic
- description = "solitary closing bracket my produce output you don't want"/>]
-
-In order to overcome this problem, escape the first closing bracket
-with literal markup::
-
- [:math-forumula-containing-closing-bracket: 2x ``]`` ]
-
-Errors
-======
-
-The module nested_inline will not produce invalid XML. If you write a file
-that has the potential to result in ill-formed XML, nested_inline produces an
-error message, along with an error tag. Consider the following document::
-
-
- .. If the script converted the brackets to tag, you would get
-
- .. <emphasis><inline arg1 = "markup">text</emphasis></inline>
-
- *[:markup: text*]
-
-The result is::
-
- <emphasis><problematic descrition = "tagging text would result in ill-formed XML"/>[:markup: text</emphasis>]
-
-Customizing Markup
-==================
-
-The nested_inline module reads from a customization file in order to determine how inline text is marked up. Change this document in order to change how you want to markup your text.
-
-The configuration file takes 6 values:
-
-- start-role: the way to mark the start of a role. The default is ":".
-
-- end-role: the way to mark the end of a role. The default is ":".
-
-- start-group: the way to mark the start of a group. The default is "[".
-
-- end-group: the way to mark the end of a group. The default is "]".
-
-- tag-name: the name of the inline tag. The default is "inline".
-
-- warning: the name of the warning messge for errors. The default is "problematic".
-
-Let's say you wanted to markup your text using parenethesis rather than brackets, and that you wanted your role to go outside of the parenthesis. You want your tag name to be "inline-tag", and your warning to be "warning." Your configuration file would look like this::
-
-
- <configure>
- <start-role string = ':'/>
- <end-role string = ':'/>
- <start-group string = '('/>
- <end-group string = ')'/>
- <place-of-role place = 'outside'/>
- <tag-name name = 'inline-tag'/>
- <warning name = 'warning'/>
- </configure>
-
-You would then markup your text as::
-
- :comment:(This is a comment with *italics*)
-
-The output would be::
-
- <inline-tag arg1 = "comment">This is a comment with <emhasis>italics</emphasis></inline-tag>
-
-Project Files & Directories
-===========================
-
-* README.txt: You're reading it.
-
-*|moduleName|: Contains all the modules for the script to run
-
-*doc: The documentation for the module, including a copy of this
-README.txt.
-
-*scripts: the script |scriptName|.
-
-*test_files: Files to test the script.
-
-
-Getting Help
-============
-
-Contact me.
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/__init__.py b/sandbox/paultremblay/docutils_nest/docutils_nest/__init__.py
deleted file mode 100644
index b3d0c915b..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-'''
-modules for rtf2xml
-'''
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/inline_to_xml.py b/sandbox/paultremblay/docutils_nest/docutils_nest/inline_to_xml.py
deleted file mode 100644
index 316a47233..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/inline_to_xml.py
+++ /dev/null
@@ -1,459 +0,0 @@
-import re, sys, os
-import docutils_nest.well_formed_xml
-
-"""
-
-
-"""
-
-class InlineToXML:
-
- """
-
- """
-
-
-
- def __init__( self,
- start_role = ':',
- end_role = ':',
- start_group = '[',
- end_group = ']',
- place = 'inside',
- tag_name = 'inline',
- warning = 'problematic'
- ):
-
- """
-
- Required:
-
- nothing
-
- Options:
-
- start_role -- the text delimeter that marks the beginning of a role
-
- end_role -- the text delimeter that marks the end of a role
-
- start_group -- the text delimeter that marks the start of a group
-
- end_group -- the text delimiter that marks the end of a group
-
- place -- whether the role goes inside or outside of the group
-
- warning -- a string of text to describe problems
-
- warning_level -- will do away with this
-
-
- """
- self.__start_role = str(start_role)
- self.__end_role = str(end_role)
- self.__start_group = str(start_group)
- self.__end_group = str(end_group)
- self.__place = str(place)
- exp = self.__make_split_exp()
- self.__split_exp = re.compile(exp)
- exp = self.__role_exp_func()
- self.__start_exp = re.compile(exp)
- self.__token_list = []
- self.__reg_bracket = 0 # found regular brackets
- self.__bracket_type = []
- self.__tag_name, self.__warning = self.__make_tag_names(tag_name, warning)
-
- def __make_tag_names(self, tag_name, warning):
- tags = [tag_name, warning]
- counter = 0
- for name in tags:
- new_string = ''
- counter += 1
- for char in name:
- if not char.isalnum():
- char = '_'
- new_string += char
- first = new_string[:1]
- is_letter = first.isalpha()
- if not is_letter:
- new_string = 'a' + new_string
- if counter == 1:
- new_tag_name = new_string
- else:
- new_warning = new_string
- return new_tag_name, new_warning
-
- def __escape_value(self, value):
-
- """
-
- Required:
-
- value -- a string
-
- Returns
-
- a string of escaped values
-
- Logic:
-
- Certain characters have special values in regular expressions. If
- the user is using any of these special expressions, then they must
- be escaped.
-
-
- """
- special = ['[', ']', '(', ')', '{', '}', '.']
- if value in special:
- value = '\\%s' % value
- return value
-
- def __make_split_exp(self):
-
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- Use the object values to form a regular expression that will be
- used to split a string into tokens. The expression will be
- different if the role is inside or outside the group.
-
-
- """
- start_group = self.__escape_value(self.__start_group)
- end_group = self.__escape_value(self.__end_group)
- start_role = self.__escape_value(self.__start_role)
- end_role = self.__escape_value(self.__end_role)
- if self.__place == 'inside':
- #\[:[^\[\]]+:\s?|\[|\]
- exp = '(%s%s[^%s%s]+%s\s?|%s|%s)' % \
- (start_group,
- start_role,
- start_group,
- end_group,
- end_role,
- start_group,
- end_group
- )
-
-
- else:
- # :[^\[\]]+:\[|[|]
- exp = '(%s[^%s%s]+%s%s|%s|%s)' %\
- (start_role,
- start_group,
- end_group,
- end_role,
- start_group,
- start_group,
- end_group
- )
- return exp
-
- def __role_exp_func(self):
- """
-
- Requires:
-
- nothing
-
- Returns
-
- nothing
-
- Logic:
-
- Make a regular expression to marke the beginning of a group
-
- """
- start_group = self.__escape_value(self.__start_group)
- end_group = self.__escape_value(self.__end_group)
- start_role = self.__escape_value(self.__start_role)
- end_role = self.__escape_value(self.__end_role)
- if self.__place == 'inside':
- exp = '%s%s(.*?)%s' % \
- (start_group,
- start_role,
- end_role
- )
- else:
- exp = '%s(.*?)%s%s' % \
- (start_role,
- end_role,
- start_group
- )
- return exp
-
-
-
- def __well_formed_func(self, my_string):
- """
-
- Required:
-
- my_string --string to check
-
- Returns:
-
- 0 if the string can be convert to tags, and 0 otherwise
-
- Logic:
-
- Use the external module well_formed_xml to test that the tags are
- balanced. If they are balanced, the module returns 1. Othewise it
- returns 0
-
-
- """
- well_formed_obj = docutils_nest.well_formed_xml.WellFormed()
- well_formed = well_formed_obj.well_formed(my_string)
- return well_formed
-
-
-
- def __open_tag(self, my_string):
- """
-
- Requires:
-
- my_string --string to parse
-
- Returns:
-
- A string of arguments for an opening tag.
-
- Logic:
-
- Use a simple split expression to turn a string of values with a
- space bewteen them into arguments: word1 word2 word3 =>
- arg1="word1" arg2="word2" arg3="word3"
-
- """
- arguments = my_string.split()
- counter = 0
- final_string = ''
- for argument in arguments:
- counter += 1
- final_string += 'arg%s="%s" ' % (counter, argument)
- final_string = final_string.replace(':', '')
- return final_string[:-1] # chop off last space
-
-
-
- def __process_inside_group(self, inner_list):
- """
-
- Requires:
-
- inner_list -- a list of two values. The first is a string starting
- and ending with a colon. :arg1 arg2:
-
- Returns:
-
- A string of tagged text. If the string can be converted to XML (or
- tagged), then it is tagged:
-
- [':word1 word2:', 'text'] => <inline arg1="word1"
- arg2="word2">text</inline>
-
- If the string cannot be tagged, it makes the following:
-
- [':word1 word2:', 'text<i>'] => <warning descrition=
- description="tagging brackets will result in invalid XML'
-
- Logic:
-
- Check to see if you can tag the text and still form valid XML. If
- so, tag and return the text.
-
- Otherwise, write an error message and return the text.
-
-
-
- """
- my_string = inner_list[1]
- tag = inner_list[0]
- well_formed = self.__well_formed_func(my_string)
- if well_formed:
- match_obj = re.match(self.__start_exp, tag)
- tag = match_obj.group(1)
- open_tag = self.__open_tag(tag) #[:wor1:
- final_string = '<%s %s>%s</%s>' % (
- self.__tag_name, open_tag, my_string, self.__tag_name)
- return final_string
- else:
- final_string = '<%s description="tagging brackets will result ' % (self.__warning,
- )
- final_string += 'in invalid XML"/>'
- final_string += tag + my_string + ']'
- warning = (
- 'WARNING: tagging brackets will result in invalid XML:'
- '%s%s' % (tag, my_string)
- )
- sys.stderr.write(repr(warning))
- sys.stderr.write('\n')
- return final_string
-
- def __start_role_func(self, token):
- """
- Requires:
-
- token -- the token to check
-
- Returns:
-
- A string if a start expession is found; 0 otherwise
-
- """
-
- match_obj = re.match(self.__start_exp, token)
-
- if match_obj:
- return match_obj.group(1)
- return 0
-
- def __tag(self, tokens):
- """
-
- Requires:
-
- tokens -- a list of tokens
-
- Returns:
-
- A string --A string of tagged text
-
- Logic:
-
- Read one token at a time.
-
- If the token is text, add it to the final string. 'Text' => 'text'
-
- If the token is an opening bracket and a colon, make a new list =>
- [:word1: text] => [[:word1:, text]]
-
- If the token is a simple opening bracket, simply set the regular
- bracket tag to true.
-
- If the token is a closed bracket, and the regular bracket is not
- true, get the last item in the group. ([:word1: text]). Process
- this list and get a string back. If there the list still has
- items, add it to the text part:
-
- returned string = <inline arg1="word1"> text</inline>
-
- list = [[:arg2:, "more text]]
-
- Becomes:
-
- list = [[:arg2:, 'more text <inline arg1="word1" text </inline>']
-
- Otherwise, add the token either to the final string, or to the
- text portion of the list.
-
- """
- final_string = ''
- for token in tokens:
- start_role = self.__start_role_func(token)
- ##print repr(token)
- ##if token == ']' and not self.__reg_bracket:
- if token == self.__end_group and self.__bracket_type and \
- self.__bracket_type[-1] == 'inline':
-
- inside_string = self.__token_list.pop()
- parsed_string = self.__process_inside_group(inside_string)
- if self.__token_list:
- self.__token_list[-1][1] += parsed_string
- else:
- final_string += parsed_string
-
- self.__bracket_type.pop()
-
- # check for solitary closing brackets
- elif token == self.__end_group and not self.__bracket_type:
- sys.stderr.write('ending bracket may cause unwanted results\n')
- if self.__token_list:
- self.__token_list[-1][1] += token
- else:
- final_string += token
- elif start_role:
- self.__token_list.append([])
- self.__token_list[-1].append(token)
- self.__bracket_type.append('inline') # inline bracket group
- self.__token_list[-1].append('')
- else:
- # first test if you should add or pop list type
- if token == self.__end_group:
- ##self.__bracket_type.pop()
- try:
- self.__bracket_type.pop()
- except IndexError:
- pass
- elif token[0:1] == self.__start_group:
- self.__bracket_type.append('regular') # regular bracket group
-
- # now add the string to the right place
- if self.__token_list:
- self.__token_list[-1][1] += token # add to middle group
- else:
- final_string += token
- if self.__token_list:
- warning = 'WARNING Brackets not closed out\n'
- warning += self.__token_list[0][0] + self.__token_list[0][1]
- sys.stderr.write(repr(warning))
- warning = '<%s description="Brackets not closed properly"/>' % (
- self.__warning)
- final_string += warning + self.__token_list[0][0] + self.__token_list[0][1]
- self.__token_list = []
-
- return final_string
-
- def make_tags(self, my_string):
- my_list = re.split(self.__split_exp, my_string)
- my_string = self.__tag(my_list)
- return my_string
-
-
-
-if __name__ == '__main__':
- start_role = ':'
- end_role = ':'
- start_group = '['
- end_group = ']'
- place = 'inside'
-
- test_obj = InlineToXML(
- start_role = start_role,
- end_role = end_role,
- place = place,
- start_group = start_group,
- end_group = end_group
- )
- the_test_string = '<i role = "arg">[:role: test22 [:role2: text2]</i>][]'
- return_string = test_obj.make_tags(the_test_string)
- print '@%s@' % return_string
-
- start_role = ':'
- end_role = ':'
- start_group = '['
- end_group = ']'
- place = 'outside'
-
- test_obj = InlineToXML(
- start_role = start_role,
- end_role = end_role,
- place = place,
- start_group = start_group,
- end_group = end_group
- )
-
- the_test_string = ':role:[ test :role2:[ text2]]'
- return_string = test_obj.make_tags(the_test_string)
- print return_string
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/nest_docutils.py b/sandbox/paultremblay/docutils_nest/docutils_nest/nest_docutils.py
deleted file mode 100644
index 61941fbb1..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/nest_docutils.py
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env python
-import sys, os
-import docutils_nest.nested_inline
-import docutils_nest.read_config
-import docutils_nest.options_trem
-import docutils_nest.location
-
-"""
-converst an XML file to nested tags
-
-
-"""
-outer_dir = docutils_nest.location.get_location()
-doc_nest_dir = os.path.join(outer_dir, '.docutils_nest')
-
-
-class GetOptions:
- def __init__(self, sys_string):
- self.__sys_string = sys_string
-
- def get_options(self):
- options_dict = {
- 'output': [1,'o']
- }
- options_obj = docutils_nest.options_trem.ParseOptions(
- system_string = self.__sys_string,
- options_dict = options_dict,
- )
-
- options, arguments = options_obj.parse_options()
- output = ''
- file = ''
- if options == 0:
- sys.stderr.write('Script will quit because of invalid options')
- sys.exit(1)
- output = options.get('output')
-
- if not output:
- sys.stderr.write('must provide output for script to work\n')
- sys.exit(1)
- if arguments:
- file = arguments[0]
-
- if not file:
- sys.stderr.write('must provide a file for script to work\n')
- sys.exit(1)
-
- return file, output
-
-class GetConfig:
-
- def __init__(self, file):
- self.__file = file
-
- def get_config(self):
- config_obj = docutils_nest.read_config.Configure(self.__file)
- config_values = config_obj.read_configs()
- return config_values
-
-class MakeTags:
- def __init__( self,
- file,
- output,
- config_values
-
- ):
- self.__file = file
- self.__output = output
- self.__start_role = config_values.get('start_role')
- self.__end_role = config_values.get('end_role')
- self.__start_group = config_values.get('start_group')
- self.__end_group = config_values.get('end_group')
- self.__place_of_role = config_values.get('place_of_role')
- self.__tag_name = config_values.get('tag_name')
- self.__warning = config_values.get('warning')
-
- def make_tags(self):
- convert_obj = docutils_nest.nested_inline.InlineBrackets(
- file = self.__file,
- output = self.__output,
- start_role = self.__start_role,
- end_role = self.__end_role,
- start_group = self.__start_group,
- end_group = self.__end_group,
- place = self.__place_of_role,
- tag_name = self.__tag_name,
- warning = self.__warning
- )
- convert_obj.make_tags()
-
-
-
-
-class NestDocutils:
-
- def __init__(self, file, output):
- self.__file = file
- self.__output = output
-
- def nest_tags(self):
- config_file = os.path.join(doc_nest_dir, 'configure.xml')
- config_obj = GetConfig(config_file)
- config_values = config_obj.get_config()
- tags_obj = MakeTags(self.__file, self.__output, config_values)
- tags_obj.make_tags()
-
-if __name__ == '__main__':
-
- # file = '/home/paul/lib/python/paul/restructure_tools/test_inline.xml'
- # output = '/home/paul/paultemp/brackets_to_tags.temp.xml'
- # nest_obj = NestDocutils(file, output)
- # nest_obj.nest_tags()
- # sys.exit(0)
- options_obj = GetOptions(sys.argv)
- file, output = options_obj.get_options()
- config_file = os.path.join(doc_nest_dir, 'configure.xml')
- config_obj = GetConfig(config_file)
- config_values = config_obj.get_config()
- tags_obj = MakeTags(file, output, config_values)
- tags_obj.make_tags()
- command = 'xmlvalid -c -v %s' % output
- os.system(command)
-
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/nest_utils.py b/sandbox/paultremblay/docutils_nest/docutils_nest/nest_utils.py
deleted file mode 100644
index c158334f9..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/nest_utils.py
+++ /dev/null
@@ -1,181 +0,0 @@
-"""
-
-This script converts a document marked up as rst to XML. It uses the
-docutils-xml.py conversion tools, and then performs one more transformation to
-convert text specially marked up to XML as well.
-
-NOTE: This is not part of the official docutils package. Rather, it is my own
-extension.
-
-"""
-
-import os, sys
-import docutils_nest.nest_docutils
-import docutils_nest.rst_options
-
-class RstWithInline:
-
- def __init__(self, file, output, docutils_opts = []):
- self.__file = file
- self.__output = output
- self.__docutils_opts = docutils_opts
-
- def convert(self):
-
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- First convert the txt file to a temp XML file. Then convert this
- temp file, chagning inline marked-up text to tags.
-
- """
- temp_file = self.__convert_restructure()
- self.__convert_inline(temp_file)
-
-
-
-
- def __convert_restructure(self):
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- Use the docuitls-xml script to convert the file from rst to XML
-
-
- """
- import locale
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- pass
- ##--no-doctype
- argv = self.__docutils_opts
- argv.append('--no-doctype')
- argv.append(self.__file) # input file
- restructure_temp = '/tmp/restructure_text_temp' # temp output
- argv.append(restructure_temp)
-
-
- from docutils.core import publish_cmdline, default_description
-
- # I think this is just for the description at the beginning of the
- # resulting file
- description = ('Generates Docutils-native XML from standalone '
- 'reStructuredText sources. \n'
- 'From script resruct_to_tei.py ' + default_description)
-
- # invoke the method for coversion
- publish_cmdline(writer_name='xml', description=description,
- argv = argv)
-
- return restructure_temp
- # os.rename(restructure_temp, self.__output)
-
- def __convert_inline(self, temp):
-
- """
-
- Requires:
-
- temp -- a valid, XML file converted from docutils-xml.py
-
- Returns:
-
- nothing
-
- Logic:
-
- Use the module nest_docutils to transform text marked up as inline to XML.
-
- """
- nest_obj = docutils_nest.nest_docutils.NestDocutils(temp, self.__output)
- nest_obj.nest_tags()
-
-
-
-
-def print_help_message():
- sys.stdout.write(
- '\n\n'
- 'Use For rst_convert_with_inline:\n'
- '================================='
- '\n\n'
- 'python rst_convert_with_inline.py [docuitls options] --output <output> file.txt\n'
- '(--output *must* be provided!)\n'
- '\n\n'
- 'An invalid docutils options will cause an error.\n'
- 'Hold on while the docutils help message prints out...'
- '\n\n'
- )
-
-
- import locale
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- pass
- argv = ['--help']
-
- from docutils.core import publish_cmdline, default_description
-
- # I think this is just for the description at the beginning of the
- # resulting file
- description = ('Generates Docutils-native XML from standalone '
- 'reStructuredText sources. \n'
- 'From script resruct_to_tei.py ' + default_description)
-
- # invoke the method for coversion
- publish_cmdline(writer_name='xml', description=description,
- argv = argv)
-
-def convert_file():
-
- options_dict = {
- 'output': [1]
- }
- opt_obj = docutils_nest.rst_options.OptionsRst(sys.argv, options_dict)
- inline_opts, args, doc_opts = opt_obj.parse_options()
- if inline_opts == 0:
- print_help_message()
- sys.stderr.write('Script will now quite because of illegal options\n')
- sys.exit(1)
- try:
- file = args[0]
- except IndexError:
- sys.stderr.write('You must provide a file for the script to convert.\n'
- 'Script will now quit'
- )
- sys.exit(1)
- output = inline_opts.get('output')
- if not output:
- sys.stderr.write('You must provide an output option for the script to work\n'
- 'Script will now quit\n'
- )
- sys.exit(1)
- convert_obj = RstWithInline(file, output, docutils_opts = doc_opts)
- convert_obj.convert()
-
-if __name__ == '__main__':
- # # file = os.path.join(nest_inline_location, 'nest_inline/test_files/simple1.txt')
- # # output = os.path.join(nest_inline_location, 'nest_inline/output.xml')
- convert_file()
-
- nest_inline_location = '/home/paul/lib/python/'
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/nested_inline.py b/sandbox/paultremblay/docutils_nest/docutils_nest/nested_inline.py
deleted file mode 100644
index 7937f070e..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/nested_inline.py
+++ /dev/null
@@ -1,352 +0,0 @@
-import os, re, sys, codecs
-
-import xml.sax.saxutils
-import xml.sax
-
-# turn on this line if you want to disablenamespaces
-##from xml.sax.handler import feature_namespaces
-
-##import paul.restructure_tools.handle_inline_text
-import docutils_nest.inline_to_xml
-# # import txt_to_xml.brackets_to_xml
-
-"""
-
-Inline
-^^^^^^
-
-:author: Paul Tremblay
-
-:revision:
-
- :revnumber: .2
-
- :date: 2003-05-03
-
- :revremark: When I first started writing this document.
-
- :revnumber: .21
-
- :date: 2003-05-06
-
- :revremark: Turned off namespaces. Tried "to get rid of using import ..
- from" construction, since I don't understand it.
-
- :revnumber: .22
-
- :date: 2003-05-09
-
- :revremark: Documented the module. Escaped brackets such as \[. Escaped any
- bracket in an attribute.
-
- :revnumber: .23
-
- :date: 2003-05-31
-
- :revremark: The user can now choose his or her own way to define groups.
-
-========
-Overview
-========
-
-This module gets a file and changes brackets to inline tags:
-
-<document>
-
- <paragraph>Text [:word1 word2 word3: Text [:word1 word2: Text2 [regular bracket]]Text3]
- </paragraph>
-
-</document>
-
-
-<document>
-
- <paragraph>Text <arg1="word1" arg2="word2" arg3="word3"> Text <inline arg1="word1" arg2= "word2"> Text2 [regular bracket]</inline>Text3</inline>
- </paragraph>
-
-</document>
-
-"""
-
-
-
-
-class InlineHandler(xml.sax.saxutils.DefaultHandler):
- """
-
- Class for handling the XML file. SAX uses the methods in this class to
- handle the data.
-
-
- """
- def __init__( self,
- write_obj,
- start_role = ':',
- end_role = ':',
- start_group = '[',
- end_group = ']',
- place = 'inside',
- tag_name = 'inline',
- warning = 'problematic'
-
- ):
-
- """
-
-
- Requires:
-
- write_obj -- a write object
-
- Returns:
-
- nothing
-
-
- Logic:
-
- Set the necessary parameters:
-
- self.__write_obj --the object for outputing text
-
- self.__name --name of current element
-
- self.__character --string containg characters in current
- element.
-
- self.__in_block --whether the text is in a block element.
-
- self.__block_tags -- a list of tags that include blocks of
- text. In other words, all tags except those tags that surround
- inline items.
-
- self.__block_tags -- the string of all text and elements in
- the current block.
-
- self.__handl_br_text_obj -- an object to handle all block text
- that contains an open bracket.
-
- """
- self.__write_obj = write_obj
- self.__name = ''
- self.__character = ''
- self.__in_block = 0
- self.__block_tags = ['paragraph', 'author', 'date', 'revision',
- 'version']
- self.__block_tag_string = ''
- # self.__handle_br_text_obj = \
- # rst_bracket_inline.handle_bracket_string.Inline()
- self.__handle_br_text_obj = \
- docutils_nest.inline_to_xml.InlineToXML(
- start_role = start_role,
- end_role = end_role,
- start_group = start_group,
- end_group = end_group,
- place = place,
- tag_name = tag_name,
- warning = warning
- )
-
- def startElement(self, name, attrs):
- """
-
- Logic:
-
- The SAX driver uses this function when if finds a beginning tag.
-
- Escape all opening and closing brackets for the values of
- attributes, so they won't be processed.
-
- Make a string from the opening tag. If you are in a block element,
- add this string to the block element string. Otherwise, write the
- string to the file.
-
-
-
- """
- self.__name = name
- if name in self.__block_tags:
- self.__in_block = 1
- open_tag = '<%s' % name
- keys = attrs.keys()
- for key in keys:
- att = key
- value = attrs[key]
- # kind of a kludge. Only escape text that is going to be unescaped
- # later on
- if self.__in_block:
- value = value.replace('[', '\000')
- value = value.replace(']', '\001')
- open_tag += ' %s="%s"' % (att, value)
- open_tag += '>'
- if self.__in_block:
- self.__block_tag_string += open_tag
- else:
- self.__write_obj.write(open_tag)
-
-
- def characters(self, character):
- """
-
- Logic:
-
- The SAX driver uses this function when it finds text.
-
- If the text is between two literal tags, then I want to escape all
- opening and closing brackts to that they are not processed.
-
- If the text is not between two literal tags, I want to escape a
- backlash followed by a bracket.
-
- (Note: The only way that a file processed by docutils-xml will
- pass on a backslash followed by a bracket is if the original file
- has *2* backslashes followed by a bracket.)
-
- Add the changed string to the block test string.
-
- If the text is not in a block (which I don't think should happen),
- it simply outputs it to the file.
-
- """
-
- character = character.replace('&', '&amp')
- character = character.replace('<', '&lt;')
- character = character.replace('>', '&gt;')
- if self.__in_block:
- if self.__name == 'literal':
- character = character.replace('[', '\000')
- character = character.replace(']', '\001')
- # replace escaped backslashes not in literal
- else:
- character = character.replace('\\]', '\001')
- self.__block_tag_string += character
- else:
- self.__write_obj.write(character)
-
-
- def endElement(self, name):
- """
-
- Logic:
-
- The SAX driver uses the function when it finds an end tag. It
- pases to this function the name of the end element.
-
- If the name is a block element, the function checks if it has any
- starting brackets. If it does, the string should be processed with
- the handle bracket module.
-
- The text that has been escaped is not unescaped, and the string is
- written to the output file.
-
- If the tag does not indicate the end of a block, but you are in a
- block tag, add the text to the block string.
-
- If the text has nothing to do with a block, simly output it to the
- file.
-
-
- """
-
-
- if name in self.__block_tags:
- self.__block_tag_string += '</%s>' % name
- # handle all the text
- if '[' in self.__block_tag_string:
- tagged_text = \
- self.__handle_br_text_obj.make_tags(self.__block_tag_string)
- else:
- tagged_text = self.__block_tag_string
- tagged_text = tagged_text.replace('\000', '[')
- tagged_text = tagged_text.replace('\001', ']')
- self.__write_obj.write(tagged_text)
- self.__in_block = 0
- self.__block_tag_string = ''
- elif self.__in_block:
- self.__block_tag_string += '</%s>' % name
- else:
- self.__write_obj.write('</%s>' % name)
-
-
-
-
-class InlineBrackets:
-
- def __init__( self,
- file,
- output,
- start_role = ':',
- end_role = ':',
- start_group = '[',
- end_group = ']',
- place = 'inside',
- tag_name = 'inline',
- warning = 'problematic'
-
- ):
-
-
- """
-
-
- Requires:
-
- file --file to be read
-
- output --file to output to
-
-
- Returns:
-
- Nothing. Outputs a file
-
- Logic:
-
- Set up a write object.
-
- Create an instance of the InlineHandler for sax to use.
-
- Pass this instance to the SAX driver.
-
- Use the SAX driver to handle the file.
-
-
- """
- self.__output = output
- self.__file = file
- self.__start_role = start_role
- self.__end_role = end_role
- self.__start_group = start_group
- self.__end_group = end_group
- self.__place = place
- self.__tag_name = tag_name
- self.__warning = warning
-
- def make_tags(self):
- (utf8_encode, utf8_decode, utf8_reader, utf8_writer) = codecs.lookup("utf-8")
- write_obj = utf8_writer(open(self.__output, 'w'))
- parser = xml.sax.make_parser()
- # turn on this line if you want to disable namespaces
- ##parser.setFeature(feature_namespaces, 0)
- inline_handler = InlineHandler( write_obj = write_obj,
- start_role = self.__start_role,
- end_role = self.__end_role,
- start_group = self.__start_group,
- end_group = self.__end_group,
- place = self.__place,
- tag_name = self.__tag_name,
- warning = self.__warning
- )
- parser.setContentHandler(inline_handler)
- parser.parse(self.__file)
- write_obj.close()
-
-
-
-if __name__ == '__main__':
- file = '/home/paul/lib/python/paul/restructure_tools/test_inline.xml'
- output = '/home/paul/paultemp/brackets_to_tags.temp.xml'
- obj = InlineBrackets(file, output = output, warning = '5fuck:? yo&<>u')
- obj.make_tags()
- command = 'xmlvalid -c -v %s' % output
- os.system(command)
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/options_trem.py b/sandbox/paultremblay/docutils_nest/docutils_nest/options_trem.py
deleted file mode 100644
index 6cf60a3db..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/options_trem.py
+++ /dev/null
@@ -1,386 +0,0 @@
-import sys
-class ParseOptions:
-
- """
-
- Requires:
-
- system_string --The string from the command line
-
- options_dict -- a dictionary with the key equal to the opition, and
- a list describing that option. (See below)
-
-
- Returns:
-
- A tupple. The first item in the tupple is a dictionary containing
- the arguments for each options. The second is a list of the
- arguments.
-
- If invalid options are passed to the module, 0,0 is returned.
-
- Examples:
-
- Your script has the option '--indents', and '--output=file'.
-
- You want to give short option names as well:
-
- --i and -o=file
-
- Use this:
-
- options_dict = {'output': [1, 'o'],
- 'indents': [0, 'i']
- }
-
- options_obj = ParseOptions(
- system_string = sys.argv,
- options_dict = options_dict
- )
-
- options, arguments = options_obj.parse_options()
- print options
- print arguments
-
- The result will be:
-
-
- {indents:None, output:'/home/paul/file'}, ['/home/paul/input']
-
-
- """
- def __init__(self, system_string, options_dict):
- self.__system_string = system_string[1:]
- long_list = self.__make_long_list_func(options_dict)
- # # print long_list
- short_list = self.__make_short_list_func(options_dict)
- # # print short_list
- self.__legal_options = long_list + short_list
- # # print self.__legal_options
- self.__short_long_dict = self.__make_short_long_dict_func(options_dict)
- # # print self.__short_long_dict
- self.__opt_with_args = self.__make_options_with_arg_list(options_dict)
- # # print self.__opt_with_args
- self.__options_okay = 1
-
-
-
- def __make_long_list_func(self, options_dict):
- """
- Required:
-
- options_dict -- the dictionary mapping options to a list
-
- Returns:
-
- a list of legal options
-
-
-
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- key = '--' + key
- legal_list.append(key)
- return legal_list
-
- def __make_short_list_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of legal short options
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- legal_list.append('-' + values[1])
- except IndexError:
- pass
-
- return legal_list
-
-
-
- def __make_short_long_dict_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a dictionary with keys of short options and values of long options
-
- """
- short_long_dict = {}
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- short = '-' + values[1]
- long = '--' + key
- short_long_dict[short] = long
- except IndexError:
- pass
-
- return short_long_dict
-
- def __make_options_with_arg_list(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of options that take arguments.
-
- """
- opt_with_arg = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- if values[0]:
- opt_with_arg.append('--' + key)
- except IndexError:
- pass
-
- return opt_with_arg
-
-
- def __sub_short_with_long(self):
- """
- Required:
-
- nothing
-
- Returns:
-
- a new system string
-
- Logic:
-
- iterate through the system string and replace short options with long options
-
-
- """
- new_string = []
- sub_list = self.__short_long_dict.keys()
- for item in self.__system_string:
- if item in sub_list:
- item = self.__short_long_dict[item]
- new_string.append(item)
- return new_string
-
-
-
- def __pair_arg_with_option(self):
-
- """
-
- Required:
-
- nothing
-
- Returns
-
- nothing (changes value of self.__system_string)
-
- Logic:
-
- iterate through the system string, and match arguments with options:
-
- old_list = ['--foo', 'bar']
-
- new_list = ['--foo=bar'
-
- """
- opt_len = len(self.__system_string)
- new_system_string = []
- counter = 0
- slurp_value = 0
- for arg in self.__system_string:
-
- # previous value was an option with an argument, so this arg is
- # actually an argument that has already been added
- counter += 1
- if slurp_value:
- slurp_value = 0
- continue
-
- # not an option--an argument
- if arg[0] != '-':
- new_system_string.append(arg)
-
- # option and argument already paired
- elif '=' in arg:
- new_system_string .append(arg)
- else:
- # this option takes an argument
- if arg in self.__opt_with_args:
- # option is the last in the list
- if counter + 1 > opt_len:
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- else:
- # the next item in list is also an option
- if self.__system_string[counter][0] == '-':
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- # the next item in the list is the argument
- else:
- new_system_string.append(arg + '=' + self.__system_string[counter])
- slurp_value = 1
- # this option does not take an argument
- else:
- new_system_string.append(arg)
- return new_system_string
-
-
- def __get_just_options(self):
-
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- list of options
-
- Logic:
-
- Iterate through the self.__system string, looking for the last
- option. The options are everything in the sysem string before the
- last option.
-
- Check to see that the options contain no arguments.
-
-
- """
- highest = 0
- counter = 0
- found_options = 0
- for item in self.__system_string:
- if item[0] == '-':
- highest = counter
- found_options = 1
- counter += 1
-
- if found_options:
- just_options = self.__system_string[:highest + 1]
- arguments = self.__system_string[highest + 1:]
- else:
- just_options = []
- arguments = self.__system_string
-
- if found_options:
- for item in just_options:
- if item[0] != '-':
- sys.stderr.write('%s is an argument in an option list\n' % item)
- self.__options_okay = 0
- return just_options, arguments
-
-
- def __is_legal_option_func(self):
-
- """
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- Check each value in the newly creatd options list to see if it
- matches what the user describes as a legal option.
-
-
- """
- illegal_options = []
- for arg in self.__system_string:
- if '=' in arg:
- temp_list = arg.split('=')
- arg = temp_list[0]
- if arg not in self.__legal_options and arg[0] == '-':
- illegal_options.append(arg)
-
- if illegal_options:
- self.__options_okay = 0
- sys.stderr.write('The following options are not permitted:\n')
- for not_legal in illegal_options:
- sys.stderr.write('%s\n' % not_legal)
-
-
- def __make_options_dict(self, options):
- options_dict = {}
- for item in options:
- if '=' in item:
- option, arg = item.split('=')
- else:
- option = item
- arg = None
-
- if option[0] == '-':
- option = option[1:]
- if option[0] == '-':
- option = option[1:]
-
- options_dict[option] = arg
-
- return options_dict
-
- def parse_options(self):
- self.__system_string = self.__sub_short_with_long()
- # # print 'subbed list is %s' % self.__system_string
- self.__system_string = self.__pair_arg_with_option()
- # # print 'list with pairing is %s' % self.__system_string
- options, arguments = self.__get_just_options()
- # # print 'options are %s ' % options
- # # print 'arguments are %s ' % arguments
- self.__is_legal_option_func()
- if self.__options_okay:
- options_dict = self.__make_options_dict(options)
- # # print options_dict
- return options_dict, arguments
-
- else:
- return 0,0
-
-
-
-
-if __name__ == '__main__':
- this_dict = {
- 'indents': [0, 'i'],
- 'output': [1, 'o'],
- 'test3': [1, 't'],
- }
- test_obj = ParseOptions(system_string = sys.argv,
- options_dict = this_dict
- )
-
- options, the_args = test_obj.parse_options()
- print options, the_args
-
- """
- this_options = ['--foo', '-o']
- this_opt_with_args = ['--foo']
-
- """
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/read_config.py b/sandbox/paultremblay/docutils_nest/docutils_nest/read_config.py
deleted file mode 100644
index 84ac7b4ad..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/read_config.py
+++ /dev/null
@@ -1,143 +0,0 @@
-import os, re, sys, codecs
-
-import xml.sax.saxutils
-import xml.sax
-
-# turn on this line if you want to disablenamespaces
-##from xml.sax.handler import feature_namespaces
-
-
-config_values = {
- 'start_role' : ':',
- 'end_role' : ':',
- 'start_group' : '[',
- 'end_group' : ']',
- 'place_of_role' : 'inside',
- 'tag_name' : 'inline',
- 'warning' : 'problematic',
-
-}
-
-
-class ConfigHandler(xml.sax.saxutils.DefaultHandler):
- """
-
- Class for handling the XML file. SAX uses the methods in this class to
- handle the data.
-
-
- """
- def __init__(self):
-
- """
-
-
- Requires:
-
-
- Returns:
-
- nothing
-
-
- Logic:
-
-
- """
- self.__allowed = [
- 'start-role', 'end-role', 'start-group', 'end-group', 'place-of-role',
- 'tag-name', 'warning', 'configure'
- ]
-
-
-
- def startElement(self, name, attrs):
- """
-
- Logic:
-
- The SAX driver uses this function when if finds a beginning tag.
-
-
-
- """
- if name in self.__allowed:
- values = attrs.values()
- config_values[name] = values
-
- else:
- sys.stderr.write('%s not a valid option\n' % name)
-
-
- def characters(self, character):
- """
-
- Logic:
-
- The SAX driver uses this function when it finds text.
-
- """
- pass
-
-
-
- def endElement(self, name):
- """
-
- Logic:
-
-
- """
-
- pass
-
-
-
-
-class Configure:
-
- def __init__(self, file):
-
-
- """
-
-
- Requires:
-
-
-
- Returns:
-
-
- Logic:
-
- Set up a write object.
-
- Create an instance of the InlineHandler for sax to use.
-
- Pass this instance to the SAX driver.
-
- Use the SAX driver to handle the file.
-
-
- """
- file_exists = os.path.exists(file)
- if not file_exists:
- raise IOError, 'file %s does not exist' % file
- self.__file = file
-
- def read_configs(self):
- parser = xml.sax.make_parser()
- # turn on this line if you want to disable namespaces
- ##parser.setFeature(feature_namespaces, 0)
- config_handler = ConfigHandler()
- parser.setContentHandler(config_handler)
- parser.parse(self.__file)
- return config_values
-
-
-
-if __name__ == '__main__':
- file = '/home/paul/docutils-extensions/configure.xml'
- obj = Configure(file)
- obj.read_configs()
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/rst_options.py b/sandbox/paultremblay/docutils_nest/docutils_nest/rst_options.py
deleted file mode 100644
index b0d3737bf..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/rst_options.py
+++ /dev/null
@@ -1,106 +0,0 @@
-"""
-
-Parse options from the command line in order to convert an rst text to XML.
-
-This script separates the options a script needs from the options that docuitls needs.
-
-Takes a system string. Returns a dictionary of options for docutils inline, a list of argumetns for docutils-inline, and a string for docutils.
-
-"""
-
-import sys, os
-import options_trem
-
-class OptionsRst:
-
- def __init__(self, sys_argv, script_options):
-
-
- self.__sys_argv = sys_argv
- self.__rst_options_dict = {
- 'pep-references': [],
- 'rfc-references': [],
- 'tab-width': [1],
- 'newlines': [],
- 'indents': [],
- 'no-xml-declaration': [],
- 'no-doctype': [],
- 'generator': [0,'g'],
- 'no-generator': [],
- 'date': [0,'d'],
- 'time': [0,'t'],
- 'no-datestamp': [],
- 'source-link': [0, 's'],
- 'source-url': [1],
- 'no-source-link': [],
- 'toc-entry-backlinks': [],
- 'toc-top-backlinks': [],
- 'no-toc-backlinks': [],
- 'footnote-backlinks': [],
- 'no-footnote-backlinks': [],
- 'report': [1, 'r'],
- 'verbose': [0,'v'],
- 'quiet': [0, 'q'],
- 'halt': [1],
- 'strict': [],
- 'debug': [],
- 'no-debug': [],
- 'warnings': [],
- 'input-encoding': [1, 'i'],
- 'output-encoding': [1, 'o'],
- 'language': [1, 'l'],
- 'config': [1],
- 'version': [0, 'V'],
- 'help': [0, 'h'],
- }
-
-
- self.__inline_options_dict = script_options
- self.__rst_options_list = self.__rst_options_dict.keys()
- self.__inline_options_list = self.__inline_options_dict.keys()
-
- self.__both_options = {}
- self.__both_options.update(self.__rst_options_dict)
- self.__both_options.update(self.__inline_options_dict)
-
- def parse_options(self):
- opts, args = self.__get_raw_options()
- if opts == 0:
- return 0, 0, 0
- doc_opts, inline_opts = self.__split_options(opts)
- return inline_opts, args, doc_opts
-
- def __get_raw_options(self):
- raw_obj = options_trem.ParseOptions(
- options_dict = self.__both_options,
- system_string = self.__sys_argv
- )
-
- options, arguments = raw_obj.parse_options()
- return options, arguments
-
- def __split_options(self, options):
- inline_options = {}
- docutils_options = []
- keys = options.keys()
- for key in keys:
- if key in self.__rst_options_list:
- if options[key] == None:
- docutils_options.append('--%s' % key)
- else:
- docutils_options.append('--%s=%s' % (key, options[key]))
-
- else:
- inline_options[key] = options[key]
-
- return docutils_options, inline_options
-
-
-
-
-if __name__ == '__main__':
- this_options_dict = {
- 'output': [1],
- }
- test_obj = OptionsRst(sys.argv, this_options_dict)
- test_obj.parse_options()
diff --git a/sandbox/paultremblay/docutils_nest/docutils_nest/well_formed_xml.py b/sandbox/paultremblay/docutils_nest/docutils_nest/well_formed_xml.py
deleted file mode 100644
index 643565382..000000000
--- a/sandbox/paultremblay/docutils_nest/docutils_nest/well_formed_xml.py
+++ /dev/null
@@ -1,73 +0,0 @@
-import xml.parsers.expat
-
-"""
-
-well_formed module
-^^^^^^^^^^^^^^^^^^
-
-========
-Overview
-========
-
-Takes a string, and returns either a zero or one, depending if the string has
-balanced tags.
-
-
-"""
-
-class WellFormed:
-
- def __init__(self):
- pass
-
- def well_formed(self, my_string):
- """
-
- Requires:
-
- my_string --string to test for well-formedness
-
- Returns:
-
- 1, if the tags are balanced, and 0 if the tags are not
-
- Logic:
-
- Enclose the string around an artifical root element.
-
- Change the encoding, if necessary.
-
- Try to parse the string with expat. If there is success, return 1.
- Otherwise, catch the exception and return 0.
-
- """
- enclosing_tag = 'doc-string-test6685866'
- my_string = '<%s>%s</%s>' % (enclosing_tag, my_string, enclosing_tag)
- try:
- if isinstance(my_string, type(u"")):
- my_string = my_string.encode("utf-8")
- parser = xml.parsers.expat.ParserCreate()
- parser.Parse(my_string, 1)
- return 1
- except xml.parsers.expat.ExpatError:
- return 0
-
-
-if __name__ == '__main__':
- test_strings = [
- '<tag>simplest test</tag>',
- '<tag>simplest fail test<tag>',
- '<tag>&amp;text\u201c</tag><tag>text,</tag>',
- '<tag>&amp;text&lt;</tag><tag>text,</tag>',
- '</tag>&amp;text&lt;</tag><tag>text,<tag>',
- ]
- test_obj = WellFormed()
- for test_string in test_strings:
- well_formed = test_obj.well_formed(test_string)
- if well_formed:
- print '%s is well formed' % test_string
- else:
- print '%s is not well formed' % test_string
-
-
-
diff --git a/sandbox/paultremblay/docutils_nest/options_trem.py b/sandbox/paultremblay/docutils_nest/options_trem.py
deleted file mode 100644
index 09eb3e4f4..000000000
--- a/sandbox/paultremblay/docutils_nest/options_trem.py
+++ /dev/null
@@ -1,377 +0,0 @@
-import sys
-class ParseOptions:
-
- """
-
- Requiries:
-
- system_string --The string from the command line
-
- options_dict -- a dictionary with the key equal to the opition, and
- a list describing that option. (See below)
-
-
- Returns:
-
- A tupple. The first item in the tupple is a dictionary containing
- the arguments for each options. The second is a list of the
- arguments.
-
- If invalid options are passed to the module, 0,0 is returned.
-
- Examples:
-
- Your script has the option '--indents', and '--output=file'.
-
- You want to give short option names as well:
-
- --i and -o=file
-
- Use this:
-
- options_dict = {'output': [1, 'o'],
- 'indents': [0, 'i']
- }
-
- options_obj = ParseOptions(
- system_string = sys.argv,
- options_dict = options_dict
- )
-
- options, arguments = options_obj.parse_options()
- print options
- print arguments
-
- The result will be:
-
-
- {indents:None, output:'/home/paul/file'}, ['/home/paul/input']
-
-
- """
- def __init__(self, system_string, options_dict):
- self.__system_string = system_string[1:]
- long_list = self.__make_long_list_func(options_dict)
- # # print long_list
- short_list = self.__make_short_list_func(options_dict)
- # # print short_list
- self.__legal_options = long_list + short_list
- # # print self.__legal_options
- self.__short_long_dict = self.__make_short_long_dict_func(options_dict)
- # # print self.__short_long_dict
- self.__opt_with_args = self.__make_options_with_arg_list(options_dict)
- # # print self.__opt_with_args
- self.__options_okay = 1
-
-
-
- def __make_long_list_func(self, options_dict):
- """
- Required:
-
- options_dict -- the dictionary mapping options to a list
-
- Returns:
-
- a list of legal options
-
-
-
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- key = '--' + key
- legal_list.append(key)
- return legal_list
-
- def __make_short_list_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of legal short options
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- legal_list.append('-' + values[1])
- except IndexError:
- pass
-
- return legal_list
-
-
-
- def __make_short_long_dict_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a dictionary with keys of short options and values of long options
-
- """
- short_long_dict = {}
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- short = '-' + values[1]
- long = '--' + key
- short_long_dict[short] = long
- except IndexError:
- pass
-
- return short_long_dict
-
- def __make_options_with_arg_list(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of options that take arguments.
-
- """
- opt_with_arg = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- if values[0]:
- opt_with_arg.append('--' + key)
- except IndexError:
- pass
-
- return opt_with_arg
-
-
- def __sub_short_with_long(self):
- """
- Required:
-
- nothing
-
- Returns:
-
- a new system string
-
- Logic:
-
- iterate through the system string and replace short options with long options
-
-
- """
- new_string = []
- sub_list = self.__short_long_dict.keys()
- for item in self.__system_string:
- if item in sub_list:
- item = self.__short_long_dict[item]
- new_string.append(item)
- return new_string
-
-
-
- def __pair_arg_with_option(self):
-
- """
-
- Required:
-
- nothing
-
- Returns
-
- nothing (changes value of self.__system_string)
-
- Logic:
-
- iterate through the system string, and match arguments with options:
-
- old_list = ['--foo', 'bar']
-
- new_list = ['--foo=bar'
-
- """
- opt_len = len(self.__system_string)
- new_system_string = []
- counter = 0
- slurp_value = 0
- for arg in self.__system_string:
-
- # previous value was an option with an argument, so this arg is
- # actually an argument that has already been added
- if slurp_value:
- slurp_value = 0
- continue
- counter += 1
-
- # not an option--an argument
- if arg[0] != '-':
- new_system_string.append(arg)
-
- # option and argument already paired
- elif '=' in arg:
- new_system_string .append(arg)
- else:
- # this option takes an argument
- if arg in self.__opt_with_args:
- # option is the last in the list
- if counter + 1 > opt_len:
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- else:
- # the next item in list is also an option
- if self.__system_string[counter][0] == '-':
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- # the next item in the list is the argument
- else:
- new_system_string.append(arg + '=' + self.__system_string[counter])
- slurp_value = 1
- # this option does not take an argument
- else:
- new_system_string.append(arg)
- return new_system_string
-
-
- def __get_just_options(self):
-
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- list of options
-
- Logic:
-
- Iterate through the self.__system string, looking for the last
- option. The options are everything in the sysem string before the
- last option.
-
- Check to see that the options contain no arguments.
-
-
- """
- highest = 0
- counter = 0
- for item in self.__system_string:
- if item[0] == '-':
- highest = counter
- counter += 1
-
- just_options = self.__system_string[:highest + 1]
- arguments = self.__system_string[highest + 1:]
-
- for item in just_options:
- if item[0] != '-':
- sys.stderr.write('%s is an argument in an option list\n' % item)
- self.__options_okay = 0
- return just_options, arguments
-
-
- def __is_legal_option_func(self):
-
- """
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- Check each value in the newly creatd options list to see if it
- matches what the user describes as a legal option.
-
-
- """
- illegal_options = []
- for arg in self.__system_string:
- if '=' in arg:
- temp_list = arg.split('=')
- arg = temp_list[0]
- if arg not in self.__legal_options and arg[0] == '-':
- illegal_options.append(arg)
-
- if illegal_options:
- self.__options_okay = 0
- sys.stderr.write('The following options are not permitted:\n')
- for not_legal in illegal_options:
- sys.stderr.write('%s\n' % not_legal)
-
-
- def __make_options_dict(self, options):
- options_dict = {}
- for item in options:
- if '=' in item:
- option, arg = item.split('=')
- else:
- option = item
- arg = None
-
- if option[0] == '-':
- option = option[1:]
- if option[0] == '-':
- option = option[1:]
-
- options_dict[option] = arg
-
- return options_dict
-
- def parse_options(self):
- self.__system_string = self.__sub_short_with_long()
- # # print 'subbed list is %s' % self.__system_string
- self.__system_string = self.__pair_arg_with_option()
- # # print 'list with pairing is %s' % self.__system_string
- options, arguments = self.__get_just_options()
- # # print 'options are %s ' % options
- # # print 'arguments are %s ' % arguments
- self.__is_legal_option_func()
- if self.__options_okay:
- options_dict = self.__make_options_dict(options)
- # # print options_dict
- return options_dict, arguments
-
- else:
- return 0,0
-
-
-
-
-if __name__ == '__main__':
- this_dict = {
- 'indents': [0, 'i'],
- 'output': [1, 'o'],
- }
- test_obj = ParseOptions(system_string = sys.argv,
- options_dict = this_dict
- )
-
- options, the_args = test_obj.parse_options()
-
- """
- this_options = ['--foo', '-o']
- this_opt_with_args = ['--foo']
-
- """
diff --git a/sandbox/paultremblay/docutils_nest/read_config.py b/sandbox/paultremblay/docutils_nest/read_config.py
deleted file mode 100644
index f7eaddaee..000000000
--- a/sandbox/paultremblay/docutils_nest/read_config.py
+++ /dev/null
@@ -1,144 +0,0 @@
-import os, re, sys, codecs
-
-import xml.sax.saxutils
-import xml.sax
-
-# turn on this line if you want to disablenamespaces
-##from xml.sax.handler import feature_namespaces
-
-
-config_values = {
- 'start_role' : ':',
- 'end_role' : ':',
- 'start_group' : '[',
- 'end_group' : ']',
- 'place_of_role' : 'inside',
- 'tag_name' : 'inline',
- 'warning' : 'problematic',
-
-}
-
-
-class ConfigHandler(xml.sax.saxutils.DefaultHandler):
- """
-
- Class for handling the XML file. SAX uses the methods in this class to
- handle the data.
-
-
- """
- def __init__(self):
-
- """
-
-
- Requires:
-
-
- Returns:
-
- nothing
-
-
- Logic:
-
-
- """
- self.__allowed = [
- 'start-role', 'end-role', 'start-group', 'end-group', 'place-of-role',
- 'tag-name', 'warning', 'configure'
- ]
-
-
-
- def startElement(self, name, attrs):
- """
-
- Logic:
-
- The SAX driver uses this function when if finds a beginning tag.
-
-
-
- """
- if name in self.__allowed:
- values = attrs.values()
- config_values[name] = values
-
- else:
- sys.stderr.write('%s not a valid option\n' % name)
-
-
- def characters(self, character):
- """
-
- Logic:
-
- The SAX driver uses this function when it finds text.
-
- """
- pass
-
-
-
- def endElement(self, name):
- """
-
- Logic:
-
-
- """
-
- pass
-
-
-
-
-class Configure:
-
- def __init__(self, file):
-
-
- """
-
-
- Requires:
-
-
-
- Returns:
-
-
- Logic:
-
- Set up a write object.
-
- Create an instance of the InlineHandler for sax to use.
-
- Pass this instance to the SAX driver.
-
- Use the SAX driver to handle the file.
-
-
- """
- file_exists = os.path.exists(file)
- if not file_exists:
- sys.stderr.write('file does not exist\n')
- sys.exit(1)
- self.__file = file
-
- def read_configs(self):
- parser = xml.sax.make_parser()
- # turn on this line if you want to disable namespaces
- ##parser.setFeature(feature_namespaces, 0)
- config_handler = ConfigHandler()
- parser.setContentHandler(config_handler)
- parser.parse(self.__file)
- return config_values
-
-
-
-if __name__ == '__main__':
- file = '/home/paul/docutils-extensions/configure.xml'
- obj = Configure(file)
- obj.read_configs()
diff --git a/sandbox/paultremblay/docutils_nest/scripts/docutils-nest-xml.py b/sandbox/paultremblay/docutils_nest/scripts/docutils-nest-xml.py
deleted file mode 100755
index 788f34190..000000000
--- a/sandbox/paultremblay/docutils_nest/scripts/docutils-nest-xml.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-
-import sys, os
-import docutils_nest.nest_utils
-import docutils_nest.rst_options
-
-
-def convert_file():
- options_dict = {
- 'output': [1]
- }
- opt_obj = docutils_nest.rst_options.OptionsRst(sys.argv, options_dict)
- inline_opts, args, doc_opts = opt_obj.parse_options()
- if inline_opts == 0:
- print_help_message()
- sys.stderr.write('Script will now quite because of illegal options\n')
- sys.exit(1)
- try:
- file = args[0]
- except IndexError:
- sys.stderr.write('You must provide a file for the script to convert.\n'
- 'Script will now quit'
- )
- sys.exit(1)
- output = inline_opts.get('output')
- if not output:
- sys.stderr.write('You must provide an output option for the script to work\n'
- 'Script will now quit\n'
- )
- sys.exit(1)
- convert_obj = docutils_nest.nest_utils.RstWithInline(file, output, docutils_opts = doc_opts)
- convert_obj.convert()
-
-if __name__ == '__main__':
- convert_file()
-
-
diff --git a/sandbox/paultremblay/docutils_nest/setup.py b/sandbox/paultremblay/docutils_nest/setup.py
deleted file mode 100644
index 88c123e55..000000000
--- a/sandbox/paultremblay/docutils_nest/setup.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-
-import os, sys
-from distutils.core import setup
-
-
-# get the location for the data
-var_file_exists = os.path.isfile('var_file')
-if not var_file_exists:
- sys.stderr.write('Please run python configure.py first\n')
- sys.exit(1)
-read_obj = open('var_file', 'r')
-lines = read_obj.readlines()
-target = lines[0]
-data_location = os.path.join(target, '.docutils_nest')
-read_obj.close()
-
-
-setup(name="docutils_nest",
- version=".1",
- description="Add nested inline markup to an rst file.",
- author="Paul Tremblay",
- author_email="phthenry@earthlink.net",
- packages=['docutils_nest'],
- data_files = [(data_location, ["data/configure.xml"])],
- scripts=["scripts/docutils-nest-xml.py"],
- )
-
diff --git a/sandbox/paultremblay/docutils_nest/test_files/test.txt b/sandbox/paultremblay/docutils_nest/test_files/test.txt
deleted file mode 100644
index 824823a33..000000000
--- a/sandbox/paultremblay/docutils_nest/test_files/test.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Simple Doc
-^^^^^^^^^^
-
-:author: Paul Tremblay
-
-Start the body
-
-A paragraph with inline markup. [:comment: I should have read *The Sun Also Rises.*] Another sentence.
-
-A paragraph with deeper nesting inline markup. [:comment: I should have read *The Sun A/home/pusetup.pylso Rises* [:note: note text [:date: 6/01/03]]]
diff --git a/sandbox/paultremblay/rst_to_docbook/README.txt b/sandbox/paultremblay/rst_to_docbook/README.txt
deleted file mode 100644
index 426b8b6e2..000000000
--- a/sandbox/paultremblay/rst_to_docbook/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-The rst_to_docbook module translates an rst document to docbook. It
-uses XML tools, namely SAX and xslt.
diff --git a/sandbox/paultremblay/rst_to_docbook/configure.py b/sandbox/paultremblay/rst_to_docbook/configure.py
deleted file mode 100644
index 41070820b..000000000
--- a/sandbox/paultremblay/rst_to_docbook/configure.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# /usr/bin/env python
-
-import sys, os
-import rst_to_docbook.options_trem
-
-"""
-
-The configuration script gets the target from the command line. It creates a
-file with the configuration variable, and a short script for the rest of
-script to be able to read and locate he configuration files.
-
-"""
-
-def configure():
- target, processor = get_target()
- if processor == None:
- sys.stderr.write('Since you need an xslt processor to run this script, the configuration will now quit\n'
- )
- try:
- os.remove('var_file')
- except:
- pass
- sys.exit(1)
- make_var_file(target)
- make_location(target)
- make_configuration_file(processor)
-
-def get_target():
- """
- This functions uses a module I wrote to parse options. If no options are
- determined on the command line, the function returnst the default
- /etc/nest_docutis
-
- """
- options_dict = {
- 'target': [1, 't'],
- 'processor': [1, 'p'],
- }
- options_obj = rst_to_docbook.options_trem.ParseOptions(sys.argv,
- options_dict)
- opt_dict, args = options_obj.parse_options()
- if opt_dict == 0:
- sys.stderr.write('invalid options for configure.py\n'
- 'use python configure --target <desired folder>'
- ' --processor <xslt proccessor>'
-
- )
- sys.exit(1)
- target = opt_dict.get('target')
- if not target:
- target = default_target()
- processor = opt_dict.get('processor')
- processor = determine_processor(processor)
- return target, processor
-
-def default_target():
- sys.stdout.write('using default \'/etc\' for the configuration directory\n')
- return '/etc'
-
-def determine_processor(processor = None):
- sys.stdout.write('determining xslt processor...\n')
- if processor == None:
- processor = 'xmllint'
- if processor == 'xalan':
- file = 'test_files/simple.xml'
- xsl_file = 'test_files/simple.xsl'
- output = 'output.xml'
- command = 'java org.apache.xalan.xslt.Process \
- -Ts -in %s -xsl %s -out %s' % (file, xsl_file, output)
- error = os.system(command)
- if error:
- sys.stderr.write('xalan does not appear to be set up correctly '
- ' on your system\n'
- 'The command "java org.apache.xalan.xslt.Process" failed\n'
- 'Is the CLASSPATH set for xalan?\n'
- 'Configuraton will now quit\n'
- )
- sys.exit(1)
- else:
- return 'xalan'
- elif processor == '4suite':
- try:
- from Ft.Xml import InputSource
- from Ft.Xml.Xslt.Processor import Processor
- return '4suite'
- except:
- sys.stderr.write('4suite does not appear to be set up correctly on your system\n'
- 'Could not find the Ft.Xml libraries\n'
- 'Script cannot work without an xslt procesor!\n'
- )
- sys.exit(1)
- elif processor == 'xsltproc' or processor == 'xmllint':
- try:
- import libxml2
- import libxslt
- return 'xmllint'
- except:
- sys.stderr.write('You either choose xmllint as your processor, or xmllint was tested because not other\n'
- 'processor was found\n'
- 'However, the libraries "libxml2" and or "libxslt" cannot be found.\n'
- )
-
- else:
- sys.stderr.write('The processor "%s" is not a valid choice for this script\n' % processor)
- return None
-
-
-
-
-def make_var_file(target):
- write_obj = open('var_file', 'w')
- # write_obj.write('[global]\n')
- write_obj.write(target)
- write_obj.close()
-
-def make_location(target):
- write_obj = open('rst_to_docbook/location.py', 'w')
- write_obj.write(
- """
-def get_location():
- return '%s'
-
-
- """
- % target)
-
-def make_configuration_file(processor):
- write_obj = open('data/configure.xml', 'w')
- write_obj.write("""
-<configuration>
- <xslt-processor processor = "%s"/>
-</configuration>
- """ % processor
- )
-
-if __name__ == '__main__':
- configure()
-
diff --git a/sandbox/paultremblay/rst_to_docbook/data/configure.xml b/sandbox/paultremblay/rst_to_docbook/data/configure.xml
deleted file mode 100644
index 4aa25c259..000000000
--- a/sandbox/paultremblay/rst_to_docbook/data/configure.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-<configuration>
- <xslt-processor processor = "xmllint"/>
-</configuration>
- \ No newline at end of file
diff --git a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names.xsl b/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names.xsl
deleted file mode 100644
index 04f365cd9..000000000
--- a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names.xsl
+++ /dev/null
@@ -1,117 +0,0 @@
-<!--WARNING TO PAUL: DON'T EDIT THIS FILE use update.py instead.
--->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <!--
-
- This template changes field_name attributes to tags and attributes:
-
-
- -->
-
-
-
-
- <xsl:template match = "field">
- <xsl:element name = "{field_name/arguments[1]}">
- <xsl:if test= "field_name/arguments[2]">
- <xsl:attribute name = "{field_name/arguments[2]}">
- <xsl:value-of select = "field_name/arguments[3]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[4]">
- <xsl:attribute name = "{field_name/arguments[4]}">
- <xsl:value-of select = "field_name/arguments[5]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[6]">
- <xsl:attribute name = "{field_name/arguments[6]}">
- <xsl:value-of select = "field_name/arguments[7]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[8]">
- <xsl:attribute name = "{field_name/arguments[8]}">
- <xsl:value-of select = "field_name/arguments[9]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[10]">
- <xsl:attribute name = "{field_name/arguments[10]}">
- <xsl:value-of select = "field_name/arguments[11]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[12]">
- <xsl:attribute name = "{field_name/arguments[12]}">
- <xsl:value-of select = "field_name/arguments[13]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[14]">
- <xsl:attribute name = "{field_name/arguments[14]}">
- <xsl:value-of select = "field_name/arguments[15]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[16]">
- <xsl:attribute name = "{field_name/arguments[16]}">
- <xsl:value-of select = "field_name/arguments[17]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[18]">
- <xsl:attribute name = "{field_name/arguments[18]}">
- <xsl:value-of select = "field_name/arguments[19]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test= "field_name/arguments[20]">
- <xsl:attribute name = "{field_name/arguments[20]}">
- <xsl:value-of select = "field_name/arguments[21]"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="inline">
- <xsl:if test="@arg1">
- <xsl:element name = "{@arg1}">
- <xsl:if test = "@arg2">
- <xsl:attribute name = "{@arg2}">
- <xsl:value-of select = "@arg3"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test = "@arg4">
- <xsl:attribute name = "{@arg4}">
- <xsl:value-of select="@arg5"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test = "@arg6">
- <xsl:attribute name = "{@arg6}">
- <xsl:value-of select = "@arg7"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test = "@arg8">
- <xsl:attribute name = "{@arg8}">
- <xsl:value-of select = "@arg9"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
-
- <xsl:template match = 'field_list'>
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "field_name"/>
-
- <xsl:template match = 'field_body'>
- <xsl:apply-templates/>
- </xsl:template>
-
-
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names_tokenize.xsl b/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names_tokenize.xsl
deleted file mode 100644
index 6de06c068..000000000
--- a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_field_names_tokenize.xsl
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--WARNING TO PAUL: DON'T EDIT THIS FILE use update.py instead.
--->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<!--
-
-change the file name string into individual fiels for easier transformation later
-
-
--->
-
- <xsl:template match="field_name">
- <field_name>
- <xsl:call-template name="tokens"/>
- </field_name>
- </xsl:template>
-
-<xsl:template name="tokens">
- <xsl:param name="str" select="normalize-space(.)"/>
- <xsl:param name="sep" select="' '"/>
- <xsl:choose>
- <xsl:when test="contains($str,' ')">
- <xsl:call-template name="arguments">
- <xsl:with-param name="str" select="substring-before($str,' ')"/>
- </xsl:call-template>
- <xsl:value-of select="$sep"/>
- <xsl:call-template name="tokens">
- <xsl:with-param name="str" select="substring-after($str,' ')"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="arguments">
- <xsl:with-param name="str" select="$str"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name= "arguments">
- <xsl:param name="str" select="string(.)"/>
- <arguments>
- <xsl:value-of select = '$str'/>
- </arguments>
- </xsl:template>
-
-
-
-
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_to_docbook.xsl b/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_to_docbook.xsl
deleted file mode 100644
index 18ab27fdd..000000000
--- a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStruct_to_docbook.xsl
+++ /dev/null
@@ -1,343 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <!--
-
- This template changed a XML document that has already been processed by docutils
- with the filed names template to docbook.
-
- -->
-
-
- <xsl:output method='xml' doctype-system='/home/paul/Documents/data/dtds/docbookx.dtd'/>
-
-
- <xsl:template match = "document">
- <TEI.2>
- <teiHeader>
- <fileDesc>
- <titleStmt>
- <xsl:choose>
- <xsl:when test='/document/title'>
- <xsl:apply-templates select = '/document/title' mode = 'keep'/>
- </xsl:when>
- <xsl:when test = '/document/docinfo/title'>
- <xsl:apply-templates select = '/document/docinfo/title'/>
- </xsl:when>
- </xsl:choose>
- <xsl:apply-templates select = "/document/docinfo/author"/>
- </titleStmt>
- <publicationStmt>
- <distributor>
- none
- </distributor>
- </publicationStmt>
- <sourceDesc>
- <p>no source--a manuscript</p>
- </sourceDesc>
-
- </fileDesc>
- <xsl:if test = "/document/docinfo/change">
- <revisionDesc>
- <xsl:apply-templates select = "/document/docinfo/change"/>
- </revisionDesc>
- </xsl:if>
-
- <!--
- <revisionDesc>
- </revisionDesc>
- -->
-
- </teiHeader>
- <text>
- <body>
- <xsl:apply-templates/>
- </body>
- </text>
- </TEI.2>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/change">
- <change>
- <xsl:apply-templates/>
- </change>
- </xsl:template>
-
-
-
- <!--info to delte-->
- <xsl:template match = "docinfo"/>
- <xsl:template match = "/document/title"/>
- <xsl:template match = "system_message"/>
- <xsl:template match = "literal"/>
- <xsl:template match = "substitution_definition"/>
- <xsl:template match = "transition"/>
- <xsl:template match = "substitution_definition"/>
-
-
- <!--Info to get rid of paragraph tags-->
- <xsl:template match = "p/paragraph|foreName/paragraph|surname/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/author">
- <author>
- <xsl:apply-templates/>
- </author>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/change/date">
- <xsl:call-template name = 'my-date'/>
- <!--
- <date>
- <xsl:apply-templates/>
- </date>
- -->
- <respStmt>
- <resp>written by</resp>
- <name>
- Paul Tremblay
- </name>
- </respStmt>
- </xsl:template>
- <xsl:template match = "/document/docinfo/item">
- <item>
- <xsl:apply-templates/>
- </item>
- </xsl:template>
-
- <xsl:template match = "paragraph">
- <xsl:choose>
- <xsl:when test = "preceding-sibling::*[1]/self::transition">
-
- <!--
- <xsl:when test = "name(preceding-sibling::*[1])='transition'">
- -->
- <p rend="transition">
- <xsl:apply-templates/>
- </p>
- </xsl:when>
- <xsl:otherwise>
- <p>
- <xsl:apply-templates/>
- </p>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template match = 'l/paragraph'>
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = 'date/paragraph|item/paragraph'>
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/title|/document/title" mode = 'keep'>
- <title>
- <xsl:apply-templates/>
- </title>
- </xsl:template>
-
- <xsl:template match = "section">
- <xsl:element name = "div">
- <xsl:attribute name = 'rend'>
- <xsl:text>1</xsl:text>
- </xsl:attribute>
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
-
- <xsl:template match = "section/section">
- <xsl:element name = "div">
- <xsl:attribute name = 'rend'>
- <xsl:text>2</xsl:text>
- </xsl:attribute>
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section">
- <xsl:element name = "div">
- <xsl:attribute name = 'rend'>
- <xsl:text>3</xsl:text>
- </xsl:attribute>
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section/section">
- <xsl:element name = "div">
- <xsl:attribute name = 'rend'>
- <xsl:text>4</xsl:text>
- </xsl:attribute>
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section/section/section">
- <xsl:element name = "div">
- <xsl:attribute name = 'rend'>
- <xsl:text>5</xsl:text>
- </xsl:attribute>
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="section/title">
- <head>
- <xsl:apply-templates/>
- </head>
- </xsl:template>
-
- <xsl:template match = 'reference'>
- <xsl:element name = "ref">
- <xsl:attribute name = "target">
- <xsl:value-of select = "@refid"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = 'target'>
- <xsl:element name= "anchor">
- <xsl:attribute name = "id">
- <xsl:value-of select = "@id"/>
- </xsl:attribute>
- </xsl:element>
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "instant">
- <dateline>
- <date>
- <xsl:value-of select = "substring(.,0,11)"/>
- </date>
- <xsl:element name = "time">
- <xsl:attribute name = "value">
- <xsl:value-of select = "substring(.,12,8)"/>
- </xsl:attribute>
- <xsl:attribute name = 'zone'>
- <xsl:choose>
- <xsl:when test = 'substring(normalize-space(.),20,6)'>
- <xsl:value-of select = 'substring(normalize-space(.),20,6)'/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>-05:00</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:text>24hour</xsl:text>
- </xsl:attribute>
- </xsl:element>
- </dateline>
- </xsl:template>
-
- <xsl:template name = "my-date">
- <xsl:element name = 'date'>
- <xsl:attribute name = 'value'>
- <xsl:value-of select = "substring(normalize-space(.),0,11)"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:template>
-
- <!--This is just and example of how to parse time?-->
- <xsl:template name = "my-time">
- <test>
- <xsl:value-of select='normalize-space(.)'/>
- </test>
- <xsl:element name = 'date'>
- <xsl:attribute name = 'value'>
- <xsl:value-of select = "substring(normalize-space(.),0,11)"/>
- </xsl:attribute>
- <xsl:attribute name = 'zone'>
- <xsl:choose>
- <xsl:when test = 'substring(normalize-space(.),12,13)'>
- <xsl:value-of select = 'substring(normalize-space(.),12,5)'/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>-05:00</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:text>24hour</xsl:text>
- </xsl:attribute>
- </xsl:element>
- </xsl:template>
- <xsl:template match = 'body'>
- <text>
- <body>
- <xsl:apply-templates/>
- </body>
- </text>
- </xsl:template>
-
- <xsl:template match = 'block_quote'>
- <q rend = "block">
- <xsl:apply-templates/>
- </q>
- </xsl:template>
-
- <xsl:template match = "comment">
- <xsl:comment>
- <xsl:value-of select = "."/>
- </xsl:comment>
- </xsl:template>
-
- <xsl:template match = "emphasis">
- <emph>
- <xsl:apply-templates/>
- </emph>
- </xsl:template>
-
- <xsl:template match = "enumerated_list">
- <list type="ordered">
- <xsl:apply-templates/>
- </list>
- </xsl:template>
-
- <xsl:template match = "list_item">
- <item>
- <xsl:apply-templates/>
- </item>
- </xsl:template>
-
-
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStructure_to_docbook.xsl b/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStructure_to_docbook.xsl
deleted file mode 100644
index ec76bdd03..000000000
--- a/sandbox/paultremblay/rst_to_docbook/data/xslt_stylesheets/reStructure_to_docbook.xsl
+++ /dev/null
@@ -1,387 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <!--
-
- This template changed a XML document that has already been processed by docutils
- with the filed names template to docbook.
-
- -->
-
-
- <xsl:output method='xml' doctype-system='/home/paul/Documents/data/dtds/docbookx.dtd'/>
-
-
- <xsl:template match = "document">
- <article>
- <articleinfo>
- <xsl:apply-templates select = "/document/docinfo/author"/>
- <xsl:choose>
- <xsl:when test='/document/title'>
- <xsl:apply-templates select = '/document/title' mode = 'keep'/>
- </xsl:when>
- <xsl:when test = '/document/docinfo/title'>
- <xsl:apply-templates select = '/document/docinfo/title'/>
- </xsl:when>
- </xsl:choose>
-
-
- <xsl:if test = "/document/docinfo/revision">
- <revhistory>
- <xsl:apply-templates select = "/document/docinfo/revision"/>
- </revhistory>
- </xsl:if>
-
-
- </articleinfo>
- <xsl:apply-templates/>
- </article>
- </xsl:template>
-
-
- <xsl:template match = "/document/docinfo/author">
- <author>
- <xsl:apply-templates/>
- </author>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/author/firstname|/document/docinfo/author/first">
- <firstname>
- <xsl:apply-templates/>
- </firstname>
- </xsl:template>
-
-
- <xsl:template match = "/document/docinfo/author/surname">
- <surname>
- <xsl:apply-templates/>
- </surname>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/author/address|/document/docinfo/author/email">
- <email>
- <xsl:apply-templates/>
- </email>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/author/firstname/paragraph|/document/docinfo/author/surname/paragraph|document/docinfo/author/address/paragraph|/document/docinfo/author/first/paragraph|/document/docinfo/author/email/paragraph|/document/docinfo/author/address/pararaph">
- <xsl:apply-templates/>
- </xsl:template>
-
-
- <xsl:template match = "/document/docinfo/author/email/paragraph/reference|/document/docinfo/author/address/reference">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/revision">
- <revision>
- <xsl:apply-templates/>
- </revision>
- </xsl:template>
-
- <xsl:template match = "revremark/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
-
-
- <!--info to delte-->
- <xsl:template match = "docinfo"/>
- <xsl:template match = "/document/title"/>
- <xsl:template match = "system_message"/>
- <xsl:template match = "literal"/>
- <xsl:template match = "substitution_definition"/>
- <xsl:template match = "transition"/>
- <xsl:template match = "substitution_definition"/>
- <xsl:template match = "system_warning"/>
-
-
- <!--Info to get rid of paragraph tags-->
- <xsl:template match = "p/paragraph|foreName/paragraph|surname/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/author">
- <author>
- <xsl:apply-templates/>
- </author>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/revnumber">
- <revnumber>
- <xsl:apply-templates/>
- </revnumber>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/revision/revnumber/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/revision/date">
- <date>
- <xsl:apply-templates/>
- </date>
- </xsl:template>
-
-
- <xsl:template match = "document/docinfo/revision/date/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "/document/docinfo/revision/date_bogus">
- <xsl:call-template name = 'my-date'/>
- <!--
- <date>
- <xsl:apply-templates/>
- </date>
- -->
- <respStmt>
- <resp>written by</resp>
- <name>
- Paul Tremblay
- </name>
- </respStmt>
- </xsl:template>
- <xsl:template match = "/document/docinfo/item">
- <item>
- <xsl:apply-templates/>
- </item>
- </xsl:template>
-
- <xsl:template match = "paragraph">
- <xsl:choose>
- <xsl:when test = "preceding-sibling::*[1]/self::transition">
-
- <!--
- <xsl:when test = "name(preceding-sibling::*[1])='transition'">
- -->
- <para role="transition">
- <xsl:apply-templates/>
- </para>
- </xsl:when>
- <xsl:otherwise>
- <para>
- <xsl:apply-templates/>
- </para>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template match = 'l/paragraph'>
- <xsl:apply-templates/>
- </xsl:template>
-
- <!--examples-->
-
- <xsl:template match = "example[@program]">
- <example>
- <xsl:apply-templates/>
- </example>
- </xsl:template>
- <xsl:template match = "example/title/paragraph">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "example[@program]/literal_block">
- <programlisting>
- <xsl:apply-templates/>
- </programlisting>
- </xsl:template>
-
- <xsl:template match = "literal_block">
- <literallayout>
- <xsl:apply-templates/>
- </literallayout>
- </xsl:template>
-
-
- <xsl:template match = "/document/docinfo/title|/document/title" mode = 'keep'>
- <title>
- <xsl:apply-templates/>
- </title>
- </xsl:template>
-
- <xsl:template match = "section">
- <xsl:element name = "sect1">
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
-
- <xsl:template match = "section/section">
- <xsl:element name = "sect2">
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section">
- <xsl:element name = "sect3">
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section/section">
- <xsl:element name = "sect4">
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = "section/section/section/section/section">
- <xsl:element name = "sect5">
- <xsl:attribute name = 'id'>
- <xsl:value-of select = '@id'/>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:value-of select = "@name"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="section/title">
- <title>
- <xsl:apply-templates/>
- </title>
- </xsl:template>
-
- <xsl:template match = 'reference'>
- <xsl:element name = "ref">
- <xsl:attribute name = "target">
- <xsl:value-of select = "@refid"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match = 'target'>
- <xsl:element name= "anchor">
- <xsl:attribute name = "id">
- <xsl:value-of select = "@id"/>
- </xsl:attribute>
- </xsl:element>
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match = "instant">
- <dateline>
- <date>
- <xsl:value-of select = "substring(.,0,11)"/>
- </date>
- <xsl:element name = "time">
- <xsl:attribute name = "value">
- <xsl:value-of select = "substring(.,12,8)"/>
- </xsl:attribute>
- <xsl:attribute name = 'zone'>
- <xsl:choose>
- <xsl:when test = 'substring(normalize-space(.),20,6)'>
- <xsl:value-of select = 'substring(normalize-space(.),20,6)'/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>-05:00</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:text>24hour</xsl:text>
- </xsl:attribute>
- </xsl:element>
- </dateline>
- </xsl:template>
-
- <xsl:template name = "my-date">
- <xsl:element name = 'date'>
- <xsl:attribute name = 'value'>
- <xsl:value-of select = "substring(normalize-space(.),0,11)"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:template>
-
- <!--This is just and example of how to parse time?-->
- <xsl:template name = "my-time">
- <test>
- <xsl:value-of select='normalize-space(.)'/>
- </test>
- <xsl:element name = 'date'>
- <xsl:attribute name = 'value'>
- <xsl:value-of select = "substring(normalize-space(.),0,11)"/>
- </xsl:attribute>
- <xsl:attribute name = 'zone'>
- <xsl:choose>
- <xsl:when test = 'substring(normalize-space(.),12,13)'>
- <xsl:value-of select = 'substring(normalize-space(.),12,5)'/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>-05:00</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:attribute name = "type">
- <xsl:text>24hour</xsl:text>
- </xsl:attribute>
- </xsl:element>
- </xsl:template>
- <xsl:template match = 'body'>
- <text>
- <body>
- <xsl:apply-templates/>
- </body>
- </text>
- </xsl:template>
-
- <xsl:template match = 'block_quote'>
- <q rend = "block">
- <xsl:apply-templates/>
- </q>
- </xsl:template>
-
- <xsl:template match = "comment">
- <xsl:comment>
- <xsl:value-of select = "."/>
- </xsl:comment>
- </xsl:template>
-
- <xsl:template match = "emphasis">
- <emph>
- <xsl:apply-templates/>
- </emph>
- </xsl:template>
-
- <xsl:template match = "enumerated_list">
- <list type="ordered">
- <xsl:apply-templates/>
- </list>
- </xsl:template>
-
- <xsl:template match = "list_item">
- <item>
- <xsl:apply-templates/>
- </item>
- </xsl:template>
-
-
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/__init__.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/__init__.py
deleted file mode 100644
index b3d0c915b..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-'''
-modules for rtf2xml
-'''
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/convert_rst_to_docbook.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/convert_rst_to_docbook.py
deleted file mode 100644
index 6634d86af..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/convert_rst_to_docbook.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-
-# configure rst_2_dbk_dir by hand
-configure_dir = ''
-
-import sys, os, tempfile, codecs
-import docutils_nest.nest_utils
-import docutils_nest.rst_options
-import rst_to_docbook.xsl_convert, rst_to_docbook.location
-import rst_to_docbook.read_config
-
-"""
-Module for convert rst documents to docbook
-"""
-
-# read input file
-
-
-
-
-
-class ConvertRstToDoc:
-
- def __init__(self, doc_debug = 0):
- outer_dir = rst_to_docbook.location.get_location()
- self.__rst_2_dbk_dir = os.path.join(outer_dir, '.rst_to_docbook')
- config_file = os.path.join(self.__rst_2_dbk_dir, 'configure.xml')
- self.__xslt_processor = self.__get_configs(config_file)
- if doc_debug:
- self.__setup_debug()
- else:
- self.__debug = 0
-
-
-
- def __setup_debug(self):
- self.__debug_dir = os.path.join(self.__rst_2_dbk_dir, 'debug')
- if not (os.path.isdir(self.__debug_dir)):
- os.mkdir(self.__debug_dir)
- list_of_files = os.listdir(self.__debug_dir)
- sys.stdout.write('Removing files from %s...\n' % self.__debug_dir)
- for file in list_of_files:
- file = os.path.join(self.__debug_dir, file)
- sys.stdout.write('%s\n' % file)
- os.remove(file)
- self.__debug = 1
-
-
- def __get_configs(self, config_file):
- config_obj = rst_to_docbook.read_config.Configure(config_file)
- config_dict = config_obj.read_configs()
- processor = config_dict.get('xslt-processor')
- processor = processor[0]
- return processor
-
-
- def convert_to_docbook(self):
- # get file, output, and the docutils_options
- file, output, docutils_options = self.__handle_options()
- docutils_nest_file = tempfile.mktemp()
- main_temp_file = tempfile.mktemp()
- self.__convert_to_nest_utils( file,
- output = docutils_nest_file,
- docutils_options = docutils_options)
- self.__copy_file(docutils_nest_file, main_temp_file)
- if self.__debug:
- new_file = os.path.join(self.__debug_dir, 'converted_to_nest_utils_info')
- self.__copy_file(docutils_nest_file, new_file)
-
- os.remove(docutils_nest_file)
-
- # convert with first xslt
- converted_string_file = tempfile.mktemp()
- self.__string_to_attributes(main_temp_file, converted_string_file)
- self.__copy_file(converted_string_file, main_temp_file)
- if self.__debug:
- new_file = os.path.join(self.__debug_dir, 'converted_string_info')
- self.__copy_file(converted_string_file, new_file)
- os.remove(converted_string_file)
-
- # convert with second xslt
- converted_arg_file = tempfile.mktemp()
- self.__convert_args(main_temp_file, converted_arg_file)
- self.__copy_file(converted_arg_file, main_temp_file)
- if self.__debug:
- new_file = os.path.join(self.__debug_dir, 'converted_to_args_info')
- self.__copy_file(converted_arg_file, new_file)
- os.remove(converted_arg_file)
-
- # final convert with xslt
- docbook_file = tempfile.mktemp()
- self.__xsl_convert_to_docbook(main_temp_file, docbook_file)
- self.__copy_file(docbook_file, main_temp_file)
- if self.__debug:
- new_file = os.path.join(self.__debug_dir, 'converted_to_docbook_info')
- self.__copy_file(docbook_file, new_file)
- os.remove(docbook_file)
-
- # write to output
- self.__copy_file(main_temp_file, output)
- os.remove(main_temp_file)
-
-
- def __handle_options(self):
- options_dict = {
- 'output': [1],
- 'doc_debug': [],
- }
- opt_obj = docutils_nest.rst_options.OptionsRst(sys.argv, options_dict)
- inline_opts, args, doc_opts = opt_obj.parse_options()
- if inline_opts == 0:
- self.__print_help_message()
- sys.stderr.write('Script will now quite because of illegal options\n')
- sys.exit(1)
- try:
- file = args[0]
- except IndexError:
- sys.stderr.write('You must provide a file for the script to convert.\n'
- 'Script will now quit'
- )
- sys.exit(1)
- output = inline_opts.get('output')
- if not output:
- sys.stderr.write('You must provide an output option for the script to work\n'
- 'Script will now quit\n'
- )
- sys.exit(1)
- return file, output, doc_opts
-
- def __convert_to_nest_utils(self, file, output, docutils_options):
-
- sys.stdout.write('converting to nest-utils.xml ...\n')
- convert_obj = docutils_nest.nest_utils.RstWithInline(file, output, docutils_opts = docutils_options)
- convert_obj.convert()
-
- def __string_to_attributes(self, file, output):
- xsl_file = os.path.join(self.__rst_2_dbk_dir,
- 'xslt_stylesheets', 'reStruct_field_names_tokenize.xsl'
- )
- sys.stdout.write('converting string in nest-utils '
- 'with xslt...\n')
- trans_obj = rst_to_docbook.xsl_convert.XslConvert(processor = self.__xslt_processor)
- trans_obj.transform(file = file,
- xsl_file = xsl_file,
- output = output)
-
- def __convert_args(self, file, output):
- xsl_file = os.path.join(self.__rst_2_dbk_dir,
- 'xslt_stylesheets', 'reStruct_field_names.xsl'
- )
- sys.stdout.write('converting args in nest-utils '
- 'with xslt...\n')
- trans_obj = rst_to_docbook.xsl_convert.XslConvert(processor = self.__xslt_processor)
- trans_obj.transform(file = file,
- xsl_file = xsl_file,
- output = output)
- def __xsl_convert_to_docbook(self, file, output):
- sys.stdout.write('doing final converstion with xslt...\n')
- xsl_file = os.path.join(self.__rst_2_dbk_dir,
- 'xslt_stylesheets', 'reStructure_to_docbook.xsl'
- )
- # reStructure_to_docbook.xsl
- trans_obj = rst_to_docbook.xsl_convert.XslConvert(processor = self.__xslt_processor)
- trans_obj.transform(file = file,
- xsl_file = xsl_file,
- output = output)
-
- def __copy_file(self, file, output):
- (utf8_encode, utf8_decode, utf8_reader, utf8_writer) = codecs.lookup("utf-8")
- write_obj = utf8_writer(open(output, 'w'))
- read_obj = open(file, 'r')
- line = 1
- while line:
- line = read_obj.readline()
- write_obj.write(line)
- read_obj.close()
- write_obj.close()
-
- def __print_help_message(self):
- sys.stderr.write('script will now quit')
- sys.exit(1)
-
-if __name__ == '__main__':
- if len(sys.argv) == 1:
- file = '/home/paul/Documents/in_progress/cvs/sandbox/paultremblay/rst_to_docbook/test_files/test_simple.rst'
- file = '/home/paul/Documents/in_progress/cvs/sandbox/paultremblay/rst_to_docbook/test_files/reStructure_docbook_example.rst'
- sys.argv.append('--indents')
- sys.argv.append('--doc_debug')
- sys.argv.append('--output')
- sys.argv.append('output.xml')
- sys.argv.append('%s' % file)
- test_obj = ConvertRstToDoc(doc_debug = 1)
- test_obj.convert_to_docbook()
-
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/location.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/location.py
deleted file mode 100644
index c74dd5ecf..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/location.py
+++ /dev/null
@@ -1,6 +0,0 @@
-
-def get_location():
- return '/etc'
-
-
- \ No newline at end of file
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/options_trem.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/options_trem.py
deleted file mode 100644
index 7176b165d..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/options_trem.py
+++ /dev/null
@@ -1,387 +0,0 @@
-# WARNING TO PAUL: DON'T EDIT THIS FILE use update.py instead.
-import sys
-class ParseOptions:
-
- """
-
- Requires:
-
- system_string --The string from the command line
-
- options_dict -- a dictionary with the key equal to the opition, and
- a list describing that option. (See below)
-
-
- Returns:
-
- A tupple. The first item in the tupple is a dictionary containing
- the arguments for each options. The second is a list of the
- arguments.
-
- If invalid options are passed to the module, 0,0 is returned.
-
- Examples:
-
- Your script has the option '--indents', and '--output=file'.
-
- You want to give short option names as well:
-
- --i and -o=file
-
- Use this:
-
- options_dict = {'output': [1, 'o'],
- 'indents': [0, 'i']
- }
-
- options_obj = ParseOptions(
- system_string = sys.argv,
- options_dict = options_dict
- )
-
- options, arguments = options_obj.parse_options()
- print options
- print arguments
-
- The result will be:
-
-
- {indents:None, output:'/home/paul/file'}, ['/home/paul/input']
-
-
- """
- def __init__(self, system_string, options_dict):
- self.__system_string = system_string[1:]
- long_list = self.__make_long_list_func(options_dict)
- # # print long_list
- short_list = self.__make_short_list_func(options_dict)
- # # print short_list
- self.__legal_options = long_list + short_list
- # # print self.__legal_options
- self.__short_long_dict = self.__make_short_long_dict_func(options_dict)
- # # print self.__short_long_dict
- self.__opt_with_args = self.__make_options_with_arg_list(options_dict)
- # # print self.__opt_with_args
- self.__options_okay = 1
-
-
-
- def __make_long_list_func(self, options_dict):
- """
- Required:
-
- options_dict -- the dictionary mapping options to a list
-
- Returns:
-
- a list of legal options
-
-
-
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- key = '--' + key
- legal_list.append(key)
- return legal_list
-
- def __make_short_list_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of legal short options
-
- """
- legal_list = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- legal_list.append('-' + values[1])
- except IndexError:
- pass
-
- return legal_list
-
-
-
- def __make_short_long_dict_func(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a dictionary with keys of short options and values of long options
-
- """
- short_long_dict = {}
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- short = '-' + values[1]
- long = '--' + key
- short_long_dict[short] = long
- except IndexError:
- pass
-
- return short_long_dict
-
- def __make_options_with_arg_list(self, options_dict):
- """
- Required:
-
- options_dict --the dictionary mapping options to a list
-
- Returns:
-
- a list of options that take arguments.
-
- """
- opt_with_arg = []
- keys = options_dict.keys()
- for key in keys:
- values = options_dict[key]
- try:
- if values[0]:
- opt_with_arg.append('--' + key)
- except IndexError:
- pass
-
- return opt_with_arg
-
-
- def __sub_short_with_long(self):
- """
- Required:
-
- nothing
-
- Returns:
-
- a new system string
-
- Logic:
-
- iterate through the system string and replace short options with long options
-
-
- """
- new_string = []
- sub_list = self.__short_long_dict.keys()
- for item in self.__system_string:
- if item in sub_list:
- item = self.__short_long_dict[item]
- new_string.append(item)
- return new_string
-
-
-
- def __pair_arg_with_option(self):
-
- """
-
- Required:
-
- nothing
-
- Returns
-
- nothing (changes value of self.__system_string)
-
- Logic:
-
- iterate through the system string, and match arguments with options:
-
- old_list = ['--foo', 'bar']
-
- new_list = ['--foo=bar'
-
- """
- opt_len = len(self.__system_string)
- new_system_string = []
- counter = 0
- slurp_value = 0
- for arg in self.__system_string:
-
- # previous value was an option with an argument, so this arg is
- # actually an argument that has already been added
- counter += 1
- if slurp_value:
- slurp_value = 0
- continue
-
- # not an option--an argument
- if arg[0] != '-':
- new_system_string.append(arg)
-
- # option and argument already paired
- elif '=' in arg:
- new_system_string .append(arg)
- else:
- # this option takes an argument
- if arg in self.__opt_with_args:
- # option is the last in the list
- if counter + 1 > opt_len:
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- else:
- # the next item in list is also an option
- if self.__system_string[counter][0] == '-':
- sys.stderr.write('option "%s" must take an argument\n' % arg)
- new_system_string.append(arg)
- self.__options_okay = 0
- # the next item in the list is the argument
- else:
- new_system_string.append(arg + '=' + self.__system_string[counter])
- slurp_value = 1
- # this option does not take an argument
- else:
- new_system_string.append(arg)
- return new_system_string
-
-
- def __get_just_options(self):
-
- """
-
- Requires:
-
- nothing
-
- Returns:
-
- list of options
-
- Logic:
-
- Iterate through the self.__system string, looking for the last
- option. The options are everything in the sysem string before the
- last option.
-
- Check to see that the options contain no arguments.
-
-
- """
- highest = 0
- counter = 0
- found_options = 0
- for item in self.__system_string:
- if item[0] == '-':
- highest = counter
- found_options = 1
- counter += 1
-
- if found_options:
- just_options = self.__system_string[:highest + 1]
- arguments = self.__system_string[highest + 1:]
- else:
- just_options = []
- arguments = self.__system_string
-
- if found_options:
- for item in just_options:
- if item[0] != '-':
- sys.stderr.write('%s is an argument in an option list\n' % item)
- self.__options_okay = 0
- return just_options, arguments
-
-
- def __is_legal_option_func(self):
-
- """
- Requires:
-
- nothing
-
- Returns:
-
- nothing
-
- Logic:
-
- Check each value in the newly creatd options list to see if it
- matches what the user describes as a legal option.
-
-
- """
- illegal_options = []
- for arg in self.__system_string:
- if '=' in arg:
- temp_list = arg.split('=')
- arg = temp_list[0]
- if arg not in self.__legal_options and arg[0] == '-':
- illegal_options.append(arg)
-
- if illegal_options:
- self.__options_okay = 0
- sys.stderr.write('The following options are not permitted:\n')
- for not_legal in illegal_options:
- sys.stderr.write('%s\n' % not_legal)
-
-
- def __make_options_dict(self, options):
- options_dict = {}
- for item in options:
- if '=' in item:
- option, arg = item.split('=')
- else:
- option = item
- arg = None
-
- if option[0] == '-':
- option = option[1:]
- if option[0] == '-':
- option = option[1:]
-
- options_dict[option] = arg
-
- return options_dict
-
- def parse_options(self):
- self.__system_string = self.__sub_short_with_long()
- # # print 'subbed list is %s' % self.__system_string
- self.__system_string = self.__pair_arg_with_option()
- # # print 'list with pairing is %s' % self.__system_string
- options, arguments = self.__get_just_options()
- # # print 'options are %s ' % options
- # # print 'arguments are %s ' % arguments
- self.__is_legal_option_func()
- if self.__options_okay:
- options_dict = self.__make_options_dict(options)
- # # print options_dict
- return options_dict, arguments
-
- else:
- return 0,0
-
-
-
-
-if __name__ == '__main__':
- this_dict = {
- 'indents': [0, 'i'],
- 'output': [1, 'o'],
- 'test3': [1, 't'],
- }
- test_obj = ParseOptions(system_string = sys.argv,
- options_dict = this_dict
- )
-
- options, the_args = test_obj.parse_options()
- print options, the_args
-
- """
- this_options = ['--foo', '-o']
- this_opt_with_args = ['--foo']
-
- """
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/output.xml b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/output.xml
deleted file mode 100644
index 222f109c0..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/output.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE TEI.2 SYSTEM "/home/paul/Documents/data/dtds/docbookx.dtd">
-<TEI.2><teiHeader><fileDesc><titleStmt><title>
- Example of reStructure document that can be converted to docbook
- </title><author>
-
-
-
- <first>
-
-
- <p>
- Paul
- </p>
-
- </first>
- <surname>
-
-
-
- Tremblay
-
-
- </surname>
- <email>
-
-
- <p>
- <ref target="">
- phthenry@earthlink.net
- </ref>
- </p>
-
- </email>
-
-
-
- </author></titleStmt><publicationStmt><distributor>
- none
- </distributor></publicationStmt><sourceDesc><p>no source--a manuscript</p></sourceDesc></fileDesc></teiHeader><text><body>
-
-
- <!--
- author: Paul Tremblay Won't work like that
- -->
- <!--
- start body
- -->
- <div rend="1" id="using-snippets-of-code" type="using snippets of code">
- <head>
- Using snippets of code
- </head>
- <p>
- How to represent a snippet of code:
- </p>
-
- <example program="">
-
-
-
- <title>
-
-
- <p>
- Processing a variable
- </p>
-
- </title>
-
- <literal_block xml:space="preserve">
- if var = 5
- self.__process(var)
- </literal_block>
-
- </example>
-
- <p>
- Keep in mind that the docbook should look like:
- </p>
- <literal_block xml:space="preserve">
- &lt;example&gt;
- &lt;title&gt;A formal example&lt;/title&gt;
- &lt;programlisting&gt;
- if var = 5
- self.__process(var)
- &lt;/programlisting&gt;
-&lt;/example&gt;
- </literal_block>
- <!--
- end of example
- -->
- </div>
-</body></text></TEI.2>
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/read_config.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/read_config.py
deleted file mode 100644
index 187ab1a48..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/read_config.py
+++ /dev/null
@@ -1,131 +0,0 @@
-import os, re, sys, codecs
-
-import xml.sax.saxutils
-import xml.sax
-
-# turn on this line if you want to disablenamespaces
-##from xml.sax.handler import feature_namespaces
-
-config_values = {}
-
-
-
-class ConfigHandler(xml.sax.saxutils.DefaultHandler):
- """
-
- Class for handling the XML file. SAX uses the methods in this class to
- handle the data.
-
-
- """
- def __init__(self):
-
- """
-
-
- Requires:
-
-
- Returns:
-
- nothing
-
-
- Logic:
-
-
- """
- self.__allowed = [ 'configuration', 'xslt-processor', ]
-
-
-
- def startElement(self, name, attrs):
- """
-
- Logic:
-
- The SAX driver uses this function when if finds a beginning tag.
-
-
-
- """
- if name in self.__allowed:
- values = attrs.values()
- config_values[name] = values
-
- else:
- sys.stderr.write('%s not a valid option\n' % name)
-
-
- def characters(self, character):
- """
-
- Logic:
-
- The SAX driver uses this function when it finds text.
-
- """
- pass
-
-
-
- def endElement(self, name):
- """
-
- Logic:
-
-
- """
-
- pass
-
-
-
-
-class Configure:
-
- def __init__(self, file):
-
-
- """
-
-
- Requires:
-
-
-
- Returns:
-
-
- Logic:
-
- Set up a write object.
-
- Create an instance of the InlineHandler for sax to use.
-
- Pass this instance to the SAX driver.
-
- Use the SAX driver to handle the file.
-
-
- """
- file_exists = os.path.exists(file)
- if not file_exists:
- raise IOError, 'file %s does not exist' % file
- self.__file = file
-
- def read_configs(self):
- parser = xml.sax.make_parser()
- # turn on this line if you want to disable namespaces
- ##parser.setFeature(feature_namespaces, 0)
- config_handler = ConfigHandler()
- parser.setContentHandler(config_handler)
- parser.parse(self.__file)
- return config_values
-
-
-
-if __name__ == '__main__':
- file = '/home/paul/docutils-extensions/configure.xml'
- obj = Configure(file)
- obj.read_configs()
diff --git a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/xsl_convert.py b/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/xsl_convert.py
deleted file mode 100644
index 3fba134a3..000000000
--- a/sandbox/paultremblay/rst_to_docbook/rst_to_docbook/xsl_convert.py
+++ /dev/null
@@ -1,145 +0,0 @@
-# WARNING TO PAUL: DON'T EDIT THIS FILE use update.py instead.
-import sys, os, tempfile
-
-
-
-
-"""
-
-
-"""
-
-
-class XslConvert:
-
- def __init__(self, processor = 'xsltproc'):
-
- """
-
-
-
- """
- self.__determine_processor(processor)
-
-
-
- def __determine_processor(self, processor):
- if processor == 'xsltproc' or processor == 'xmllint':
- self.__processor = 'xmllint'
- elif processor == '4suite':
- self.__processor = '4suite'
- elif processor == 'xalan':
- self.__processor = 'xalan'
- else:
- sys.stderr.write('%s not a valid processor choice\n' % processor)
- sys.exit(1)
-
- def transform(self, file, xsl_file, output, params = {}):
- """
- Requires:
-
- file -- the file to parse
-
- xsl_file --the xsl style sheet
-
- Returns:
-
- nothing
-
- Logic:
-
- Check for the existence of the files and the stylesheet. Determine
- the processor to be used, and let the othe methods do the processing.
-
- """
-
- if not (os.path.exists(file)):
- sys.stderr.write('"%s" does not exist\n' % file)
- sys.exit(1)
- if not (os.path.exists(xsl_file)):
- sys.stderr.write('"%s" does not exist\n' % xsl_file)
- sys.exit(1)
-
- if self.__processor == 'xmllint':
- self.__transform_xmllint(file, xsl_file, output, params)
- if self.__processor == 'xalan':
- self.__transform_xalan(file, xsl_file, output, params)
-
- elif self.__processor == '4suite':
- self.__transform_4suite(file, xsl_file, output, params)
-
- def __transform_xmllint(self, file, xsl_file, output, params = {}):
- import libxml2
- import libxslt
-
- new_params = {}
- keys = params.keys()
- for key in keys:
- new_params[key] = '"%s"' % params[key]
- params = new_params
-
-
-
- xml_doc = file
- # parse stylesheet
- styledoc = libxml2.parseFile(xsl_file)
- style = libxslt.parseStylesheetDoc(styledoc)
- # parse doc
- doc = libxml2.parseFile(xml_doc)
- result = style.applyStylesheet(doc, params)
- style.saveResultToFilename(output, result, 0)
- style.freeStylesheet()
- doc.freeDoc()
- result.freeDoc()
-
-
-
- def __transform_4suite(self, file, xsl_file, output, params):
-
- import codecs
- from Ft.Xml import InputSource
- from Ft.Xml.Xslt.Processor import Processor
-
- document = InputSource.DefaultFactory.fromUri(file)
- stylesheet = InputSource.DefaultFactory.fromUri(xsl_file)
- # there's also a fromString() method
-
- processor = Processor()
- processor.appendStylesheet(stylesheet)
- result = processor.run(document, topLevelParams=params)
- (utf8_encode, utf8_decode, utf8_reader, utf8_writer) = codecs.lookup("utf-8")
- write_obj = utf8_writer(open(output, 'w'))
- write_obj.write(result)
- write_obj.close()
-
- def __transform_xalan(self, file, xsl_file, output, params):
- command = 'java org.apache.xalan.xslt.Process \
- -Ts -in %s -xsl %s -out %s' % (file, xsl_file, output)
-
- param_string = ''
- keys = params.keys()
- for key in keys:
- param_string += ' %s "%s"' % (key, params[key])
-
- command += ' -PARAM %s' % param_string
- print command
- os.system(command)
-
-
-
-if __name__ == '__main__':
- test_xml_dir = '/home/paul/lib/python/xml_tools_trem/test_files/xml_files'
- test_xsl_dir = '/home/paul/lib/python/xml_tools_trem/test_files/xsl_stylesheets'
- output_dir = '/home/paul/paultemp'
-
- file = 'simple.xml'
- xsl_file = 'simple1.xsl'
- output = 'output.xml'
-
-
- test_file = os.path.join(test_xml_dir, file)
- test_xsl = os.path.join(test_xsl_dir, xsl_file)
- test_output = os.path.join(output_dir, output)
-
- test_obj = XslConvert('xalan')
- test_obj.transform (test_file, test_xsl, test_output, params = {'test-param': 'changed in xalan'})
diff --git a/sandbox/paultremblay/rst_to_docbook/scripts/rst2docbook.py b/sandbox/paultremblay/rst_to_docbook/scripts/rst2docbook.py
deleted file mode 100644
index ccc52fa15..000000000
--- a/sandbox/paultremblay/rst_to_docbook/scripts/rst2docbook.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-import sys, os
-import rst_to_docbook.convert_rst_to_docbook
-import rst_to_docbook.options_trem
-
-class Convert:
-
- def __init__(self):
- pass
-
- def convert(self):
- debug_doc = self.__parse_options()
-
- convert_obj = rst_to_docbook.convert_rst_to_docbook.ConvertRstToDoc(doc_debug = debug_doc)
- convert_obj.convert_to_docbook()
-
- def __parse_options(self):
- if '--debug-doc' in sys.argv:
- sys.argv.remove('--debug-doc')
- return 1
- return 0
-
-if __name__ == '__main__':
- execute_obj = Convert()
- execute_obj.convert()
diff --git a/sandbox/paultremblay/rst_to_docbook/setup.py b/sandbox/paultremblay/rst_to_docbook/setup.py
deleted file mode 100644
index 4a93d0880..000000000
--- a/sandbox/paultremblay/rst_to_docbook/setup.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-import sys, os
-from distutils.core import setup
-
-from distutils.core import setup
-
-
-# get the location for the data
-var_file_exists = os.path.isfile('var_file')
-if not var_file_exists:
- sys.stderr.write('Please run python configure.py first\n')
- sys.exit(1)
-read_obj = open('var_file', 'r')
-lines = read_obj.readlines()
-data_location = lines[0]
-data_xslt_location = os.path.join(data_location, '.rst_to_docbook', 'xslt_stylesheets')
-data_config_location = os.path.join(data_location, '.rst_to_docbook')
-read_obj.close()
-
-
-
-setup(name="rst_to_docbook",
- version=".1",
- description="convert rst to docbook.",
- author="Paul Tremblay",
- author_email="phthenry@earthlink.net",
- packages=['rst_to_docbook'],
- data_files = [(data_xslt_location,
- [
- 'data/xslt_stylesheets/reStruct_field_names_tokenize.xsl',
- 'data/xslt_stylesheets/reStruct_field_names.xsl',
- 'data/xslt_stylesheets/reStruct_to_docbook.xsl',
- 'data/xslt_stylesheets/reStructure_to_docbook.xsl'
- ]
- ),
- (data_config_location, ['data/configure'])
-
- ],
- scripts=["scripts/rst2docbook.py"],
- )
-
-## os.remove('var_file')
-
-
diff --git a/sandbox/paultremblay/rst_to_docbook/test_files/reStructure_docbook_example.rst b/sandbox/paultremblay/rst_to_docbook/test_files/reStructure_docbook_example.rst
deleted file mode 100644
index 304f8f4ab..000000000
--- a/sandbox/paultremblay/rst_to_docbook/test_files/reStructure_docbook_example.rst
+++ /dev/null
@@ -1,65 +0,0 @@
-.. WARNING TO PAUL: DON'T EDIT THIS FILE use update.py instead.
-Example of reStructure document that can be converted to docbook
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. author: Paul Tremblay Won't work like that
-
-:author:
-
- :first: Paul
-
- :surname: Tremblay
-
- :email: phthenry@earthlink.net
-
-
-:revision:
-
- :revnumber: 01
-
- :date: 2003-04-24
-
- :revremark: When I first started writing this document.
-
-:revision:
-
- :revnumber: 02
-
- :date: 2003-05-01
-
- :revremark: Made the following changes
-
-.. start body
-
-========================
-Using snippets of code
-========================
-
-How to represent a snippet of code:
-
-:example program:
-
- :title: Processing a variable
-
- ::
-
- if var = 5
- self.__process(var)
-
-
-Keep in mind that the docbook should look like:
-
-::
-
- <example>
- <title>A formal example</title>
- <programlisting>
- if var = 5
- self.__process(var)
- </programlisting>
- </example>
-
-.. end of example
-
-
-
diff --git a/sandbox/paultremblay/rst_to_docbook/test_files/simple.xml b/sandbox/paultremblay/rst_to_docbook/test_files/simple.xml
deleted file mode 100644
index 16b68e755..000000000
--- a/sandbox/paultremblay/rst_to_docbook/test_files/simple.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<doc>
- <element1>text</element1>
-</doc>
diff --git a/sandbox/paultremblay/rst_to_docbook/test_files/simple.xsl b/sandbox/paultremblay/rst_to_docbook/test_files/simple.xsl
deleted file mode 100644
index 8e15469c1..000000000
--- a/sandbox/paultremblay/rst_to_docbook/test_files/simple.xsl
+++ /dev/null
@@ -1,18 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <!--
-
- This template is a simple test
-
-
- -->
-
-
-
-
- <xsl:template match = "element1">
- <element1-changed>
- <xsl:apply-templates/>
- </element1-changed>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/sandbox/paultremblay/rst_to_docbook/test_files/test_simple.rst b/sandbox/paultremblay/rst_to_docbook/test_files/test_simple.rst
deleted file mode 100644
index c314721ba..000000000
--- a/sandbox/paultremblay/rst_to_docbook/test_files/test_simple.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. simple test file
-
-:author: Paul Tremblay
-
-Main body
-
-:custom-field arg1 arg2:
-
- body of block custom field
-
- more body [:role arg1 arg2: inline [:role2 arg1 arg2: more inline]] last of body
diff --git a/sandbox/pobrien/LinuxFormat/LXFwriter.py b/sandbox/pobrien/LinuxFormat/LXFwriter.py
deleted file mode 100644
index 13e39d3d8..000000000
--- a/sandbox/pobrien/LinuxFormat/LXFwriter.py
+++ /dev/null
@@ -1,984 +0,0 @@
-"""Linux Format writer."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os
-import time
-import re
-from types import ListType
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-
-class Writer(writers.Writer):
-
- supported = ('lxf', 'LinuxFormat')
- """Formats this writer supports."""
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
- """Produces Linux Format Magazine output."""
-
- words_and_spaces = re.compile(r'\S+| +|\n')
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = settings = document.settings
- lcode = settings.language_code
- self.language = languages.get_language(lcode)
- self.head = []
- self.body = []
- self.foot = []
- self.part = self.body
- self.section_level = 0
- self.context = []
- self.topic_class = ''
- self.colspecs = []
- self.compact_p = 1
- self.compact_simple = None
- self.in_bullet_list = False
- self.in_docinfo = False
- self.in_sidebar = False
- self.sidebar_start = False
- self.filterNewlines = True
-
- def astext(self):
- """Return the final formatted document as a string."""
- return ''.join(self.head + ['\n///BODY COPY START///'] +
- self.body + ['///END BODY COPY///\n'] + self.foot)
-
- def encode(self, text):
- if self.filterNewlines:
- text = text.replace('\n', ' ')
- return text
-
- def visit_Text(self, node):
- self.part.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'address', meta=None)
-
- def depart_address(self, node):
- self.depart_docinfo_item()
-
- def visit_admonition(self, node, name):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'div', CLASS=name))
- self.part.append('<p class="admonition-title">'
- + self.language.labels[name] + '</p>\n')
-
- def depart_admonition(self):
- raise NotImplementedError, node.astext()
- self.part.append('</div>\n')
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'blockquote'))
-
- def depart_block_quote(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</blockquote>\n')
-
- def check_simple_list(self, node):
- raise NotImplementedError, node.astext()
- """Check for a simple list that can be rendered compactly."""
- visitor = SimpleListChecker(self.document)
- try:
- node.walk(visitor)
- except nodes.NodeFound:
- return None
- else:
- return 1
-
- def visit_bullet_list(self, node):
- self.in_bullet_list = True
-
- def depart_bullet_list(self, node):
- self.in_bullet_list = False
-
- def visit_caption(self, node):
- self.part.append('\n///CAPTION///')
- self.visit_paragraph(node)
-
- def depart_caption(self, node):
- self.depart_paragraph(node)
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.part.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<col />\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.part.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(']</a>')
-
- def visit_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(' <span class="classifier-delimiter">:</span> ')
- self.part.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</span>')
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- raise NotImplementedError, node.astext()
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.part.append(self.emptytag(node, 'col',
- width='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node):
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'contact', meta=None)
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</dt>\n')
- self.part.append(self.starttag(node, 'dd', ''))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_definition(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</dd>\n')
-
- def visit_definition_list(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</dl>\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'td', ''))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_description(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</td>')
-
- def visit_docinfo(self, node):
- self.in_docinfo = True
-
- def depart_docinfo(self, node):
- self.in_docinfo = False
-
- def visit_docinfo_item(self, node, name, meta=1):
- raise NotImplementedError, node.astext()
- if meta:
- self.head.append('<meta name="%s" content="%s" />\n'
- % (name, self.attval(node.astext())))
- self.part.append(self.starttag(node, 'tr', ''))
- self.part.append('<th class="docinfo-name">%s:</th>\n<td>'
- % self.language.labels[name])
- if len(node):
- if isinstance(node[0], nodes.Element):
- node[0].set_class('first')
- if isinstance(node[0], nodes.Element):
- node[-1].set_class('last')
-
- def depart_docinfo_item(self):
- raise NotImplementedError, node.astext()
- self.part.append('</td></tr>\n')
-
- def visit_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
- def depart_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('\n</pre>\n')
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.part.append('/')
-
- def depart_emphasis(self, node):
- self.part.append('/')
-
- def visit_entry(self, node):
- raise NotImplementedError, node.astext()
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.part.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.part.append('&nbsp;')
- else:
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_entry(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- raise NotImplementedError, node.astext()
- """
- The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
- CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
- usable.
- """
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['class'] = node['enumtype']
- # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
- # single "format" attribute? Use CSS2?
- 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_class == 'contents'
- or self.check_simple_list(node)))
- if self.compact_simple and not old_compact_simple:
- atts['class'] = (atts.get('class', '') + ' simple').strip()
- self.part.append(self.starttag(node, 'ol', **atts))
-
- def depart_enumerated_list(self, node):
- raise NotImplementedError, node.astext()
- self.compact_simple, self.compact_p = self.context.pop()
- self.part.append('</ol>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- if self.in_docinfo:
- self.part = self.foot
-
- def depart_field(self, node):
- self.part = self.body
-
- def visit_field_body(self, node):
- pass
-
- def depart_field_body(self, node):
- pass
-
- def visit_field_list(self, node):
- raise NotImplementedError, node.astext()
-
- def depart_field_list(self, node):
- raise NotImplementedError, node.astext()
-
- def visit_field_name(self, node):
- if self.in_docinfo and node.astext() == 'Next':
- self.part.append('\n\n///NEXT MONTH///')
- raise nodes.SkipNode
- else:
- raise NotImplementedError, node.astext()
-
- def depart_field_name(self, node):
- pass
-
- def visit_figure(self, node):
- self.part = self.foot
- self.part.append('\n\n///PIC///\n')
-
- def depart_figure(self, node):
- self.part = self.body
-
- def visit_footer(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.part))
-
- def depart_footer(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- footer = (['<hr class="footer"/>\n',
- self.starttag(node, 'div', CLASS='footer')]
- + self.part[start:] + ['</div>\n'])
- self.body_suffix[:0] = footer
- del self.part[start:]
-
- def visit_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'table', CLASS='footnote',
- frame="void", rules="none"))
- self.part.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- raise NotImplementedError, node.astext()
- if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- self.context.append('')
- self.context.append('<a class="fn-backref" href="#%s" '
- 'name="%s">' % (backrefs[0], node['id']))
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
- % (backref, i))
- i += 1
- self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
- self.context.append('<a name="%s">' % node['id'])
- else:
- self.context.append('')
- self.context.append('<a name="%s">' % node['id'])
-
- def depart_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '<sup>'
- self.context.append('</sup>')
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.part.append(self.starttag(node, 'a', suffix, href=href,
- CLASS='footnote-reference'))
-
- def depart_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.context.pop() + '</a>')
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.part))
-
- def depart_header(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.part[start:])
- self.body_prefix.append('<hr />\n</div>\n')
- del self.part[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- name = str(node.attributes['uri'])
- self.part.append(name)
- pass
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_label(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
- CLASS='label'))
-
- def depart_label(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(']</a></td><td>%s' % self.context.pop())
-
- def visit_legend(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</div>\n')
-
- def visit_line_block(self, node):
- raise NotImplementedError, node.astext()
-
- def depart_line_block(self, node):
- raise NotImplementedError, node.astext()
-
- def visit_list_item(self, node):
- if self.in_bullet_list:
- self.part.append('\n* ')
-
- def depart_list_item(self, node):
- pass
-
- def visit_literal(self, node):
- self.part.append('///code///')
-
- def depart_literal(self, node):
- self.part.append('///code ends///')
-
- def visit_literal_block(self, node):
- self.part.append('\n///CODE///\n')
- self.filterNewlines = False
-
- def depart_literal_block(self, node):
- self.part.append('\n///END CODE///\n')
- self.filterNewlines = True
-
- def visit_meta(self, node):
- raise NotImplementedError, node.astext()
- self.head.append(self.emptytag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- raise NotImplementedError, node.astext()
- if self.context[-1]:
- self.part.append(', ')
-
- def depart_option(self, node):
- raise NotImplementedError, node.astext()
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(node.get('delimiter', ' '))
- self.part.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</var>')
-
- def visit_option_group(self, node):
- raise NotImplementedError, node.astext()
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.part.append(self.starttag(node, 'td', **atts))
- self.part.append('<kbd>')
- self.context.append(0) # count number of options
-
- def depart_option_group(self, node):
- raise NotImplementedError, node.astext()
- self.context.pop()
- self.part.append('</kbd></td>\n')
- self.part.append(self.context.pop())
-
- def visit_option_list(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none"))
- self.part.append('<col class="option" />\n'
- '<col class="description" />\n'
- '<tbody valign="top">\n')
-
- def depart_option_list(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</tbody>\n</table>\n')
-
- def visit_option_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</tr>\n')
-
- def visit_option_string(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</span>')
-
- def visit_organization(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- raise NotImplementedError, node.astext()
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- if self.in_sidebar and self.sidebar_start:
- self.part.append('///BOX BODY///')
- self.sidebar_start = False
- if not self.in_bullet_list:
- self.part.append('\n')
-
- def depart_paragraph(self, node):
- self.part.append('\n')
-
- def visit_problematic(self, node):
- raise NotImplementedError, node.astext()
- if node.hasattr('refid'):
- self.part.append('<a href="#%s" name="%s">' % (node['refid'],
- node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.part.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</span>')
- self.part.append(self.context.pop())
-
- def visit_raw(self, node):
- raise NotImplementedError, node.astext()
- if node.get('format') == 'html':
- self.part.append(node.astext())
- # Keep non-HTML raw text out of output:
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- pass
-
- def depart_reference(self, node):
- pass
-
- def visit_revision(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'revision', meta=None)
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</tr>\n')
-
- def visit_section(self, node):
- self.section_level += 1
-
- def depart_section(self, node):
- self.section_level -= 1
-
- def visit_sidebar(self, node):
- self.part = self.foot
- self.in_sidebar = True
- self.sidebar_start = True
- self.part.append('\n\n///BOXOUT///\n')
-
- def depart_sidebar(self, node):
- self.part.append('///END BOX BODY///\n')
- self.in_sidebar = False
- self.part = self.body
-
- def visit_status(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'status', meta=None)
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- self.part.append('*')
-
- def depart_strong(self, node):
- self.part.append('*')
-
- def visit_substitution_definition(self, node):
- """Internal only."""
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- if self.in_sidebar:
- self.part.append('///BOXOUT SUBHEAD///\n')
- else:
- self.part = self.head
- self.part.append('\n///DESCRIPTION///\n')
-
- def depart_subtitle(self, node):
- self.part.append('\n')
- if self.in_sidebar:
- pass
- else:
- self.part = self.body
-
- def visit_system_message(self, node):
- raise NotImplementedError, node.astext()
- if node['level'] < self.document.reporter['writer'].report_level:
- # Level is too low to display:
- raise nodes.SkipNode
- self.part.append(self.starttag(node, 'div', CLASS='system-message'))
- self.part.append('<p class="system-message-title">')
- attr = {}
- backref_text = ''
- if node.hasattr('id'):
- attr['name'] = node['id']
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- backref_text = ('; <em><a href="#%s">backlink</a></em>'
- % backrefs[0])
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a href="#%s">%s</a>' % (backref, i))
- i += 1
- backref_text = ('; <em>backlinks: %s</em>'
- % ', '.join(backlinks))
- if node.hasattr('line'):
- line = ', line %s' % node['line']
- else:
- line = ''
- if attr:
- a_start = self.starttag({}, 'a', '', **attr)
- a_end = '</a>'
- else:
- a_start = a_end = ''
- self.part.append('System Message: %s%s/%s%s (<tt>%s</tt>%s)%s</p>\n'
- % (a_start, node['type'], node['level'], a_end,
- node['source'], line, backref_text))
-
- def depart_system_message(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</div>\n')
-
- def visit_table(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(
- self.starttag(node, 'table', CLASS="table",
- frame='border', rules='all'))
-
- def depart_table(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</table>\n')
-
- def visit_target(self, node):
- raise NotImplementedError, node.astext()
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- self.part.append(self.starttag(node, 'a', '', CLASS='target'))
- self.context.append('</a>')
- else:
- self.context.append('')
-
- def depart_target(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.context.pop())
-
- def visit_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.part.append(self.context.pop()) # '</colgroup>\n' or ''
- self.part.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</tbody>\n')
-
- def visit_term(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- """
- Leave the end tag to `self.visit_definition()`, in case there's a
- classifier.
- """
- raise NotImplementedError, node.astext()
- pass
-
- def visit_tgroup(self, node):
- raise NotImplementedError, node.astext()
- # Mozilla needs <colgroup>:
- self.part.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.part.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.part.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- """Only 2 section levels are supported."""
- if isinstance(node.parent, nodes.topic):
- if self.topic_class == 'abstract':
- self.part = self.head
- self.part.append('\n///STRAP///')
- raise nodes.SkipNode
- elif self.in_sidebar:
- # sidebar title
- self.part.append('///BOXOUT HEAD///\n')
- elif self.section_level == 0:
- # document title
- self.part = self.head
- self.part.append('///TITLE///\n')
- else:
- self.part.append('\n///CROSSHEAD///\n')
-
- def depart_title(self, node):
- self.part.append('\n')
- if not self.in_sidebar:
- self.part = self.body
-
- def visit_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.starttag(node, 'cite', ''))
-
- def depart_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.part.append('</cite>')
-
- def visit_topic(self, node):
- self.topic_class = node.get('class')
-
- def depart_topic(self, node):
- self.topic_class = ''
- self.part = self.body
-
- def visit_transition(self, node):
- raise NotImplementedError, node.astext()
- self.part.append(self.emptytag(node, 'hr'))
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'version', meta=None)
-
- def depart_version(self, node):
- self.depart_docinfo_item()
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
-
-class SimpleListChecker(nodes.GenericNodeVisitor):
-
- """
- Raise `nodes.SkipNode` if non-simple list item is encountered.
-
- Here "simple" means a list item containing nothing other than a single
- paragraph, a simple list, or a paragraph followed by a simple list.
- """
-
- def default_visit(self, node):
- raise nodes.NodeFound
-
- def visit_bullet_list(self, node):
- pass
-
- def visit_enumerated_list(self, node):
- pass
-
- def visit_list_item(self, node):
- children = []
- for child in node.get_children():
- if not isinstance(child, nodes.Invisible):
- children.append(child)
- if (children and isinstance(children[0], nodes.paragraph)
- and (isinstance(children[-1], nodes.bullet_list)
- or isinstance(children[-1], nodes.enumerated_list))):
- children.pop()
- if len(children) <= 1:
- return
- else:
- raise nodes.NodeFound
-
- def visit_paragraph(self, node):
- raise nodes.SkipNode
-
- def invisible_visit(self, node):
- """Invisible nodes should be ignored."""
- pass
-
- visit_comment = invisible_visit
- visit_substitution_definition = invisible_visit
- visit_target = invisible_visit
- visit_pending = invisible_visit
diff --git a/sandbox/pobrien/LinuxFormat/__init__.py b/sandbox/pobrien/LinuxFormat/__init__.py
deleted file mode 100644
index db6003cf3..000000000
--- a/sandbox/pobrien/LinuxFormat/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# Orbtech python package. \ No newline at end of file
diff --git a/sandbox/pobrien/LinuxFormat/rest2lxf.py b/sandbox/pobrien/LinuxFormat/rest2lxf.py
deleted file mode 100755
index 720cc3a0a..000000000
--- a/sandbox/pobrien/LinuxFormat/rest2lxf.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-
-"""Generates Linux Format articles."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-from LXFwriter import Writer
-
-
-def main():
- description = ("Generates Linux Format articles. " + default_description)
- publish_cmdline(writer=Writer(), description=description)
-
-
-if __name__ == '__main__':
- main()
diff --git a/sandbox/pobrien/OpenOffice/OOdirectives.py b/sandbox/pobrien/OpenOffice/OOdirectives.py
deleted file mode 100644
index 5cf89b459..000000000
--- a/sandbox/pobrien/OpenOffice/OOdirectives.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""Custom directives"""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-import sys
-import os
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.languages import en
-
-registry = directives._directive_registry
-registry['index'] = ('OOdirectives', 'index_directive')
-registry['include-code'] = ('OOdirectives', 'include_code')
-registry['include-output'] = ('OOdirectives', 'include_output')
-
-en.directives['index'] = 'index'
-en.directives['include-code'] = 'include-code'
-en.directives['include-output'] = 'include-output'
-
-
-#class index_entry(nodes.General, nodes.Element): pass
-class index_entry(nodes.Inline, nodes.TextElement): pass
-
-
-def index_directive(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #nodes = []
- #for entry in content:
- # nodes.append(index_entry(entry, entry))
- #return nodes
- entries = '\n'.join(content)
- return [index_entry(entries,entries)]
-
-index_directive.content = 1
-
-
-def include_code(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- #obj = state_machine.document.attributes
- #print >> sys.stderr, obj
- #print >> sys.stderr, dir(obj)
- document = state_machine.document
- dirname = getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- code = open(fname).read()
- return [nodes.literal_block(code, code)]
-
-include_code.arguments = (0, 1, 0)
-
-
-def include_output(name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- document = state_machine.document
- dirname = getDocDir(document)
- fname = os.path.join(dirname, arguments[0])
- cmd = os.environ['PYTHON'] + ' ' + fname
- f_input, f_output = os.popen4(cmd)
- output = f_output.read()
- f_output.close()
- return [nodes.literal_block(output, output)]
-
-include_output.arguments = (0, 1, 0)
-
-
-def getDocDir(document):
- source = document.current_source
- if source is None:
- return os.getcwd()
- else:
- dirname = os.path.dirname(os.path.abspath(source))
- if dirname is None:
- return os.getcwd()
- else:
- return dirname
diff --git a/sandbox/pobrien/OpenOffice/OOtext.py b/sandbox/pobrien/OpenOffice/OOtext.py
deleted file mode 100644
index b5b20dbdf..000000000
--- a/sandbox/pobrien/OpenOffice/OOtext.py
+++ /dev/null
@@ -1,708 +0,0 @@
-"""Text used in the creation of the XML files."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-
-# Can't have blank line at beginning of XML
-
-manifest = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
-<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
-<manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer" manifest:full-path="/"/>
-%s
-%s
-</manifest:manifest>
-'''
-
-# The pictures list gets populated by OOwriter as it comes across
-# images in the document.
-pictures = []
-
-m_xml_format = '<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="%s"/>'
-
-m_tif_format = '<manifest:file-entry manifest:media-type="image/tif" manifest:full-path="Pictures/%s"/>'
-
-m_png_format = '<manifest:file-entry manifest:media-type="image/png" manifest:full-path="Pictures/%s"/>'
-
-content_header = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE office:document-content PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "office.dtd">
-<office:document-content
-xmlns:office="http://openoffice.org/2000/office"
-xmlns:style="http://openoffice.org/2000/style"
-xmlns:text="http://openoffice.org/2000/text"
-xmlns:table="http://openoffice.org/2000/table"
-xmlns:draw="http://openoffice.org/2000/drawing"
-xmlns:fo="http://www.w3.org/1999/XSL/Format"
-xmlns:xlink="http://www.w3.org/1999/xlink"
-xmlns:number="http://openoffice.org/2000/datastyle"
-xmlns:svg="http://www.w3.org/2000/svg"
-xmlns:chart="http://openoffice.org/2000/chart"
-xmlns:dr3d="http://openoffice.org/2000/dr3d"
-xmlns:math="http://www.w3.org/1998/Math/MathML"
-xmlns:form="http://openoffice.org/2000/form"
-xmlns:script="http://openoffice.org/2000/script" office:class="text"
-office:version="1.0">
-<office:body>
-<text:sequence-decls>
-<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
-<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
-<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
-<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
-</text:sequence-decls>
-'''
-
-content_footer = '''
-</office:body>
-</office:document-content>
-'''
-
-styles = '''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE office:document-styles PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "office.dtd">
-
-<office:document-styles
-xmlns:office="http://openoffice.org/2000/office"
-xmlns:style="http://openoffice.org/2000/style"
-xmlns:text="http://openoffice.org/2000/text"
-xmlns:table="http://openoffice.org/2000/table"
-xmlns:draw="http://openoffice.org/2000/drawing"
-xmlns:fo="http://www.w3.org/1999/XSL/Format"
-xmlns:xlink="http://www.w3.org/1999/xlink"
-xmlns:number="http://openoffice.org/2000/datastyle"
-xmlns:svg="http://www.w3.org/2000/svg"
-xmlns:chart="http://openoffice.org/2000/chart"
-xmlns:dr3d="http://openoffice.org/2000/dr3d"
-xmlns:math="http://www.w3.org/1998/Math/MathML"
-xmlns:form="http://openoffice.org/2000/form"
-xmlns:script="http://openoffice.org/2000/script"
-office:version="1.0">
-
-<office:font-decls>
-
-<style:font-decl style:name="Wingdings"
-fo:font-family="Wingdings"
-style:font-pitch="variable"
-style:font-charset="x-symbol"/>
-<style:font-decl style:name="Palatino"
-fo:font-family="Palatino"/>
-<style:font-decl style:name="Courier"
-fo:font-family="Courier"
-style:font-family-generic="modern"/>
-<style:font-decl style:name="Arial Unicode MS"
-fo:font-family="&apos;Arial Unicode MS&apos;"
-style:font-pitch="variable"/>
-<style:font-decl style:name="HG Mincho Light J"
-fo:font-family="&apos;HG Mincho Light J&apos;"
-style:font-pitch="variable"/>
-<style:font-decl style:name="AGaramond"
-fo:font-family="AGaramond"
-style:font-family-generic="roman"
-style:font-pitch="variable"/>
-<style:font-decl style:name="AGaramond Bold"
-fo:font-family="&apos;AGaramond Bold&apos;"
-style:font-family-generic="roman"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Times"
-fo:font-family="Times"
-style:font-family-generic="roman"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Times New Roman"
-fo:font-family="&apos;Times New Roman&apos;"
-style:font-family-generic="roman"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Arial"
-fo:font-family="Arial"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Helvetica"
-fo:font-family="Helvetica"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Helvetica-Narrow"
-fo:font-family="Helvetica-Narrow"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Humanst521 Cn BT"
-fo:font-family="&apos;Humanst521 Cn BT&apos;"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Luxi Sans"
-fo:font-family="&apos;Luxi Sans&apos;"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Tahoma"
-fo:font-family="Tahoma"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-<style:font-decl style:name="Univers 45 Light"
-fo:font-family="&apos;Univers 45 Light&apos;"
-style:font-family-generic="swiss"
-style:font-pitch="variable"/>
-
-</office:font-decls>
-<office:styles>
-
-
-<style:default-style style:family="graphics">
-<style:properties draw:start-line-spacing-horizontal="0.1114inch"
-draw:start-line-spacing-vertical="0.1114inch"
-draw:end-line-spacing-horizontal="0.1114inch"
-draw:end-line-spacing-vertical="0.1114inch" fo:color="#000000"
-style:font-name="Palatino" fo:font-size="12pt" fo:language="en"
-fo:country="US" style:font-name-asian="HG Mincho Light J"
-style:font-size-asian="12pt" style:language-asian="none"
-style:country-asian="none" style:font-name-complex="Arial Unicode MS"
-style:font-size-complex="12pt" style:language-complex="none"
-style:country-complex="none" style:text-autospace="ideograph-alpha"
-style:punctuation-wrap="simple" style:line-break="strict">
-<style:tab-stops/></style:properties></style:default-style>
-
-<style:default-style style:family="paragraph">
-<style:properties fo:color="#000000" style:font-name="Palatino"
-fo:font-size="12pt" fo:language="en" fo:country="US"
-style:font-name-asian="HG Mincho Light J" style:font-size-asian="12pt"
-style:language-asian="none" style:country-asian="none"
-style:font-name-complex="Arial Unicode MS"
-style:font-size-complex="12pt" style:language-complex="none"
-style:country-complex="none" fo:hyphenate="false"
-fo:hyphenation-remain-char-count="2"
-fo:hyphenation-push-char-count="2"
-fo:hyphenation-ladder-count="no-limit"
-style:text-autospace="ideograph-alpha"
-style:punctuation-wrap="hanging" style:line-break="strict"
-style:tab-stop-distance="0.5inch"/></style:default-style>
-
-<style:style style:name="Standard"
-style:family="paragraph"
-style:class="text">
-<style:properties fo:color="#000000"
-style:font-name="Times New Roman" fo:font-size="10pt" fo:language="en"
-fo:country="US" style:font-name-asian="Times New Roman"
-style:font-size-asian="10pt" fo:orphans="2"
-fo:widows="2"/></style:style>
-
-<style:style style:name="Text body"
-style:family="paragraph"
-style:parent-style-name="Standard"
-style:class="text">
-<style:properties fo:margin-top="0inch"
-fo:margin-bottom="0.0835inch"/></style:style>
-
-<style:style style:name="Header"
-style:family="paragraph"
-style:parent-style-name="Standard"
-style:class="extra">
-<style:properties>
-<style:tab-stops>
-<style:tab-stop
-style:position="3inch" style:type="center"/>
-<style:tab-stop
-style:position="6inch"
-style:type="right"/></style:tab-stops></style:properties></style:style>
-
-<style:style style:name="Footer"
-style:family="paragraph"
-style:parent-style-name="Standard"
-style:class="extra">
-<style:properties fo:color="#000000"
-style:font-name="AGaramond">
-<style:tab-stops>
-<style:tab-stop
-style:position="3inch" style:type="center"/>
-<style:tab-stop
-style:position="6inch"
-style:type="right"/></style:tab-stops></style:properties></style:style>
-
-<style:style style:name="Table Contents"
-style:family="paragraph"
-style:parent-style-name="Text body"
-style:class="extra">
-<style:properties text:number-lines="false"
-text:line-number="0"/></style:style>
-
-<style:style style:name="Table
-Heading" style:family="paragraph"
-style:parent-style-name="Table Contents"
-style:class="extra">
-<style:properties fo:font-style="italic"
-fo:font-weight="bold" style:font-style-asian="italic"
-style:font-weight-asian="bold" style:font-style-complex="italic"
-style:font-weight-complex="bold" fo:text-align="center"
-style:justify-single-word="false" text:number-lines="false"
-text:line-number="0"/></style:style>
-
-<style:style style:name="Caption"
-style:family="paragraph"
-style:parent-style-name="Standard"
-style:class="extra">
-<style:properties fo:margin-top="0.0835inch"
-fo:margin-bottom="0.0835inch" style:font-name="Palatino"
-fo:font-size="10pt" fo:font-style="italic"
-style:font-size-asian="10pt" style:font-style-asian="italic"
-style:font-size-complex="10pt" style:font-style-complex="italic"
-text:number-lines="false"
-text:line-number="0"/></style:style>
-
-<style:style style:name="Frame contents"
-style:family="paragraph"
-style:parent-style-name="Text body"
-style:class="extra"/>
-<style:style style:name="Index"
-style:family="paragraph" style:parent-style-name="Standard"
-style:class="index">
-<style:properties style:font-name="Palatino"
-text:number-lines="false"
-text:line-number="0"/></style:style>
-
-<style:style style:name="code"
-style:family="text">
-<style:properties style:font-name="Courier"/></style:style>
-
-<style:style style:name=".body"
-style:family="paragraph">
-<style:properties fo:margin-left="0inch"
-fo:margin-right="0inch" fo:margin-top="0inch" fo:margin-bottom="0inch"
-fo:color="#000000" style:font-name="AGaramond" fo:font-size="11pt"
-fo:language="en" fo:country="US" style:font-name-asian="Times New
-Roman" style:font-size-asian="11pt" fo:line-height="0.1937inch"
-fo:text-align="justify" style:justify-single-word="false"
-fo:orphans="2" fo:widows="2" fo:text-indent="0.25inch"
-style:auto-text-indent="false">
-<style:tab-stops/></style:properties></style:style>
-
-<style:style style:name=".body1"
-style:family="paragraph"
-style:parent-style-name=".body"
-style:next-style-name=".body">
-<style:properties fo:margin-left="0inch"
-fo:margin-right="0inch" fo:font-size="11pt"
-style:font-size-asian="11pt" fo:text-indent="0inch"
-style:auto-text-indent="false"/></style:style>
-
-<style:style style:name=".bullet"
-style:family="paragraph"
-style:list-style-name="BulletList">
-<style:properties
-fo:margin-left="0.5inch"
-fo:margin-right="0inch"
-fo:margin-top="0.028inch"
-fo:margin-bottom="0.028inch"
-fo:color="#000000"
-style:font-name="AGaramond"
-fo:font-size="11pt"
-fo:language="en"
-fo:country="US"
-style:font-name-asian="Times New Roman"
-style:font-size-asian="11pt"
-fo:line-height="0.1937inch"
-fo:text-align="justify"
-style:justify-single-word="false"
-fo:orphans="0"
-fo:widows="0"
-fo:text-indent="0inch"
-style:auto-text-indent="false">
-<style:tab-stops>
-<style:tab-stop
-style:position="0inch"/>
-</style:tab-stops>
-</style:properties>
-</style:style>
-
-<text:list-style style:name="BulletList">
-<text:list-level-style-bullet text:level="1"
-text:style-name="Bullet"
-style:num-suffix="."
-text:bullet-char="*">
-<style:properties
-text:min-label-width="0.25inch"
-style:font-name="Wingdings"/>
-</text:list-level-style-bullet>
-</text:list-style>
-
-<style:style style:name="Bullet"
-style:family="text">
-<style:properties
-style:font-name="Wingdings"/>
-</style:style>
-
-<style:style style:name=".CALLOUT"
-style:family="paragraph"
-style:parent-style-name=".body">
-<style:properties
-fo:background-color="#e6e6e6"
-fo:margin-left="0.25inch" fo:margin-right="0.25inch"
-fo:margin-top="0.0835inch" fo:margin-bottom="0.0835inch"
-fo:text-indent="0inch"
-style:auto-text-indent="false"/></style:style>
-
-<style:style style:name=".cell body"
-style:family="paragraph">
-<style:properties
-fo:color="#000000" style:font-name="Univers 45 Light"
-fo:font-size="8pt" fo:language="en" fo:country="US"
-style:font-name-asian="Times New Roman" style:font-size-asian="8pt"
-style:line-height-at-least="0.139inch" fo:orphans="0"
-fo:widows="0"/></style:style>
-
-<style:style style:name=".cell head"
-style:family="paragraph">
-<style:properties fo:color="#000000"
-style:font-name="Univers 45 Light" fo:font-size="8pt" fo:language="en"
-fo:country="US" fo:font-weight="bold" style:font-name-asian="Times New
-Roman" style:font-size-asian="8pt" style:font-weight-asian="bold"
-style:line-height-at-least="0.139inch" fo:orphans="0"
-fo:widows="0"/></style:style>
-
-<style:style style:name=".ch title"
-style:family="paragraph">
-<style:properties
-fo:margin-top="0.5inch" fo:margin-bottom="0.25inch" fo:color="#000000"
-style:font-name="AGaramond" fo:font-size="29.5pt" fo:language="en"
-fo:country="US" fo:font-style="italic" style:font-name-asian="Times
-New Roman" style:font-size-asian="29.5pt"
-style:font-style-asian="italic"
-style:line-height-at-least="0.4161inch" fo:orphans="0"
-fo:widows="0"/></style:style>
-
-<style:style style:name=".code"
-style:family="paragraph">
-<style:properties fo:color="#000000"
-style:font-name="Courier" fo:font-size="10pt" fo:language="en"
-fo:country="US" style:font-name-asian="Times New Roman"
-style:font-size-asian="10pt" style:language-asian="en"
-style:country-asian="US" style:line-height-at-least="0.1665inch"
-fo:orphans="0" fo:widows="0"/></style:style>
-
-<style:style style:name=".code NOTATION"
-style:family="paragraph">
-<style:properties
-style:use-window-font-color="true" style:font-name="Helvetica-Narrow"
-fo:font-size="9pt" fo:font-weight="bold" style:font-name-asian="Times
-New Roman" style:font-size-asian="9pt" style:font-weight-asian="bold"
-fo:orphans="2" fo:widows="2"/></style:style>
-
-<style:style style:name=".figure"
-style:family="paragraph">
-<style:properties
-fo:margin-top="0inch" fo:margin-bottom="0inch" fo:color="#000000"
-style:font-name="Univers 45 Light" fo:font-size="8pt" fo:language="en"
-fo:country="US" fo:font-weight="bold" style:font-name-asian="Times New
-Roman" style:font-size-asian="8pt" style:font-weight-asian="bold"
-fo:line-height="0.139inch" fo:orphans="0"
-fo:widows="0"/></style:style>
-
-<style:style style:name=".head 1"
-style:family="paragraph">
-<style:properties
-fo:margin-top="0.278inch" fo:margin-bottom="0.1665inch"
-fo:color="#000000" style:font-name="AGaramond" fo:font-size="20pt"
-fo:language="en" fo:country="US" fo:font-style="italic"
-style:font-name-asian="Times New Roman" style:font-size-asian="20pt"
-style:font-style-asian="italic" fo:line-height="0.278inch"
-fo:orphans="0" fo:widows="0"
-fo:keep-with-next="true"/></style:style>
-
-<style:style style:name=".head 2"
-style:family="paragraph"
-style:parent-style-name=".head 1"
-style:next-style-name=".body1">
-<style:properties
-fo:margin-top="0.0972inch" fo:margin-bottom="0.0972inch"
-fo:font-size="16pt" style:font-size-asian="16pt"
-fo:line-height="0.222inch"/></style:style>
-
-<style:style style:name=".head 3alone"
-style:family="paragraph"
-style:next-style-name=".body">
-<style:properties
-fo:margin-top="0.0972inch" fo:margin-bottom="0.0555inch"
-style:use-window-font-color="true" style:font-name="AGaramond"
-fo:font-size="14pt" fo:font-style="italic"
-style:font-name-asian="Times New Roman" style:font-size-asian="14pt"
-style:font-style-asian="italic" fo:orphans="2"
-fo:widows="2"/></style:style>
-
-<style:style style:name=".numlist"
-style:family="paragraph"
-style:list-style-name="NumberedList">
-<style:properties
-fo:margin-top="0.028inch"
-fo:margin-bottom="0.028inch"
-fo:color="#000000"
-style:font-name="AGaramond"
-fo:font-size="11pt"
-fo:language="en"
-fo:country="US"
-style:font-name-asian="Times New Roman"
-style:font-size-asian="11pt"
-fo:line-height="0.1937inch"
-fo:text-align="justify"
-style:justify-single-word="false"
-fo:orphans="0" fo:widows="0">
-<style:tab-stops>
-<style:tab-stop style:position="0.5inch"/>
-</style:tab-stops>
-</style:properties></style:style>
-
-<text:list-style style:name="NumberedList">
-<text:list-level-style-number text:level="1"
-style:num-suffix="."
-style:num-format="1">
-<style:properties
-text:min-label-width="0.25inch"/>
-</text:list-level-style-number>
-</text:list-style>
-
-<style:style style:name=".numlist 1"
-style:family="paragraph"
-style:parent-style-name=".numlist"
-style:next-style-name=".numlist">
-<style:properties
-fo:margin-left="0inch" fo:margin-right="0inch" fo:text-indent="0inch"
-style:auto-text-indent="false"/></style:style>
-
-<style:style style:name=".table title"
-style:family="paragraph">
-<style:properties fo:color="#000000"
-style:font-name="Univers 45 Light" fo:font-size="8pt" fo:language="en"
-fo:country="US" fo:font-weight="bold" style:font-name-asian="Times New
-Roman" style:font-size-asian="8pt" style:font-weight-asian="bold"
-style:line-height-at-least="0.139inch" fo:text-align="justify"
-style:justify-single-word="false" fo:orphans="0"
-fo:widows="0"/></style:style>
-
-<style:style style:name="image"
-style:family="graphics">
-<style:properties style:wrap="none"
-style:vertical-pos="top"
-style:vertical-rel="char"
-style:horizontal-pos="from-left"
-style:horizontal-rel="paragraph-content"
-fo:background-color="transparent"
-fo:padding="0.0102inch"
-fo:border="none" style:mirror="none"
-fo:clip="rect(0inch 0inch 0inch 0inch)"
-draw:luminance="0%"
-draw:contrast="0%"
-draw:red="0%"
-draw:green="0%"
-draw:blue="0%"
-draw:gamma="100"
-draw:color-inversion="false"
-draw:transparency="-100%"
-draw:color-mode="standard">
-<style:background-image/>
-</style:properties>
-</style:style>
-
-<style:style style:name="Page Number"
-style:family="text"
-style:parent-style-name="WW-Default Paragraph Font"/>
-
-<style:style style:name="WW-Default Paragraph Font"
-style:family="text"/>
-
-<style:style style:name="Frame" style:family="graphics">
-<style:properties
-text:anchor-type="paragraph" svg:x="0inch" svg:y="0inch"
-style:wrap="parallel" style:number-wrapped-paragraphs="no-limit"
-style:wrap-contour="false" style:vertical-pos="top"
-style:vertical-rel="paragraph-content" style:horizontal-pos="center"
-style:horizontal-rel="paragraph-content"/></style:style>
-
-<style:style style:name="Graphics" style:family="graphics">
-<style:properties
-text:anchor-type="paragraph" svg:x="0inch" svg:y="0inch"
-style:wrap="none"
-style:vertical-pos="top"
-style:vertical-rel="char"
-style:horizontal-pos="from-left"
-style:horizontal-rel="paragraph-content"/></style:style>
-
-<style:style style:name="OLE" style:family="graphics">
-<style:properties
-text:anchor-type="paragraph" svg:x="0inch" svg:y="0inch"
-style:wrap="none" style:vertical-pos="top"
-style:vertical-rel="paragraph" style:horizontal-pos="center"
-style:horizontal-rel="paragraph"/></style:style>
-
-<text:footnotes-configuration
-style:num-format="1" text:start-value="0"
-text:footnotes-position="page"
-text:start-numbering-at="document"/>
-
-<text:endnotes-configuration
-style:num-format="i"
-text:start-value="0"/>
-
-<text:linenumbering-configuration
-text:number-lines="false" text:offset="0.1965inch"
-style:num-format="1" text:number-position="left"
-text:increment="5"/>
-
-</office:styles>
-
-
-<office:automatic-styles>
-
-<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
-<style:properties
-fo:margin-left="0inch" fo:margin-right="0.25inch"
-style:font-name="AGaramond" fo:text-indent="0inch"
-style:auto-text-indent="false"/>
-</style:style>
-
-<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
-<style:properties
-fo:margin-left="0inch" fo:margin-right="0.25inch"
-fo:text-indent="0.25inch"
-style:auto-text-indent="false"/>
-</style:style>
-
-<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
-<style:properties>
-<style:tab-stops>
-<style:tab-stop
-style:position="0.0626inch"/>
-<style:tab-stop
-style:position="0.25inch"/>
-<style:tab-stop
-style:position="2.6252inch"/>
-<style:tab-stop
-style:position="6.3126inch"/>
-<style:tab-stop
-style:position="6.3752inch"/>
-</style:tab-stops></style:properties></style:style>
-
-<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">
-<style:properties
-fo:margin-left="0inch" fo:margin-right="0.25inch"
-fo:text-indent="0inch"
-style:auto-text-indent="false">
-<style:tab-stops>
-<style:tab-stop
-style:position="6.4402inch"
-style:type="right"/>
-</style:tab-stops></style:properties></style:style>
-
-<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Standard">
-<style:properties
-fo:margin-left="0inch" fo:margin-right="0.25inch"
-fo:text-indent="0inch"
-style:auto-text-indent="false">
-<style:tab-stops>
-<style:tab-stop
-style:position="0inch"/>
-<style:tab-stop
-style:position="2.75inch"/>
-<style:tab-stop
-style:position="3.1874inch"/>
-<style:tab-stop
-style:position="6.1874inch"/>
-<style:tab-stop
-style:position="6.4402inch"
-style:type="right"/>
-</style:tab-stops></style:properties></style:style>
-
-<style:style style:name="T1" style:family="text" style:parent-style-name="Page Number">
-<style:properties
-style:font-name="AGaramond"/></style:style>
-
-<style:style style:name="fr1"
-style:family="graphics"
-style:parent-style-name="Graphics">
-<style:properties
-fo:background-color="transparent">
-<style:background-image/></style:properties></style:style>
-
-<style:page-master style:name="pm1" style:page-usage="mirrored">
-<style:properties
-fo:page-width="8.5inch" fo:page-height="11inch" style:num-format="1"
-style:print-orientation="portrait" fo:margin-top="0.4925inch"
-fo:margin-bottom="0.4925inch" fo:margin-left="1inch"
-fo:margin-right="1inch" style:layout-grid-color="#c0c0c0"
-style:layout-grid-lines="40"
-style:layout-grid-base-height="0.1945inch"
-style:layout-grid-ruby-height="0.0555inch"
-style:layout-grid-mode="none" style:layout-grid-ruby-below="false"
-style:layout-grid-print="false" style:layout-grid-display="false"
-style:footnote-max-height="0inch">
-<style:footnote-sep
-style:width="0.0071inch" style:distance-before-sep="0.0398inch"
-style:distance-after-sep="0.0398inch" style:adjustment="left"
-style:rel-width="25%"
-style:color="#000000"/>
-</style:properties>
-<style:header-style>
-<style:properties
-fo:min-height="0.5075inch"/>
-</style:header-style>
-<style:footer-style>
-<style:properties fo:min-height="0inch" fo:margin-top="0.0909inch"/>
-</style:footer-style>
-</style:page-master>
-</office:automatic-styles>
-
-
-<office:master-styles>
-<style:master-page style:name="Standard" style:page-master-name="pm1">
-
-<style:header>
-<text:p text:style-name="P1">
-<draw:text-box draw:style-name="fr1"
-draw:name="Frame1" text:anchor-type="paragraph" svg:y="0.0008inch"
-svg:width="0.2429inch" svg:height="0.0161inch" draw:z-index="2">
-<text:p text:style-name="Header">
-<text:span text:style-name="T1">
-<text:page-number text:select-page="current">10
-</text:page-number></text:span></text:p></draw:text-box></text:p>
-</style:header>
-
-<style:header-left>
-<text:p text:style-name="P2">
-<draw:text-box draw:style-name="fr1"
-draw:name="Frame2" text:anchor-type="paragraph" svg:y="0.0008inch"
-svg:width="0.2429inch" svg:height="0.0161inch" draw:z-index="3">
-<text:p text:style-name="Standard">
-<text:page-number text:select-page="current">10
-</text:page-number></text:p></draw:text-box></text:p>
-</style:header-left>
-
-<style:footer>
-<text:p text:style-name="P3">
-<text:tab-stop/></text:p>
-<text:p text:style-name="P3">
-Author Template
-<text:tab-stop/>
-Manning Publications Co.
-<text:tab-stop/>
-<text:span text:style-name="T1">
-<text:page-number text:select-page="current">10
-</text:page-number></text:span></text:p>
-</style:footer>
-
-<style:footer-left>
-<text:p text:style-name="P4"/>
-<text:p text:style-name="P5">
-Author Template
-<text:tab-stop/>
-Manning Publications Co.
-<text:tab-stop/>
-<text:tab-stop/>
-<text:span text:style-name="T1">
-<text:page-number text:select-page="current">10
-</text:page-number></text:span></text:p>
-</style:footer-left>
-
-</style:master-page>
-</office:master-styles>
-</office:document-styles>
-
-'''
-
-# Temporary style info:
-
-'''
-
-'''
diff --git a/sandbox/pobrien/OpenOffice/OOwriter.py b/sandbox/pobrien/OpenOffice/OOwriter.py
deleted file mode 100644
index 2a3fb8ddb..000000000
--- a/sandbox/pobrien/OpenOffice/OOwriter.py
+++ /dev/null
@@ -1,599 +0,0 @@
-"""OpenOffice writer
-
-The output is an OpenOffice.org 1.0-compatible document."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-# Based on work orginally created by:
-# Author: Aahz
-# Contact: aahz@pythoncraft.com
-
-__docformat__ = 'reStructuredText'
-
-import sys
-from warnings import warn
-import re
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-import OOtext
-
-import Image # from the Python Imaging Library
-
-section_styles = [
- '.ch title',
- '.head 1',
- '.head 2',
- '.head 3alone',
- ]
-
-
-class Writer(writers.Writer):
-
- supported = ('OpenOffice')
- """Formats this writer supports."""
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
-
- header = [OOtext.content_header]
- footer = [OOtext.content_footer]
-
- start_para = '\n<text:p text:style-name="%s">\n'
- end_para = '\n</text:p>\n'
-
- start_charstyle = '<text:span text:style-name="%s">'
- end_charstyle = '</text:span>'
-
- line_break = '\n<text:line-break/>'
- re_spaces = re.compile(' +')
- spaces = '<text:s text:c="%d"/>'
-
- re_annotation = re.compile(r'#\d+(?:, #\d+)*$')
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = document.settings
- self.body = []
- self.section_level = 0
- self.skip_para_tag = False
- self.para_styles = ['.body']
- self.compact_p = 1
- self.compact_simple = None
- self.context = []
- self.inBulletList = False
- self.inEnumList = False
- self.inTableHead = False
- self.inTableBody = False
- self.bodyOne = False
- self.colspecs = []
-
- def astext(self):
- """Return the final formatted document as a string."""
- return ''.join(self.header + self.body + self.footer)
-
- def encode(self, text):
- """Encode special characters in `text` & return."""
- # @@@ A codec to do these and all other HTML entities would be nice.
- text = text.replace("&", "&amp;")
- text = text.replace("<", "&lt;")
- text = text.replace('"', "&quot;")
- text = text.replace(">", "&gt;")
- return text
-
- def compress_spaces(self, line):
- while 1:
- match = self.re_spaces.search(line)
- if match:
- start, end = match.span()
- numspaces = end - start
- line = line[:start] + (self.spaces % numspaces) + line[end:]
- else:
- break
- return line
-
- def fix_annotation(self, line):
- match = self.re_annotation.search(line)
- if match:
- pos = match.start()
- line = line[:pos] + '|' + line[pos:]
- return line
-
- def visit_Text(self, node):
- self.body.append(self.encode(node.astext()))
-
- def depart_Text(self, node):
- pass
-
- def visit_admonition(self, node, name):
- self.skip_para_tag = False
- self.para_styles.append('.CALLOUT')
-
- def depart_admonition(self):
- self.para_styles.pop()
- self.bodyOne = True
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
-## def visit_block_quote(self, node):
-## self.skip_para_tag = True
-## self.body.append(self.start_para % '.quotes')
-
-## def depart_block_quote(self, node):
-## self.body.append(self.end_para)
-## self.skip_para_tag = False
-## self.bodyOne = True
-
- def visit_bullet_list(self, node):
- self.inBulletList = True
- self.body.append('\n<text:unordered-list text:style-name="BulletList">\n')
-
- def depart_bullet_list(self, node):
- self.body.append('</text:unordered-list>\n')
- self.inBulletList = False
- self.bodyOne = True
-
- def visit_caption(self, node):
- pass
-
- def depart_caption(self, node):
- pass
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
-## def visit_citation(self, node):
-## self.body.append(self.starttag(node, 'table', CLASS='citation',
-## frame="void", rules="none"))
-## self.footnote_backrefs(node)
-
-## def depart_citation(self, node):
-## self.body.append('</td></tr>\n'
-## '</tbody>\n</table>\n')
-
-## def visit_citation_reference(self, node):
-## href = ''
-## if node.has_key('refid'):
-## href = '#' + node['refid']
-## elif node.has_key('refname'):
-## href = '#' + self.document.nameids[node['refname']]
-## self.body.append(self.starttag(node, 'a', '[', href=href,
-## CLASS='citation-reference'))
-
-## def depart_citation_reference(self, node):
-## self.body.append(']</a>')
-
-## def visit_classifier(self, node):
-## self.body.append(' <span class="classifier-delimiter">:</span> ')
-## self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
-## def depart_classifier(self, node):
-## self.body.append('</span>')
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- self.body.append('<table:table-column/>')
-
-## colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
-## self.body.append(self.emptytag(node, 'col',
-## colwidth='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node):
- raise nodes.SkipNode
-
- def visit_decoration(self, node):
- raise nodes.SkipNode
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- pass
-
- def depart_definition(self, node):
- pass
-
- def visit_definition_list(self, node):
- pass
-
- def depart_definition_list(self, node):
- pass
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_docinfo(self, node):
- raise nodes.SkipNode
-
- def depart_docinfo(self, node):
- pass
-
- def visit_doctest_block(self, node):
- self.visit_literal_block(node)
-
- def visit_document(self, node):
- pass
-
- def depart_document(self, node):
- pass
-
- def visit_emphasis(self, node):
- self.body.append(self.start_charstyle % 'Emphasis')
-
- def depart_emphasis(self, node):
- self.body.append(self.end_charstyle)
-
- def visit_entry(self, node):
- self.body.append('<table:table-cell table:value-type="string">\n')
-
- def depart_entry(self, node):
- self.body.append('</table:table-cell>\n')
-
- def visit_enumerated_list(self, node):
- self.inEnumList = True
- self.body.append('\n<text:ordered-list text:style-name="NumberedList">\n')
-
- def depart_enumerated_list(self, node):
- self.body.append('</text:ordered-list>\n')
- self.inEnumList = False
- self.bodyOne = True
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_figure(self, node):
- self.body.append(self.start_para % '.figure')
-
- def depart_figure(self, node):
- self.body.append(self.end_para)
- self.bodyOne = True
-
- def visit_footer(self, node):
- pass
-## self.context.append(len(self.body))
-
- def depart_footer(self, node):
- pass
-## start = self.context.pop()
-## footer = (['<hr class="footer" />\n',
-## self.starttag(node, 'div', CLASS='footer')]
-## + self.body[start:] + ['</div>\n'])
-## self.body_suffix[:0] = footer
-## del self.body[start:]
-
- def visit_footnote(self, node):
- raise nodes.SkipNode
-
-## def footnote_backrefs(self, node):
-## warn("footnote backrefs not available")
-
- def depart_footnote(self, node):
- pass
-
-## def visit_footnote_reference(self, node):
-## name = node['refid']
-## id = node['id']
-## number = node['auto']
-## for footnote in self.document.autofootnotes:
-## if name == footnote['name']:
-## break
-## self.body.append('<text:footnote text:id="%s">\n' % id)
-## self.body.append('<text:footnote-citation text:string-value="%s"/>\n' % number)
-## self.body.append('<text:footnote-body>\n')
-## self.body.append(self.start_para % '.body')
-## for child in footnote.children:
-## if isinstance(child, nodes.paragraph):
-## self.body.append(child.astext())
-## self.body.append(self.end_para)
-## self.body.append('</text:footnote-body>\n')
-## self.body.append('</text:footnote>')
-## raise nodes.SkipNode
-
-## def depart_footnote_reference(self, node):
-## pass
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
-## def visit_header(self, node):
-## self.context.append(len(self.body))
-
-## def depart_header(self, node):
-## start = self.context.pop()
-## self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
-## self.body_prefix.extend(self.body[start:])
-## self.body_prefix.append('<hr />\n</div>\n')
-## del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- name = str(node.attributes['uri'])
- image = Image.open(name)
- format = image.format
- dpi = 96.0
- width, height = image.size
- width /= dpi
- height /= dpi
- scale = None
- if 'scale' in node.attributes:
- scale = node.attributes['scale']
- if scale is not None:
- factor = scale / 100.0
- width *= factor
- height *= factor
- # Add to our list so that rest2oo.py can create the manifest.
- if format == 'PNG':
- OOtext.pictures.append((name, OOtext.m_png_format % name))
- elif format == 'TIFF':
- OOtext.pictures.append((name, OOtext.m_tif_format % name))
- else:
- print '*** Image type not recognized ***', repr(name)
- #self.body.append('<text:line-break/>\n')
- self.body.append('<draw:image draw:style-name="image"\n')
- self.body.append('draw:name="%s"\n' % name)
- self.body.append('text:anchor-type="char"\n')
- self.body.append('svg:width="%0.2finch"\n' % width)
- self.body.append('svg:height="%0.2finch"\n' % height)
- self.body.append('draw:z-index="0"\n')
- self.body.append('xlink:href="#Pictures/%s"\n' % name)
- self.body.append('xlink:type="simple"\n')
- self.body.append('xlink:show="embed"\n')
- self.body.append('xlink:actuate="onLoad"/>')
- self.body.append('Figure X.X\n')
-
- def depart_image(self, node):
- pass
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_index_entry(self, node):
- index_format = '<text:alphabetical-index-mark text:string-value="%s"/>\n'
- self.body.append(self.start_para % '.body')
- entries = node.astext().split('\n')
- for entry in entries:
- self.body.append(index_format % self.encode(entry))
- self.body.append(self.end_para)
- raise nodes.SkipNode
-
-## def visit_line_block(self, node):
-## self.body.append(self.start_para % '.quotes')
-## lines = node.astext()
-## lines = lines.split('\n')
-## lines = self.line_break.join(lines)
-## self.body.append(lines)
-## self.body.append(self.end_para)
-## raise nodes.SkipNode
-
- def visit_list_item(self, node):
- self.body.append('<text:list-item>')
-## if len(node):
-## node[0].set_class('first')
-
- def depart_list_item(self, node):
- self.body.append('</text:list-item>\n')
-
- def visit_literal(self, node):
- self.body.append(self.start_charstyle % 'code')
-
- def depart_literal(self, node):
- self.body.append(self.end_charstyle)
-
- def visit_literal_block(self, node):
- self.body.append(self.start_para % '.code first')
- self.body.append(self.end_para)
- lines = self.encode(node.astext())
- lines = lines.split('\n')
- while lines[-1] == '':
- lines.pop()
- for line in lines:
- self.body.append(self.start_para % '.code')
- line = self.fix_annotation(line)
- line = self.compress_spaces(line)
- self.body.append(line)
- self.body.append(self.end_para)
- self.body.append(self.start_para % '.code last')
- self.body.append(self.end_para)
- self.bodyOne = True
- raise nodes.SkipNode
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_paragraph(self, node):
- style = self.para_styles[-1]
- if self.inBulletList:
- style = '.bullet'
- elif self.inEnumList:
- style = '.numlist'
- elif self.inTableHead:
- style = '.cell head'
- elif self.inTableBody:
- style = '.cell body'
- elif node.astext().startswith('(annotation)'):
- style = '.code NOTATION'
- elif self.bodyOne or node.astext().startswith('#'):
- if style == '.body':
- style = '.body1'
- self.bodyOne = False
- if not self.skip_para_tag:
- self.body.append(self.start_para % style)
-
- def depart_paragraph(self, node):
- if not self.skip_para_tag:
- self.body.append(self.end_para)
-
- def visit_reference(self, node):
- pass
-
- def depart_reference(self, node):
- pass
-
- def visit_row(self, node):
- self.body.append('<table:table-row>\n')
-
- def depart_row(self, node):
- self.body.append('</table:table-row>\n')
-
- def visit_section(self, node):
- self.section_level += 1
- self.bodyOne = True
-
- def depart_section(self, node):
- self.section_level -= 1
-
-## XX Perhaps these should replace admonition:
-
-## def visit_sidebar(self, node):
-## self.body.append(self.starttag(node, 'div', CLASS='sidebar'))
-## self.in_sidebar = 1
-
-## def depart_sidebar(self, node):
-## self.body.append('</div>\n')
-## self.in_sidebar = None
-
- def visit_strong(self, node):
- self.body.append(self.start_charstyle % 'Strong Emphasis')
-
- def depart_strong(self, node):
- self.body.append(self.end_charstyle)
-
- def visit_table(self, node):
- self.body.append('<table:table>\n')
-
- def depart_table(self, node):
- self.body.append('</table:table>\n')
- self.bodyOne = True
-
- def visit_tbody(self, node):
- self.write_colspecs()
- self.inTableBody = True
-
- def depart_tbody(self, node):
- self.inTableBody = False
-
- def visit_term(self, node):
- self.bodyOne = True
- self.visit_paragraph(node)
- self.body.append(self.start_charstyle % 'Strong Emphasis')
-
- def depart_term(self, node):
- self.body.append(self.end_charstyle)
- self.depart_paragraph(node)
-
- def visit_tgroup(self, node):
- pass
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- self.write_colspecs()
- self.inTableHead = True
-
- def depart_thead(self, node):
- self.inTableHead = False
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- """Only 4 section levels are supported by this writer."""
- title_tag = self.start_para % section_styles[self.section_level]
- self.body.append(title_tag)
-
- def depart_title(self, node):
- self.body.append(self.end_para)
-
- def visit_topic(self, node):
- if node.has_key('class') and node['class'] == 'contents':
- raise nodes.SkipNode
- else:
- pass
-
- def depart_topic(self, node):
- pass
-
- def visit_transition(self, node):
- self.visit_paragraph(node)
-
- def depart_transition(self, node):
- self.depart_paragraph(node)
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def visit_system_message(self, node):
- print node.astext()
-
- def depart_system_message(self, node):
- pass
-
- def unknown_visit(self, node):
- print "=" * 70
- print "Failure due to unknown node type"
- print "-" * 70
- print "Failed node is: %r" % node
- print "Failed line is:", node.line
- print "Failed text is:", node.astext()
- print "=" * 70
- raise NotImplementedError('unimplemented node type: %s'
- % node.__class__.__name__)
diff --git a/sandbox/pobrien/OpenOffice/__init__.py b/sandbox/pobrien/OpenOffice/__init__.py
deleted file mode 100644
index db6003cf3..000000000
--- a/sandbox/pobrien/OpenOffice/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# Orbtech python package. \ No newline at end of file
diff --git a/sandbox/pobrien/OpenOffice/rest2oo.py b/sandbox/pobrien/OpenOffice/rest2oo.py
deleted file mode 100755
index e48e7d4ec..000000000
--- a/sandbox/pobrien/OpenOffice/rest2oo.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-import sys
-import zipfile
-
-from docutils import core
-
-import OOdirectives
-import OOtext
-import OOwriter
-
-
-def main():
-
-## pub = core.Publisher(writer=OOwriter.Writer())
-## pub.set_reader('standalone', None, 'restructuredtext')
-## settings = pub.get_settings()
-## pub.source = io.FileInput(settings, source_path=sys.argv[1])
-## pub.destination = io.StringOutput(settings)
-## content = pub.publish()
-
- source = file(sys.argv[1]).read()
- content = core.publish_string(source, writer=OOwriter.Writer())
-
- xml_manifest_list = [
- ('content.xml', content),
- ('styles.xml', OOtext.styles)
- ]
-
- xml_entries = []
- for docname, _ in xml_manifest_list:
- xml_entries.append(OOtext.m_xml_format % docname)
-
- image_manifest_list = OOtext.pictures
-
- image_entries = []
- for name, format in image_manifest_list:
- image_entries.append(format)
-
- manifest = OOtext.manifest % ('\n '.join(image_entries),
- '\n '.join(xml_entries))
- xml_manifest_list.append(('META-INF/manifest.xml', manifest))
-
- zip = zipfile.ZipFile(sys.argv[2], "w")
- for docname, contents in xml_manifest_list:
- zinfo = zipfile.ZipInfo(docname)
- zip.writestr(zinfo, contents)
- for name, format in image_manifest_list:
- zip.write(name, 'Pictures/' + name)
- zip.close()
-
-if __name__ == '__main__':
- main()
diff --git a/sandbox/pobrien/OpenOffice/rest2oopseudo.py b/sandbox/pobrien/OpenOffice/rest2oopseudo.py
deleted file mode 100755
index 75565eac5..000000000
--- a/sandbox/pobrien/OpenOffice/rest2oopseudo.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-
-"""
-A minimal front end to the Docutils Publisher, producing pseudo-XML.
-"""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-import OOdirectives
-
-description = ('Generates pseudo-XML from standalone reStructuredText '
- 'sources (for testing purposes). ' + default_description)
-
-publish_cmdline(description=description)
diff --git a/sandbox/pobrien/OpenOffice/rest2ooxml.py b/sandbox/pobrien/OpenOffice/rest2ooxml.py
deleted file mode 100755
index 671052845..000000000
--- a/sandbox/pobrien/OpenOffice/rest2ooxml.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env python
-
-"""Generates the OpenOffice.org content.xml file outside of a .swx zip
-file. Useful for debugging the OOwriter."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-import locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-from OOwriter import Writer
-
-
-def main():
- description = ("Generates OpenOffice.org XML. " + default_description)
- publish_cmdline(writer=Writer(), description=description)
-
-
-if __name__ == '__main__':
- main()
diff --git a/sandbox/pobrien/WriterTemplate.py b/sandbox/pobrien/WriterTemplate.py
deleted file mode 100644
index 868c8434a..000000000
--- a/sandbox/pobrien/WriterTemplate.py
+++ /dev/null
@@ -1,1081 +0,0 @@
-"""Template for creating a new writer."""
-
-__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
-
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os
-import time
-import re
-from types import ListType
-
-import docutils
-from docutils import nodes, utils, writers, languages
-
-
-class Writer(writers.Writer):
-
- supported = ('SomeFormat')
- """Formats this writer supports."""
-
- output = None
- """Final translated form of `document`."""
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = Translator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
-
-
-class Translator(nodes.NodeVisitor):
- """Modify this to suite your needs."""
-
- words_and_spaces = re.compile(r'\S+| +|\n')
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.settings = settings = document.settings
- lcode = settings.language_code
- self.language = languages.get_language(lcode)
- self.head = []
- self.body = []
- self.foot = []
- self.section_level = 0
- self.context = []
- self.topic_class = ''
- self.colspecs = []
- self.compact_p = 1
- self.compact_simple = None
- self.in_docinfo = None
-
- def astext(self):
- """Return the final formatted document as a string."""
- raise NotImplementedError
- return ''.join(self.head + self.body + self.foot)
-
- def visit_Text(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(node.astext())
-
- def depart_Text(self, node):
- pass
-
- def visit_address(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'address', meta=None)
-
- def depart_address(self, node):
- self.depart_docinfo_item()
-
- def visit_admonition(self, node, name):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS=name))
- self.body.append('<p class="admonition-title">'
- + self.language.labels[name] + '</p>\n')
-
- def depart_admonition(self):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_attention(self, node):
- self.visit_admonition(node, 'attention')
-
- def depart_attention(self, node):
- self.depart_admonition()
-
- def visit_author(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'author')
-
- def depart_author(self, node):
- self.depart_docinfo_item()
-
- def visit_authors(self, node):
- pass
-
- def depart_authors(self, node):
- pass
-
- def visit_block_quote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'blockquote'))
-
- def depart_block_quote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</blockquote>\n')
-
- def check_simple_list(self, node):
- raise NotImplementedError, node.astext()
- """Check for a simple list that can be rendered compactly."""
- visitor = SimpleListChecker(self.document)
- try:
- node.walk(visitor)
- except nodes.NodeFound:
- return None
- else:
- return 1
-
- def visit_bullet_list(self, node):
- raise NotImplementedError, node.astext()
- atts = {}
- 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_class == '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))
-
- def depart_bullet_list(self, node):
- raise NotImplementedError, node.astext()
- self.compact_simple, self.compact_p = self.context.pop()
- self.body.append('</ul>\n')
-
- def visit_caption(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
- def depart_caption(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</p>\n')
-
- def visit_caution(self, node):
- self.visit_admonition(node, 'caution')
-
- def depart_caution(self, node):
- self.depart_admonition()
-
- def visit_citation(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'table', CLASS='citation',
- frame="void", rules="none"))
- self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<col />\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def depart_citation(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '[', href=href,
- CLASS='citation-reference'))
-
- def depart_citation_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(']</a>')
-
- def visit_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(' <span class="classifier-delimiter">:</span> ')
- self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
- def depart_classifier(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</span>')
-
- def visit_colspec(self, node):
- self.colspecs.append(node)
-
- def depart_colspec(self, node):
- pass
-
- def write_colspecs(self):
- raise NotImplementedError, node.astext()
- width = 0
- for node in self.colspecs:
- width += node['colwidth']
- for node in self.colspecs:
- colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
- self.body.append(self.emptytag(node, 'col',
- width='%i%%' % colwidth))
- self.colspecs = []
-
- def visit_comment(self, node,
- sub=re.compile('-(?=-)').sub):
- raise NotImplementedError, node.astext()
- """Escape double-dashes in comment text."""
- self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_contact(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'contact', meta=None)
-
- def depart_contact(self, node):
- self.depart_docinfo_item()
-
- def visit_copyright(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'copyright')
-
- def depart_copyright(self, node):
- self.depart_docinfo_item()
-
- def visit_danger(self, node):
- self.visit_admonition(node, 'danger')
-
- def depart_danger(self, node):
- self.depart_admonition()
-
- def visit_date(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'date')
-
- def depart_date(self, node):
- self.depart_docinfo_item()
-
- def visit_decoration(self, node):
- pass
-
- def depart_decoration(self, node):
- pass
-
- def visit_definition(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</dt>\n')
- self.body.append(self.starttag(node, 'dd', ''))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_definition(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</dd>\n')
-
- def visit_definition_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'dl'))
-
- def depart_definition_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</dl>\n')
-
- def visit_definition_list_item(self, node):
- pass
-
- def depart_definition_list_item(self, node):
- pass
-
- def visit_description(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'td', ''))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_description(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td>')
-
- def visit_docinfo(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.body))
- self.body.append(self.starttag(node, 'table', CLASS='docinfo',
- frame="void", rules="none"))
- self.body.append('<col class="docinfo-name" />\n'
- '<col class="docinfo-content" />\n'
- '<tbody valign="top">\n')
- self.in_docinfo = 1
-
- def depart_docinfo(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tbody>\n</table>\n')
- self.in_docinfo = None
- start = self.context.pop()
- self.body_pre_docinfo = self.body[:start]
- self.docinfo = self.body[start:]
- self.body = []
-
- def visit_docinfo_item(self, node, name, meta=1):
- raise NotImplementedError, node.astext()
- if meta:
- self.head.append('<meta name="%s" content="%s" />\n'
- % (name, self.attval(node.astext())))
- self.body.append(self.starttag(node, 'tr', ''))
- self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
- % self.language.labels[name])
- if len(node):
- if isinstance(node[0], nodes.Element):
- node[0].set_class('first')
- if isinstance(node[0], nodes.Element):
- node[-1].set_class('last')
-
- def depart_docinfo_item(self):
- raise NotImplementedError, node.astext()
- self.body.append('</td></tr>\n')
-
- def visit_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
- def depart_doctest_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('\n</pre>\n')
-
- def visit_document(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='document'))
-
- def depart_document(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_emphasis(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('<em>')
-
- def depart_emphasis(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</em>')
-
- def visit_entry(self, node):
- raise NotImplementedError, node.astext()
- if isinstance(node.parent.parent, nodes.thead):
- tagname = 'th'
- else:
- tagname = 'td'
- atts = {}
- if node.has_key('morerows'):
- atts['rowspan'] = node['morerows'] + 1
- if node.has_key('morecols'):
- atts['colspan'] = node['morecols'] + 1
- self.body.append(self.starttag(node, tagname, '', **atts))
- self.context.append('</%s>\n' % tagname.lower())
- if len(node) == 0: # empty cell
- self.body.append('&nbsp;')
- else:
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_entry(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_enumerated_list(self, node):
- raise NotImplementedError, node.astext()
- """
- The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
- CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
- usable.
- """
- atts = {}
- if node.has_key('start'):
- atts['start'] = node['start']
- if node.has_key('enumtype'):
- atts['class'] = node['enumtype']
- # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
- # single "format" attribute? Use CSS2?
- 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_class == '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))
-
- def depart_enumerated_list(self, node):
- raise NotImplementedError, node.astext()
- self.compact_simple, self.compact_p = self.context.pop()
- self.body.append('</ol>\n')
-
- def visit_error(self, node):
- self.visit_admonition(node, 'error')
-
- def depart_error(self, node):
- self.depart_admonition()
-
- def visit_field(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
-
- def depart_field(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tr>\n')
-
- def visit_field_body(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
- if len(node):
- node[0].set_class('first')
- node[-1].set_class('last')
-
- def depart_field_body(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td>\n')
-
- def visit_field_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'table', frame='void',
- rules='none', CLASS='field-list'))
- self.body.append('<col class="field-name" />\n'
- '<col class="field-body" />\n'
- '<tbody valign="top">\n')
-
- def depart_field_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tbody>\n</table>\n')
-
- def visit_field_name(self, node):
- raise NotImplementedError, node.astext()
- atts = {}
- if self.in_docinfo:
- atts['class'] = 'docinfo-name'
- else:
- atts['class'] = 'field-name'
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'th', '', **atts))
-
- def depart_field_name(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(':</th>')
- self.body.append(self.context.pop())
-
- def visit_figure(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='figure'))
-
- def depart_figure(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_footer(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.body))
-
- def depart_footer(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- footer = (['<hr class="footer"/>\n',
- self.starttag(node, 'div', CLASS='footer')]
- + self.body[start:] + ['</div>\n'])
- self.body_suffix[:0] = footer
- del self.body[start:]
-
- def visit_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'table', CLASS='footnote',
- frame="void", rules="none"))
- self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
- '<tbody valign="top">\n'
- '<tr>')
- self.footnote_backrefs(node)
-
- def footnote_backrefs(self, node):
- raise NotImplementedError, node.astext()
- if self.settings.footnote_backlinks and node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- self.context.append('')
- self.context.append('<a class="fn-backref" href="#%s" '
- 'name="%s">' % (backrefs[0], node['id']))
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
- % (backref, i))
- i += 1
- self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
- self.context.append('<a name="%s">' % node['id'])
- else:
- self.context.append('')
- self.context.append('<a name="%s">' % node['id'])
-
- def depart_footnote(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</td></tr>\n'
- '</tbody>\n</table>\n')
-
- def visit_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- href = ''
- if node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- format = self.settings.footnote_references
- if format == 'brackets':
- suffix = '['
- self.context.append(']')
- elif format == 'superscript':
- suffix = '<sup>'
- self.context.append('</sup>')
- else: # shouldn't happen
- suffix = '???'
- self.content.append('???')
- self.body.append(self.starttag(node, 'a', suffix, href=href,
- CLASS='footnote-reference'))
-
- def depart_footnote_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop() + '</a>')
-
- def visit_generated(self, node):
- pass
-
- def depart_generated(self, node):
- pass
-
- def visit_header(self, node):
- raise NotImplementedError, node.astext()
- self.context.append(len(self.body))
-
- def depart_header(self, node):
- raise NotImplementedError, node.astext()
- start = self.context.pop()
- self.body_prefix.append(self.starttag(node, 'div', CLASS='header'))
- self.body_prefix.extend(self.body[start:])
- self.body_prefix.append('<hr />\n</div>\n')
- del self.body[start:]
-
- def visit_hint(self, node):
- self.visit_admonition(node, 'hint')
-
- def depart_hint(self, node):
- self.depart_admonition()
-
- def visit_image(self, node):
- raise NotImplementedError, node.astext()
- atts = node.attributes.copy()
- atts['src'] = atts['uri']
- del atts['uri']
- if not atts.has_key('alt'):
- atts['alt'] = atts['src']
- if isinstance(node.parent, nodes.TextElement):
- self.context.append('')
- else:
- self.body.append('<p>')
- self.context.append('</p>\n')
- self.body.append(self.emptytag(node, 'img', '', **atts))
-
- def depart_image(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_important(self, node):
- self.visit_admonition(node, 'important')
-
- def depart_important(self, node):
- self.depart_admonition()
-
- def visit_label(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
- CLASS='label'))
-
- def depart_label(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(']</a></td><td>%s' % self.context.pop())
-
- def visit_legend(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
- def depart_legend(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_line_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'pre', CLASS='line-block'))
-
- def depart_line_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('\n</pre>\n')
-
- def visit_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'li', ''))
- if len(node):
- node[0].set_class('first')
-
- def depart_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</li>\n')
-
- def visit_literal(self, node):
- raise NotImplementedError, node.astext()
- """Process text to prevent tokens from wrapping."""
- self.body.append(self.starttag(node, 'tt', '', CLASS='literal'))
- text = node.astext()
- for token in self.words_and_spaces.findall(text):
- if token.strip():
- # Protect text like "--an-option" from bad line wrapping:
- self.body.append('<span class="pre">%s</span>'
- % self.encode(token))
- elif token in ('\n', ' '):
- # Allow breaks at whitespace:
- self.body.append(token)
- else:
- # Protect runs of multiple spaces; the last space can wrap:
- self.body.append('&nbsp;' * (len(token) - 1) + ' ')
- self.body.append('</tt>')
- # Content already processed:
- raise nodes.SkipNode
-
- def visit_literal_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
-
- def depart_literal_block(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('\n</pre>\n')
-
- def visit_meta(self, node):
- raise NotImplementedError, node.astext()
- self.head.append(self.emptytag(node, 'meta', **node.attributes))
-
- def depart_meta(self, node):
- pass
-
- def visit_note(self, node):
- self.visit_admonition(node, 'note')
-
- def depart_note(self, node):
- self.depart_admonition()
-
- def visit_option(self, node):
- raise NotImplementedError, node.astext()
- if self.context[-1]:
- self.body.append(', ')
-
- def depart_option(self, node):
- raise NotImplementedError, node.astext()
- self.context[-1] += 1
-
- def visit_option_argument(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(node.get('delimiter', ' '))
- self.body.append(self.starttag(node, 'var', ''))
-
- def depart_option_argument(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</var>')
-
- def visit_option_group(self, node):
- raise NotImplementedError, node.astext()
- atts = {}
- if len(node.astext()) > 14:
- atts['colspan'] = 2
- self.context.append('</tr>\n<tr><td>&nbsp;</td>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'td', **atts))
- self.body.append('<kbd>')
- self.context.append(0) # count number of options
-
- def depart_option_group(self, node):
- raise NotImplementedError, node.astext()
- self.context.pop()
- self.body.append('</kbd></td>\n')
- self.body.append(self.context.pop())
-
- def visit_option_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(
- self.starttag(node, 'table', CLASS='option-list',
- frame="void", rules="none"))
- self.body.append('<col class="option" />\n'
- '<col class="description" />\n'
- '<tbody valign="top">\n')
-
- def depart_option_list(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tbody>\n</table>\n')
-
- def visit_option_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_option_list_item(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tr>\n')
-
- def visit_option_string(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
- def depart_option_string(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</span>')
-
- def visit_organization(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'organization')
-
- def depart_organization(self, node):
- raise NotImplementedError, node.astext()
- self.depart_docinfo_item()
-
- def visit_paragraph(self, node):
- raise NotImplementedError, node.astext()
- # Omit <p> tags if this is an only child and optimizable.
- if (self.compact_simple or
- self.compact_p and (len(node.parent) == 1 or
- len(node.parent) == 2 and
- isinstance(node.parent[0], nodes.label))):
- self.context.append('')
- else:
- self.body.append(self.starttag(node, 'p', ''))
- self.context.append('</p>\n')
-
- def depart_paragraph(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_problematic(self, node):
- raise NotImplementedError, node.astext()
- if node.hasattr('refid'):
- self.body.append('<a href="#%s" name="%s">' % (node['refid'],
- node['id']))
- self.context.append('</a>')
- else:
- self.context.append('')
- self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
- def depart_problematic(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</span>')
- self.body.append(self.context.pop())
-
- def visit_raw(self, node):
- raise NotImplementedError, node.astext()
- if node.get('format') == 'html':
- self.body.append(node.astext())
- # Keep non-HTML raw text out of output:
- raise nodes.SkipNode
-
- def visit_reference(self, node):
- raise NotImplementedError, node.astext()
- if node.has_key('refuri'):
- href = node['refuri']
- elif node.has_key('refid'):
- href = '#' + node['refid']
- elif node.has_key('refname'):
- href = '#' + self.document.nameids[node['refname']]
- self.body.append(self.starttag(node, 'a', '', href=href,
- CLASS='reference'))
-
- def depart_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</a>')
-
- def visit_revision(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'revision', meta=None)
-
- def depart_revision(self, node):
- self.depart_docinfo_item()
-
- def visit_row(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tr>\n')
-
- def visit_section(self, node):
- raise NotImplementedError, node.astext()
- self.section_level += 1
- self.body.append(self.starttag(node, 'div', CLASS='section'))
-
- def depart_section(self, node):
- raise NotImplementedError, node.astext()
- self.section_level -= 1
- self.body.append('</div>\n')
-
- def visit_status(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'status', meta=None)
-
- def depart_status(self, node):
- self.depart_docinfo_item()
-
- def visit_strong(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('<strong>')
-
- def depart_strong(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</strong>')
-
- def visit_substitution_definition(self, node):
- """Internal only."""
- raise nodes.SkipNode
-
- def visit_substitution_reference(self, node):
- self.unimplemented_visit(node)
-
- def visit_subtitle(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
-
- def depart_subtitle(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</h2>\n')
-
- def visit_system_message(self, node):
- raise NotImplementedError, node.astext()
- if node['level'] < self.document.reporter['writer'].report_level:
- # Level is too low to display:
- raise nodes.SkipNode
- self.body.append(self.starttag(node, 'div', CLASS='system-message'))
- self.body.append('<p class="system-message-title">')
- attr = {}
- backref_text = ''
- if node.hasattr('id'):
- attr['name'] = node['id']
- if node.hasattr('backrefs'):
- backrefs = node['backrefs']
- if len(backrefs) == 1:
- backref_text = ('; <em><a href="#%s">backlink</a></em>'
- % backrefs[0])
- else:
- i = 1
- backlinks = []
- for backref in backrefs:
- backlinks.append('<a href="#%s">%s</a>' % (backref, i))
- i += 1
- backref_text = ('; <em>backlinks: %s</em>'
- % ', '.join(backlinks))
- if node.hasattr('line'):
- line = ', line %s' % node['line']
- else:
- line = ''
- if attr:
- a_start = self.starttag({}, 'a', '', **attr)
- a_end = '</a>'
- else:
- a_start = a_end = ''
- self.body.append('System Message: %s%s/%s%s (<tt>%s</tt>%s)%s</p>\n'
- % (a_start, node['type'], node['level'], a_end,
- node['source'], line, backref_text))
-
- def depart_system_message(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
-
- def visit_table(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(
- self.starttag(node, 'table', CLASS="table",
- frame='border', rules='all'))
-
- def depart_table(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</table>\n')
-
- def visit_target(self, node):
- raise NotImplementedError, node.astext()
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
- self.body.append(self.starttag(node, 'a', '', CLASS='target'))
- self.context.append('</a>')
- else:
- self.context.append('')
-
- def depart_target(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n' or ''
- self.body.append(self.starttag(node, 'tbody', valign='top'))
-
- def depart_tbody(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</tbody>\n')
-
- def visit_term(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'dt', ''))
-
- def depart_term(self, node):
- """
- Leave the end tag to `self.visit_definition()`, in case there's a
- classifier.
- """
- raise NotImplementedError, node.astext()
- pass
-
- def visit_tgroup(self, node):
- raise NotImplementedError, node.astext()
- # Mozilla needs <colgroup>:
- self.body.append(self.starttag(node, 'colgroup'))
- # Appended by thead or tbody:
- self.context.append('</colgroup>\n')
-
- def depart_tgroup(self, node):
- pass
-
- def visit_thead(self, node):
- raise NotImplementedError, node.astext()
- self.write_colspecs()
- self.body.append(self.context.pop()) # '</colgroup>\n'
- # There may or may not be a <thead>; this is for <tbody> to use:
- self.context.append('')
- self.body.append(self.starttag(node, 'thead', valign='bottom'))
-
- def depart_thead(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</thead>\n')
-
- def visit_tip(self, node):
- self.visit_admonition(node, 'tip')
-
- def depart_tip(self, node):
- self.depart_admonition()
-
- def visit_title(self, node):
- raise NotImplementedError, node.astext()
- """Only 6 section levels are supported by HTML."""
- if isinstance(node.parent, nodes.topic):
- self.body.append(
- self.starttag(node, 'p', '', CLASS='topic-title'))
- if node.parent.hasattr('id'):
- self.body.append(
- self.starttag({}, 'a', '', name=node.parent['id']))
- self.context.append('</a></p>\n')
- else:
- self.context.append('</p>\n')
- elif self.section_level == 0:
- # document title
- self.head.append('<title>%s</title>\n'
- % self.encode(node.astext()))
- self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
- self.context.append('</h1>\n')
- else:
- self.body.append(
- self.starttag(node, 'h%s' % self.section_level, ''))
- atts = {}
- if node.parent.hasattr('id'):
- atts['name'] = node.parent['id']
- 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' % (self.section_level))
-
- def depart_title(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.context.pop())
-
- def visit_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'cite', ''))
-
- def depart_title_reference(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</cite>')
-
- def visit_topic(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.starttag(node, 'div', CLASS='topic'))
- self.topic_class = node.get('class')
-
- def depart_topic(self, node):
- raise NotImplementedError, node.astext()
- self.body.append('</div>\n')
- self.topic_class = ''
-
- def visit_transition(self, node):
- raise NotImplementedError, node.astext()
- self.body.append(self.emptytag(node, 'hr'))
-
- def depart_transition(self, node):
- pass
-
- def visit_version(self, node):
- raise NotImplementedError, node.astext()
- self.visit_docinfo_item(node, 'version', meta=None)
-
- def depart_version(self, node):
- self.depart_docinfo_item()
-
- def visit_warning(self, node):
- self.visit_admonition(node, 'warning')
-
- def depart_warning(self, node):
- self.depart_admonition()
-
- def unimplemented_visit(self, node):
- raise NotImplementedError('visiting unimplemented node type: %s'
- % node.__class__.__name__)
-
-
-class SimpleListChecker(nodes.GenericNodeVisitor):
-
- """
- Raise `nodes.SkipNode` if non-simple list item is encountered.
-
- Here "simple" means a list item containing nothing other than a single
- paragraph, a simple list, or a paragraph followed by a simple list.
- """
-
- def default_visit(self, node):
- raise nodes.NodeFound
-
- def visit_bullet_list(self, node):
- pass
-
- def visit_enumerated_list(self, node):
- pass
-
- def visit_list_item(self, node):
- children = []
- for child in node.get_children():
- if not isinstance(child, nodes.Invisible):
- children.append(child)
- if (children and isinstance(children[0], nodes.paragraph)
- and (isinstance(children[-1], nodes.bullet_list)
- or isinstance(children[-1], nodes.enumerated_list))):
- children.pop()
- if len(children) <= 1:
- return
- else:
- raise nodes.NodeFound
-
- def visit_paragraph(self, node):
- raise nodes.SkipNode
-
- def invisible_visit(self, node):
- """Invisible nodes should be ignored."""
- pass
-
- visit_comment = invisible_visit
- visit_substitution_definition = invisible_visit
- visit_target = invisible_visit
- visit_pending = invisible_visit
diff --git a/sandbox/pobrien/dwArticle/__init__.py b/sandbox/pobrien/dwArticle/__init__.py
deleted file mode 100644
index db6003cf3..000000000
--- a/sandbox/pobrien/dwArticle/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# Orbtech python package. \ No newline at end of file
diff --git a/sandbox/richard/ZReST/Makefile b/sandbox/richard/ZReST/Makefile
deleted file mode 100644
index 1f78c66e8..000000000
--- a/sandbox/richard/ZReST/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-FILES = ZReST.py __init__.py refresh.txt version.txt TODO.txt README.txt
-DTML = dtml/manage_addZReSTForm.dtml dtml/manage_editForm.dtml
-VERSION := $(shell cat version.txt)
-
-all: ${FILES} ${DTML}
- rm -rf dist
- mkdir dist
- mkdir dist/ZReST
- mkdir dist/ZReST/dtml
- cp ${FILES} dist/ZReST
- cp ${DTML} dist/ZReST/dtml
- (cd dist; tar zcf ZReST-${VERSION}.tgz ZReST)
- mv dist/ZReST-${VERSION}.tgz .
- rm -rf dist
-
diff --git a/sandbox/richard/ZReST/README.txt b/sandbox/richard/ZReST/README.txt
deleted file mode 100644
index 89766f9d6..000000000
--- a/sandbox/richard/ZReST/README.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-----------------------------------
-ReStructuredText Document for Zope
-----------------------------------
-
-Requirements
-============
-
-To use this product, you will need:
-
-python2.1+
- see http://www.python.org/
-Zope 2.5+
- see http://www.zope.org/
-A docutils snapshot from later than 21 August 2002
- see http://docutils.sourceforge.net/#development-snapshots
-
-Installation
-============
-
-To install this product, unpack it so the ZReST directory is in the Zope
-lib/python/Products directory. You should then restart Zope.
-
-You will now be able to add objects of type "ReStructuredText Document".
-
-Usage
-=====
-
-See the docutils user documentation section:
-
- http://docutils.sourceforge.net/docs/index.html#user
-
-I recommend starting with the ReST "primer":
-
- http://docutils.sourceforge.net/docs/user/rst/quickstart.html
-
-
-Footnotes
-=========
-
-This product was written by Richard Jones, rjones@ekit-inc.com.
-
-Please direct questions about ReStructureText to the `Docutils mailing
-lists`_.
-
-.. _Docutils mailing lists:
- http://docutils.sourceforge.net/docs/user/mailing-lists.html
-
-This package is placed in the Public Domain.
diff --git a/sandbox/richard/ZReST/TODO.txt b/sandbox/richard/ZReST/TODO.txt
deleted file mode 100644
index 6860c9423..000000000
--- a/sandbox/richard/ZReST/TODO.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-* charset configuration, defaulting to 'latin-1'
-
-* add "level" and "header" args to render / as_html
-
- - level indicates the header level to start at
- - header boolean turns page header tags on/off
diff --git a/sandbox/richard/ZReST/ZReST.py b/sandbox/richard/ZReST/ZReST.py
deleted file mode 100644
index e130cf18e..000000000
--- a/sandbox/richard/ZReST/ZReST.py
+++ /dev/null
@@ -1,288 +0,0 @@
-#
-# $Id$
-#
-''' ReStructuredText Product for Zope
-
-This Product stores two texts - a "source" text in ReStructureText format,
-and a HTML "formatted" version of that text.
-
-'''
-import docutils.core, docutils.io
-
-from Globals import InitializeClass, DTMLFile
-from OFS.SimpleItem import Item
-from OFS.PropertyManager import PropertyManager
-from OFS.History import Historical, html_diff
-from Acquisition import Implicit
-from Persistence import Persistent
-from AccessControl import ClassSecurityInfo
-from AccessControl import ModuleSecurityInfo
-from DateTime.DateTime import DateTime
-modulesecurity = ModuleSecurityInfo()
-
-modulesecurity.declareProtected('View management screens',
- 'manage_addZReSTForm')
-manage_addZReSTForm = DTMLFile('dtml/manage_addZReSTForm', globals())
-
-modulesecurity.declareProtected('Add Z Roundups', 'manage_addZReST')
-def manage_addZReST(self, id, file='', REQUEST=None):
- """Add a ZReST product """
- # validate the instance_home
- self._setObject(id, ZReST(id))
- self._getOb(id).manage_upload(file)
- if REQUEST:
- return self.manage_main(self, REQUEST)
-
-class Warnings:
- def __init__(self):
- self.messages = []
- def write(self, message):
- self.messages.append(message)
-
-class ZReST(Item, PropertyManager, Historical, Implicit, Persistent):
- '''An instance of this class provides an interface between Zope and
- ReStructuredText for one text.
- '''
- meta_type = 'ReStructuredText Document'
- security = ClassSecurityInfo()
-
- def __init__(self, id):
- self.id = id
- self.title = id
- self.stylesheet = 'default.css'
- self.report_level = '2'
- self.source = self.formatted = ''
-
- # define the properties that define this object
- _properties = (
- {'id':'stylesheet', 'type': 'string', 'mode': 'w',
- 'default': 'default.css'},
- {'id':'report_level', 'type': 'string', 'mode': 'w', 'default': '2'},
- )
- property_extensible_schema__ = 0
-
- # define the tabs for the management interface
- manage_options= ( {'label': 'Edit', 'action':'manage_main'},
- {'label': 'View', 'action':'index_html'},
- {'label': 'Source', 'action':'source_txt'},
- ) \
- + PropertyManager.manage_options \
- + Historical.manage_options \
- + Item.manage_options
-
- # access to the source text and formatted text
- security.declareProtected('View', 'index_html')
- def index_html(self, REQUEST=None):
- ''' Getting the formatted text
- '''
- REQUEST.RESPONSE.setHeader('content-type', 'text/html')
- return self.formatted
- security.declareProtected('View', 'source_txt')
- def source_txt(self, REQUEST=None):
- ''' Getting the source text
- '''
- REQUEST.RESPONSE.setHeader('content-type', 'text/plain')
- return self.source
-
- # edit form, which is also the primary interface
- security.declareProtected('Edit ReStructuredText', 'manage_editForm')
- manage_main = DTMLFile('dtml/manage_editForm', globals())
-
- # edit action
- security.declareProtected('Edit ReStructuredText', 'manage_edit')
- def manage_edit(self, data, SUBMIT='Change',dtpref_cols='50',
- dtpref_rows='20', REQUEST=None):
- '''Alias index_html to roundup's index
- '''
- if self._size_changes.has_key(SUBMIT):
- return self._er(data, SUBMIT, dtpref_cols, dtpref_rows, REQUEST)
- if data != self.source:
- self.source = data
- self.render()
-
- if REQUEST:
- message="Saved changes."
- return self.manage_main(self, REQUEST, manage_tabs_message=message)
-
- # handle edit window size changes
- _size_changes = {
- 'Bigger': (5,5),
- 'Smaller': (-5,-5),
- 'Narrower': (0,-5),
- 'Wider': (0,5),
- 'Taller': (5,0),
- 'Shorter': (-5,0),
- }
- def _er(self, data, SUBMIT, dtpref_cols, dtpref_rows, REQUEST):
- dr,dc = self._size_changes[SUBMIT]
- rows=max(1,int(dtpref_rows)+dr)
- cols=max(40,int(dtpref_cols)+dc)
- e=(DateTime('GMT') + 365).rfc822()
- resp=REQUEST['RESPONSE']
- resp.setCookie('dtpref_rows',str(rows),path='/',expires=e)
- resp.setCookie('dtpref_cols',str(cols),path='/',expires=e)
- return self.manage_main(self, REQUEST, __str__=self.quotedHTML(data),
- dtpref_cols=cols, dtpref_rows=rows)
- security.declarePrivate('quotedHTML')
- def quotedHTML(self,
- text=None,
- character_entities=(
- (('&'), '&amp;'),
- (("<"), '&lt;' ),
- ((">"), '&gt;' ),
- (('"'), '&quot;'))): #"
- if text is None: text=self.read_raw()
- for re,name in character_entities:
- if text.find(re) >= 0: text=name.join(text.split(re))
- return text
-
-
- # handle uploads too
- security.declareProtected('Edit ReStructuredText', 'manage_upload')
- def manage_upload(self, file='', REQUEST=None):
- ''' Replaces the current source with the upload.
- '''
- if isinstance(file, type('')):
- self.source = file
- else:
- self.source = file.read()
- self.render()
-
- if REQUEST:
- message="Saved changes."
- return self.manage_main(self, REQUEST, manage_tabs_message=message)
-
- security.declarePrivate('render')
- def render(self):
- ''' Render the source to HTML
- '''
- # format with strings
- pub = docutils.core.Publisher()
- pub.set_reader('standalone', None, 'restructuredtext')
- pub.set_writer('html')
-
- # go with the defaults
- pub.get_settings()
-
- # this is needed, but doesn't seem to do anything
- pub.settings._destination = ''
-
- # use the stylesheet chosen by the user
- pub.settings.stylesheet = self.stylesheet
-
- # set the reporting level to something sane
- pub.settings.report_level = int(self.report_level)
-
- # don't break if we get errors
- pub.settings.halt_level = 6
-
- # remember warnings
- pub.settings.warning_stream = Warnings()
-
- # input
- pub.source = docutils.io.StringInput(
- source=self.source, encoding=pub.settings.input_encoding)
-
- # output - not that it's needed
- pub.destination = docutils.io.StringOutput(
- encoding=pub.settings.output_encoding)
-
- # parse!
- document = pub.reader.read(pub.source, pub.parser, pub.settings)
- self.warnings = ''.join(pub.settings.warning_stream.messages)
-
- if document.children:
- item = document.children[0]
- if item.tagname == 'title':
- self.title = str(item.children[0])
-
- # do the format
- self.formatted = pub.writer.write(document, pub.destination)
-
-
- security.declareProtected('Edit ReStructuredText', 'PUT', 'manage_FTPput')
- def PUT(self, REQUEST, RESPONSE):
- ''' Handle HTTP PUT requests
- '''
- data = REQUEST.get('BODY', '')
- if data != self.source:
- if data.startswith('.. '):
- data = data.splitlines()
- new = []
- for i in range(len(data)):
- line = data[i]
- if not line.startswith('.. '):
- break
- if line.startswith('.. stylesheet='):
- self.stylesheet = line.split('=')[1]
- elif line.startswith('.. report_level='):
- self.report_level = line.split('=')[1]
- else:
- pass # ignore
- data = '\n'.join(new) + '\n'.join(data[i:])
- self.source = data
- self.render()
- RESPONSE.setStatus(204)
- return RESPONSE
-
- manage_FTPput = PUT
-
- def manage_FTPget(self):
- ''' Get source for FTP download
- '''
- self.REQUEST.RESPONSE.setHeader('Content-Type', 'text/plain')
- s = [
- '.. This is a ReStructuredText Document. Initial comment lines '
- '(".. ") will be stripped.',
- '.. stylesheet='+self.stylesheet,
- '.. report_level='+self.report_level
- ]
- if self.warnings:
- s.append('.. ')
- s.append('.. ' + '\n.. '.join(self.warnings.splitlines()))
- s.append('.. ')
- return '\n'.join(s) + '\n' + self.source
-
- def __str__(self):
- ''' Stringfy .. return the source
- '''
- return self.quotedHTML(self.source)
-
- def PrincipiaSearchSource(self):
- ''' Support for searching - the document's contents are searched.
- '''
- return self.source
-
- def manage_historyCompare(self, rev1, rev2, REQUEST,
- historyComparisonResults=''):
- return ZReST.inheritedAttribute('manage_historyCompare')(
- self, rev1, rev2, REQUEST,
- historyComparisonResults=html_diff(rev1.source, rev2.source))
-
-InitializeClass(ZReST)
-modulesecurity.apply(globals())
-
-
-#
-# $Log$
-# Revision 1.6 2002/11/28 03:44:50 goodger
-# updated
-#
-# Revision 1.5 2002/11/05 05:27:56 goodger
-# fixed Reader name
-#
-# Revision 1.4 2002/10/18 05:10:33 goodger
-# Refactored names (options -> settings; etc.); updated.
-#
-# Revision 1.3 2002/08/15 05:02:41 richard
-# pull out the document title too
-#
-# Revision 1.2 2002/08/15 04:36:56 richard
-# FTP interface and Reporter message snaffling
-#
-# Revision 1.1 2002/08/14 05:15:37 richard
-# Zope ReStructuredText Product
-#
-#
-#
-# vim: set filetype=python ts=4 sw=4 et si
diff --git a/sandbox/richard/ZReST/__init__.py b/sandbox/richard/ZReST/__init__.py
deleted file mode 100644
index e3feaf4ae..000000000
--- a/sandbox/richard/ZReST/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# $Id$
-#
-__version__='1.0'
-
-# product initialisation
-import ZReST
-def initialize(context):
- context.registerClass(
- ZReST, meta_type = 'ReStructuredText Document',
- constructors = (
- ZReST.manage_addZReSTForm, ZReST.manage_addZReST
- )
- )
-
-
-#
-# $Log$
-# Revision 1.2 2002/08/15 04:36:56 richard
-# FTP interface and Reporter message snaffling
-#
-# Revision 1.1 2002/08/14 05:15:37 richard
-# Zope ReStructuredText Product
-#
-#
-#
-# vim: set filetype=python ts=4 sw=4 et si
diff --git a/sandbox/richard/ZReST/dtml/manage_addZReSTForm.dtml b/sandbox/richard/ZReST/dtml/manage_addZReSTForm.dtml
deleted file mode 100644
index 971e63160..000000000
--- a/sandbox/richard/ZReST/dtml/manage_addZReSTForm.dtml
+++ /dev/null
@@ -1,45 +0,0 @@
-<dtml-var manage_page_header>
-
-<dtml-var "manage_form_title(this(), _, form_title='Add ReStructureText Document')">
-
-<p class="form-help">
-You may optionally select a file to upload from your local computer by
-clicking the <em>Browse</em> button.
-</p>
-
-<form action="manage_addZReST" method="post" enctype="multipart/form-data">
-<table cellspacing="0" cellpadding="2" border="0">
- <tr>
- <td align="left" valign="top">
- <div class="form-label">
- Id
- </div>
- </td>
- <td align="left" valign="top">
- <input type="text" name="id" size="40" />
- </td>
- </tr>
- <tr>
- <td align="left" valign="top">
- <div class="form-optional">
- File
- </div>
- </td>
- <td align="left" valign="top">
- <input type="file" name="file" size="25" value="" />
- </td>
- </tr>
- <tr>
- <td align="left" valign="top">
- </td>
- <td align="left" valign="top">
- <div class="form-element">
- <input class="form-element" type="submit" name="submit"
- value=" Add " />
- </div>
- </td>
- </tr>
-</table>
-</form>
-
-<dtml-var manage_page_footer>
diff --git a/sandbox/richard/ZReST/dtml/manage_editForm.dtml b/sandbox/richard/ZReST/dtml/manage_editForm.dtml
deleted file mode 100644
index e302893f9..000000000
--- a/sandbox/richard/ZReST/dtml/manage_editForm.dtml
+++ /dev/null
@@ -1,88 +0,0 @@
-<dtml-var manage_page_header>
-<dtml-var manage_tabs>
-
-<p class="form-help">
-You may edit the source for this document using the form below. You
-may also upload the source for this document from a local file. Click
-the <em>browse</em> button to select a local file to upload.
-</p>
-
-<dtml-if warnings>
-<pre class="system-msg">
-&dtml-warnings;
-</pre>
-</dtml-if>
-
-<p class="form-help"><strong>Help:</strong> ReStructuredText
- <a href="http://docutils.sourceforge.net/docs/rst/quickstart.html">primer</a>
- for beginners,
- <a href="http://docutils.sourceforge.net/docs/rst/quickref.html">quick
- reference</a> for the more advanced and
- <a href="http://docutils.sourceforge.net/rst.html">home page</a> for all
- the details.
-</p>
-
-<form action="manage_edit" method="post">
-<table cellpadding="2" cellspacing="0" width="100%" border="0">
-
-<dtml-with keyword_args mapping>
-<tr>
- <td align="left" valign="top" colspan="2">
- <div style="width: 100%;">
- <textarea name="data:text" wrap="off" style="width: 100%;"<dtml-if
- dtpref_cols> cols="<dtml-var dtpref_cols>"<dtml-else
- > cols="50"</dtml-if><dtml-if dtpref_rows> rows="<dtml-var
- dtpref_rows>"<dtml-else> rows="20"</dtml-if>><dtml-var
- __str__></textarea>
- </div>
- </td>
-</tr>
-</dtml-with>
-
-<tr>
- <td align="left" valign="top" colspan="2">
- <div class="form-element">
- <dtml-if wl_isLocked>
- <em>Locked by WebDAV</em>
- <dtml-else>
- <input class="form-element" type="submit" name="SUBMIT" value="Save Changes">
- </dtml-if>
- &nbsp;&nbsp;
- <input class="form-element" type="submit" name="SUBMIT" value="Taller">
- <input class="form-element" type="submit" name="SUBMIT" value="Shorter">
- <input class="form-element" type="submit" name="SUBMIT" value="Wider">
- <input class="form-element" type="submit" name="SUBMIT" value="Narrower">
- </div>
- </td>
-</tr>
-</table>
-</form>
-
-<form action="manage_upload" method="post" enctype="multipart/form-data">
-<table cellpadding="2" cellspacing="0" border="0">
-<tr>
- <td align="left" valign="top">
- <div class="form-label">
- File &nbsp;
- </div>
- </td>
- <td align="left" valign="top">
- <input type="file" name="file" size="25" value="">
- </td>
-</tr>
-<tr>
- <td></td>
- <td align="left" valign="top">
- <div class="form-element">
- <dtml-if wl_isLocked>
- <em>Locked by WebDAV</em>
- <dtml-else>
- <input class="form-element" type="submit" value="Upload File">
- </dtml-if>
- </div>
- </td>
-</tr>
-</table>
-</form>
-
-<dtml-var manage_page_footer>
diff --git a/sandbox/richard/ZReST/refresh.txt b/sandbox/richard/ZReST/refresh.txt
deleted file mode 100644
index 01ee0fa7b..000000000
--- a/sandbox/richard/ZReST/refresh.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a flag that tells Zope that the product may be auto-refreshed.
diff --git a/sandbox/richard/ZReST/version.txt b/sandbox/richard/ZReST/version.txt
deleted file mode 100644
index d3827e75a..000000000
--- a/sandbox/richard/ZReST/version.txt
+++ /dev/null
@@ -1 +0,0 @@
-1.0
diff --git a/sandbox/richard/pythonpoint/example_slides.txt b/sandbox/richard/pythonpoint/example_slides.txt
deleted file mode 100644
index 8633bafcc..000000000
--- a/sandbox/richard/pythonpoint/example_slides.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-Presentation Cover
-------------------
-
-*Richard Jones, Another Author*
-
-http://docutils.sf.net/ is cool.
-
-*Some very important conference, March 2002*
-
-Second slide
-------------
-
-- blah, blah blah blah blah. blah, blah blah blah blah.
-- blah, blah blah blah blah.
-
-Another slide
--------------
-
-bare para blah, blah blah blah blah. blah, blah blah blah blah.
-
-definition term
- blah, blah blah blah blah. blah, blah blah blah blah.
-another one
- note, don't have more than one para in here!
-
-bare para blah, blah blah blah blah. blah, blah blah blah blah.
-
-Another slide
--------------
-
-hi, another para
-
-- ooh, bullet points
-- yeah!
-- woo! **bold** and *italics* are OK!
-
-don't nest _anything_ ... PLATYPUS can't deal with it. That means no
-indented bullets, no multiple paras in bullets or definitions...
diff --git a/sandbox/richard/pythonpoint/pythonpoint.py b/sandbox/richard/pythonpoint/pythonpoint.py
deleted file mode 100644
index 8854ae114..000000000
--- a/sandbox/richard/pythonpoint/pythonpoint.py
+++ /dev/null
@@ -1,328 +0,0 @@
-import cStringIO, cgi, sys, urllib
-import docutils.core, docutils.io
-from docutils import writers, nodes, languages
-
-class Writer(writers.Writer):
-
- settings_spec = ()
- settings_default_overrides = {}
- output = None
-
- def translate(self):
- visitor = DumbPythonPointFormatter(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- #self.head_prefix = visitor.head_prefix
- #self.head = visitor.head
- #self.body_prefix = visitor.body_prefix
- #self.body = visitor.body
- #self.body_suffix = visitor.body_suffix
-
-class DumbPythonPointFormatter(nodes.NodeVisitor):
-
- def __init__(self, document):
- nodes.NodeVisitor.__init__(self, document)
- self.section = 0
- self.closers = []
- self.slidenum = 0
- self.body = []
- self.w = self.body.append
- self.suppress_para = 0
-
- def astext(self):
- return ''.join(self.body)
-
- def visit_reference(self, node):
- pass
- def depart_reference(self, node):
- pass
-
- def visit_document(self, node):
- self.w('<presentation>\n'
- '<stylesheet module="modern" function="getParagraphStyles"/>\n'
- '<section name="Main">\n')
- def depart_document(self, node):
- self.w('</section>\n'
- '</presentation>\n')
-
- def visit_section(self, node):
- if node['names']:
- name = node.attributes['names'][0]
- else:
- name = node.attributes['dupnames'][0]
- self.slidenum += 1
- self.w('<slide id="Slide%03d" title="%s">\n'
- '<frame x="90" y="72" width="600" height="432" leftmargin="12"'
- 'rightmargin="0">\n'%(self.slidenum, name))
- def depart_section(self, node):
- self.w('</frame>\n</slide>\n')
-
- def visit_title(self, node):
- self.w('<para style="Heading2">')
- self.suppress_para = 1
- def depart_title(self, node):
- self.suppress_para = 0
- self.w('</para>\n')
-
- def visit_paragraph(self, node):
- if not self.suppress_para: self.w('<para style="BodyText">')
- def depart_paragraph(self, node):
- if not self.suppress_para: self.w('</para>\n')
-
- # Simple lists
- def visit_bullet_list(self, node):
- pass
- def depart_bullet_list(self, node):
- pass
- def visit_enumerated_list(self, node):
- pass
- def depart_enumerated_list(self, node):
- pass
-
- def visit_list_item(self, node):
- self.w('<para style="Bullet">')
- self.suppress_para = 1
- def depart_list_item(self, node):
- self.suppress_para = 0
- self.w('</para>\n')
-
- # Definition List
- def visit_definition_list(self, node):
- pass
- def depart_definition_list(self, node):
- pass
- def visit_definition_list_item(self, node):
- pass
- def depart_definition_list_item(self, node):
- pass
-
- def visit_term(self, node):
- self.w('<para><b>')
- def depart_term(self, node):
- self.w('</b>')
-
- def visit_classifier(self, node):
- self.w('<i>')
- def depart_classifier(self, node):
- self.w('</i>')
-
- def visit_definition(self, node):
- self.w('</para>\n<para style="Definition">')
- self.suppress_para = 1
- def depart_definition(self, node):
- self.suppress_para = 0
- self.w('</para>\n')
-
- def visit_field(self, node):
- self.w('<para>')
- def depart_field(self, node):
- self.w('</para>\n')
-
- def visit_field_body(self, node):
- self.suppress_para = 1
- return
- def depart_field_body(self, node):
- self.suppress_para = 0
-
- def visit_field_list(self, node):
- return
- def depart_field_list(self, node):
- return
-
- def visit_field_name(self, node):
- self.w('<b>')
-
- def depart_field_name(self, node):
- self.w(':')
- self.w('</b>')
-
- # Literal Block
- def visit_literal_block(self, node):
- self.w('<prefmt style="Code">')
- self.suppress_para = 1
- def depart_literal_block(self, node):
- self.suppress_para = 0
- self.w('</prefmt>\n')
-
- # Block Quote
- def visit_block_quote(self, node):
- self.w('<para style="Indent">')
- def depart_block_quote(self, node):
- self.w('</para>\n')
-
- def visit_image(self, node):
- ''' EMPTY
- uri CDATA #REQUIRED
- alt CDATA #IMPLIED
- height NMTOKEN #IMPLIED
- width NMTOKEN #IMPLIED
- scale NMTOKEN #IMPLIED
- '''
- attrs = node.attributes
- l = ['src="%(uri)s"'%attrs]
- # TODO: scale
- self.w('<image filename="%s"/>'%node.attributes['uri'])
- def depart_image(self, node):
- pass
-
- #
- # Tables:
- # NOT IN DOM YET
- #
- def visit_table(self, node):
- '''
- +------------------------+------------+----------+----------+
- | Header row, column 1 | Header 2 | Header 3 | Header 4 |
- | (header rows optional) | | | |
- +========================+============+==========+==========+
- | body row 1, column 1 | column 2 | column 3 | column 4 |
- +------------------------+------------+----------+----------+
- | body row 2 | Cells may span columns. |
- +------------------------+------------+---------------------+
- | body row 3 | Cells may | - Table cells |
- +------------------------+ span rows. | - contain |
- | body row 4 | | - body elements. |
- +------------------------+------------+---------------------+
- '''
- self.w('<table border=1>\n')
- def depart_table(self, node):
- self.w('</table>\n')
-
- def visit_tgroup(self, node):
- pass
- def depart_tgroup(self, node):
- pass
-
- def visit_colspec(self, node):
- pass
- def depart_colspec(self, node):
- pass
-
- def visit_row(self, node):
- self.body.append(self.starttag(node, 'tr', ''))
-
- def depart_row(self, node):
- self.body.append('</tr>\n')
-
- def visit_thead(self, node):
- self.thead = 1
- def depart_thead(self, node):
- self.thead = 0
- def visit_tbody(self, node):
- self.thead = 1
- def depart_tbody(self, node):
- self.thead = 0
-
- def visit_entry(self, node):
- if self.thead:
- s = 'th '
- else:
- s = 'td '
- attrs = node.attributes
- if attrs.has_key('morecols'):
- s = s + 'colspan=%d '%(attrs['morecols']+1)
- if attrs.has_key('morerows'):
- s = s + 'rowspan=%d '%(attrs['morerows']+1)
- self.w('<%svalign="top" align="left">'%s)
-
- def depart_entry(self, node):
- if self.thead:
- self.w('</th>\n')
- else:
- self.w('</td>\n')
-
- def visit_emphasis(self, node):
- self.w('<i>')
- def depart_emphasis(self, node):
- self.w('</i>')
-
- def visit_strong(self, node):
- self.w('<b>')
- def depart_strong(self, node):
- self.w('</b>')
-
- def visit_interpreted(self, node):
- pass #raise NotImplementedError, node
- def depart_interpreted(self, node):
- pass #raise NotImplementedError, node
-
- def visit_literal(self, node):
- self.w('<div style="Code">')
- def depart_literal(self, node):
- self.w('</div>')
-
- def visit_reference(self, node):
- attrs = node.attributes
- doc = self.document
- ok = 1
- if attrs.has_key('refuri'):
- self.w('<a href="%s">'%attrs['refuri'])
- elif doc.explicit_targets.has_key(attrs['refname']):
- # an external reference has been defined
- ref = doc.explicit_targets[attrs['refname']]
- if ref.attributes.has_key('refuri'):
- self.w('<a href="%s">'%ref.attributes['refuri'])
- else:
- self.w('<a href="#%s">'%attrs['refname'])
- elif doc.implicit_targets.has_key(attrs['refname']):
- # internal reference
- name = attrs['refname']
- self.w('<a href="#%s">'%urllib.quote(name))
- else:
- self.w('<span class="formatter_error">target "%s" '
- 'undefined</span>'%attrs['refname'])
-
- def depart_reference(self, node):
- self.w('</a>')
-
- def visit_footnote_reference(self, node):
- raise NotImplementedError, node
-
- def visit_substitution_reference(self, node):
- pass
- def depart_substitution_reference(self, node):
- pass
-
- def visit_problematic(self, node):
- raise NotImplementedError, node
- def depart_problematic(self, node):
- raise NotImplementedError, node
-
- def visit_system_message(self, node):
- print >>sys.stderr, '%s: %s'%(node.attributes['type'], node[0][0].data)
- def depart_system_message(self, node):
- pass
-
- def visit_comment(self, node):
- pass
- def depart_comment(self, node):
- pass
-
- def visit_Text(self, node):
- self.w(cgi.escape(node.data))
- def depart_Text(self, node):
- pass
-
-def main(filename, debug=0):
- pub = docutils.core.Publisher()
- pub.set_reader('standalone', None, 'restructuredtext')
- pub.writer = Writer()
- pub.get_settings()
- pub.settings._destination = ''
- pub.source = docutils.io.StringInput(source=open(filename).read(),
- encoding='latin-1')
- pub.destination = docutils.io.StringOutput(encoding='latin-1')
- document = pub.reader.read(pub.source, pub.parser, pub.settings)
- pub.apply_transforms(document)
-
- if debug == 1:
- print document.pformat()
- else:
- print pub.writer.write(document, pub.destination)
-
-if __name__ == '__main__':
- if len(sys.argv) > 2:
- main(sys.argv[1], debug=1)
- else:
- main(sys.argv[1])
-
diff --git a/sandbox/richard/pythonpoint/readme.txt b/sandbox/richard/pythonpoint/readme.txt
deleted file mode 100644
index 6a8c91255..000000000
--- a/sandbox/richard/pythonpoint/readme.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This generates an XML slideshow usable by PythonPoint_.
-
-.. _PythonPoint: http://www.reportlab.org/python_point.html
-
-See the example slides.stx for information - and restrictions.
diff --git a/sandbox/richard/pythonpoint/rst2pythonpoint.py b/sandbox/richard/pythonpoint/rst2pythonpoint.py
deleted file mode 100755
index becb88155..000000000
--- a/sandbox/richard/pythonpoint/rst2pythonpoint.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Felix Wiemann
-# Contact: Felix_Wiemann@ososo.de
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing PythonPoint XML.
-"""
-
-try:
- import locale
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates PythonPoint documents from standalone reStructuredText '
- 'sources. ' + default_description)
-
-publish_cmdline(writer_name='pythonpoint', description=description)
diff --git a/sandbox/simonb/inline_target.txt b/sandbox/simonb/inline_target.txt
deleted file mode 100644
index f54aaa2aa..000000000
--- a/sandbox/simonb/inline_target.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-.. Note:: This functionality has been implemented as `embedded URIs
- <http://docutils.sf.net/spec/rst/reStructuredText.html#embedded-uris>`_.
-
-
-Sample usage of inline targets
-------------------------------
-
-Here is some sample text, that tests an syntax for inline targets.
-There has been a lot of discussion starting here__
-__<http://mail.python.org/pipermail/doc-sig/2002-June/002648.html>
-
-This just has been an anonymous reference, that immediately got resolved.
-Please note, that this can be mixed freely__ with "real" anonymous__
-links__ __<http://www.gimp.org> and the inlined target will always__
-be assigned to the anonymous link immediately in front of it.
-
-regular anonymous links should not be disturbed. They should get resolved
-without noticing that there has been an immediately resolved one inbetween.
-
- __ anonlink1.html
- __ anonlink2.html
- __ anonlink3.html
-
-As a not yet discussed feature I have the equivalent construct for named
-links. this example_ _<http://example.com> shows how this works. You can refer
-a second time to example_ as usual.
-
-I wonder what happenes here__
- __ <here.html>
-
-Of course you can `add links to multiple words`__ __<multiple.html>.
-So `the implementation`_ is kind of consistent with the usual link
-syntax. I am not sure if the added space and the doubling of the
-underscores is worth it just to avoid long words.
-It introduces a lot of line noise. Changing this in `the
-implementation`_ _<file:/home/simon/ST/docutils/parsers/rst/states.py>
-should be fairly trivial: I'd guess that adjsuting te regex in two places
-would do the trick.
-
-Some real use: Bookmark lists:
-
-- `Cool Modifications`__ __<http://metku.net/>
-- `Cool Image Manipulation`__ __<http://www.gimp.org>
-- `Cool Homepage`__ __<http://www.home.unix-ag.org/simon/>
-- `Cool Comics`__ __<http://www.nichtlustig.de/>
-- `something with a Cool long URL`__ __<http://something.
- with.a-cool.long.url/plus additional_newlines.and/
- spaces#and_a/fragment_identifier>
diff --git a/sandbox/stylesheets/index.txt b/sandbox/stylesheets/index.txt
deleted file mode 100644
index 4b290d449..000000000
--- a/sandbox/stylesheets/index.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-=======================
- Docutils_ Stylesheets
-=======================
-
-:Author: Felix Wiemann
-:Contact: Felix.Wiemann@ososo.de
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This document has been placed in the public domain.
-
-
-This is a list of stylesheets, which can be used to customize the look
-of the documents created by Docutils, contributed by various users and
-developers.
-
-If you have a stylesheet to contribute, please send it to the
-Docutils-users_ mailing list. (If you have write-access to the
-repository, you can also upload it to the ``sandbox/stylesheets/`` and
-add it in the list below.)
-
-.. TODO: Add previews of the stylesheets. Either using PHP or with
- screenshots.
-
-
-HTML (CSS) Stylesheets
-======================
-
-Please see "`Writing HTML (CSS) Stylesheets for Docutils`__" on how to
-write your own CSS stylesheet for use with Docutils' HTML writer.
-
-__ http://docutils.sf.net/docs/howto/html-stylesheets.html
-
-* `<voidspace.css>`_: Blue boxes around section headings, more
- borders, and somewhat more colorful than the default stylesheet.
-
-.. _Docutils: http://docutils.sourceforge.net/
-.. _Docutils-users:
- http://docutils.sf.net/docs/user/mailing-lists.html#docutils-users
-
-
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/sandbox/stylesheets/voidspace.css b/sandbox/stylesheets/voidspace.css
deleted file mode 100644
index 050d9f0dd..000000000
--- a/sandbox/stylesheets/voidspace.css
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-:Authors: Ian Bicking, Michael Foord
-:Contact: fuzzyman@voidspace.org.uk
-:Date: 2005/08/26
-:Version: 0.1.0
-:Copyright: This stylesheet has been placed in the public domain.
-
-Stylesheet for Docutils.
-Based on ``blue_box.css`` by Ian Bicking
-and ``html4css1.css`` revision 1.46.
-*/
-
-@import url(html4css1.css);
-
-body {
- font-family: Arial, sans-serif;
-}
-
-em, i {
- /* Typically serif fonts have much nicer italics */
- font-family: Times New Roman, Times, serif;
-}
-
-a.target {
- color: blue;
-}
-
-a.target {
- color: blue;
-}
-
-a.toc-backref {
- text-decoration: none;
- color: black;
-}
-
-a.toc-backref:hover {
- background-color: inherit;
-}
-
-a:hover {
- background-color: #cccccc;
-}
-
-div.attention, div.caution, div.danger, div.error, div.hint,
-div.important, div.note, div.tip, div.warning {
- background-color: #cccccc;
- padding: 3px;
- width: 80%;
-}
-
-div.admonition p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
- text-align: center;
- background-color: #999999;
- display: block;
- margin: 0;
-}
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: #cc0000;
- font-family: sans-serif;
- text-align: center;
- background-color: #999999;
- display: block;
- margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- font-family: Helvetica, Arial, sans-serif;
- border: thin solid black;
- /* This makes the borders rounded on Mozilla, which pleases me */
- -moz-border-radius: 8px;
- padding: 4px;
-}
-
-h1 {
- background-color: #444499;
- color: #ffffff;
- border: medium solid black;
-}
-
-h1 a.toc-backref, h2 a.toc-backref {
- color: #ffffff;
-}
-
-h2 {
- background-color: #666666;
- color: #ffffff;
- border: medium solid black;
-}
-
-h3, h4, h5, h6 {
- background-color: #cccccc;
- color: #000000;
-}
-
-h3 a.toc-backref, h4 a.toc-backref, h5 a.toc-backref,
-h6 a.toc-backref {
- color: #000000;
-}
-
-h1.title {
- text-align: center;
- background-color: #444499;
- color: #eeeeee;
- border: thick solid black;
- -moz-border-radius: 20px;
-}
-
-table.footnote {
- padding-left: 0.5ex;
-}
-
-table.citation {
- padding-left: 0.5ex
-}
-
-pre.literal-block, pre.doctest-block {
- border: thin black solid;
- padding: 5px;
-}
-
-.image img { border-style : solid;
- border-width : 2px;
-}
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
- font-size: 100%;
-}
-
-code, tt {
- color: #000066;
-}
diff --git a/sandbox/tibs/pysource/__init__.py b/sandbox/tibs/pysource/__init__.py
deleted file mode 100755
index 66239ca01..000000000
--- a/sandbox/tibs/pysource/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-"""Extract information from Python files, for DOCUTILS/reST purposes
-
-:Author: Tibs <tibs@tibsnjoan.co.uk>
-:Version: 0.1
-"""
diff --git a/sandbox/tibs/pysource/buildhtml.py b/sandbox/tibs/pysource/buildhtml.py
deleted file mode 100755
index f620a7a02..000000000
--- a/sandbox/tibs/pysource/buildhtml.py
+++ /dev/null
@@ -1,354 +0,0 @@
-"""Convenience mechanisms for writing HTML
-
-Similar in concept to buildtree.py (qv), but very different in the details.
-"""
-
-import sys
-import string
-
-__docformat__ = "reST"
-
-EMPTY = ["br","hr"]
-"""Elements that do not (may not) have content.
-"""
-
-INLINE = ["em","strong","samp","code","tt","text"]
-"""Elements that may occur 'inline' - within a paragraph, etc.
-
-Note that we include the 'pseudo-element' "text".
-"""
-
-NEWLINE_AFTER = ["html","head","body","table","address"]
-
-LISTS = ["ol","ul","dl"]
-
-
-# ----------------------------------------------------------------------
-class BuildHTML:
-
- def __init__(self,stream=None):
- """Instantiate a BuildHTML instance.
-
- `stream` should be either something that "looks like" a file
- instance (specifically, it has to have a "write" method), or
- else `None` if we want to default to sys.stdout
- """
-
- self.stream = stream or sys.stdout
- self.stack = []
- """A stack of tag names (e.g., ["html","body","h1","p"])
- """
- self.last = None
- """The last element we were told to add to our output.
- """
- self.fancy = 0
-
- def write_doctype(self):
- """Write out the DOCTYPE element at the start of the HTML file.
-
- For the moment, we don't provide any flexibility in this...
- """
- self.stream.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01'
- ' Transitional//EN"'
- ' "http://www.w3.org/TR/html4/loose.dtd">\n')
-
- def finish(self):
- """Call this to indicate we have finished.
-
- It will grumble if anything is left unclosed - i.e., if there
- is still stuff on the internal stack.
- """
- if len(self.stack) > 0:
- raise ValueError,"Items still outstanding on stack: %s"%\
- self._stack_as_string()
-
- def _maybe_write_newline(self,tag,before=1):
- """Decide whether to write a newline before or after an element.
- """
- if before:
- if tag not in INLINE:
- self.stream.write("\n")
- else:
- if tag in NEWLINE_AFTER:
- self.stream.write("\n")
-
- def add(self,tag,*args,**keywords):
- """Write an HTML element at the current level.
-
- For instance::
-
- build.add("em","Some simple text.")
-
- If `tag` is "text" then it will automagically be converted
- to ordinary inline text (even though there is no such HTML
- element).
-
- Otherwise, this produces (for instance)::
-
- <em>Some simple text.</em>
-
- See `write` (which this uses) for more details of the arguments.
- """
- self._maybe_write_newline(tag)
- self.stream.write(self.element(tag,*args,**keywords))
- self.last = "/"+tag
-
- def start(self,tag,*args,**keywords):
- """Write out the start of an HTML element, and start a new level.
-
- `tag` should be the name of an HTML element (a tag), or "comment".
-
- For instance::
-
- build.start("li","some text")
-
- might cause::
-
- <li>some text
-
- to be written out. Note that the element's closing tag is *not*
- written out - see `end()` for that.
-
- If `args` are given, they are assumed to be (things that resolve
- to) more text elements (i.e., strings). For instance::
-
- build.start("li","some text",
- build.element("strong","and emphasis"),
- "and plain text again")
-
- See `write` (which this uses) for more details of the use of the
- `tag` and `keywords` arguments.
- """
- if tag in EMPTY:
- raise ValueError,"Cannot start an 'empty' element (%s)"%tag
- elif tag == "text":
- raise ValueError,"Cannot start 'text'"
- elif tag == "html" and len(self.stack) > 0:
- raise ValueError,\
- "Cannot insert 'html' except at root of stack"
-
- self._maybe_write_newline(tag,before=1)
- self.stream.write(self.start_tag(tag,**keywords))
- content = self._content(tag,args)
- if content:
- self.stream.write(content)
- self._stack_add(tag)
- self.last = tag
-
- def end(self,tag,*args):
- """Write out the end of an HTML element, and finish the current level.
-
- `tag` should be the name of an HTML element (a tag), or "comment".
-
- For instance::
-
- build.end("ul")
-
- Otherwise, for the moment at least, the `tag` being ended
- must be the last tag that was begun (in the future, we *might*
- support automatic "unrolling" of the stack, but not at the
- moment).
-
- NB: if `args` are given, they will also be treated as closing
- tags, in order - thus, for example::
-
- build.end("td","tr","table")
-
- is exactly equivalent to::
-
- build.end("td")
- build.end("tr")
- build.end("table")
-
- (Hmm - I'm not sure if that last is a good idea. Still, I *do*
- use it for that specific instance, which is a relatively common
- thing to want to do, and it does save "wasting" two fairly
- uninteresting lines of code.)
- """
- if tag in EMPTY:
- raise ValueError,"Cannot start an 'empty' element (%s)"%tag
-
- if tag == "text":
- raise ValueError,"Cannot end 'text'"
-
- self._stack_remove(tag)
- self.stream.write(self.end_tag(tag))
- self._maybe_write_newline(tag,before=0)
-
- if args:
- for item in args:
- self.end(item)
- self.last = "/"+args[-1]
- else:
- self.last = "/"+tag
-
- def start_tag(self,tag,**keywords):
- """Construct and return a start tag.
-
- `tag` should be the name of an HTML element (a tag)
-
- `tag` may not be "text".
-
- `keywords` should be attributes for the tag.
- """
- if tag == "comment":
- return "<!-- "
-
- str = "<%s"%tag
- if keywords:
- keys = keywords.keys()
- keys.sort()
- for key in keys:
- value = self.escape(keywords[key])
- str += " %s='%s'"%(key,value)
- return str + ">"
-
- def end_tag(self,tag):
- """Construct and return an end tag.
-
- `tag` should be the name of an HTML element (a tag)
-
- `tag` may not be "text".
- """
- if tag == "comment":
- return " -->"
- else:
- return "</%s>"%tag
-
- def element(self,tag,*args,**keywords):
- """Construct and return a complete HTML element.
-
- `tag` should be the name of an HTML element (a tag), or "text".
-
- If `tag` is "text" then `keywords` is ignored, and the result
- of concatenating `args` is returned.
-
- Otherwise:
-
- - an opening tag is composed from `tag` and `keywords`
- (see `start_tag()`)
- - the result of concatentating `args` is appended to that
- - a closing tag (see `end_tag()`) is appended to that
-
- and the result is returned.
-
- Within `args`, non-strings are coerced to their representations.
- """
- content = self._content(tag,args)
- if tag == "text":
- return content
- else:
- return self.start_tag(tag,**keywords) + content + \
- self.end_tag(tag)
-
-
- def _content(self,tag,args):
- """Return the *content* of an element.
-
- `tag` is not currently used, but *might* be useful later on?
- """
- content = ""
- if args:
- for item in args:
- if type(item) == type(""):
- content += item
- else:
- content += `item`
- return content
-
- def escape(self,text):
- """Return `text` as valid HTML
-
- (that is, with any "special" characters escaped)
- """
- # Hmm - paranoia, just in case
- if type(text) != type(""): return text
-
- text = string.replace(text, "&", "&amp;")
- text = string.replace(text, "<", "&lt;")
- text = string.replace(text, '"', "&quot;")
- text = string.replace(text, ">", "&gt;")
-
- if self.fancy:
- text = string.replace(text, " ", "&deg;")
- text = string.replace(text, "\n", "&para;\n")
- return text
-
- def last_tag(self):
- """Return the last element we were asked to add to our output.
-
- Note that if we just closed element "XX" (for instance), then
- we will return "/XX".
- """
- return self.last
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Stack queries
-
- def _in_list(self):
- """Are we *immediately* within a list
-
- (i.e., the first child element of a list)
- """
- return self.stack[-1] in LISTS
-
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Stack maintenance
-
- def _stack_ends(self,name):
- """Return true if the stack ends with the named entity.
- """
- return self.stack[-1] == name
-
- def _stack_add(self,name):
- """Add a new level to the stack.
- """
- self.stack.append(name)
-
- def _stack_remove(self,name):
- """Remove the last level from the stack
-
- (but only if it is of the right sort).
- """
- if len(self.stack) == 0:
- raise ValueError,"Cannot end %s - nothing outstanding to end"%\
- (name)
- if name != self.stack[-1]:
- raise ValueError,"Cannot end %s - last thing begun was %s"%\
- (name,self.stack[-1])
- del self.stack[-1]
-
- def _stack_as_string(self):
- names = []
- for name in self.stack:
- names.append(name)
- return string.join(names,",")
-
-
-# ----------------------------------------------------------------------
-if __name__ == "__main__":
- build = BuildHTML()
-
- print "Building a page"
- build.start("html")
- build.start("body")
- build.add("h1","Fred")
- build.start("p")
- build.add("text","This is some text.")
- build.add("strong","Really.")
- build.start("p","Another paragraph")
- build.end("body")
- build.end("html")
- build.finish()
-
- print
- print "Building a broken page"
- try:
- build.start("html")
- build.start("body")
- build.add("h1","Fred")
- build.start("p")
- build.finish()
- except ValueError,detail:
- print "ValueError:",detail
diff --git a/sandbox/tibs/pysource/buildtree.py b/sandbox/tibs/pysource/buildtree.py
deleted file mode 100755
index 977226f8d..000000000
--- a/sandbox/tibs/pysource/buildtree.py
+++ /dev/null
@@ -1,403 +0,0 @@
-"""This module explores a different approach to building doctree elements...
-
-The "normal" way of building a DOCUTILS tree involves, well, building a tree
-structure. So one might do::
-
- section = docutils.nodes.section()
- section += docutils.nodes.title(text="Title")
- para = docutils.nodes.paragraph()
- section += para
- para += docutils.nodes.Text("Some ")
- para += docutils.nodes.strong(text="strong text.")
-
-That's all very nice, if one is *thinking* in terms of a tree structure,
-but it is not, for me, a very natural way to construct a text.
-
- (OK - I *know* in practice one would also have imported `paragraph`,
- etc., from `docutils.nodes`, but that is not my point.)
-
-This module allows one to use a more LaTex style of construction, with
-begin and end delimitors for DOCUTILS nodes. Thus the above example becomes::
-
- build.start("section")
- build.add("title","Title")
- build.start("paragraph","Some ")
- build.add("strong","Strong text.")
- build.end("section")
-
-(As a convenience, paragraphs are automatically ended.)
-
-A slightly shorter, and possibly more obfuscated, way of writing this
-would be::
-
- build.start("section",build.make("title","Title")
- build.start("paragraph","Some ",build.make("strong","Strong text."))
- build.end("section")
-
-Sometimes I think that sort of approach makes more sense, sometimes not.
-""" # we need a " to keep [X]Emacs Python mode happy.
-
-import string
-import docutils.nodes
-import docutils.utils
-
-__docformat__ = "reST"
-
-
-# ----------------------------------------------------------------------
-class group(docutils.nodes.Element):
- """Group is a way of grouping together elements.
-
- Compare it to HTML <div> and <span>, or to TeX (?check?)
- \begingroup and \endgroup.
-
- It takes the special attribute `style`, which indicates what
- sort of thing it is grouping - for instance, "docstring" or
- "attributes".
-
- Although it (should be) supplied by the standard DOCUTILS tree,
- reST itself does not use `group`. It is solely used by
- extensions, such as ``pysource``.
-
- In the default HTML Writer, `group` renders invisibly
- (that is, it has no effect at all on the formatted output).
- """
-
- pass
-
-
-# ----------------------------------------------------------------------
-class BuildTree:
-
- def __init__(self, with_groups=1, root=None):
- self.stack = []
- """A stack of tuples of the form ("classname",classinstance).
- """
-
- self.root = root
- """A memory of the first item on the stack (notionally, the
- "document") - we need this because if we `start` a document,
- fill it up, and then `end` it, that final `end` will remove
- the appropriate instance from the stack, leaving no record.
- Thus this is that record.
- """
- if root is not None:
- self._stack_add(root)
-
- self.with_groups = with_groups
-
- def finish(self):
- """Call this to indicate we have finished.
-
- It will grumble if anything is left unclosed, but will
- return the "root" instance of the DOCUTILS tree we've been
- building if all is well...
- """
- if len(self.stack) > 0:
- raise ValueError,"Items still outstanding on stack: %s"%\
- self._stack_as_string()
- else:
- return self.root
-
- def add(self,thing,*args,**keywords):
- """Add a `thing` DOCUTILS node at the current level.
-
- For instance::
-
- build.add("paragraph","Some simple text.")
-
- If `thing` is "text" then it will automagically be converted
- to "Text" (this makes life easier for the user, as all of the
- other DOCUTILS node classes they are likely to use start with a
- lowercase letter, and "Text" is the sole exception).
-
- See `make` (which this uses) for more details of the arguments.
- """
- if thing == "group" and not self.with_groups:
- return
-
- instance = self.make(thing,*args,**keywords)
- self._stack_append(instance)
-
- def addsubtree(self,subtree):
- """Add a DOCUTILS subtree to the current item.
- """
- self._stack_append(subtree)
-
- def current(self):
- """Return the "current" item.
-
- That is, return the item to which `add()` will add DOCUTILS nodes.
- """
- return self._stack_current()
-
- def start(self,thing,*args,**keywords):
- """Add a `thing` DOCUTILS node, starting a new level.
-
- `thing` should be either the name of a docutils.nodes class, or
- else a class itself.
-
- If `thing` is "text" then it will automagically be converted
- to "Text" (this makes life easier for the user, as all of the
- other DOCUTILS node classes they are likely to use start with a
- lowercase letter, and "Text" is the sole exception).
-
- For instance::
-
- build.start("bullet_list")
-
- As a convenience, if `thing` is a paragraph, and if the current
- item is another paragraph, this method will end the old paragraph
- before starting the new.
-
- Note that if `thing` is "document", some extra magic is worked
- internally. If the keywords `warninglevel` and `errorlevel` are
- given, they will be passed to a docutils.utils.Reporter instance,
- as well as being passed down to the `document` class's initialiser.
-
- See `make` (which this uses) for more details of the arguments.
- """
- name = self._nameof(thing)
-
- if name == "group" and not self.with_groups:
- return
-
- if name == "paragraph" and self._stack_ends("paragraph"):
- self.end("paragraph")
-
- if name == "document":
- if self.root:
- return
- if len(self.stack) > 0:
- raise ValueError,\
- "Cannot insert 'document' except at root of stack"
- warninglevel = keywords.get("warninglevel",2)
- errorlevel = keywords.get("errorlevel",4)
- reporter = docutils.utils.Reporter('fubar', warninglevel,
- errorlevel)
- instance = docutils.nodes.document(reporter,"en")
- else:
- instance = self.make(thing,*args,**keywords)
-
- if len(self.stack) == 0:
- self.root = instance
- else:
- self._stack_append(instance)
-
- self._stack_add(instance)
-
- def end(self,thing):
- """End the level started below a `thing` DOCUTILS node.
-
- `thing` should be either the name of a docutils.nodes class, or
- else a class itself.
-
- For instance::
-
- build.end("bullet_list")
-
- As a convenience, if the last item constructed was actually
- a paragraph, and `thing` is the container for said paragraph,
- then the paragraph will be automatically ended.
-
- Otherwise, for the moment at least, the `thing` being ended
- must be the last thing that was begun (in the future, we *might*
- support automatic "unrolling" of the stack, but not at the
- moment).
- """
- name = self._nameof(thing)
-
- if thing == "group" and not self.with_groups:
- return
-
- if self._stack_ends("paragraph") and name != "paragraph":
- self.end("paragraph")
-
- self._stack_remove(name)
-
- def make(self,thing,*args,**keywords):
- """Return an instance of `docutils.nodes.thing`
-
- Attempts to regularise the initialisation of putting initial
- text into an Element and a TextElement...
-
- `thing` should be either the name of a docutils.nodes class, or
- else a class itself (so, for instance, one might call
- ``build.make("paragraph")`` or
- ``build.make(docutils.nodes.paragraph)``),
- or else None.
-
- If `thing` is "text" then it will automagically be converted
- to "Text" (this makes life easier for the user, as all of the
- other DOCUTILS node classes they are likely to use start with a
- lowercase letter, and "Text" is the sole exception).
-
- If `thing` is an Element subclass, then the arguments are just
- passed straight through - any *args list is taken to be children
- for the element (strings are coerced to Text instances), and any
- **keywords are taken as attributes.
-
- If `thing` is an TextElement subclass, then if the first
- item in *args is a string, it is passed down as the `text`
- parameter. Any remaining items from *args are used as child
- nodes, and any **keywords as attributes.
-
- If `thing` is a Text subclass, then a single argument is expected
- within *args, which must be a string, to be used as the Text's
- content.
-
- For instance::
-
- n1 = build.make("paragraph","Some ",
- build.make("emphasis","text"),
- ".",align="center")
- n2 = build.make(None,"Just plain text")
- """
-
- #print "make: %s, %s, %s"%(thing,args,keywords)
-
- # Temporary special case - since group is not (yet) in docutils.nodes...
- if thing == "group":
- thing = group
-
- if thing == None:
- dps_class = docutils.nodes.Text
- elif type(thing) == type(""):
- if thing == "text":
- thing = "Text"
- try:
- dps_class = getattr(docutils.nodes,thing)
- except AttributeError:
- raise ValueError,"docutils.nodes does not define '%s'"%thing
- else:
- dps_class = thing
-
- # NB: check for TextElement before checking for Element,
- # since TextElement is itself a subclass of Element!
- if issubclass(dps_class,docutils.nodes.TextElement):
- # Force the use of the argument list as such, by insisting
- # that the `rawsource` and `text` arguments are empty strings
- args = self._convert_args(args)
- dps_instance = dps_class("","",*args,**keywords)
- elif issubclass(dps_class,docutils.nodes.Element):
- # Force the use of the argument list as such, by insisting
- # that the `rawsource` arguments is an empty string
- args = self._convert_args(args)
- dps_instance = dps_class("",*args,**keywords)
- elif issubclass(dps_class,docutils.nodes.Text):
- if len(args) > 1:
- raise ValueError,\
- "Text subclass %s may only take one argument"%\
- self._nameof(thing)
- elif len(args) == 1:
- text = args[0]
- else:
- text = ""
- if keywords:
- raise ValueError,\
- "Text subclass %s cannot use keyword arguments"%\
- self._nameof(thing)
- dps_instance = dps_class(text)
- else:
- raise ValueError,"%s is not an Element or TextElement"%\
- self._nameof(thing)
-
- #print " ",dps_instance
- return dps_instance
-
- def _convert_args(self,args):
- """Return the arguments, with strings converted to Texts.
- """
- newargs = []
- for arg in args:
- if type(arg) == type(""):
- newargs.append(docutils.nodes.Text(arg))
- else:
- newargs.append(arg)
- return newargs
-
- def __getattr__(self,name):
- """Return an appropriate DOCUTILS class, for instantiation.
- """
- return getattr(docutils.nodes,name)
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def _nameof(self,thing):
- if thing is None:
- return "Text"
- elif type(thing) == type(""):
- return thing
- else:
- return thing.__name__
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Stack maintenance
-
- def _stack_ends(self,name):
- """Return true if the stack ends with the named entity.
- """
- return self.stack[-1][0] == name
-
- def _stack_add(self,instance):
- """Add a new level to the stack.
- """
- self.stack.append((instance.__class__.__name__,instance))
-
- def _stack_remove(self,name):
- """Remove the last level from the stack
-
- (but only if it is of the right sort).
- """
- if len(self.stack) == 0:
- raise ValueError,"Cannot end %s - nothing outstanding to end"%\
- (name)
- if name != self.stack[-1][0]:
- raise ValueError,"Cannot end %s - last thing begun was %s"%\
- (name,self.stack[-1][0])
- del self.stack[-1]
-
- def _stack_append(self,instance):
- """Append an instance to the last item on the stack.
- """
- if len(self.stack) > 0:
- self.stack[-1][1].append(instance)
- else:
- raise ValueError,"Cannot add %s to current level" \
- " - nothing current"%(instance.__class__.__name__)
-
- def _stack_current(self):
- """Return the "current" element from the stack
-
- That is, the element to which we would append any new instances
- with `_stack_append()`
- """
- return self.stack[-1][1]
-
- def _stack_as_string(self):
- names = []
- for name,inst in self.stack:
- names.append(name)
- return string.join(names,",")
-
-
-# ----------------------------------------------------------------------
-if __name__ == "__main__":
- build = BuildTree()
- #print build.make("paragraph",text="fred")
- #print build.paragraph(text="fred")
-
- print "Building a section"
- build.start("section")
- build.add("title","Fred")
- build.start("paragraph")
- build.add("text","This is some text.")
- build.add("strong","Really.")
- build.start("paragraph","Another paragraph")
- build.end("section")
- print build.finish()
-
- #print "Building a broken section"
- #build.start("section")
- #build.add("title","Fred")
- #build.start("paragraph")
- #print build.finish()
diff --git a/sandbox/tibs/pysource/doc/readme.rtxt b/sandbox/tibs/pysource/doc/readme.rtxt
deleted file mode 100644
index 5710eaa53..000000000
--- a/sandbox/tibs/pysource/doc/readme.rtxt
+++ /dev/null
@@ -1,189 +0,0 @@
-pysource
-========
-
-:Author: Tibs (tibs@tibsnjoan.co.uk)
-:Date: $Date$
-:Revision: $Revision$
-:Version: 0.1
-
-Ahem
-----
-This file needs updating - unless this notice has disappeared, treat the
-rest of the file as out-of-date...
-
-History
--------
-2002-04:
-
-* Name changed from 'pydps' to 'pysource' (in line with a suggestion
- made a while back on the Doc-SIG by David Goodger).
-
- It's not that that's a great name, just that it's better than 'pydps'
- (especially now that 'dps' has become 'docutils'), and the rather more
- obvious 'pydoc' is already taken. Any suggestions for a better name will
- be gratefully received!
-
-* Converted from the old 'dps' and 'restructuredtext' packages to the
- new 'docutils' package.
-
-* All previous history is elided with the change of name and first release...
-
-Obtaining the package
----------------------
-The latest version of 'pysource' may be found in the Docutils sandbox
-(tarball_ and browsable_).
-
-.. _tarball: http://docutils.sourceforge.net/docutils-sandbox-snapshot.tgz
-.. _browsable: http://docutils.sourceforge.net/sandbox/tibs/pysource/
-
-I hope to keep a copy of the current "released" version at
-
- http://www.tibsnjoan.co.uk/reST/pysource.tgz
-
-Purpose
--------
-This module provides code to
-
- * parse a Python file using the Python Compiler module, which is
- standard with Python 2.2 and later, and available in the Tools
- directory in earlier versions,
- * extract relevant information, including docstrings,
- * and ultimately produce (in the first instance) HTML documentation
- therefrom.
-
-As a subsidiary capability, it can read a restructuredtext file and produce
-HTML from that.
-
-There are obviously other tools which perform similar tasks - see the
-accompanying file whythis.rtxt for some comparisons, and an
-explanation of why I think it is worth developing this tool
-independently.
-
-
-*** TO HERE ***
-
-Usage
------
-The command ``python pysource/pysource.py --help`` gives the following
-information::
-
- """The command line interface to docutil's Python documentation extractor.
-
- Usage: ``pysource.py <switches> <inpath> [<outfile>]``
-
- <inpath> is the path to a package or module.
-
- <outfile> is the path to the output file. If it's not given, then
- output will be written to a file with the same name as the input
- file, but defaulting to the current directory, and with extension
- derived from the type of output:
-
- - show -> ``.show``
- - ast -> ``.ast``
- - xml -> ``.xml``
- - html -> ``.html``
- - pretty -> ``.pretty``
-
- (unless --stdout is requested). The default is --html.
-
- Note that progress messages (and ``verb`` information) are written
- to ``sys.stderr``.
- """
-
- <switches> are:
-
- -v, --verbose Report on progress in more detail
- -q, --quiet Suppress normal progress messages
- -t, --text The input file is a plain (text) reST file
- -s, --show Output basic information about the input
- -a, --ast Output a representation of the AST
- -x, --xml Output an XML representation of the input
- -h, --html Output an HTML representation of the input [default]
- -p, --pretty Output a 'pretty' representation of the input
- -d, --doctest Treat a reST file as doctest input.
- -h, --help Show 'help' information
- -n, --new Use David Goodger's HTML Writer (sort of)
- --stdout Write output to stdout, instead of a file
-
-I recommend use of the ``--pretty`` option for gaining an understanding of the
-DPS tree itself.
-
-Limitations and dependencies
-----------------------------
-This is beta software, and is still, to some extent, a proof and exploration of
-concept.
-
-The following limitations are obvious:
-
- * Its concept of a "package" is rather limited - it doesn't understand
- sub-packages (i.e., it only copes with a "flat" directory structure).
- * It only produces a single HTML file - a more sophisticated approach
- is clearly needed, particularly for large packages (or even large
- modules).
- * It is not fully integrated with the Docutils HTML Writer, which it
- should be using in preference to my own home-grown approach.
- * The Docutils tree that it produces could use some improvement - in
- particular the Python specific nodes need various design decisions
- to be made.
-
-Also:
-
- * It doesn't throw away as much information as it should.
- * It doesn't check all assignments for use of global values.
- * It doesn't handle all Python entities that it should.
- * The HTML it produces is pretty yuck, and is *designed* not
- to look terribly nice (although you should remember not to
- ask my opinion of the HTML output by pydoc).
- * Autonumbered footnote resolution is done by the HTML writer,
- which means that it will likely go wrong if it needs to do
- anything with Python source that contains autonumbered
- footnotes in docstrings(!). But it does work (I believe)
- for .rtxt files.
- * Various other Docutils tree transforms that should be applied
- are not yet performed.
-
-Subtler things:
-
- * The ``--doctest`` mode just pretends that the whole file is
- a single doctest string (i.e., just as if doctest had found
- it as a docstring in a Python file).
-
- That's quite sensible, except that the current doctest doesn't
- know that it should ignore literal blocks, and thus may find
- apparent Python code where it shouldn't.
-
-It depends on:
-
- * The latest versions of Docutils, as of the
- time it was uploaded (I generally track these fairly well,
- so am normally using the latest versions whilst developing).
- These should have been installed (using the setup scripts
- they provide).
- * Python 2.0 or above
- * Tools/compiler for the current Python. For Pythons before
- 2.2a4 (I think it was) this should be installed using the
- setup script it provides (after that it comes as standard).
-
-I develop it with Python 2.1 on Windows/NT and with Python 2.2 on
-Debian GNU/Linux.
-
-Refactoring warning
--------------------
-It is my aim to refactor this code to follow David Goodger's
-
- Reader - Transformer - Writer
-
-model more closely than it currently does. And there is also lots of
-tidying up to do (especially in `visit.py`).
-
-Interesting things to do
-------------------------
-Run it over docutils/spec/reStructuredText.txt.
-
-Run it over docutils/docutils.
-
-Run it over pysource/visit.py.
-
-Run it over the standard string module, and compare the result with that
-of ``pydoc``.
-
diff --git a/sandbox/tibs/pysource/doc/whythis.rtxt b/sandbox/tibs/pysource/doc/whythis.rtxt
deleted file mode 100644
index 0307654a2..000000000
--- a/sandbox/tibs/pysource/doc/whythis.rtxt
+++ /dev/null
@@ -1,122 +0,0 @@
-Why pysource?
-=============
-
-There is the question of why a new tool is needed to go with Docutils and
-reStructuredText, when there are several existing tools which could have been
-adopted.
-
-Perhaps the main reason is simply as a "proof of concept" - even if pysource
-itself is not adopted as *the* tool for use in documenting Python source files
-(and I certainly would not advocate that it be the only one, as other tools
-present their own particular advantages), it *is* worth doing as a "proof of
-concept" - as an examplar that it is possible to do the job.
-
-Three existing tools deserve particular consideration:
-
- - pydoc
- - HappyDoc
- - PyPaSax
-
-pydoc
------
-
-pydoc is Ka-Ping Yee's classic application. It is now (as of Python 2.1)
-included in the standard Python library, where it also provides the backbone
-for the "help" command.
-
-pydoc uses introspection of "live" objects to determine information - that is,
-it requires that the modules to be documented be imported. This can be a
-limiting factor - sometimes it is not advisable to import a module, and
-sometimes it is simply not possible.
-
-It provides output as HTML, and also has a rather output mode for use at
-a terminal.
-
-.. note:
- I've still to work out how to make pydoc work as a standalone tool
- (i.e., at the terminal prompt) for documenting my own Python code
- - for instance, doing ``pydoc.py pysource/visit.py``, which, at best,
- doesn't seem to see any documentation!
-
-HappyDoc
---------
-
- http://happydoc.sourceforge.net/
-
-HappyDoc is a seriously neat tool, and one of the longest standing in the
-arena. It is a mature tool, and:
-
- - supports several forms of structured text within docstrings - notably
- plain text, "raw" text, StructuredTextClassic and StructuredTextNG.
-
- - allows the extraction of documentation from comments as well as from
- docstrings.
-
- - supports several forms of output - notably HTML, SGML and XML DocBook,
- plain text, and Dia files.
-
- - has documented mechanisms for adding new import and export filters.
-
- - has sophisticated control over the actual details of export (HTML options,
- single or multiple files, etc.)
-
-I would expect it to add support for reStructuredText in the near future.
-
-PyPaSax
--------
-
- http://www.logilab.org/pypasax/
-
-PyPaSax is a Python module that uses the python parser to generate Sax2 events,
-and thus enables the visualisation of a python document as an XML tree. This is
-used at Logilab for documenting the source code of Narval. Logilab are also
-working on an XSL transformation to generate XMI from the generated XML, which
-should allow interface to UML tools.
-
-This is a very interesting approach to the problem of extracting information
-from Python modules, but it is currently relatively "coarse grained" - it does
-not, for instance, pay attention to docstrings.
-
-pysource
---------
-
-http://docutils.sourceforge.net/sandbox/pysource/ (or from the tarball_).
-
-.. _tarball: http://docutils.sourceforge.net/docutils-sandbox-snapshot.tgz
-
-pysource is intended as a proof-of-concept implementation of the concepts in
-the Docutils PEPs.
-
-It parses Python files using the Compiler module, honouring the __docformat__
-module value to decide whether docstrings are in reStructuredText or plain
-text.
-
-It uses Docutils to organise the information so gained, and the results of
-parsing the Python code are integrated with the parsed docstring text into a
-single Docutils nodes tree.
-
-The initial version of pysource supports the output of XML (which is a native
-ability of Docutils itself), and HTML. Since it is intended that pysource
-integrate closely with Docutils, additional output formats will occur as new
-Writers are added to Docutils itself.
-
-See also
---------
-pep-0256: Docstring Processing System Framework
-
- This includes a closer analysis of why pydoc is not directly suitable
- for the purposes of Docutils.
-
-pep-0257: Docstring conventions
-
- This describes the high-level structure of docstrings.
-
-pep-0258: Docutils Design Specification
-
- This includes a description of what a tool such as pysource should
- actually do - what docstrings to extract and from where, and how to
- decide what format is used within said docstrings.
-
-pep-0287: reStructuredText Standard Docstring Format
-
- The PEP for reStructuredText itself.
diff --git a/sandbox/tibs/pysource/group-notes.txt b/sandbox/tibs/pysource/group-notes.txt
deleted file mode 100644
index 6c3f281f9..000000000
--- a/sandbox/tibs/pysource/group-notes.txt
+++ /dev/null
@@ -1,220 +0,0 @@
-Adding <group>, losing <package_section> and their ilk
-======================================================
-
-:Author: Tibs
-:Date: 2001-11-18
-
-Background
-----------
-I am currently writing software that will take information from
-Python source files, produce a DPS node tree therefrom, and allow
-the user to generate HTML from that.
-
-My initial implementation produced a *variant* of the DPS node
-tree, which contained many structures that related closely to the
-information derived from Python - for instance, something like::
-
- <py_class name="Fred">
- <docstring>
- This is a very silly class.
- <py_attr_list>
- <py_attr name="jim">
- <py_method "name="method">
-
-For various reasons, the (implicit) DTD wasn't shaping up very
-like that proposed by David Goodger, so I asked about the
-possibility of amending the "standard" DTD. This led to a
-discussion of how the flow of information through a DPS processor
-should actually work, with the result being David's diagram
-[#diagram]_::
-
- +--------+ +--------+ +------------+ +--------+
- | READER | --> | linker | --> | transforms | --> | WRITER |
- +--------+ +--------+ +------------+ +--------+
- | TOC, index, |
- | etc. (optional) |
- +--------+ +--------+
- | PARSER | | filer |
- +--------+ +--------+
-
-David also made the point that, within this plan, the result of
-the ``linker`` phase is a normal DPS tree, which can be
-transformed with any of the "standard" transformation tools (for
-instance, to resolve automatic footnotes), and then output with
-any writer.
-
-Whilst David's diagram is not *quite* how I see the process, it's
-close enough for this purpose. Thus pydps [#pydps]_ might be shown
-as::
-
- +--------+ +--------------+ +------------+ +---------+
- | READER | --> | transform.py | --> | transforms | --> | html.py |
- +--------+ +--------------+ +------------+ +---------+
- | |
- +----------+ +---------------+
- | visit.py | | buildhtml.py |
- +----------+ +---------------+
-
-The "READER" is implicit in the main utility (currently
-``pydps.py``), and locates the relevant Python files. It then
-uses ``visit.py`` to generate a tree representing the Python code
-(the Python ``compiler`` module, standard with Python 2.2 and
-above, but in ``Tools`` before that, is used).
-
-``transform.py`` (which, by David's diagrams, should maybe be
-called ``link``) transforms that information into a proper DPS
-node tree. At the time of writing, no transformations are done.
-
-Finally, HTML is output from the DPS node tree by ``html.py``.
-
-So, in summary:
-
- 1. ``transform.py`` generates a *normal* DPS tree. It doesn't
- use any "odd" nodes (except <group> - but we'll discuss
- that later on). This means that it should be possible to
- plug in any other writer, and produce a different format as
- output - a very significant advantage.
-
- 2. ``html.py`` expects to be given a *normal* DPS tree. This
- means that it should be usable by any other utility that
- also provides a normal DPS tree - again an advantage.
-
-The problem
------------
-But there is a clash in requirements here. Whilst it is very nice
-to be able to represent the Python information as "normal" DPS
-(guaranteeing that anyone can do useful things with it), there is
-some need to transfer information that goes beyond that. There
-are two main reasons for wanting to do this:
-
- * Data mining
- * Presentation
-
-For the first, although DPS/reST/pydps is primarily about
-producing human-viewable documentation, it might also be nice to
-be able to extract parts of it automatically, for various
-purposes - for instance, retrieve just the information about
-which classes inherit from other. This information will, in part,
-be obvious from the text chosen within the document (a title like
-"Class Fred" might be taken to be useful, for instance!), but it
-would be nice to give a bit more help.
-
-For the second, it's relatively difficult to produce better
-layout for DPS Python documentation without more information to
-work on. If one uses the (rather garish) default presentation
-produced by pydps (and no, I'm not saying that's a *nice*
-presentation, but it is the one I've got as an example), it is
-clearly useful to be able to:
-
- 1. group together the package/class/method/etc title and its
- full name/path/whatever
-
- 2. group together a method or function's signature and its
- docstring
-
-David's original approach to this was to introduce a host of
-Python specific tags into ``nodes.py`` [#nodes]_ - for instance::
-
- package_section
- module_section
- ...
- instance_attribute_section
- ...
- parameter_item
- parameter_tuple
- ...
- package
- module
- class_attribute
-
-There are several problems with approach. Perhaps the most
-serious is that *all* generic DPS writers need to understand
-this host of elements that are only relevant to Python. Clearly,
-someone writing a writer for other purposes may be reluctant to
-go to this (to them) redundant effort.
-
-From my point of view, an immediate problem is that the set of
-elements is not *quite* what I want - which means working towards
-a set of patches for ``nodes.py`` and the relevant DTD, and
-getting David to agree to them (well, that last is a useful
-process to have in place, but still). Since I'm not likely to get
-it right immediately, this is a repetitive process.
-
-Lastly, one might imagine someone from another programming
-language domain adopting DPS/reST. One can expect them to be
-frustrated if the set of constructs provided for Python doesn't
-quite match the set of constructs required to describe their
-language in a natural manner.
-
-Luckily (!), I have a counter proposal, which hopefully keeps the
-baby and just loses the bath water.
-
-Groups and "style"
-------------------
-The first thing that I realised was that, for convenience of
-output at least, I wanted to be able to group elements together -
-or, in terms of the DPS tree, insert an arbitrary "subroot"
-within the tree to 'abstract' a branch of the tree.
-
-This is particularly useful for linking together the parts of the
-text that deal with (for instance) attribution, or unusual
-globals, without having to embed yet another section.
-
-There is, of course, precedent. HTML provides <div> and <span> -
-one for "structural" elements, and one for inline elements (I
-forget which is which), and TeX and LaTeX are well-known for
-their use of grouping (e.g., the ``\begin{xxx}`` and
-``\end{xxx}`` in LaTeX).
-
-I don't consider it worth making the <div>/<span> distinction in
-the context of a tree - it is perfectly evident what is beingp
-grouped from the elements themselves.
-
-Once one has a <group> element, it is natural to annotate it with
-*what* it is a group of/for. I chose the arbitrary term "style" -
-partly because it is not used in HTML/XML for any purpose I am
-aware of.
-
-And once one has the "style" attribute, it becomes possible to
-use it elsewhere - most notably in <section> elements, saving the
-need for a myriad of different sections for different purposes.
-
-In these instances, it is perhaps acting more like the "class"
-attribute in HTML - indicating, to some extent, meaning, but
-aimed mostly at presentation (via CSS).
-
-The other obvious place to use it is in the automatically
-generated text for things like names, where (at least
-pre-"combing"/transformation) one is "pretending" to have
-assigned a role (just as a person might in a docstring) (but see
-[#style]_).
-
-Summary
--------
-Current DPS defines many element types for use in Python code
-representation.
-
-However, there are major advantages in only using the "simple"
-DPS nodes for all purposes.
-
-This becomes simple and practical given a single extra, general
-purpose, element: <group>.
-
-Furthermore, adding a standard attribute called "style" (or
-perhaps "role" - see [#style]_) seems to fulfil any other
-outstanding requirements.
-
-References
-----------
-.. [#diagram] in email by David Goodger to Doc-SIG, dated
- 21 September 2001 04:31, "Re: [Doc-SIG] DPS components".
-
-.. [#style] Hmm - maybe "style" should be "role", to match
- with the way that a ``:role:`of something``` gets handled...
-
-.. [#pydps] Normally to be found at
- http://www.tibsnjoan.co.uk/reST/pydps.tgz,
- although note that this is not currently up-to-date.
-
-.. [#nodes] dps/dps/nodes.py in the DPS distribution
- (``dps.nodes`` if one is importing it).
diff --git a/sandbox/tibs/pysource/html.py b/sandbox/tibs/pysource/html.py
deleted file mode 100755
index 398151a0e..000000000
--- a/sandbox/tibs/pysource/html.py
+++ /dev/null
@@ -1,1163 +0,0 @@
-"""Output DOCUTILS nodes as HTML.
-
-This is a quick-and-dirty approach to writing out HTML derived from
-a DOCUTILS node tree. It maintains a minimum of state, and doesn't attempt
-any particular intelligence about the tree structure.
-
- Note: for debugging purposes some HTML elements are output with
- "style" attributes - this is so I can track which elements were
- written for what purpose, and is temporary.
-
- (Use of "class" attributes to make CSS usage easier is a
- separate consideration, to be made later on.)
-
-Use of this should ultimately be replaced by use of David's new mechanisms
-from the docutils module - but they didn't exist when I started, so we'll live
-with this for a little longer.
-"""
-
-import time
-import buildhtml
-
-__docformat__ = "reST"
-
-class HTMLError(Exception):
- pass
-
-
-# ----------------------------------------------------------------------
-class Writer:
- """Encapsulate the HTML writing stuff in a class
-
- - it makes it easier to handle values we want to keep around
- """
-
- colours = {"Information": "#FF0000",
- "Warning" : "#FF0000",
- "Error" : "#FF0000",
- "Fatal" : "#FF0000",
- "WarningBG" : "Silver", # (was "lightgrey" or #DDDDDD)
- "default" : "#FFFFCC",
- }
- """Colours to use to distinguish various contexts
-
- Note that the HTML4 spec defines the following colours:
-
- * Black = "#000000"
- * Silver = "#C0C0C0"
- * Gray = "#808080"
- * White = "#FFFFFF"
- * Maroon = "#800000"
- * Red = "#FF0000"
- * Purple = "#800080"
- * Fuchsia = "#FF00FF"
- * Green = "#008000"
- * Lime = "#00FF00"
- * Olive = "#808000"
- * Yellow = "#FFFF00"
- * Navy = "#000080"
- * Blue = "#0000FF"
- * Teal = "#008080"
- * Aqua = "#00FFFF"
- """ #"
-
- role_text = {"package" : "Package",
- "module" : "Module",
- "class" : "Class",
- "method" : "Method",
- "function" : "Function",
- "module_attribute" : "Module attribute",
- "class_attribute" : "Class attribute",
- "instance_attribute": "Instance attribute",
- "variable" : "Name",
- "parameter" : "Argument",
- "type" : "Type",
- "exception_class" : "Exception class",
- "exception" : "Exception",
- "warning_class" : "Warning class",
- "warning" : "Warning"}
- """If an interpreted text has a role, we want to write that role
- out. We thus need a dictionary to relate role names to the text
- to be written out.
- """
-
- fancy = 0
- """Do we want fancy presentation?"""
-
- want_contents = 0
- """Do we *want* contents for this document?
- """
-
- language = "en"
- """The language that we believe our document to be
- destined for.
- """
-
- showwarnings = 1
- """Should we show warnings, or try to continue silently?
- """
-
- showinforms = 1
- """Should we show informational messages, or ignore them?
- """
-
- visible_targets = 0
- """Show link target names
- """
-
- visible_links = 0
- """Show link references (although not all of the possible links
- we produce).
- """
-
- def __init__(self):
-
- # The current document tree - unset it here just in case...
- self.document = None
-
- # Our HTML builder - ditto
- self.html = None
-
- # Our method cache - we seed it with the entry for "#text"
- # because we can't deduce the method name from that tag
- # ("write_#text" is not a valid Python name!)
- self.method_cache = {"#text":self.write_text}
-
- def __call__(self,document,stream):
- """Output an HTML representation of `document` to `stream`.
-
- Arguments:
-
- * document -- the DOCUTILS tree we are to output as HTML
- * stream -- something like a File, with a write method
- """
-
- self.document = document
- self.html = buildhtml.BuildHTML(stream)
-
- # Reset things (i.e., so we can be called more than once)
-
- # The header level to use for <section> titles
- # (i.e., <h2>, <h3>, etc).
- self.level = 0
-
- # Have we output Contents for this document?
- self.got_contents = 0
-
- # Are we within the body of a field list item?
- self.infield = 0
-
- # Or in a paragraph? (note - only in the sense that the DOCUTILS
- # tree says that we're in a paragraph)
- self.in_paragraph = 0
-
- # Footnote autonumbers
- self.auto_footnote = 0
- """The current auto-numbered footnote's number.
- This will be stored as attribute "auto-index" on
- the footnote itself, by `find_auto_footnotes()`.
- """
- self.auto_footnote_names = {}
- """A dictionary linking an auto-numbered footnote label
- to the corresponding (generated) footnote number. This
- is populated by `find_auto_footnotes()`.
- """
- self.auto_footnote_list = []
- """A list of the auto-numbered footnote numbers that
- are used for non-named footnotes. This list is then
- used to populate the [#]_ footnote references. It is
- populated by `find_auto_footnotes()`.
- """
- self.auto_footnote_index = 0
- """An index into `self.auto_footnote_list`.
- """
- self.auto_footnote_target = 0
- """This is used to record the numbering for the "link" end
- of footnotes - i.e., the number for autonumbered references.
- """
-
- self.find_auto_footnotes(document)
-
- # Table location
- self.in_table_header = 0
- self.in_table_body = 0
-
- # And now down to work...
- self.html.write_doctype()
- self.html.start("html")
-
- # Hmm - have we been handed a "document" rooted tree,
- # or a DOM-like tree that has "document" as its single child?
- if document.tagname == "document":
- self.write_html(document,stream)
- else:
- for element in document:
- self.write_html(element,stream)
-
- self.html.end("html")
- self.html.finish()
-
- def find_auto_footnotes(self,element):
- """Locate and number autonumbered footnotes...
- """
-
- if element.tagname == "#text":
- return
- elif element.tagname == "footnote":
- # This is a footnote body - it is the footnote bodies
- # that determine their order and numbering...
- name = auto = None
- if element.hasattr("name"):
- name = element["name"]
- if element.hasattr("auto"):
- auto = element["auto"]
- self.auto_footnote += 1
- element["auto-index"] = self.auto_footnote
- if auto:
- if name:
- if not self.auto_footnote_names.has_key(name):
- self.auto_footnote_names[name] = self.auto_footnote
- else:
- # Well, what should we do?
- # Removing it seems the best bet...
- del self.auto_footnote_names[name]
- else:
- self.auto_footnote_list.append(self.auto_footnote)
-
- for node in element:
- self.find_auto_footnotes(node)
-
- def write_document(self,element,stream):
- document_is_section = 0
- if element.hasattr("title"):
- title = self.html.escape(element["title"])
- else:
- firstchild = element[0]
- if firstchild.tagname == "title":
- title = self.html.escape(firstchild.astext())
- document_is_section = 1
- elif firstchild.hasattr("title"):
- title = self.html.escape(firstchild["title"])
- else:
- title = "Document produced by pysource"
-
- self.html.start("head")
- self.html.add("title",title)
- self.html.end("head")
-
- self.html.start("body")
- if document_is_section:
- # There is no internal <section> - instead we just
- # have a <document> whose first element is <title>
- # So, given that, pretend we ARE a section...
- self.write_section(element,stream)
- else:
- for node in element:
- self.write_html(node,stream)
-
- self.html.add("hr")
- self.html.start("p")
- self.html.add("em","Automatically generated by ",
- self.html.element("code","pysource"),
- " on %s\n"%time.ctime(time.time()))
- self.html.end("p")
- self.html.end("body")
-
- def write_text(self,element,stream):
- """Write out plain text.
- """
- self.html.add("text",self.html.escape(element.astext()))
-
- def write_html(self,element,stream):
- """Write out the HTML representation of `element` on `stream`.
- """
-
- name = element.tagname
- try:
- method = self.method_cache[name]
- except KeyError:
- method = getattr(self,"write_%s"%name,self.write_unknown)
- self.method_cache[name] = method
- method(element,stream)
-
- def write_unknown(self,element,stream):
- """Write out an element which we don't recognise.
- """
-
- self.html.add("p",self.html.element("comment","just a spacer"))
-
- self.html.start("font","&lt;%s"%element.tagname,color="red")
- for name,value in element.attlist():
- self.html.add("text"," %s='%s'"%(name,self.html.escape(value)))
- self.html.add("text","&gt;")
- self.html.end("font")
-
- for node in element:
- self.write_html(node,stream)
-
- self.html.add("font","&lt;/%s&gt;"%element.tagname,
- color="red")
-
- def write_section(self,element,stream):
- """Write a section - i.e., something with a title
- """
-
- self.level += 1
-
- if element.hasattr("name"):
- # Lazily, escape the name so we don't have to worry
- # about single quotes in it...
- name=self.html.escape(element["name"])
-
- # Hmm - we *want* to write "\n\n<a name='...'></a>"
- # which isn't *quite* what this does - maybe have a specialised
- # call in buildhtml.py?
- self.html.add("text",self.html.element("a",name=name))
- if self.visible_links:
- self.html.start("font",color="green")
- self.html.add("text","&lt;%s&gt;"%name)
- self.html.end("font")
-
- for node in element:
- self.write_html(node,stream)
-
- self.level -= 1
-
- def write_title(self,element,stream):
- if 1 <= self.level <= 6:
- self.html.start("h%d"%self.level)
- for node in element:
- self.write_html(node,stream)
- self.html.end("h%d"%self.level)
- else:
- # Put a warning here?
- self.html.start("p")
- self.html.start("font",size="-1",color="red")
- self.html.add("text","[problem: header level='%d']"%self.level)
- self.html.end("font")
- self.html.start("strong")
- for node in element:
- self.write_html(node,stream)
- self.html.end("strong")
- self.html.end("p")
-
- def write_transition(self,element,stream):
- self.html.start("p", # hmm - strictly not legal...
- self.html.element("hr"))
-
- def write_enumerated_list(self,element,stream):
- typedict = {"arabic" : "1",
- "roman" : "i",
- "Roman" : "I",
- "alpha" : "a",
- "Alpha" : "A"}
- try:
- enumtype = typedict[element["enumtype"]]
- except:
- enumtype = "1"
-
- # Does this match how DOCUTILS nodes work?
- if element.hasattr("start"):
- self.html.start("ol",type=enumtype,start=element["start"])
- else:
- self.html.start("ol",type=enumtype)
- for node in element:
- self.write_html(node,stream)
- self.html.end("ol")
-
- def write_bullet_list(self,element,stream):
- # Hmm - the translation is fairly arbitrary
- # - but at least consistent
- bulletdict = {"*" : "disc",
- "-" : "circle",
- "+" : "square"}
- try:
- bullet = bulletdict[element["bullet"]]
- except:
- bullet = None
-
- if bullet:
- self.html.start("ul",type=bullet)
- else:
- self.html.start("ul")
- for node in element:
- self.write_html(node,stream)
- self.html.end("ul")
-
- def write_definition_list(self,element,stream):
- self.html.start("dl")
- for node in element:
- self.write_html(node,stream)
- self.html.end("dl")
-
- def write_definition_list_item(self,element,stream):
- # Nothing special to do for this one
- for node in element:
- self.write_html(node,stream)
-
- def write_term(self,element,stream):
- self.html.start("dt")
- self.html.start("strong")
- for node in element:
- self.write_html(node,stream)
- self.html.add("text"," ") # to separate consecutive parts,
- # in option lists
- self.html.end("strong")
- self.html.end("dt")
-
- def write_list_item(self,element,stream):
- self.html.start("li")
- for node in element:
- self.write_html(node,stream)
- self.html.end("li")
-
- def write_option_list(self,element,stream):
- self.html.start("dl")
- for node in element:
- self.write_html(node,stream)
- self.html.end("dl")
-
- def write_option_list_item(self,element,stream):
- for node in element:
- self.write_html(node,stream)
-
- def write_option(self,element,stream):
- self.html.start("dt")
- self.html.start("strong")
- for node in element:
- self.write_html(node,stream)
- self.html.add("text"," ") # to separate consecutive parts,
- # in option lists
- self.html.end("strong")
- self.html.end("dt")
-
- def write_definition(self,element,stream):
- self.html.start("dd")
- for node in element:
- self.write_html(node,stream)
- self.html.end("dd")
-
- def write_short_option(self,element,stream):
- self.html.start("samp")
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- def write_long_option(self,element,stream):
- self.html.start("samp")
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- def write_vms_option(self,element,stream):
- self.html.start("samp")
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- def write_option_argument(self,element,stream):
- self.html.start("samp")
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- def write_description(self,element,stream):
- self.html.start("dd")
- for node in element:
- self.write_html(node,stream)
- self.html.end("dd")
-
- def write_field_list(self,element,stream):
- """Write out a fieldlist.
- """
- # The colour is for debugging purposes only!
- self.html.start("table",width="100%",bgcolor="palegreen")
-
- self.infield = 1
- for node in element:
- self.write_html(node,stream)
- self.infield = 0
-
- self.html.end("table")
-
- def write_field(self,element,stream):
- self.html.start("tr",valign="top",dps="field")
- for node in element:
- self.write_html(node,stream)
- self.html.end("tr")
-
- def write_field_name(self,element,stream):
- self.html.start("td",dps="field_name")
- self.html.start("strong")
- for node in element:
- self.write_html(node,stream)
- self.html.end("strong")
- self.html.end("td")
-
- def write_field_body(self,element,stream):
- self.infield = 1
- self.paranum = 0
- self.html.start("td",dps="field_body")
- for node in element:
- self.write_html(node,stream)
- self.html.end("td")
- self.infield = 0
-
- def write_biblio_field(self,element,stream,name):
- """Write out a document bibliographic datum.
- """
- self.infield = 1
- # The colour is for debugging purposes only!
- self.html.start("table",width="100%",bgcolor="palegreen")
- self.html.start("tr",valign="top")
- self.html.start("td",dps="biblio_field")
- self.html.add("strong",name)
-
- if len(element) != 1:
- raise HTMLError,"Found %d children in field %s"%\
- (len(element),name)
-
- self.write_field_body(element[0],stream)
-
- self.html.end("td","tr","table")
- self.infield = 0
-
- def write_subtitle(self,element,stream):
- self.write_biblio_field(element,stream,"Subtitle")
-
- def write_author(self,element,stream):
- self.write_biblio_field(element,stream,"Author")
-
- def write_authors(self,element,stream):
- self.write_biblio_field(element,stream,"Authors")
-
- def write_organization(self,element,stream):
- self.write_biblio_field(element,stream,"Organisation")
-
- def write_organisation(self,element,stream):
- self.write_biblio_field(element,stream,"Organisation")
-
- def write_contact(self,element,stream):
- self.write_biblio_field(element,stream,"Contact")
-
- def write_version(self,element,stream):
- self.write_biblio_field(element,stream,"Version")
-
- def write_status(self,element,stream):
- self.write_biblio_field(element,stream,"Status")
-
- def write_date(self,element,stream):
- self.write_biblio_field(element,stream,"Date")
-
- def write_revision(self,element,stream):
- self.write_biblio_field(element,stream,"Revision")
-
- def write_copyright(self,element,stream):
- self.write_biblio_field(element,stream,"Copyright")
-
- def write_abstract(self,element,stream):
- self.write_biblio_field(element,stream,"Abstract")
-
- def write_reference(self,element,stream):
- """Write a link - the "pointer" to a target.
-
- Doesn't yet handle "indirect" links...
- """
- if element.hasattr("refuri"):
- name = self.html.escape(element["refuri"])
- self.html.start("a",href=name)
- elif element.hasattr("refname"):
- # Escape the name to match what we do with titles...
- name = "#"+self.html.escape(element["refname"])
- self.html.start("a",href=name)
- else:
- self.write_unknown(element,stream)
- return
- for node in element:
- self.write_html(node,stream)
- self.html.end("a")
- if self.visible_links:
- self.html.start("font",color="green")
- self.html.add("text","&lt;%s&gt;"%name)
- self.html.end("font")
-
- def write_target(self,element,stream):
- """Write the target end of a link.
-
- Ultimately, the user should be able to choose to fold these into
- the document (i.e., into the "link" itself).
- """
- try:
- name = element["name"]
- except:
- name = "**no target name**"
-
- ##if not self.in_paragraph:
- ## self.html.start("p")
-
- # Provide some "debugging" information
- if self.visible_targets:
- self.html.start("font",color="green")
- self.html.start("strong")
- self.html.start("em")
- self.html.add("text",name)
- self.html.end("em")
- self.html.end("strong")
- self.html.end("font")
-
- self.html.add("a",name=self.html.escape(name))
-
- if element.has_key("refuri"):
- uri = self.html.escape(element["refuri"])
- self.html.add("text",":&nbsp;")
- self.html.add("a",element["refuri"],href=uri)
-
- ##if not self.in_paragraph:
- ## self.html.end("p")
-
- def write_footnote(self,element,stream):
- """Write out the body of a footnote.
-
- It's not entirely clear how to do this in HTML, so we'll
- just try for something distinctive...
- """
- name = auto = index = None
- if element.hasattr("name"):
- name = element["name"]
- if element.hasattr("auto"):
- auto = element["auto"]
- if element.hasattr("auto-index"):
- index = element["auto-index"]
-
- if auto and index == None:
- raise HTMLError,"Footnote auto-numbering has not been done"
-
- if name and auto:
- self.html.start("p")
- self.html.add("a",name=self.html.escape(name))
- self.html.add("text"," ")
- self.html.add("a",name=`index`)
- self.html.end("p")
- elif name:
- self.html.start("p")
- self.html.add("a",name=self.html.escape(name))
- self.html.end("p")
- elif auto:
- self.html.start("p")
- self.html.add("a",name=`index`)
- self.html.end("p")
- else:
- self.write_message(stream,level=2,
- text="Footnote doesn't have name"
- " or auto attributes")
-
- self.html.start("table",align="center",width="80%")
- self.html.start("tr")
- self.html.start("td")
-
- # Automatically numbered footnotes don't contain an explicit
- # <label> element, so we have to do it by hand...
- if auto:
- self.write_label(element,stream,index)
-
- for node in element:
- self.write_html(node,stream)
-
- self.html.end("td","tr","table")
-
- def write_label(self,element,stream,index=None):
- """Write out the label for a footnote.
- """
- self.html.add("p",
- self.html.element("hr"))
-
- self.html.start("p","Footnote ")
- if index == None:
- self.html.add("strong",element.astext())
- else:
- self.html.add("strong",`index`)
- self.html.end("p")
- self.html.add("br")
- self.html.add("hr")
-
- def write_footnote_reference(self,element,stream):
- """Write out the link to a footnote.
- """
- name = auto = None
- if element.hasattr("refname"):
- name = element["refname"]
- if element.hasattr("auto"):
- auto = element["auto"]
-
- if auto:
- if name:
- if self.auto_footnote_names.has_key(name):
- number = self.auto_footnote_names[name]
- else:
- self.write_message(stream,level=2,
- text="Autonumber footnote name"
- " '%s' doesn't match a"
- " footnote"%name)
- number = 0
- else:
- try:
- number = self.auto_footnote_list[self.auto_footnote_index]
- self.auto_footnote_index += 1
- except IndexError:
- # Hmm - probably a [#]_ with no footnotes for it to
- # point to - best we can do is write *something* out
- self.html.start("font",color=self.colours["Error"])
- self.html.add("text","[")
- self.html.add("strong","#")
- self.html.add("text","]")
- self.html.end("font")
- return
-
- if auto:
- self.html.start("a",href="#%d"%number)
- self.html.add("text","[")
- self.html.add("strong",`number`)
- self.html.add("text","]")
- self.html.end("a")
- elif name:
- self.html.start("a",href="#%s"%self.html.escape(name))
- self.html.add("text","[")
- self.html.add("strong",element.astext())
- self.html.add("text","]")
- self.html.end("a")
- else:
- self.write_unknown(element,stream)
- return
-
-
- def write_comment(self,element,stream):
- """Write out a comment
- """
- # Technically, this may not be enough, as we don't know what
- # they might *have* in the comment - but in practice, it's
- # likely to do...
- self.html.start("comment")
- for node in element:
- self.write_html(node,stream)
- self.html.end("comment")
-
- def write_paragraph(self,element,stream):
- """Write a new paragraph.
-
- This is a method simply because I do odd things inside
- a field body, to make it "look" better.
- """
- if self.html.last_tag() not in ["li","dd","td","th"]:
- self.html.start("p")
- write_slash_p = 1
- else:
- write_slash_p = 0
-
- for node in element:
- self.write_html(node,stream)
-
- if write_slash_p:
- self.html.end("p")
- return
-
-
- self.in_paragraph = 1
- if self.infield:
- self.write_field_paragraph(element,stream)
- else:
- self.html.start("p")
- for node in element:
- self.write_html(node,stream)
- self.html.end("p")
- self.in_paragraph = 0
-
- def write_field_paragraph(self,element,stream):
- """Write a new paragraph inside a field body.
- """
- started_row = 0
- if self.paranum > 0:
- self.html.start("tr")
- self.html.add("td") # an empty column...
- self.html.start("td",dps="paragraph")
- started_row = 1
- self.paranum += 1
- for node in element:
- self.write_html(node,stream)
- if self.paranum > 1:
- self.html.end("td")
- if started_row:
- self.html.end("tr")
-
- def write_table(self,element,stream):
- """Write out a table - initially in a very visible manner
- """
- self.html.start("table",border="1",align="center")
- for node in element:
- self.write_html(node,stream)
- self.html.end("table")
-
- def write_tgroup(self,element,stream):
- for node in element:
- self.write_html(node,stream)
-
- def write_colspec(self,element,stream):
- for node in element:
- self.write_html(node,stream)
-
- def write_rowspec(self,element,stream):
- for node in element:
- self.write_html(node,stream)
-
- def write_thead(self,element,stream):
- """Write out a table header section
- """
- self.html.start("thead")
- self.in_table_header = 1
- for node in element:
- self.write_html(node,stream)
- self.in_table_header = 0
- self.html.end("thead")
-
- def write_tbody(self,element,stream):
- """Write out a table body section
- """
- self.html.start("tbody")
- self.in_table_body = 1
- for node in element:
- self.write_html(node,stream)
- self.in_table_body = 0
- self.html.end("tbody")
-
- def write_row(self,element,stream):
- """Write out a table row.
- """
- if self.in_table_header:
- self.html.start("tr",valign="top",align="left")
- else:
- self.html.start("tr",valign="top")
- for node in element:
- self.write_html(node,stream)
- self.html.end("tr")
-
- def write_entry(self,element,stream):
- """Write out the equivalent of a table "entry" (e.g., HTML <td>)
- """
- keywords = {}
- if element.hasattr("morecols"):
- keywords["colspan"] = element["morecols"]+1
- if element.hasattr("morerows"):
- keywords["rowspan"] = element["morerows"]+1
- keywords["dps"] = "entry"
- self.html.start("td",**keywords)
-
- if self.in_table_header:
- self.html.start("strong")
-
- if len(element) == 0:
- # Since we're writing a table with a border, it looks better if
- # even an empty entry has *some* content - a non-breaking space
- # will suffice to make sure the entry is properly bordered
- self.html.add("text","&nbsp;")
- else:
- for node in element:
- self.write_html(node,stream)
-
- if self.in_table_header:
- self.html.end("strong")
-
- self.html.end("td")
-
- def write_message(self,stream,level=2,text=None,element=None):
- names = {1: "Information",
- 2: "Warning",
- 3: "Error",
- 4: "Fatal"}
-
- if level == 0 and not self.showinforms:
- return
- elif level == 1 and not self.showwarnings:
- return
-
- try:
- name = names[level]
- colour = self.colours[name]
- except:
- name = "Unrecognised warning level %d"%level
- colour = self.colours["Fatal"]
- bgcolour = self.colours["WarningBG"]
-
- self.html.start("table",width="100%%",bgcolor=bgcolour)
- self.html.start("tr")
- self.html.start("td")
- self.html.start("font",color=colour)
- self.html.add("strong",name)
- self.html.end("font")
- self.html.end("td","tr")
-
- self.html.start("tr")
- self.html.start("td")
- if text:
- self.html.add("text",text)
- if element:
- for node in element:
- self.write_html(node,stream)
- self.html.end("td","tr")
- self.html.end("table")
-
- def write_problematic(self,element,stream):
- self.html.start("a",href="#%s"%element["refid"])
- self.html.start("font",color="red")
- for node in element:
- self.write_html(node,stream)
- self.html.end("font")
- self.html.end("a")
-
- def write_system_message(self,element,stream):
- try:
- target = element["refid"]
- except:
- target = None
- if target:
- self.html.add("a","",name="%s"%target)
- self.write_message(stream,level=element["level"],element=element)
-
- def write_group(self,element,stream):
- """By default, we don't do anything with <group> tags.
- """
- for node in element:
- self.write_html(node,stream)
-
- def write_emphasis(self,element,stream):
- self.html.start("em")
- for node in element:
- self.write_html(node,stream)
- self.html.end("em")
-
- def write_strong(self,element,stream):
- self.html.start("strong")
- for node in element:
- self.write_html(node,stream)
- self.html.end("strong")
-
- def write_interpreted(self,element,stream):
- if element.hasattr("refname"):
- self.html.start("a",href="#"+self.html.escape(element["refname"]))
- inref = 1
- else:
- inref = 0
-
- self.html.start("samp",style="interpreted")
- if element.hasattr("role"):
- role = element["role"]
- if self.role_text.has_key(role):
- self.html.add("text","%s "%self.role_text[role])
-
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- if inref:
- self.html.end("a")
- if self.visible_links:
- self.html.start("font",color="green")
- self.html.add("text","&lt;%s&gt;"%element["refname"])
- self.html.end("font")
-
- def write_literal(self,element,stream):
- self.html.start("samp",style="literal")
- for node in element:
- self.write_html(node,stream)
- self.html.end("samp")
-
- def write_literal_block(self,element,stream):
- self.html.start("pre")
- for node in element:
- self.write_html(node,stream)
- self.html.end("pre")
-
- def write_doctest_block(self,element,stream):
- self.html.start("pre",style="doctest")
- for node in element:
- self.write_html(node,stream)
- self.html.end("pre")
-
- def write_block_quote(self,element,stream):
- self.html.start("blockquote")
- for node in element:
- self.write_html(node,stream)
- self.html.end("blockquote")
-
-
-# ----------------------------------------------------------------------
-class PythonWriter(Writer):
- """A Writer that understands how Python is represented using DOCUTILS.
-
- Note that as a princple, I don't believe that "modes" should add extra
- DOCUTILS nodes - in other words, any DOCUTILS tree should be presentable by
- the default writer (albeit maybe not very well).
- """
-
- python_colours = {"package" : "Aqua",
- "module" : "#FFFF00",
- "class" : "#99CCFF", # Python blue
- "method" : "#AAFFAA",
- "function" : "#FFAAFF",
- "docstring" : "#FFFFCC", # pale yellow-ish
- "generator" : "pink",
- }
-
- def write_group(self,element,stream):
- """Write out a group according to its style.
- """
-
- try:
- style = element["style"]
- except:
- style = None
-
- if style == "docstring":
- self.write_docstring(element,stream)
- elif style == "generator":
- self.html.start("table",bgcolor=self.python_colours["generator"],
- width="100%")
- self.html.start("tr")
- self.html.start("td")
-
- for node in element:
- self.write_html(node,stream)
-
- self.html.end("td")
- self.html.end("tr")
- self.html.end("table")
- else:
- for node in element:
- self.write_html(node,stream)
-
- def write_docstring(self,element,stream):
- """Write out a docstring
- """
-
- self.html.start("table",bgcolor=self.python_colours["docstring"],
- width="100%")
- self.html.start("tr")
- self.html.start("td")
-
- # Within a docstring, we want traditional HTML headers,
- # starting at <h2> and working downwards
- self.level = 1
-
- for node in element:
- self.write_html(node,stream)
-
- self.html.end("td")
- self.html.end("tr")
- self.html.end("table")
-
- def write_section(self,element,stream):
- """Write a section - i.e., something with a title
- """
-
- try:
- style = element["style"]
- except:
- style = None
-
- if style in ["package","module","class","method","function"]:
- self.write_py_section(element,stream,style)
- else:
- Writer.write_section(self,element,stream)
-
- def write_py_section(self,element,stream,style):
- """Write out the HTML for a Python section.
- """
-
- self.level += 1
-
- try:
- colour = self.python_colours[style]
- except:
- colour = self.colours["default"]
-
- self.html.start("table",width="100%",cellspacing="0")
-
- # First row - full width, coloured
- self.html.start("tr",bgcolor=colour)
- self.html.add("td",self.html.element("hr"),colspan="2")
- self.html.end("tr")
-
- # Now, if the section has a <title> and a <group> with
- # style="details", we want to treat them specially - and
- # we *know* that they should, if present, be the first
- # two child elements...
- # Optional first-and-a-halfth row
- offset = self.write_py_section_details(element,stream,colour)
-
- if len(element.children) > offset:
- # Second row - left hand margin coloured, "body" not
- self.html.start("tr")
- self.html.add("td","&nbsp;",width="1%",bgcolor=colour)
- self.html.start("td",width="99%")
-
- # More detail needed here?
- for node in element.children[offset:]:
- self.write_html(node,stream)
-
- self.html.end("td")
- self.html.end("tr")
-
- # Third row - full width coloured
- self.html.start("tr",bgcolor=colour)
- self.html.add("td",self.html.element("hr"),colspan="2")
- self.html.end("tr")
-
- if self.got_contents:
- # Fourth row - full width coloured
- self.html.start("tr",bgcolor=colour)
- self.html.add("td","&nbsp;")
- self.html.start("td",align="right")
- self.html.add("text","Return to ")
- self.html.add("a","Contents",href="#contents")
- self.html.end("td")
- self.html.end("tr")
-
- self.html.end("table")
-
- self.level -= 1
-
- def write_py_section_details(self,element,stream,colour):
- """Deal with the title and details for a Python section.
-
- Returns the offset within the <section> elements children
- at which we should continue processing...
- """
- offset = 0
- if element[0].tagname == "title":
- offset = 1
- self.html.start("tr",bgcolor=colour)
- self.html.start("td",colspan="2")
- self.html.start("table",width="100%")
- self.html.start("tr",valign="top")
- self.html.start("td")
- # Hmm. It doesn't work too well using <h2>..<h6> as header
- # elements for nested module, class, etc. Let's do this
- # by "hand"
- self.html.start("font",size="+2")
- for node in element[0]:
- self.write_html(node,stream)
- self.html.end("font")
- self.html.end("td")
- self.html.end("tr")
-
- if element[1].tagname == "group" and \
- element[1].hasattr("style") and \
- element[1]["style"] == "details":
- offset = 2
- self.html.start("tr")
- self.html.start("td",align="right")
- self.write_html(element[1],stream)
- self.html.end("td")
- self.html.end("tr")
- self.html.end("table")
- self.html.end("td")
- self.html.end("tr")
- return offset
diff --git a/sandbox/tibs/pysource/notes/notes.py b/sandbox/tibs/pysource/notes/notes.py
deleted file mode 100755
index a7fd81f51..000000000
--- a/sandbox/tibs/pysource/notes/notes.py
+++ /dev/null
@@ -1,115 +0,0 @@
-"""Notes (i.e., me working things out...)
-
-Given the following Python::
-
- def func(a,b=1,c='jim',d=None,e=[],f={'a':1},g=(1,2,3)):
-
-the tree produced by compiler looks like::
-
- <Function> 'func' 'a' 'b' 'c' 'd' 'e' 'f' 'g'
- <Const> 1
- <Const> 'jim'
- <Name> 'None'
- <List>
- <Dict>
- <Const> 'a'
- <Const> 1
- <Tuple>
- <Const> 1
- <Const> 2
- <Const> 3 0
-
-If one has::
-
- def func2(a,*args,**kargs):
-
-one gets::
-
- <Function> 'func2' 'a' 'args' 'kargs' 3 None
-
-and lastly::
-
- def func3((a,b,c),d):
-
-gives::
-
- <Function> 'func3' 'a' 'b' 'c' 'd' 0 None
-
-
-`compiler.misc` defines `flatten(tup)` - maybe I should try it?
-
-"""
-
-
-# compiler.transformer contains this useful set of comments:
-#
-#
-# The output tree has the following nodes:
-#
-# Source Python line #'s appear at the end of each of all of these nodes
-# If a line # doesn't apply, there will be a None instead.
-#
-# module: doc, node
-# stmt: [ node1, ..., nodeN ]
-# function: name, argnames, defaults, flags, doc, codeNode
-# lambda: argnames, defaults, flags, codeNode
-# classdef: name, bases, doc, codeNode
-# pass:
-# break:
-# continue:
-# for: assignNode, listNode, bodyNode, elseNode
-# while: testNode, bodyNode, elseNode
-# if: [ (testNode, suiteNode), ... ], elseNode
-# exec: expr1Node, expr2Node, expr3Node
-# from: modname, [ name1, ..., nameN ]
-# import: [ name1, ..., nameN ]
-# raise: expr1Node, expr2Node, expr3Node
-# tryfinally: trySuiteNode, finSuiteNode
-# tryexcept: trySuiteNode, [ (exprNode, assgnNode, suiteNode), ... ], elseNode
-# return: valueNode
-# const: value
-# print: [ node1, ..., nodeN ] [, dest]
-# printnl: [ node1, ..., nodeN ] [, dest]
-# discard: exprNode
-# augassign: node, op, expr
-# assign: [ node1, ..., nodeN ], exprNode
-# ass_tuple: [ node1, ..., nodeN ]
-# ass_list: [ node1, ..., nodeN ]
-# ass_name: name, flags
-# ass_attr: exprNode, attrname, flags
-# list: [ node1, ..., nodeN ]
-# dict: [ (key1, val1), ..., (keyN, valN) ]
-# not: exprNode
-# compare: exprNode, [ (op, node), ..., (op, node) ]
-# name: name
-# global: [ name1, ..., nameN ]
-# backquote: node
-# getattr: exprNode, attrname
-# call_func: node, [ arg1, ..., argN ]
-# keyword: name, exprNode
-# subscript: exprNode, flags, [ sub1, ..., subN ]
-# ellipsis:
-# sliceobj: [ node1, ..., nodeN ]
-# slice: exprNode, flags, lowerNode, upperNode
-# assert: expr1, expr2
-#
-# Compiled as "binary" ops:
-# tuple: [ node1, ..., nodeN ]
-# or: [ node1, ..., nodeN ]
-# and: [ node1, ..., nodeN ]
-# bitor: [ node1, ..., nodeN ]
-# bitxor: [ node1, ..., nodeN ]
-# bitand: [ node1, ..., nodeN ]
-#
-# Operations easily evaluateable on constants:
-# <<: exprNode, shiftNode
-# >>: exprNode, shiftNode
-# +: leftNode, rightNode
-# -: leftNode, rightNode
-# *: leftNode, rightNode
-# /: leftNode, rightNode
-# %: leftNode, rightNode
-# power: leftNode, rightNode
-# unary+: node
-# unary-: node
-# invert: node
diff --git a/sandbox/tibs/pysource/notes/notes.txt b/sandbox/tibs/pysource/notes/notes.txt
deleted file mode 100644
index 548d792a1..000000000
--- a/sandbox/tibs/pysource/notes/notes.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Paul Moore's summary of backquoted markup possibilities::
-
- `xxxxx`_ - named hyperlink reference (type 2)
- `xxxxx`__ - anonymous hyperlink reference (type 2)
- _`xxxx` - inline hyperlink targets
- `/xxx/` - substitution reference
- `xxxxx` - interpreted text
diff --git a/sandbox/tibs/pysource/notes/roles.txt b/sandbox/tibs/pysource/notes/roles.txt
deleted file mode 100644
index b063e026d..000000000
--- a/sandbox/tibs/pysource/notes/roles.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-The following is taken from the DPS document pysource-reader.txt::
-
- Interpreted Text
- ================
-
- DTD elements: package, module, class, method, function,
- module_attribute, class_attribute, instance_attribute, variable,
- parameter, type, exception_class, warning_class.
-
- In Python docstrings, interpreted text is used to classify and mark up
- program identifiers, such as the names of variables, functions,
- classes, and modules. If the identifier alone is given, its role is
- inferred implicitly according to the Python namespace lookup rules.
- For functions and methods (even when dynamically assigned),
- parentheses ('()') may be included::
-
- This function uses `another()` to do its work.
-
- For class, instance and module attributes, dotted identifiers are used
- when necessary::
-
- class Keeper(Storer):
-
- """
- Extend `Storer`. Class attribute `instances` keeps track of
- the number of `Keeper` objects instantiated.
- """
-
- instances = 0
- """How many `Keeper` objects are there?"""
-
- def __init__(self):
- """
- Extend `Storer.__init__()` to keep track of instances.
-
- Keep count in `self.instances` and data in `self.data`.
- """
- Storer.__init__(self)
- self.instances += 1
-
- self.data = []
- """Store data in a list, most recent last."""
-
- def storedata(self, data):
- """
- Extend `Storer.storedata()`; append new `data` to a list
- (in `self.data`).
- """
- self.data = data
-
- To classify identifiers explicitly, the role is given along with the
- identifier in either prefix or suffix form::
-
- Use :method:`Keeper.storedata` to store the object's data in
- `Keeper.data`:instance_attribute:.
-
- The role may be one of 'package', 'module', 'class', 'method',
- 'function', 'module_attribute', 'class_attribute',
- 'instance_attribute', 'variable', 'parameter', 'type',
- 'exception_class', 'exception', 'warning_class', or 'warning'. Other
- roles may be defined.
diff --git a/sandbox/tibs/pysource/notes/scope.txt b/sandbox/tibs/pysource/notes/scope.txt
deleted file mode 100644
index 1ad889c1b..000000000
--- a/sandbox/tibs/pysource/notes/scope.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-On finding names
-================
-
-We are not trying for a general solution to the problem of "find the item
-that is being referred to" - we are just trying to provide useful links
-between <interpreted> items in docstrings and those things that they
-might reasonably be expected to be referring to.
-
-Some rules thus occur.
-
-1. We will not show attributes, docstring or not, if they are not
-
- a. At module level (so a ModuleValue)
- b. Within a class (so a ClassValue)
- c. Within a method called __init__ or __new__.
-
- So discard any attributes that do not match these criteria.
-
-Hmm - is that the only rule? Can it be so simple?
diff --git a/sandbox/tibs/pysource/notes/string.html b/sandbox/tibs/pysource/notes/string.html
deleted file mode 100755
index e09c30e2b..000000000
--- a/sandbox/tibs/pysource/notes/string.html
+++ /dev/null
@@ -1,225 +0,0 @@
-
-<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: module string</title>
-<style type="text/css"><!--
-TT { font-family: lucidatypewriter, lucida console, courier }
---></style></head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0>
-<tr bgcolor="#7799ee">
-<td valign=bottom><small>&nbsp;<br></small
-><font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>string</strong></big></big></font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:///C|/python21/lib/string.py">c:\python21\lib\string.py</a></font></td></tr></table>
- <p><small><tt>A&nbsp;collection&nbsp;of&nbsp;string&nbsp;operations&nbsp;(most&nbsp;are&nbsp;no&nbsp;longer&nbsp;used&nbsp;in&nbsp;Python&nbsp;1.6).<br>
-&nbsp;<br>
-Warning:&nbsp;most&nbsp;of&nbsp;the&nbsp;code&nbsp;you&nbsp;see&nbsp;here&nbsp;isn't&nbsp;normally&nbsp;used&nbsp;nowadays.&nbsp;&nbsp;With<br>
-Python&nbsp;1.6,&nbsp;many&nbsp;of&nbsp;these&nbsp;functions&nbsp;are&nbsp;implemented&nbsp;as&nbsp;methods&nbsp;on&nbsp;the<br>
-standard&nbsp;string&nbsp;object.&nbsp;They&nbsp;used&nbsp;to&nbsp;be&nbsp;implemented&nbsp;by&nbsp;a&nbsp;built-in&nbsp;module<br>
-called&nbsp;strop,&nbsp;but&nbsp;strop&nbsp;is&nbsp;now&nbsp;obsolete&nbsp;itself.<br>
-&nbsp;<br>
-Public&nbsp;module&nbsp;variables:<br>
-&nbsp;<br>
-whitespace&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;whitespace<br>
-lowercase&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;lowercase&nbsp;letters<br>
-uppercase&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;uppercase&nbsp;letters<br>
-letters&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;letters<br>
-digits&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;decimal&nbsp;digits<br>
-hexdigits&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;hexadecimal&nbsp;digits<br>
-octdigits&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;octal&nbsp;digits<br>
-punctuation&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;punctuation<br>
-printable&nbsp;--&nbsp;a&nbsp;string&nbsp;containing&nbsp;all&nbsp;characters&nbsp;considered&nbsp;printable</tt></small></p>
-
-<p><table width="100%" cellspacing=0 cellpadding=2 border=0>
-<tr bgcolor="#eeaa77">
-<td colspan=3 valign=bottom><small><small>&nbsp;<br></small></small
-><font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
-
-<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;&nbsp;</td>
-<td width="100%"><dl><dt><a name="-_float"><strong>_float</strong></a> = float(...)<dd><small><tt>float(x)&nbsp;-&gt;&nbsp;floating&nbsp;point&nbsp;number<br>
-&nbsp;<br>
-Convert&nbsp;a&nbsp;string&nbsp;or&nbsp;number&nbsp;to&nbsp;a&nbsp;floating&nbsp;point&nbsp;number,&nbsp;if&nbsp;possible.</tt></small></dl>
- <dl><dt><a name="-_int"><strong>_int</strong></a> = int(...)<dd><small><tt>int(x[,&nbsp;base])&nbsp;-&gt;&nbsp;integer<br>
-&nbsp;<br>
-Convert&nbsp;a&nbsp;string&nbsp;or&nbsp;number&nbsp;to&nbsp;an&nbsp;integer,&nbsp;if&nbsp;possible.&nbsp;&nbsp;A&nbsp;floating&nbsp;point<br>
-argument&nbsp;will&nbsp;be&nbsp;truncated&nbsp;towards&nbsp;zero&nbsp;(this&nbsp;does&nbsp;not&nbsp;include&nbsp;a&nbsp;string<br>
-representation&nbsp;of&nbsp;a&nbsp;floating&nbsp;point&nbsp;number!)&nbsp;&nbsp;When&nbsp;converting&nbsp;a&nbsp;string,&nbsp;use<br>
-the&nbsp;optional&nbsp;base.&nbsp;&nbsp;It&nbsp;is&nbsp;an&nbsp;error&nbsp;to&nbsp;supply&nbsp;a&nbsp;base&nbsp;when&nbsp;converting&nbsp;a<br>
-non-string.</tt></small></dl>
- <dl><dt><a name="-_long"><strong>_long</strong></a> = long(...)<dd><small><tt>long(x)&nbsp;-&gt;&nbsp;long&nbsp;integer<br>
-long(x,&nbsp;base)&nbsp;-&gt;&nbsp;long&nbsp;integer<br>
-&nbsp;<br>
-Convert&nbsp;a&nbsp;string&nbsp;or&nbsp;number&nbsp;to&nbsp;a&nbsp;long&nbsp;integer,&nbsp;if&nbsp;possible.&nbsp;&nbsp;A&nbsp;floating<br>
-point&nbsp;argument&nbsp;will&nbsp;be&nbsp;truncated&nbsp;towards&nbsp;zero&nbsp;(this&nbsp;does&nbsp;not&nbsp;include&nbsp;a<br>
-string&nbsp;representation&nbsp;of&nbsp;a&nbsp;floating&nbsp;point&nbsp;number!)&nbsp;&nbsp;When&nbsp;converting&nbsp;a<br>
-string,&nbsp;use&nbsp;the&nbsp;given&nbsp;base.&nbsp;&nbsp;It&nbsp;is&nbsp;an&nbsp;error&nbsp;to&nbsp;supply&nbsp;a&nbsp;base&nbsp;when<br>
-converting&nbsp;a&nbsp;non-string.</tt></small></dl>
- <dl><dt><a name="-atof"><strong>atof</strong></a>(s)<dd><small><tt><a href="#-atof">atof</a>(s)&nbsp;-&gt;&nbsp;float<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;floating&nbsp;point&nbsp;number&nbsp;represented&nbsp;by&nbsp;the&nbsp;string&nbsp;s.</tt></small></dl>
- <dl><dt><a name="-atoi"><strong>atoi</strong></a>(s, base<small><font color="#909090">=10</font></small>)<dd><small><tt><a href="#-atoi">atoi</a>(s&nbsp;[,base])&nbsp;-&gt;&nbsp;int<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;integer&nbsp;represented&nbsp;by&nbsp;the&nbsp;string&nbsp;s&nbsp;in&nbsp;the&nbsp;given<br>
-base,&nbsp;which&nbsp;defaults&nbsp;to&nbsp;10.&nbsp;&nbsp;The&nbsp;string&nbsp;s&nbsp;must&nbsp;consist&nbsp;of&nbsp;one<br>
-or&nbsp;more&nbsp;digits,&nbsp;possibly&nbsp;preceded&nbsp;by&nbsp;a&nbsp;sign.&nbsp;&nbsp;If&nbsp;base&nbsp;is&nbsp;0,&nbsp;it<br>
-is&nbsp;chosen&nbsp;from&nbsp;the&nbsp;leading&nbsp;characters&nbsp;of&nbsp;s,&nbsp;0&nbsp;for&nbsp;octal,&nbsp;0x&nbsp;or<br>
-0X&nbsp;for&nbsp;hexadecimal.&nbsp;&nbsp;If&nbsp;base&nbsp;is&nbsp;16,&nbsp;a&nbsp;preceding&nbsp;0x&nbsp;or&nbsp;0X&nbsp;is<br>
-accepted.</tt></small></dl>
- <dl><dt><a name="-atol"><strong>atol</strong></a>(s, base<small><font color="#909090">=10</font></small>)<dd><small><tt><a href="#-atol">atol</a>(s&nbsp;[,base])&nbsp;-&gt;&nbsp;long<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;long&nbsp;integer&nbsp;represented&nbsp;by&nbsp;the&nbsp;string&nbsp;s&nbsp;in&nbsp;the<br>
-given&nbsp;base,&nbsp;which&nbsp;defaults&nbsp;to&nbsp;10.&nbsp;&nbsp;The&nbsp;string&nbsp;s&nbsp;must&nbsp;consist<br>
-of&nbsp;one&nbsp;or&nbsp;more&nbsp;digits,&nbsp;possibly&nbsp;preceded&nbsp;by&nbsp;a&nbsp;sign.&nbsp;&nbsp;If&nbsp;base<br>
-is&nbsp;0,&nbsp;it&nbsp;is&nbsp;chosen&nbsp;from&nbsp;the&nbsp;leading&nbsp;characters&nbsp;of&nbsp;s,&nbsp;0&nbsp;for<br>
-octal,&nbsp;0x&nbsp;or&nbsp;0X&nbsp;for&nbsp;hexadecimal.&nbsp;&nbsp;If&nbsp;base&nbsp;is&nbsp;16,&nbsp;a&nbsp;preceding<br>
-0x&nbsp;or&nbsp;0X&nbsp;is&nbsp;accepted.&nbsp;&nbsp;A&nbsp;trailing&nbsp;L&nbsp;or&nbsp;l&nbsp;is&nbsp;not&nbsp;accepted,<br>
-unless&nbsp;base&nbsp;is&nbsp;0.</tt></small></dl>
- <dl><dt><a name="-capitalize"><strong>capitalize</strong></a>(s)<dd><small><tt><a href="#-capitalize">capitalize</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;only&nbsp;its&nbsp;first&nbsp;character<br>
-capitalized.</tt></small></dl>
- <dl><dt><a name="-capwords"><strong>capwords</strong></a>(s, sep<small><font color="#909090">=None</font></small>)<dd><small><tt><a href="#-capwords">capwords</a>(s,&nbsp;[sep])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Split&nbsp;the&nbsp;argument&nbsp;into&nbsp;words&nbsp;using&nbsp;split,&nbsp;capitalize&nbsp;each<br>
-word&nbsp;using&nbsp;capitalize,&nbsp;and&nbsp;join&nbsp;the&nbsp;capitalized&nbsp;words&nbsp;using<br>
-join.&nbsp;Note&nbsp;that&nbsp;this&nbsp;replaces&nbsp;runs&nbsp;of&nbsp;whitespace&nbsp;characters&nbsp;by<br>
-a&nbsp;single&nbsp;space.</tt></small></dl>
- <dl><dt><a name="-center"><strong>center</strong></a>(s, width)<dd><small><tt><a href="#-center">center</a>(s,&nbsp;width)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;center&nbsp;version&nbsp;of&nbsp;s,&nbsp;in&nbsp;a&nbsp;field&nbsp;of&nbsp;the&nbsp;specified<br>
-width.&nbsp;padded&nbsp;with&nbsp;spaces&nbsp;as&nbsp;needed.&nbsp;&nbsp;The&nbsp;string&nbsp;is&nbsp;never<br>
-truncated.</tt></small></dl>
- <dl><dt><a name="-count"><strong>count</strong></a>(s, *args)<dd><small><tt><a href="#-count">count</a>(s,&nbsp;sub[,&nbsp;start[,end]])&nbsp;-&gt;&nbsp;int<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;number&nbsp;of&nbsp;occurrences&nbsp;of&nbsp;substring&nbsp;sub&nbsp;in&nbsp;string<br>
-s[start:end].&nbsp;&nbsp;Optional&nbsp;arguments&nbsp;start&nbsp;and&nbsp;end&nbsp;are<br>
-interpreted&nbsp;as&nbsp;in&nbsp;slice&nbsp;notation.</tt></small></dl>
- <dl><dt><a name="-expandtabs"><strong>expandtabs</strong></a>(s, tabsize<small><font color="#909090">=8</font></small>)<dd><small><tt><a href="#-expandtabs">expandtabs</a>(s&nbsp;[,tabsize])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;all&nbsp;tab&nbsp;characters&nbsp;replaced<br>
-by&nbsp;the&nbsp;appropriate&nbsp;number&nbsp;of&nbsp;spaces,&nbsp;depending&nbsp;on&nbsp;the&nbsp;current<br>
-column,&nbsp;and&nbsp;the&nbsp;tabsize&nbsp;(default&nbsp;8).</tt></small></dl>
- <dl><dt><a name="-find"><strong>find</strong></a>(s, *args)<dd><small><tt><a href="#-find">find</a>(s,&nbsp;sub&nbsp;[,start&nbsp;[,end]])&nbsp;-&gt;&nbsp;in<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;lowest&nbsp;index&nbsp;in&nbsp;s&nbsp;where&nbsp;substring&nbsp;sub&nbsp;is&nbsp;found,<br>
-such&nbsp;that&nbsp;sub&nbsp;is&nbsp;contained&nbsp;within&nbsp;s[start,end].&nbsp;&nbsp;Optional<br>
-arguments&nbsp;start&nbsp;and&nbsp;end&nbsp;are&nbsp;interpreted&nbsp;as&nbsp;in&nbsp;slice&nbsp;notation.<br>
-&nbsp;<br>
-Return&nbsp;-1&nbsp;on&nbsp;failure.</tt></small></dl>
- <dl><dt><a name="-index"><strong>index</strong></a>(s, *args)<dd><small><tt><a href="#-index">index</a>(s,&nbsp;sub&nbsp;[,start&nbsp;[,end]])&nbsp;-&gt;&nbsp;int<br>
-&nbsp;<br>
-Like&nbsp;find&nbsp;but&nbsp;raises&nbsp;ValueError&nbsp;when&nbsp;the&nbsp;substring&nbsp;is&nbsp;not&nbsp;found.</tt></small></dl>
- <dl><dt><a name="-join"><strong>join</strong></a>(words, sep<small><font color="#909090">=' '</font></small>)<dd><small><tt><a href="#-join">join</a>(list&nbsp;[,sep])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;string&nbsp;composed&nbsp;of&nbsp;the&nbsp;words&nbsp;in&nbsp;list,&nbsp;with<br>
-intervening&nbsp;occurrences&nbsp;of&nbsp;sep.&nbsp;&nbsp;The&nbsp;default&nbsp;separator&nbsp;is&nbsp;a<br>
-single&nbsp;space.<br>
-&nbsp;<br>
-(joinfields&nbsp;and&nbsp;join&nbsp;are&nbsp;synonymous)</tt></small></dl>
- <dl><dt><a name="-joinfields"><strong>joinfields</strong></a> = join(words, sep<small><font color="#909090">=' '</font></small>)<dd><small><tt><a href="#-join">join</a>(list&nbsp;[,sep])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;string&nbsp;composed&nbsp;of&nbsp;the&nbsp;words&nbsp;in&nbsp;list,&nbsp;with<br>
-intervening&nbsp;occurrences&nbsp;of&nbsp;sep.&nbsp;&nbsp;The&nbsp;default&nbsp;separator&nbsp;is&nbsp;a<br>
-single&nbsp;space.<br>
-&nbsp;<br>
-(joinfields&nbsp;and&nbsp;join&nbsp;are&nbsp;synonymous)</tt></small></dl>
- <dl><dt><a name="-ljust"><strong>ljust</strong></a>(s, width)<dd><small><tt><a href="#-ljust">ljust</a>(s,&nbsp;width)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;left-justified&nbsp;version&nbsp;of&nbsp;s,&nbsp;in&nbsp;a&nbsp;field&nbsp;of&nbsp;the<br>
-specified&nbsp;width,&nbsp;padded&nbsp;with&nbsp;spaces&nbsp;as&nbsp;needed.&nbsp;&nbsp;The&nbsp;string&nbsp;is<br>
-never&nbsp;truncated.</tt></small></dl>
- <dl><dt><a name="-lower"><strong>lower</strong></a>(s)<dd><small><tt><a href="#-lower">lower</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;converted&nbsp;to&nbsp;lowercase.</tt></small></dl>
- <dl><dt><a name="-lstrip"><strong>lstrip</strong></a>(s)<dd><small><tt><a href="#-lstrip">lstrip</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;leading&nbsp;whitespace&nbsp;removed.</tt></small></dl>
- <dl><dt><a name="-maketrans"><strong>maketrans</strong></a>(...)<dd><small><tt><a href="#-maketrans">maketrans</a>(frm,&nbsp;to)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;translation&nbsp;table&nbsp;(a&nbsp;string&nbsp;of&nbsp;256&nbsp;bytes&nbsp;long)<br>
-suitable&nbsp;for&nbsp;use&nbsp;in&nbsp;string.translate.&nbsp;&nbsp;The&nbsp;strings&nbsp;frm&nbsp;and&nbsp;to<br>
-must&nbsp;be&nbsp;of&nbsp;the&nbsp;same&nbsp;length.</tt></small></dl>
- <dl><dt><a name="-replace"><strong>replace</strong></a>(s, old, new, maxsplit<small><font color="#909090">=-1</font></small>)<dd><small><tt>replace&nbsp;(str,&nbsp;old,&nbsp;new[,&nbsp;maxsplit])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;string&nbsp;str&nbsp;with&nbsp;all&nbsp;occurrences&nbsp;of&nbsp;substring<br>
-old&nbsp;replaced&nbsp;by&nbsp;new.&nbsp;If&nbsp;the&nbsp;optional&nbsp;argument&nbsp;maxsplit&nbsp;is<br>
-given,&nbsp;only&nbsp;the&nbsp;first&nbsp;maxsplit&nbsp;occurrences&nbsp;are&nbsp;replaced.</tt></small></dl>
- <dl><dt><a name="-rfind"><strong>rfind</strong></a>(s, *args)<dd><small><tt><a href="#-rfind">rfind</a>(s,&nbsp;sub&nbsp;[,start&nbsp;[,end]])&nbsp;-&gt;&nbsp;int<br>
-&nbsp;<br>
-Return&nbsp;the&nbsp;highest&nbsp;index&nbsp;in&nbsp;s&nbsp;where&nbsp;substring&nbsp;sub&nbsp;is&nbsp;found,<br>
-such&nbsp;that&nbsp;sub&nbsp;is&nbsp;contained&nbsp;within&nbsp;s[start,end].&nbsp;&nbsp;Optional<br>
-arguments&nbsp;start&nbsp;and&nbsp;end&nbsp;are&nbsp;interpreted&nbsp;as&nbsp;in&nbsp;slice&nbsp;notation.<br>
-&nbsp;<br>
-Return&nbsp;-1&nbsp;on&nbsp;failure.</tt></small></dl>
- <dl><dt><a name="-rindex"><strong>rindex</strong></a>(s, *args)<dd><small><tt><a href="#-rindex">rindex</a>(s,&nbsp;sub&nbsp;[,start&nbsp;[,end]])&nbsp;-&gt;&nbsp;int<br>
-&nbsp;<br>
-Like&nbsp;rfind&nbsp;but&nbsp;raises&nbsp;ValueError&nbsp;when&nbsp;the&nbsp;substring&nbsp;is&nbsp;not&nbsp;found.</tt></small></dl>
- <dl><dt><a name="-rjust"><strong>rjust</strong></a>(s, width)<dd><small><tt><a href="#-rjust">rjust</a>(s,&nbsp;width)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;right-justified&nbsp;version&nbsp;of&nbsp;s,&nbsp;in&nbsp;a&nbsp;field&nbsp;of&nbsp;the<br>
-specified&nbsp;width,&nbsp;padded&nbsp;with&nbsp;spaces&nbsp;as&nbsp;needed.&nbsp;&nbsp;The&nbsp;string&nbsp;is<br>
-never&nbsp;truncated.</tt></small></dl>
- <dl><dt><a name="-rstrip"><strong>rstrip</strong></a>(s)<dd><small><tt><a href="#-rstrip">rstrip</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;trailing&nbsp;whitespace<br>
-removed.</tt></small></dl>
- <dl><dt><a name="-split"><strong>split</strong></a>(s, sep<small><font color="#909090">=None</font></small>, maxsplit<small><font color="#909090">=-1</font></small>)<dd><small><tt><a href="#-split">split</a>(s&nbsp;[,sep&nbsp;[,maxsplit]])&nbsp;-&gt;&nbsp;list&nbsp;of&nbsp;strings<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;words&nbsp;in&nbsp;the&nbsp;string&nbsp;s,&nbsp;using&nbsp;sep&nbsp;as&nbsp;the<br>
-delimiter&nbsp;string.&nbsp;&nbsp;If&nbsp;maxsplit&nbsp;is&nbsp;given,&nbsp;splits&nbsp;into&nbsp;at&nbsp;most<br>
-maxsplit&nbsp;words.&nbsp;&nbsp;If&nbsp;sep&nbsp;is&nbsp;not&nbsp;specified,&nbsp;any&nbsp;whitespace&nbsp;string<br>
-is&nbsp;a&nbsp;separator.<br>
-&nbsp;<br>
-(split&nbsp;and&nbsp;splitfields&nbsp;are&nbsp;synonymous)</tt></small></dl>
- <dl><dt><a name="-splitfields"><strong>splitfields</strong></a> = split(s, sep<small><font color="#909090">=None</font></small>, maxsplit<small><font color="#909090">=-1</font></small>)<dd><small><tt><a href="#-split">split</a>(s&nbsp;[,sep&nbsp;[,maxsplit]])&nbsp;-&gt;&nbsp;list&nbsp;of&nbsp;strings<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;words&nbsp;in&nbsp;the&nbsp;string&nbsp;s,&nbsp;using&nbsp;sep&nbsp;as&nbsp;the<br>
-delimiter&nbsp;string.&nbsp;&nbsp;If&nbsp;maxsplit&nbsp;is&nbsp;given,&nbsp;splits&nbsp;into&nbsp;at&nbsp;most<br>
-maxsplit&nbsp;words.&nbsp;&nbsp;If&nbsp;sep&nbsp;is&nbsp;not&nbsp;specified,&nbsp;any&nbsp;whitespace&nbsp;string<br>
-is&nbsp;a&nbsp;separator.<br>
-&nbsp;<br>
-(split&nbsp;and&nbsp;splitfields&nbsp;are&nbsp;synonymous)</tt></small></dl>
- <dl><dt><a name="-strip"><strong>strip</strong></a>(s)<dd><small><tt><a href="#-strip">strip</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;leading&nbsp;and&nbsp;trailing<br>
-whitespace&nbsp;removed.</tt></small></dl>
- <dl><dt><a name="-swapcase"><strong>swapcase</strong></a>(s)<dd><small><tt><a href="#-swapcase">swapcase</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;with&nbsp;upper&nbsp;case&nbsp;characters<br>
-converted&nbsp;to&nbsp;lowercase&nbsp;and&nbsp;vice&nbsp;versa.</tt></small></dl>
- <dl><dt><a name="-translate"><strong>translate</strong></a>(s, table, deletions<small><font color="#909090">=''</font></small>)<dd><small><tt><a href="#-translate">translate</a>(s,table&nbsp;[,deletions])&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s,&nbsp;where&nbsp;all&nbsp;characters&nbsp;occurring<br>
-in&nbsp;the&nbsp;optional&nbsp;argument&nbsp;deletions&nbsp;are&nbsp;removed,&nbsp;and&nbsp;the<br>
-remaining&nbsp;characters&nbsp;have&nbsp;been&nbsp;mapped&nbsp;through&nbsp;the&nbsp;given<br>
-translation&nbsp;table,&nbsp;which&nbsp;must&nbsp;be&nbsp;a&nbsp;string&nbsp;of&nbsp;length&nbsp;256.&nbsp;&nbsp;The<br>
-deletions&nbsp;argument&nbsp;is&nbsp;not&nbsp;allowed&nbsp;for&nbsp;Unicode&nbsp;strings.</tt></small></dl>
- <dl><dt><a name="-upper"><strong>upper</strong></a>(s)<dd><small><tt><a href="#-upper">upper</a>(s)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Return&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;string&nbsp;s&nbsp;converted&nbsp;to&nbsp;uppercase.</tt></small></dl>
- <dl><dt><a name="-zfill"><strong>zfill</strong></a>(x, width)<dd><small><tt><a href="#-zfill">zfill</a>(x,&nbsp;width)&nbsp;-&gt;&nbsp;string<br>
-&nbsp;<br>
-Pad&nbsp;a&nbsp;numeric&nbsp;string&nbsp;x&nbsp;with&nbsp;zeros&nbsp;on&nbsp;the&nbsp;left,&nbsp;to&nbsp;fill&nbsp;a&nbsp;field<br>
-of&nbsp;the&nbsp;specified&nbsp;width.&nbsp;&nbsp;The&nbsp;string&nbsp;x&nbsp;is&nbsp;never&nbsp;truncated.</tt></small></dl>
-</td></tr></table>
-<p><table width="100%" cellspacing=0 cellpadding=2 border=0>
-<tr bgcolor="#55aa55">
-<td colspan=3 valign=bottom><small><small>&nbsp;<br></small></small
-><font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
-
-<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;&nbsp;</td>
-<td width="100%"><strong>_StringType</strong> = &lt;type 'string'&gt;<br>
-<strong>__file__</strong> = r'c:\Python21\Lib\string.pyc'<br>
-<strong>__name__</strong> = 'string'<br>
-<strong>_idmap</strong> = '<font color="#c040c0">\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f</font> !"#$%&amp;<font color="#c040c0">\'</font>()*+,-./...<font color="#c040c0">\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff</font>'<br>
-<strong>_idmapL</strong> = None<br>
-<strong>digits</strong> = '0123456789'<br>
-<strong>hexdigits</strong> = '0123456789abcdefABCDEF'<br>
-<strong>letters</strong> = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'<br>
-<strong>lowercase</strong> = 'abcdefghijklmnopqrstuvwxyz'<br>
-<strong>octdigits</strong> = '01234567'<br>
-<strong>printable</strong> = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&amp;<font color="#c040c0">\'</font>()*+,-./:;&lt;=&gt;?@[<font color="#c040c0">\\</font>]^_`{|}~ <font color="#c040c0">\t\n\r\x0b\x0c</font>'<br>
-<strong>punctuation</strong> = '!"#$%&amp;<font color="#c040c0">\'</font>()*+,-./:;&lt;=&gt;?@[<font color="#c040c0">\\</font>]^_`{|}~'<br>
-<strong>uppercase</strong> = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'<br>
-<strong>whitespace</strong> = '<font color="#c040c0">\t\n\x0b\x0c\r</font> '</td></tr></table>
-</body></html> \ No newline at end of file
diff --git a/sandbox/tibs/pysource/notes/thoughts.txt b/sandbox/tibs/pysource/notes/thoughts.txt
deleted file mode 100644
index 59691717b..000000000
--- a/sandbox/tibs/pysource/notes/thoughts.txt
+++ /dev/null
@@ -1,170 +0,0 @@
-Thoughts on pysource
-====================
-
-:Author: Tibs
-:Date: 19 Sep 2002
-
-..
-
- [This is the contents of an email sent from Tibs to me, to tie up
- -- or at least identify -- loose ends. When Tibs writes "you",
- he's referring to me. It is published with Tibs' permission. I
- mostly agree with what Tibs has written. I've added my own notes,
- indented in square brackets, like this one.
-
- --David Goodger]
-
-Well, having looked back at the pysource sources, I'm confirmed
-in my opinion that, if I were to start work on the project again,
-I would probably start a new version of pysource from scratch,
-using what I have learned (essentially, the content of visit.py),
-and taking advantage of all the new technology that is in the
-modern DOCUTILS.
-
-Thus I would (at least):
-
-1. produce a "frontend" using Optik
-2. rewrite visit.py more neatly
-3. construct DOCUTILS nodes to match pysource.dtd
-4. *possibly* meld those into the classes in visit.py
- (but possibly not - some of the stuff in visit.py
- seems to me to be, of necessity, a bit messy as it
- is constructing stuff, and thus it may be premature
- to "DOCUTILS" it before it is necessary).
-5. produce an example transform to amend the Python
- specific DOCUTILS tree into a generic DOCUTILS
- tree.
-
-That's a fair amount of work, and I'm not convinced that I can
-find the sustained effort [1]_, especially if you might be
-willing to take the task on (and if I would have been refactoring
-anyway, a whole different head may be a significant benefit).
-
-.. [1] I believe that's called "British understatement".
-
-Some comments on pysource.txt and pysource.dtd
-----------------------------------------------
-
-I believe that a <docstring> node is a Good Thing. It's a natural
-construct (if one believes that the other nodes are good things
-as well!), and it allows the "transform" of the Python specific
-tree to be done more sensibly.
-
- [I think I finally understand what Tibs is getting at here. I
- thought he meant to have a <docstring> node in an otherwise
- standard Docutils doctree, which just contained the raw docstring.
- Instead, I believe he means that the Python-specific Docutils
- doctree elements like <class_section> and
- <module_section> (see pysource.dtd), should each have a <docstring>
- element which contains ``%structure.model;``, instead of the
- current ``%structure.model;`` directly inside the element. In
- other words, a <docstring> element would be a simple container for
- all the parsed elements of the docstring. On second thought, each
- Python-specific section element would still have to have
- ``%structure.model;``, in order to contain subsections. A
- <package_section> would contain <module_section>s, which would
- contain <class_section>s, and so on.
-
- So a <docstring> element may be useful as a convenience to
- transforms. It would be a trivial change anyhow.
-
- The initial (internal) data structure resulting from the parsing
- of Python modules & packages is a completely different beast. It
- should contain <docstring> nodes, along with <package>, <module>,
- <class>, etc., nodes. But these should *not* be subclasses of
- docutils.nodes.Node, and this tree should not be a "Docutils
- document tree". It should be a separate, parallel structure.
- Document tree nodes (docutils.nodes.Node objects) are not suited
- for this work.
-
- --DG]
-
-I recommend some initial "surgery" on the initial parse tree to
-make finding the docstrings for nodes easier.
-
-I reckon that one produces a Python-specific doctree, and then
-chooses one of several transforms to produce generic doctrees.
-
-By the way, I still vote for "static" introspection - that is,
-without actually importing the module. It does limit what one can
-do in some respects, but there are modules one might want to
-document that one does not wish to import (and indeed, at work we
-have some Python files that essentially cannot be introspected in
-this manner with any ease - they are "designed" to be imported by
-other modules after ``sys.path`` has been mangled suitably, and
-just don't work stand-alone).
-
-I've tried to expand out the ideas you had on how the "pysource"
-tool should work below.
-
- although it occurs to me that this is all terribly obvious,
- really. Oh well...
-
-The pysource tool
------------------
-
-The "input mode" should be the "Python Source Reader".
-
- You can see where I'm starting from in pysource.txt.
-
-This produces, as its output, a Python-specific doctree,
-containing extra nodes as defined in pysource.dtd (etc.).
-
-One of the tasks undertaken by the Python Source Reader is to
-decide what to do with docstrings. For each Python file, it
-discovers (from ``__docformat__``) if the input parser is
-"reStructuredText". If it is, then the contents of each docstring
-in that file will be parsed as such, including sorting out
-interpreted text (i.e., rendering it into links across the tree).
-If it is not, then each docstring will be treated as a literal
-block.
-
- This admits the posibility of adding other parsers *for
- docstrings* at a later date - which I suspect is how HappyDoc
- does it. It is just necessary to publicise the API for the
- Docstring class, and then someone else can provide alternate
- plugins.
-
-The output of the Python Source Reader is thus a Python-specific
-doctree, with all docstrings fully processed (as appropriate),
-and held inside <docstring> elements.
-
-The next stage is handled by the Layout Transformer.
-
- [What I call "stylist transforms". --DG]
-
-This determines the layout of the document to be produced - the
-*kind* or *style* of output that the user wants (e.g., PyDoc
-style, LibRefMan style, generic docutils style, etc.).
-
-Each layout is represented by a class that walks the
-Python-specific doctree, replacing the Python-specific nodes with
-appropriate generic nodes. The output of the Layout Transformer
-is thus a generic doctree.
-
-The final stage is thus a normal DOCUTILS Writer - since it is
-taking input that is a generic doctree, this makes perfect
-sense. This also means that we get maximum leverage from existing
-Writers, which is essential (not just a Good Thing).
-
-As you point out, some layouts will probably only be appropriate
-for some output formats. Well, that's OK. On the other hand, if
-the output of the Layout stage *is* a generic doctree, we're not
-likely to get fatal errors by putting it through the wrong
-Writer, so we needn't worry too much.
-
-Thus one might envisage a command line something like::
-
- pysource --layout:book --format:html this_module
-
-Of course, other command line switches would be options for
-particular phases (e.g., to use frames or not for HTML output). I
-can see wanting a series of configuration files that one could
-reference, to save specifying lots of switches.
-
-One specific thing to be decided, particularly for HTML, is
-whether one is outputting a "cluster" of files (e.g., as javadoc
-does). I reckon this can be left for later on, though (as can
-such issues as saying "other interesting sources are *over
-there*, so reference them if you can" - e.g., the Python
-library).
diff --git a/sandbox/tibs/pysource/pysource.py b/sandbox/tibs/pysource/pysource.py
deleted file mode 100755
index a62c96ebb..000000000
--- a/sandbox/tibs/pysource/pysource.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#! /usr/bin/env python
-"""A simple command line interface for the pysource package
-
-This will become more interesting later on...
-"""
-
-import os
-import sys
-import getopt
-
-import docutils.nodes
-import docutils.utils
-
-# Local modules
-import utils
-import visit
-import html
-
-import transform
-
-__docformat__ = "reST"
-
-
-# ----------------------------------------------------------------------
-def rest_document(filename):
- """Return an reST document.
- """
-
- from docutils.parsers.rst import Parser
-
- file = open(filename)
- try:
- text = file.read()
- finally:
- file.close()
-
- parser = Parser()
- docroot = docutils.utils.new_document()
- parser.parse(text,docroot)
- return docroot
-
-
-# ----------------------------------------------------------------------
-# I don't much like the Unix command line style (I always thought the
-# VMS approach was much more flexible and sensible), but it *does* seem
-# to be what people expect these days...
-
-options = [
- # long option, short, description
- ("verbose", "v", "Report on progress in more detail"),
- ("quiet", "q", "Suppress normal progress messages"),
- ("text", "t", "The input file is a plain (text) reST file"),
- ("show", "s", "Output basic information about the input"),
- ("ast", "a", "Output a representation of the AST"),
- ("xml", "x", "Output an XML representation of the input"),
- ("html", "h", "Output an HTML representation of the input [default]"),
- ("pretty", "p", "Output a 'pretty' representation of the input"),
- ("doctest", "d", "Treat a reST file as doctest input."),
- ("help", "h", "Show 'help' information"),
- ("new", "n", "Use David Goodger's HTML Writer (sort of)"),
- ("stdout", "", "Write output to stdout, instead of a file"),
- ]
-
-def print_usage():
- docstring = visit.Docstring(main.__doc__)
- docstring.show(sys.stdout)
- print
- print " <switches> are:"
- print
- for longopt, shortopt, description in options:
- if shortopt:
- print " -%s, --%-9s %s"%(shortopt,longopt,description)
- else:
- print " --%-9s %s"%(longopt,description)
-
-def main():
- """The command line interface to docutil's Python documentation extractor.
-
- Usage: ``pysource.py <switches> <inpath> [<outfile>]``
-
- <inpath> is the path to a package or module.
-
- <outfile> is the path to the output file. If it's not given, then
- output will be written to a file with the same name as the input
- file, but defaulting to the current directory, and with extension
- derived from the type of output:
-
- - show -> ``.show``
- - ast -> ``.ast``
- - xml -> ``.xml``
- - html -> ``.html``
- - pretty -> ``.pretty``
-
- (unless --stdout is requested). The default is --html.
-
- Note that progress messages (and ``verb`` information) are written
- to ``sys.stderr``.
- """
-
- if len(sys.argv) <= 1:
- print "Not enough arguments"
- print_usage()
- return
-
- shortopts = ''.join([option[1] for option in options])
- longopts = [option[0] for option in options]
- try:
- opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
- except getopt.GetoptError,detail:
- print "Problem with options:",detail
- print_usage()
- return
-
- verbose = 0
- quiet = 0
- input_format = "python"
- output_format = "html"
- want_docutilstree = 1
- new_writer = 0
- write_stdout = 0
-
- for opt, arg in opts:
- if opt in ["-?","--help"]:
- print_usage()
- return
- elif opt in ["-n","--new"]:
- new_writer = 1
- output_format = "html"
- print >>sys.stderr, "Using new HTML Writer"
- elif opt in ["-v","--verbose"]:
- verbose = 1
- elif opt in ["-q","--quiet"]:
- quiet = 1
- elif opt in ["-t","--text"]:
- input_format = "text"
- elif opt in ["-s","--show"]:
- output_format = "show"
- want_docutilstree = 0
- elif opt in ["-a","--ast"]:
- output_format = "ast"
- want_docutilstree = 0
- elif opt in ["-x","--xml"]:
- output_format = "xml"
- elif opt in ["-h","--html"]:
- output_format = "html"
- elif opt in ["-d","--doctest"]:
- output_format = "doctest"
- elif opt in ["-p","--pretty"]:
- output_format = "pretty"
- elif opt == "--stdout":
- write_stdout = 1
- else:
- raise getopt.GetoptError, "getopt should have saved us!"
-
- if len(args) == 0 or len(args) > 2:
- print "Please specify an input and an (optional) output"
- print_usage()
- return
-
- if input_format == "text" and \
- output_format not in ["xml","html","pretty","doctest"]:
- print "--text only supports --xml, --html, --pretty or --doctest"
- print_usage()
- return
-
- if input_format == "text" and output_format == "doctest" \
- and len(args) == 2:
- print "--doctest does not accept an output file"
- # Should it?
- print_usage()
- return
-
- if write_stdout and len(args) == 2:
- print "It doesn't make sense to specify --stdout and an output file"
- print_usage()
- return
-
- filename = args[0]
- if len(args) == 2:
- if not quiet:
- print >>sys.stderr, "... Output will go to",args[1]
- outstream = open(args[1],"w")
- elif write_stdout:
- if not quiet:
- print >>sys.stderr, "... Output will go to standard output"
- outstream = sys.stdout
- else:
- head,tail = os.path.split(filename)
- base,ext = os.path.splitext(tail)
- outname = "%s.%s"%(base,output_format)
- if not quiet:
- print >>sys.stderr, "... Output will go to",outname
- outstream = open(outname,"w")
-
- try:
- if output_format == "doctest":
- from doctest import Tester
- if not quiet: print >>sys.stderr, "*** Doctesting the document"
- t = Tester(globs={},verbose=verbose)
- (fail,total) = t.runstring(open(filename).read(),filename)
- if not quiet and not verbose:
- print >>sys.stderr, "*** ",
- if fail:
- print "%d of"%fail,
- if total == 1:
- print "1 example",
- else:
- print "%d examples"%total,
- if fail:
- print "failed"
- else:
- print "passed"
- elif input_format == "text":
- if not quiet: print >>sys.stderr, "*** Making the document"
- document = rest_document(filename)
- else:
- if os.path.isdir(filename):
- print >>sys.stderr, "*** Parsing the Python package",filename
- thing = visit.Package(None, filename)
- else:
- print >>sys.stderr, "*** Parsing the Python file",filename
- thing = visit.Module(None, filename)
-
- if want_docutilstree:
- if not quiet:
- print >>sys.stderr, "*** Making the document"
- with_groups = not new_writer
- process = transform.Process(with_groups)
- document = process(thing)
-
- if output_format == "show":
- thing.show(outstream)
- elif output_format == "ast":
- thing.show_ast(outstream)
- print
- elif output_format == "pretty":
- outstream.write(document.pformat(indent=" "))
- elif output_format == "xml":
- if not quiet: print >>sys.stderr, "*** Producing a DOM tree"
- domtree = document.asdom()
- if not quiet: print >>sys.stderr, " Writing XML"
- domtree.writexml(outstream,indent="", addindent=" ",newl="\n")
- elif output_format == "html":
- if not quiet: print >>sys.stderr, "*** Writing HTML"
- if new_writer:
- from docutils.writers.html4css1 import Writer
- writer = Writer()
- writer.write(document,outstream)
- elif input_format == "text":
- writer = html.Writer()
- writer(document,outstream)
- else:
- writer = html.PythonWriter()
- writer(document,outstream)
- finally:
- if outstream != sys.stdout:
- outstream.close()
-
-
-# ----------------------------------------------------------------------
-if __name__ == "__main__":
- main()
diff --git a/sandbox/tibs/pysource/rjhack.py b/sandbox/tibs/pysource/rjhack.py
deleted file mode 100755
index 6046312ac..000000000
--- a/sandbox/tibs/pysource/rjhack.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-
-# Author: Richard Jones
-# Contact: richard@users.sourceforge.net
-# Revision: $Revision$
-# Date: $Date$
-# Copyright: This module has been placed in the public domain.
-
-"""
-A front end to the Docutils Publisher, taking Python source and producing HTML.
-"""
-
-import os, locale
-try:
- locale.setlocale(locale.LC_ALL, '')
-except:
- pass
-
-import visit, transform
-
-from docutils.parsers.rst import Parser
-class SourceParser(Parser):
- supported = ('pysource',)
- settings_spec = (
- 'PySource Parser Options',
- None,
- (('Be verbose while parsing', ['--verbose-parse'],
- {'action': 'store_true'}),
- )) + Parser.settings_spec
- def parse(self, filename, document):
- if os.path.isdir(filename):
- thing = visit.Package(document.settings, filename)
- else:
- thing = visit.Module(document.settings, filename)
- process = transform.Process(with_groups=0, document=document)
- process(thing)
-
-from docutils.readers import Reader
-class SourceReader(Reader):
- def read(self, source, parser, settings):
- self.source = source
- if not self.parser:
- self.parser = parser
- self.settings = settings
- # we want the input as the filename, not the file content
- self.source.source.close()
- self.input = self.source.source_path
- self.parse()
- return self.document
-
-from docutils.core import publish_cmdline, default_description
-description = ('Generates (X)HTML documents from Python sources. '
- + default_description)
-parser = SourceParser()
-reader = SourceReader(parser, 'pysource')
-publish_cmdline(reader=reader, parser=parser, writer_name='html',
- description=description)
-
diff --git a/sandbox/tibs/pysource/test/readme.txt b/sandbox/tibs/pysource/test/readme.txt
deleted file mode 100644
index a6af4576d..000000000
--- a/sandbox/tibs/pysource/test/readme.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Files in the ``test`` directory
--------------------------------
-
-This directory is intended to contain various test file. They are (hopefully)
-named in a consistent manner:
-
-README.txt
- This file.
-
-``*.rtxt``
- Sample reST text files, suitable for checking odd things.
-
-``*.py``
- Sample Python test files, ditto.
-
-``*.doctest``
- Files that contain "semiliterate testing" [1]_ -- that is,
- descriptive text (written with reST) surrounding doctest blocks.
- The idea is that these files should be passed to (for instance)
- pydps.py (or whatever it is called at the moment) to be tested by
- Tim Peters' doctest - for instance::
-
- pydps/pydps.py --text --doctest simple.doctest
-
-
-
-.. [1] a semi-lame reference to literate programming, I'm afraid.
diff --git a/sandbox/tibs/pysource/test/test.doctest b/sandbox/tibs/pysource/test/test.doctest
deleted file mode 100644
index bc91115ad..000000000
--- a/sandbox/tibs/pysource/test/test.doctest
+++ /dev/null
@@ -1,12 +0,0 @@
-The following is some Python code:
-
- >>> a = 1
- >>> a
- 1
-
-and here is some more:
-
- >>> a + 1
- 3
-
-and that's all.
diff --git a/sandbox/tibs/pysource/test/test.py b/sandbox/tibs/pysource/test/test.py
deleted file mode 100755
index b3e380526..000000000
--- a/sandbox/tibs/pysource/test/test.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""A simple test file for input to ast-mining.py.
-
-But it isn't a "raw" string, so:
-
- \\*escape* \\`with` "\\\\"
-"""
-
-__docformat__ = "reST"
-
-import string
-
-one = 1
-
-"""Documentation after `one` (intervening blank line)"""
-
-two,three = 2,3
-"""Documenatation after ``two,three=2,3``"""
-
-four,five = two,three
-
-six = [four,five]
-"""Documentation after ``six=[four,five]``"""
-
-global gmodule
-gmodule = 1
-"""Global at the module level"""
-
-def func(a,b=1,c='jim',d=None,e=[],f={'a':1},g=(1,2,3)):
- r"""Function at the module level
-
- This *is* a "raw" string, so:
-
- \*escape* \`with` "\\"
- """
-
- from string import lstrip,rstrip
-
- a = 3
-
- global gfunc
- gfunc = 1
- """Global referenced only within `func()`"""
-
- global one
- one = 2
-
- class InFunc:
- pass
-
- def infunc():
- """Function defined inside function `func()`"""
- global ginner
- ginner = 1
- """Global referenced only within `infunc()`"""
-
- class Silly:
- pass
-
- def silly_fn():
- pass
-
-def func2(a,*args,**kargs):
- pass
-
-def func3((a,b,c),d):
- pass
-
-class Fred:
- """Class at the module level."""
-
- a = 1
- """Documentation for class value `a`"""
-
- global gclass
- gclass = 2
- """Global referenced only within `Fred`"""
-
- def __init__(self):
- """Initialisation for `Fred`"""
- self.b = 2
- """`self.b` within `Fred.__init__()`"""
-
- c = 3
- """Local variable within `Fred.__init__()`"""
-
- global gmeth
- gmeth = 3
- """Global referenced only within a method"""
-
- global gagain
- gagain = 3
-
- class Insider:
- """Class defined inside `Fred.__init__()`"""
-
- a = 'jim'
- """Local name within class inside `Fred.__init__()`"""
-
- global gclass2
- gclass2 = 4
- """Global referenced only within a class within a method"""
-
- global gunused
- global gagain
-
- def fred(self):
- global gunused2,gfunc2
- gfunc2 = 5
- """Global referenced only within a method in a
- class in a method
- """
-
- def fredinner():
- global ginner2
- global gagain
- ginner2 = 6
- gagain = 6
-
- infredinner = 7
-
-class Jim(Fred):
- pass
-
-
diff --git a/sandbox/tibs/pysource/test/test.rtxt b/sandbox/tibs/pysource/test/test.rtxt
deleted file mode 100644
index f28a3d4e2..000000000
--- a/sandbox/tibs/pysource/test/test.rtxt
+++ /dev/null
@@ -1,442 +0,0 @@
-pydps test document
-===================
-
-:Author: Tibs
-:Version: 0.1
-:Eggs: Green
-:Ham: Green
-
-This is intended to be a simple test document, with "something of everything".
-It is *not* intended to trawl for *problems*, but just to check I've got the
-writing out of just about everything supported in the HTML writer.
-
- :Author: Tibs
- :Version: 0.1
- :Eggs: Green
- :Ham: Green
- :Parameter i: integer
-
-Lists
------
-1. A list
-2. Some more
-3.
-
- * What's this?
- - and this?
- + and this?
-
-i. And this is Roman
-
-a. And this is alpha
-
-A. And so is this
-
-I. What is this?
-
-.. Just a comment, honest.
- That's all.
-
-A title
- and some text.
-And another
- and more text.
-
-Short options:
-
--a option a
-
--b file option b
-
--cname option c
-
-Long options:
-
---aaaa option aaaa
---bbbb=file option bbbb
---cccc name option cccc
---d-e-f-g option d-e-f-g
---h_i_j_k option h_i_j_k
-
-VMS/DOS-style options:
-
-/A option A
-/B file option B
-/Cstring option C
-
-Mixed short, long, and VMS/DOS options:
-
--a option a
---bbbb=file option bbbb
-/C option C
---dddd name option dddd
--e string option e
-/F file option F
-
-Aliased options:
-
--a, --aaaa, /A option a, aaaa, A
--b file, --bbbb=file, /B file option b, bbbb, B
-
-Multiple lines in descriptions, aligned:
-
--a option a, line 1
- line 2
--b file option b, line 1
- line 2
-
-Multiple lines in descriptions, not aligned:
-
--a option a, line 1
- line 2
--b file option b, line 1
- line 2
-
-Some edge cases:
-
---option=arg arg too many arguments
-
---option=arg=arg too many arguments
-
--aletter arg too many arguments (-a letter)
-
-/Aletter arg too many arguments (/A letter)
-
--a=b can't use = for short arguments
-
-/A=b can't use = for DOS/VMS arguments?
-
---option= argument missing
-
---=argument option missing
-
--- everything missing
-
-- this should be a bullet list item
-
-+ bullet
-
-.. Comments swallow up all indented text following.
-
- (Therefore this is not a) block quote.
-
-- bullet
-
- If we want a block quote after this bullet list item,
- we need to use an empty comment:
-
-..
-
- Block quote.
-
-Other blocks
-------------
-
-::
-
- Anonymous literal block
-
-This is a literal block::
-
- This here.
-
-And we don't need colons ::
-
- Not really.
-
-Of course, **I** like Python:
-
- >>> print " Indented block & output."
- Indented block & output.
-
-Or maybe I don't::
-
- >>> print " Indented block & output."
- Indented block & output.
-
-Footnotes
----------
-
-Autonumbered footnotes
-......................
-[#]_ is the first auto-numbered footnote reference.
-[#]_ is the second auto-numbered footnote reference.
-
-.. [#] Auto-numbered footnote 1.
-.. [#] Auto-numbered footnote 2.
-.. [#] Auto-numbered footnote 3.
-
-[#]_ is the third auto-numbered footnote reference.
-
-Autonumbered and named footnotes
-................................
-[#six]_ is a reference to the sixth auto-numbered footnote.
-
-.. [#four] Fourth auto-numbered footnote.
-.. [#five] Fifth auto-numbered footnote.
-.. [#six] Sixth auto-numbered footnote.
-
-[#five]_ is a reference to the fifth auto-numbered footnote.
-[#four]_ is a reference to the fourth auto-numbered footnote.
-[#six]_ is another reference to the sixth auto-numbered footnote.
-
-Here are some internal cross-references to the implicit targets
-generated by the footnotes: four_, five_, six_.
-
-Mixed anonymous and labelled auto-numbered footnotes
-....................................................
-[#ten]_ should be 10, [#]_ should be 7,
-[#]_ should be 9, [#]_ is one too many,
-[#eight]_ should be 8, and [#twelve]_ doesn't exist,
-nor does [#eleven]_.
-
-.. [#] Auto-numbered footnote 7.
-.. [#eight] Auto-numbered footnote 8.
-.. [#] Auto-numbered footnote 9.
-.. [#ten] Auto-numbered footnote 10.
-.. [#eleven] Auto-numbered footnote 11.
-.. [#eleven] Auto-numbered footnote 11 again (duplicate).
-
-Inline stuff
-------------
-(**strong**) but not (**) or '(** ' or x**2 or \\**kwargs or **
-
-(however, '**kwargs' will trigger a warning and may be problematic)
-
-Strong asterisk: *****
-
-Strong double asterisk: ******
-
-``literal``
-``lite\\ral``
-
-``literal ``TeX quotes'' & \\backslash`` but not "``" or ``
-
-(however, ``standalone TeX quotes'' will trigger a warning
-and may be problematic)
-
-Find the ```interpreted text``` in this paragraph!
-
-`interpreted`
-:role:`interpreted`
-
-`interpreted` but not \\`interpreted` [`] or ({[`] or [`]}) or `
-
-`interpreted`-text `interpreted`: text `interpreted`:text `text`'s interpreted
-
-http://www.standalone.hyperlink.com
-
-one-slash-only:/absolute.path
-
-mailto:someone@somewhere.com
-
-news:comp.lang.python
-
-An email address in a sentence: someone@somewhere.com.
-
-ftp://ends.with.a.period.
-
-(a.question.mark@end?)
-
-Tables
-------
-
-+-------------------------------------+
-| A table with one cell and one line. |
-+-------------------------------------+
-
-+-----------------------+
-| A malformed table. |
-+-----------------------+
-
-+------------------------+
-| A well-formed | table. |
-+------------------------+
-
-+------------------------+
-| This +----------+ too! |
-+------------------------+
-
-+--------------------------+
-| A table with three rows, |
-+------------+-------------+
-| and two | columns. |
-+------------+-------------+
-| First and last rows |
-| contain column spans. |
-+--------------------------+
-
-+------------+-------------+---------------+
-| A table | two rows in | and row spans |
-| with three +-------------+ to left and |
-| columns, | the middle, | right. |
-+------------+-------------+---------------+
-
-+------------+-------------+---------------+
-| A table | | two rows in | and funny |
-| with 3 +--+-------------+-+ stuff. |
-| columns, | the middle, | | |
-+------------+-------------+---------------+
-
-+-----------+-------------------------+
-| W/NW cell | N/NE cell |
-| +-------------+-----------+
-| | Middle cell | E/SE cell |
-+-----------+-------------+ |
-| S/SE cell | |
-+-------------------------+-----------+
-
-+--------------+-------------+
-| A bad table. | |
-+--------------+ |
-| Cells must be rectangles. |
-+----------------------------+
-
-+-------------------------------+
-| A table with two header rows, |
-+------------+------------------+
-| the first | with a span. |
-+============+==================+
-| Two body | rows, |
-+------------+------------------+
-| the second with a span. |
-+-------------------------------+
-
-+-------------------------------+
-| A table with two head/body |
-+=============+=================+
-| row | separators. |
-+=============+=================+
-| That's bad. | |
-+-------------+-----------------+
-
-The traditional:
-
- +------------------------+------------+----------+----------+
- | Header row, column 1 | Header 2 | Header 3 | Header 4 |
- +========================+============+==========+==========+
- | body row 1, column 1 | column 2 | column 3 | column 4 |
- +------------------------+------------+----------+----------+
- | body row 2 | Cells may span columns. |
- +------------------------+------------+---------------------+
- | body row 3 | Cells may | - Table cells |
- +------------------------+ span rows. | - contain |
- | body row 4 | | - body elements. |
- +------------------------+------------+---------------------+
-
-+-----------------+--------+
-| A simple table | cell 2 |
-+-----------------+--------+
-| cell 3 | cell 4 |
-+-----------------+--------+
-No blank line after table.
-
-+-----------------+--------+
-| A simple table | cell 2 |
-+-----------------+--------+
-| cell 3 | cell 4 |
-+-----------------+--------+
- Unexpected indent and no blank line after table.
-
-+------------------------------+
-| This table contains another. |
-| |
-| +-------------------------+ |
-| | A table within a table. | |
-| +-------------------------+ |
-+------------------------------+
-
-+------------------+--------+
-| A simple table | |
-+------------------+--------+
-| with empty cells | |
-+------------------+--------+
-
-Links and so on
----------------
-.. _target:
-
-(internal hyperlink)
-
-.. _one-liner: http://structuredtext.sourceforge.net
-
-.. _starts-on-this-line: http://
- structuredtext.
- sourceforge.net
-
-.. _entirely-below:
- http://structuredtext.
- sourceforge.net
-
-.. _target1: Not a proper hyperlink target
-
-.. _a long target name:
-
-.. _`a target name: including a colon (quoted)`:
-
-.. _a target name\: including a colon (escaped):
-
-.. _target2: http://www.python.org/
-
-(indirect external hyperlink)
-
-Duplicate indirect links (different URIs):
-
-.. _target3: first
-
-.. _target3: second
-
-Duplicate indirect links (same URIs):
-
-.. _target4: first
-
-.. _target4: first
-
-Directives
-----------
-.. Attention:: Directives at large.
-
-.. Note:: This is a note.
-
-.. Tip:: 15% if the
- service is good.
-
-- .. WARNING:: Strong prose may provoke extreme mental exertion.
- Reader discretion is strongly advised.
-- .. Error:: Does not compute.
-
-.. Caution::
-
- Don't take any wooden nickels.
-
-.. DANGER:: Mad scientist at work!
-
-.. Important::
- - Wash behind your ears.
- - Clean up your room.
- - Call your mother.
- - Back up your data.
-
-.. image:: images/ball.gif
-
-.. image::
- picture.png
- [height=100 width=200 scale=50]
-
-.. figure:: picture.png
-
- A picture with a caption.
-
-.. figure:: picture.png
-
- A picture with a caption and a legend.
-
- +-----------------------+-----------------------+
- | Symbol | Meaning |
- +=======================+=======================+
- | .. image:: tent.png | Campground |
- +-----------------------+-----------------------+
- | .. image:: waves.png | Lake |
- +-----------------------+-----------------------+
- | .. image:: peak.png | Mountain |
- +-----------------------+-----------------------+
diff --git a/sandbox/tibs/pysource/test/testassign.py b/sandbox/tibs/pysource/test/testassign.py
deleted file mode 100755
index e4d70a356..000000000
--- a/sandbox/tibs/pysource/test/testassign.py
+++ /dev/null
@@ -1,12 +0,0 @@
-class Jim:
-
- def __init__(self):
- a = 1
- a = [2,3]
- a,b = 4,5
- a,b = [6,7]
- a,self.a = 8,9
- a = b = self.a = 10
- a,b = c,d = 11,12
- self.a,self.b = 13,14
- self.a = self.b = 15
diff --git a/sandbox/tibs/pysource/test/testfunc.py b/sandbox/tibs/pysource/test/testfunc.py
deleted file mode 100755
index 4a887b098..000000000
--- a/sandbox/tibs/pysource/test/testfunc.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Stuff needed to make the examples compile...
-class Fred:
- def __getitem__(self,index):
- pass
-a = Fred()
-b = [1,2,3,4]
-d = Fred()
-
-def func1(a,b=1,c='jim',d=None,e=[],f={'a':1,a:1},g=(1,2,3)):
- pass
-
-def func2(a,*args,**kargs):
- pass
-
-def func2a(a,*args):
- pass
-
-def func2b(a,**kargs):
- pass
-
-def func3((a,b,c),d):
- pass
-
-def func4(a=a,b=Fred,c=Fred()):
- pass
-
-def func5(a=[x for x in [1,2,3] if x > 2],
- b=[(x,y) for x in [1,2,3] for y in [3,4,5]]):
- pass
-
-def func6(a=b[1:2],c=d[1,4:6,...,8:9:10],
- e=lambda x: x*2,
- f=lambda x,a=a: func5(x,a)):
- pass
diff --git a/sandbox/tibs/pysource/test/testinterpreted.py b/sandbox/tibs/pysource/test/testinterpreted.py
deleted file mode 100755
index 00eb59311..000000000
--- a/sandbox/tibs/pysource/test/testinterpreted.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""Test interpreted text
-
-This module (`testinterpreted`) contains one :class:`Fred`
-(and one hopes `Fred` will also work) and a function *and*
-a method called `fred`.
-
-NB: the above sentence *should*, when transformed into HTML
-or some other output format, hopefully, contain text something
-like::
-
- contains one class Fred
-
-i.e., the ``:class:`Fred``` should probably cause the "insertion"
-of the word "class". Or so I think.
-""" #'
-
-__docformat__ = "reST"
-
-class Fred:
- """This class (`Fred`), in :module:`testinterpreted`, contains
- a method `fred`.
- """
-
- jim = None
- """A class value, a default.
- """
-
- def fred(self):
- """This method (`fred`) is in class `Fred`
- """
- fred = 3
- """This name (`fred`) is in :function:`fred` in class `Fred`.
- """
-
-def fred(fred):
- """This function (:function:`fred`) is *not* in class `Fred`.
-
- It has one argument, :parameter:`fred`.
-
- If I just say `fred`, what *should* that resolve to?
- """
- fred.jim = 3
- """We assume that `fred` must be something with a `jim` attribute...
- """
diff --git a/sandbox/tibs/pysource/test/testinterpreted2.py b/sandbox/tibs/pysource/test/testinterpreted2.py
deleted file mode 100755
index 59dac777a..000000000
--- a/sandbox/tibs/pysource/test/testinterpreted2.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""
-This is the example from David Goodger's DPS document pysource-reader.txt.
-"""
-
-__docformat__ = "restructuredtext"
-
-class Keeper(Storer):
-
- """
- Extend `Storer`. Class attribute `instances` keeps track of
- the number of `Keeper` objects instantiated.
- """
-
- instances = 0
- """How many `Keeper` objects are there?"""
-
- def __init__(self):
- """
- Extend `Storer.__init__()` to keep track of instances.
-
- Keep count in `self.instances` and data in `self.data`.
- """
- Storer.__init__(self)
- self.instances += 1
-
- self.data = []
- """Store data in a list, most recent last."""
-
- def storedata(self, data):
- """
- Extend `Storer.storedata()`; append new `data` to a list
- (in `self.data`).
-
- Use :method:`Keeper.storedata` to store the object's data in
- `Keeper.data`:instance_attribute:.
- """
- self.data = data
diff --git a/sandbox/tibs/pysource/test/testsimp.py b/sandbox/tibs/pysource/test/testsimp.py
deleted file mode 100755
index 7dfeb4202..000000000
--- a/sandbox/tibs/pysource/test/testsimp.py
+++ /dev/null
@@ -1,12 +0,0 @@
-a = 'b'
-class Fred:
- """A *silly* demonstration."""
-
- def __init__(self, b=1, c='jim', d=None, f={'a':1,a:1},
- g=[x for x in [1,2,3] if x > 2]):
- """Initialise ourselves."""
- self.list = g
-
- def __call__(self,a):
- """Call ourselves."""
- pass
diff --git a/sandbox/tibs/pysource/test/testyield.py b/sandbox/tibs/pysource/test/testyield.py
deleted file mode 100755
index e3fd1d2d0..000000000
--- a/sandbox/tibs/pysource/test/testyield.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from __future__ import generators
-from string import lower as lll
-from string import lower as lll, upper as uuu, lower, lower as xxx
-
-def fred():
- a = 1
- yield a
-
diff --git a/sandbox/tibs/pysource/transform.py b/sandbox/tibs/pysource/transform.py
deleted file mode 100755
index f93f17ed4..000000000
--- a/sandbox/tibs/pysource/transform.py
+++ /dev/null
@@ -1,358 +0,0 @@
-"""Transfer the structure from visit.py into a DOCUTILS node tree.
-
-TODO: ensure that the encoding of individual items makes sense.
-
-This should probably be using David's new mechanisms from the docutils module
-to build the DOCUTILS tree - but they were written after this was coded, and
-I've still to investigate them.
-"""
-
-import string
-
-import docutils.nodes
-import docutils.utils
-
-import visit
-import utils
-import buildtree
-
-__docformat__ = "reST"
-
-
-# ----------------------------------------------------------------------
-class Process:
- """The infrastucture that knows how to produce our DOCUTILS node tree.
- """
-
- def __init__(self, with_groups=1, document=None):
- """Instantiate our transformation to a DOCUTILS tree.
-
- At the moment, whilst we are considering both my own old HTML
- output and also moving towards David Goodger's DOCUTILS HTML output,
- we have the ``with_groups`` argument - if this is false then
- buildtree will not output "group" elements...
- """
- self.current_module = None
- self.dps = buildtree.BuildTree(with_groups=with_groups, root=document)
-
- def __call__(self,thing):
- """Produce a DOCUTILS 'document' node and attach our information to it
- """
- self.dps.start("document")
-
- if thing.__class__ == visit.Package:
- self.add_package(thing)
- elif thing.__class__ == visit.Module:
- self.add_module(thing)
- else:
- raise ValueError,"Argument must be a Package or Module,"\
- " not a %s"%thing.__class__.__name__
-
- self.dps.end("document")
- document = self.dps.finish()
-
- # David's HTML writer requires the document to have a "source"
- # attribute - so add a temporary one (something better should
- # be done later on - see what David does!)
- document["source"] = "pysource"
- return document
-
- def add_package(self,thing):
- """Process a package and produce DOCUTILS nodes for it.
- """
-
- self.dps.start("section",style="package")
- self.dps.add("target",name=thing.label())
- self.dps.add("title",self.title(thing))
-
- self.dps.start("group",style="details")
- self.dps.add("paragraph","Path: "+thing.directory)
- self.dps.end("group")
-
- for mod in thing.getModules():
- self.add_module(mod)
-
- self.dps.end("section")
-
- def add_module(self,thing):
- """Process a module and produce DOCUTILS nodes for it.
- """
-
- self.current_module = thing
-
- self.dps.add("target",name=thing.label())
- self.dps.start("section",style="module")
- self.dps.add("title",self.title(thing))
-
- self.dps.start("group",style="details")
- self.dps.start("paragraph","Full name: ")
- self.dps.add("emphasis",thing.fullname)
- self.dps.end("paragraph")
- self.dps.add("paragraph","Path: "+thing.filename)
- self.dps.end("group")
-
- self.add_generic(thing)
-
- obscure = thing.getObscureGlobals()
- if obscure:
- self.dps.start("group",style="obscure_globals")
- self.dps.start("paragraph")
- self.dps.add("strong","Globals in obscure places")
- self.dps.start("bullet_list")
-
- for name,places in thing.getObscureGlobals():
- self.dps.start("list_item")
- self.dps.start("paragraph")
- self.dps.add("literal",name)
- self.dps.add("text"," defined and used in")
- if len(places) == 1:
- self.dps.add("text"," ")
- self.dps.add("literal",places[0])
- else:
- self.dps.add("text",":")
- self.dps.start("bullet_list")
- for place in places:
- self.dps.add("list_item",
- self.dps.make("literal",place))
- self.dps.end("bullet_list")
- self.dps.end("list_item")
- self.dps.end("bullet_list")
- self.dps.end("group")
-
- self.dps.end("section")
-
- def add_generic(self,thing):
- """Basic stuff, common to just about all things
- """
-
- # Side effects, all is side effects...
- self.add_docstring(thing)
- self.add_imports(thing)
- self.add_attributes(thing)
- self.add_classes(thing)
- self.add_functions(thing)
-
- def add_docstring(self,thing):
- is_function = (thing.__class__ in [visit.Method,visit.Function])
-
- if not thing.docstring and not is_function:
- return
-
- self.dps.start("group",style="docstring")
-
- if is_function:
- args = thing.getArgs()
- self.dps.start("paragraph")
- # Make the function/method name easily findable...
- self.dps.start("literal",style="funcall")
- self.dps.add("text",thing.name)
- self.dps.end("literal")
- # And then we have the arguments...
- self.dps.add("target",name=thing.args_label())
- self.dps.start("literal",style="funargs")
- self.dps.add("text","(%s)"%string.join(args,", "))
- self.dps.end("literal")
- self.dps.end("paragraph")
-
- if thing.docstring:
- # Insert the docstring into our tree structure
- thing.docstring.add_to_DPS(self.dps)
-
- self.dps.end("group")
-
- # #############################################################
- # Should we sort things alphabetically within each list, below?
- # - maybe yes for some, but no for others...
- # #############################################################
-
- def add_imports(self,thing):
- """Work out a description of any imports.
-
- `thing` is the visitor node that we are to use to construct
- DOCUTILS nodes.
- """
-
- imports = thing.getImports()
- froms = thing.getFromImports()
-
- if not imports and not froms:
- return
-
- self.dps.add("target",name=thing.label())
- self.dps.start("group",style="imports")
- self.dps.start("paragraph")
- self.dps.add("strong","Imports:")
- self.dps.start("bullet_list")
-
- if imports:
- names = imports.keys()
- names.sort()
- for name in names:
- self.dps.start("list_item")
- self.dps.start("paragraph","import ")
- self._add_import(name,imports)
- self.dps.end("list_item")
-
- if froms:
- #print froms
- modnames = froms.keys()
- modnames.sort()
- for modname in modnames:
- self.dps.start("list_item")
- self.dps.start("paragraph","from ")
- self.dps.add("literal",modname)
- self.dps.add("text"," import ")
- dict = froms[modname]
- names = dict.keys()
- names.sort()
- uselist = len(names) > 1
- if uselist:
- self.dps.start("bullet_list")
- for name in names:
- if uselist:
- self.dps.start("list_item")
- self._add_import(name,dict)
- self.dps.end("list_item")
- else:
- self._add_import(name,dict)
- if uselist:
- self.dps.end("bullet_list")
- self.dps.end("list_item")
-
- self.dps.end("bullet_list")
- self.dps.end("group")
-
- def _add_import(self,name,import_dict):
- self.dps.add("literal",name)
- aslist = import_dict[name]
- if len(aslist) == 1 and aslist[0] == None:
- self.dps.add("text"," (as ");
- self.dps.add("emphasis","itself");
- self.dps.add("text",")");
- else:
- self._add_aslist(aslist)
-
- def _add_aslist(self,aslist):
- self.dps.add("text"," as ")
- another = 0
- for name in aslist:
- if another:
- self.dps.add("text",", ")
- else:
- another = 1
- if name is None:
- self.dps.add("emphasis","itself")
- else:
- self.dps.add("literal",name)
-
- def add_attributes(self,thing):
- attributes = thing.getAttributeNames()
- if not attributes:
- return
-
- # We don't do attributes for functions, or for methods that are
- # not called "__init__" or "__new__" (the DOCUTILS spec doesn't require
- # retention of attributes in "__new__" methods, but it seems sensible
- # to me, and I'm not sure they were around when the DOCUTILS spec was
- # first written...)
- if thing.__class__ == visit.Function:
- return
- if thing.__class__ == visit.Method and \
- thing.name not in ("__init__","__new__"):
- return
-
- self.dps.start("group",style="attributes")
- self.dps.start("paragraph")
- self.dps.add("strong","Attributes:")
- self.dps.start("bullet_list")
-
- for name in attributes:
- self.dps.start("list_item")
- nameinst = thing.getAttribute(name)
- self.dps.start("paragraph")
- self.dps.add("target",name=nameinst.label())
- self.dps.add("literal",nameinst.getAsString())
- if nameinst.isGlobal():
- self.dps.add("text"," ")
- self.dps.add("emphasis","(global)")
- if nameinst.__class__ == visit.InstanceValue and \
- nameinst.see_also:
- self.dps.add("text"," - see also class instance ")
- self.dps.add("a",nameinst.our_class.name,
- href="#"+nameinst.our_class.label())
- self.add_docstring(nameinst)
- self.dps.end("list_item")
-
- self.dps.end("bullet_list")
- self.dps.end("group")
-
- def add_classes(self,thing):
- class_names = thing.getClassNames()
- for name in class_names:
- class_instance = thing.getClass(name)
- self.add_class(class_instance)
-
- def add_class(self,thing):
- """Process a class and produce DOCUTILS nodes for it.
- """
-
- self.dps.add("target",name=thing.label())
- self.dps.start("section",style="class")
- self.dps.add("title",self.title(thing))
-
- self.dps.start("group",style="details")
- self.dps.start("paragraph","Full name: ")
- self.dps.add("emphasis",thing.fullname)
-
- names = thing.getBaseNames()
- if names:
- self.dps.start("paragraph","Inherits from: ")
- done_one = 0
- for name in names:
- if done_one:
- self.dps.add("text",", ")
- else:
- done_one = 1
- self.dps.add("literal",name)
- self.dps.end("group")
-
- self.add_generic(thing)
- self.dps.end("section")
-
- def add_functions(self,thing):
- """Add information about any functions or methods.
- """
-
- func_names = thing.getFunctionNames()
- for name in func_names:
- fun_instance = thing.getFunction(name)
- self.add_function(fun_instance)
-
- def add_function(self,thing):
- """Process a function or method and produce DOCUTILS nodes for it.
- """
-
- if thing.__class__ == visit.Method:
- style = "method"
- else:
- style = "function"
- self.dps.add("target",name=thing.label())
- self.dps.start("section",style=style)
- self.dps.add("title",self.title(thing))
-
- self.dps.start("group",style="details")
- self.dps.start("paragraph","Full name: ")
- self.dps.add("emphasis",thing.fullname)
- self.dps.end("group")
-
- if thing.generator:
- self.dps.start("group",style="generator")
- self.dps.add("paragraph","%s %s is actually a generator"%\
- (thing.__class__.__name__,thing.name))
- self.dps.end("group")
-
- self.add_generic(thing)
- self.dps.end("section")
-
- def title(self,thing):
- return "%s %s"%(thing.__class__.__name__,thing.name)
diff --git a/sandbox/tibs/pysource/utils.py b/sandbox/tibs/pysource/utils.py
deleted file mode 100755
index 8823c9265..000000000
--- a/sandbox/tibs/pysource/utils.py
+++ /dev/null
@@ -1,474 +0,0 @@
-"""Utilities for pysource
-"""
-
-import types
-import string
-import compiler
-
-# We'd better have at least *one* module in this package that demonstrates
-# *not* using reST for our docstrings...
-__docformat__ = "none"
-
-
-# ----------------------------------------------------------------------
-PLAINTEXT = "plaintext"
-RESTRUCTUREDTEXT = "restructuredtext"
-
-canonical_format = { "plaintext" : PLAINTEXT,
- "plain" : PLAINTEXT,
- "none" : PLAINTEXT,
- "rst" : RESTRUCTUREDTEXT,
- "rest" : RESTRUCTUREDTEXT,
- "rtxt" : RESTRUCTUREDTEXT,
- "restructuredtext" : RESTRUCTUREDTEXT,
- }
-
-def docformat(text):
- """Interpret a module's __docformat__ string.
-
- Returns a tuple of (format,language)
- """
- if text == None:
- return PLAINTEXT,"en"
-
- words = string.split(string.lower(text))
-
- #print words
-
- if len(words) == 0:
- return PLAINTEXT,"en"
- elif len(words) > 2:
- raise ValueError,"__docformat__ may be at most two 'words'"
-
- if len(words) == 2:
- language = string.lower(words[1])
- else:
- language = "en"
-
- try:
- format = canonical_format[string.lower(words[0])]
- except KeyError:
- legal = canonical_format.keys()
- legal.sort()
- raise ValueError,"__docformat__ should be one of %s"%legal
-
- return format,language
-
-
-# ----------------------------------------------------------------------
-def flatten(item):
- """Retrieve some simpler representation of our AST.
-
- (and it's not meant to be 'theoretically' wonderful, just something
- I can look at to work out how an AST works...)
- """
- if isinstance(item,compiler.ast.Node):
- things = [item.__class__.__name__]
- children = item.getChildren()
- for child in children:
- things.append(flatten(child))
- return things
- else:
- return [item]
-
-
-# ----------------------------------------------------------------------
-def treeprint(stream,item,indent=0):
- """Simple pretty printer for the AST."""
- if isinstance(item,compiler.ast.Node):
- stream.write("\n%s<%s>"%(" "*indent,item.__class__.__name__))
-
- children = item.getChildren()
- for child in children:
- treeprint(stream,child,indent+2)
-
- # Fake our docstring as a sub-node (it's *really* more an attribute)
- if hasattr(item,"docstring"):
- stream.write("\n%s <docstring> %s"%(" "*indent,item.docstring))
-
- # And ditto for a remembered assignment expression
- if hasattr(item,"assign_expr"):
- stream.write("\n%s <assign_expr>"%(" "*indent))
- treeprint(stream,item.assign_expr,indent+4)
- else:
- stream.write(" ")
- stream.write(`item`)
-
-
-# ----------------------------------------------------------------------
-def find_attr_docs(tree,verbose=0):
- """Find candidates for documented attributes
-
- Note that after this, it may be that the AST will not garbage collect
- its own nodes properly anymore, as we are adding in cross-linkages.
- """
-
- if not isinstance(tree,compiler.ast.Node):
- return
-
- children = tree.getChildren()
-
- # Might as well get our recursion done with first...
- for child in children:
- find_attr_docs(child,verbose)
-
- # I believe that only Stmt nodes can have Assign and Discard
- # nodes as children
- if not isinstance(tree,compiler.ast.Stmt):
- return
-
- if len(children) == 0:
- return
-
- pairs = []
- last = children[0]
- for item in children[1:]:
- pairs.append((last,item))
- last = item
-
- for this,next in pairs:
- if isinstance(this,compiler.ast.Assign) and \
- isinstance(next,compiler.ast.Discard):
- if verbose:
- print
- print
- print "*** Attribute docstring candidate"
- treeprint(this,4)
- treeprint(next,4)
- print
-
- nextexpr = next.expr
- if isinstance(nextexpr,compiler.ast.Const):
- if type(nextexpr.value) == types.StringType:
- docstring = nextexpr.value
- else:
- if verbose:
- print
- print "... Discarded constant is not a string"
- continue
- else:
- if verbose:
- print
- print "... Discarded expression is not a constant"
- continue
-
- # If there is more than one assignment attached to
- # the <Assign> node, we are not interested
- if len(this.nodes) > 1:
- if verbose:
- print
- print "... (but there are too many assignments in the <Assign>)"
- continue
-
- target = this.nodes[0]
- if isinstance(target,compiler.ast.AssName):
- # Let's be cheeky and glue the docstring on...
- target.docstring = docstring
- elif isinstance(target,compiler.ast.AssAttr):
- # Let's be cheeky and glue the docstring on...
- target.docstring = docstring
- else:
- if verbose:
- print
- print "... (but the assignment is to a tuple/list/etc.)"
- continue
-
- if verbose:
- print
- print "Becomes:"
- treeprint(this,4)
-
-
-# ----------------------------------------------------------------------
-def find_attr_vals(tree,verbose=0):
- """Find attributes whose values we're interested in.
-
- Clearly, when this is working, it could do with being "folded" into
- `find_attr_docs()`.
-
- Note that after this, it may be that the AST will not garbage collect
- its own nodes properly anymore, as we are adding in cross-linkages.
- """
-
- if not isinstance(tree,compiler.ast.Node):
- return
-
- children = tree.getChildren()
-
- # Might as well get our recursion done with first...
- for child in children:
- find_attr_vals(child,verbose)
-
- # I believe that only Stmt nodes can have Assign and Discard
- # nodes as children
- if not isinstance(tree,compiler.ast.Stmt):
- return
-
- for this in children:
- if isinstance(this,compiler.ast.Assign):
- if verbose:
- print
- print
- print "*** Assignment - name/value candidate"
- treeprint(this,4)
- print
-
- # If there is more than one assignment attached to
- # the <Assign> node, we are not interested
- if len(this.nodes) > 1:
- if verbose:
- print
- print "... (but there are too many assignments in the <Assign>)"
- continue
-
- target = this.nodes[0]
- if isinstance(target,compiler.ast.AssName) or \
- isinstance(target,compiler.ast.AssAttr):
- # Let's be cheeky and glue the associated expression on...
- target.assign_expr = this.expr
- else:
- if verbose:
- print
- print "... (but the assignment is to a tuple/list/etc.)"
- continue
-
- if verbose:
- print
- print "Becomes:"
- treeprint(this,4)
-
-
-# ----------------------------------------------------------------------
-def stringify_arg(thing):
- """Return a string representation of a function argument.
-
- This just works for tuples of (strings or tuples (of strings ...) ...)
- """
- if type(thing) == types.StringType:
- return thing
- elif type(thing) == types.TupleType:
- innards = []
- for item in thing:
- innards.append(stringify_arg(item))
- return "(" + string.join(innards,",") + ")"
- else:
- raise ValueError,"Tried to stringify type %s"%type(thing)
-
-
-# ----------------------------------------------------------------------
-def merge_args(args,defaults):
- """Merge together arguments and defaults from an argument list.
-
- Returns a list of argument strings.
- """
- if args == None:
- return []
-
- if defaults == None:
- defaults = []
-
- # This is horrible - do it nicely later on!
- argstrs = []
- for item in args:
- argstrs.append(stringify_arg(item))
-
- pos = len(args) - len(defaults)
- next = 0
- for index in range(pos,len(args)):
- thing = defaults[next]
- thing = stringify_expr(thing)
- argstrs[index] = "%s=%s"%(argstrs[index],thing)
- next = next + 1
- return argstrs
-
-
-# ----------------------------------------------------------------------
-def stringify_expr(thing):
- """Return a very simple string representation of an expression node
-
- Specifically, this function aims to support stringifying things
- which can be on the RHS of an assignment - is that *actually* the
- same as stringifying expression nodes?
- """
-
- # Humph - saving typing may be a good thing...
- strify = stringify_expr
-
- #print thing.__class__.__name__
-
- if thing == None:
- return 'None'
- elif isinstance(thing,compiler.ast.Add):
- return strify(thing.left) + " + " + strify(thing.right)
- elif isinstance(thing,compiler.ast.And):
- exprs = []
- for node in thing.nodes:
- exprs.append(strify(node))
- return string.join(exprs," && ")
- elif isinstance(thing,compiler.ast.AssAttr):
- # Attribute as target of assignment
- if thing.flags == compiler.consts.OP_ASSIGN:
- return strify(thing.expr) + "." + thing.attrname
- else:
- raise ValueError,"Unexpected flag %d in %s"%(thing.flags,`thing`)
- elif isinstance(thing,compiler.ast.AssName):
- # Name as target of assignment, but this also means name
- # as target of "in" assignment (e.g., "x in [1,2,3]"),
- # which is why *we're* interested in it (since this can
- # occur in list comprehensions, which can occur as the
- # RHS of assignments)
- if thing.flags == compiler.consts.OP_ASSIGN:
- return thing.name
- else:
- raise ValueError,"Unexpected flag %d in %s"%(thing.flags,`thing`)
- elif isinstance(thing,compiler.ast.Backquote):
- return "`" + strify(thing.expr) + "`"
- elif isinstance(thing,compiler.ast.Bitand):
- exprs = []
- for node in thing.nodes:
- exprs.append(strify(node))
- return string.join(exprs," & ")
- elif isinstance(thing,compiler.ast.Bitor):
- exprs = []
- for node in thing.nodes:
- exprs.append(strify(node))
- return string.join(exprs," | ")
- elif isinstance(thing,compiler.ast.Bitxor):
- exprs = []
- for node in thing.nodes:
- exprs.append(strify(node))
- return string.join(exprs," ^ ")
- elif isinstance(thing,compiler.ast.CallFunc):
- # Yuck - this is getting complicated!
- # (for an example, see method `hyperlink_target` in
- # restructuredtext/states.py)
- str = strify(thing.node) + "("
- arglist = []
- if thing.args:
- for arg in thing.args:
- arglist.append(strify(arg))
- if thing.star_args:
- arglist.append("*"+strify(thing.star_args))
- if thing.dstar_args:
- arglist.append("**"+strify(thing.dstar_args))
- if arglist:
- str += string.join(arglist,", ")
- return str+")"
- elif isinstance(thing,compiler.ast.Compare):
- str = strify(thing.expr) + " "
- for op,val in thing.ops:
- str += op + " " + strify(val)
- return str
- elif isinstance(thing,compiler.ast.Const):
- # Try not to let long strings take up too much room...
- value = thing.value
- if type(value) == type("") and len(value) > 50:
- value = value[:47] + "..."
- # Make Python decide for us if it needs quotes round it
- # (and, if so, what sort)
- return `value`
- elif isinstance(thing,compiler.ast.Dict):
- innards = []
- for key,val in thing.items:
- key = strify(key)
- val = strify(val)
- innards.append(key+":"+val)
- return "{" + string.join(innards,", ") + "}"
- elif isinstance(thing,compiler.ast.Div):
- return strify(thing.left) + " / " + strify(thing.right)
- elif isinstance(thing,compiler.ast.Ellipsis):
- return "..."
- elif isinstance(thing,compiler.ast.Getattr):
- return strify(thing.expr) + "." + thing.attrname
- elif isinstance(thing,compiler.ast.Invert):
- # Bitwise negation
- return "~" + strify(thing.expr)
- elif isinstance(thing,compiler.ast.Keyword):
- # An 'arg=value' within a function call
- return thing.name + "=" + strify(thing.expr)
- elif isinstance(thing,compiler.ast.Lambda):
- str = "lambda "
- if thing.flags != 0:
- str += " <flag %d> "%thing.flags
- str += string.join(merge_args(thing.argnames,thing.defaults),", ")
- str += ": "
- str += strify(thing.code)
- return str
- elif isinstance(thing,compiler.ast.LeftShift):
- return strify(thing.left) + " << " + strify(thing.right)
- elif isinstance(thing,compiler.ast.List):
- innards = []
- for item in thing.nodes:
- innards.append(strify(item))
- return "[" + string.join(innards,", ") + "]"
- elif isinstance(thing,compiler.ast.ListComp):
- str = "["+strify(thing.expr)
- for node in thing.quals:
- str += " "+strify(node)
- return str+"]"
- elif isinstance(thing,compiler.ast.ListCompFor):
- str = "for "+strify(thing.assign)
- str += " in "+strify(thing.list)
- if thing.ifs:
- for node in thing.ifs:
- str += " "+strify(node)
- return str
- elif isinstance(thing,compiler.ast.ListCompIf):
- return "if "+strify(thing.test)
- elif isinstance(thing,compiler.ast.Mod):
- return strify(thing.left) + "%" + strify(thing.right)
- elif isinstance(thing,compiler.ast.Mul):
- return strify(thing.left) + " * " + strify(thing.right)
- elif isinstance(thing,compiler.ast.Name):
- return thing.name
- elif isinstance(thing,compiler.ast.Not):
- return "not " + strify(thing.expr)
- elif isinstance(thing,compiler.ast.Or):
- exprs = []
- for node in thing.nodes:
- exprs.append(strify(node))
- return string.join(exprs," || ")
- elif isinstance(thing,compiler.ast.Power):
- return strify(thing.left) + " ** " + strify(thing.right)
- elif isinstance(thing,compiler.ast.RightShift):
- return strify(thing.left) + " >> " + strify(thing.right)
- elif isinstance(thing,compiler.ast.Slice):
- if thing.flags != compiler.consts.OP_APPLY:
- raise ValueError,"Unexpected flag %d in %s"%(thing.flags,`thing`)
- return strify(thing.expr) + "[" + \
- strify(thing.lower) + ":" + strify(thing.upper) + "]"
- elif isinstance(thing,compiler.ast.Sliceobj):
- slicelist = []
- for idx in thing.nodes:
- slicelist.append(strify(idx))
- return string.join(slicelist,":")
- elif isinstance(thing,compiler.ast.Sub):
- return strify(thing.left) + " - " + strify(thing.right)
- elif isinstance(thing,compiler.ast.Subscript):
- if thing.flags != compiler.consts.OP_APPLY:
- raise ValueError,"Unexpected flag %d in %s"%(thing.flags,`thing`)
- str = strify(thing.expr) + "["
- sublist = []
- for sub in thing.subs:
- sublist.append(strify(sub))
- return str + string.join(sublist,", ") + "]"
- elif isinstance(thing,compiler.ast.Tuple):
- innards = []
- for item in thing.nodes:
- innards.append(strify(item))
- return "(" + string.join(innards,", ") + ")"
- elif isinstance(thing,compiler.ast.UnaryAdd):
- return "+" + strify(thing.expr)
- elif isinstance(thing,compiler.ast.UnarySub):
- return "-" + strify(thing.expr)
- else:
- return _whatsthis(thing)
-
-def _whatsthis(thing):
- # Wrong, but what else can we do?
- import sys
- print >>sys.stderr,"stringify_expr - don't recognise %s %s"%\
- (thing.__class__.__name__,thing)
- return `thing`
-
-
diff --git a/sandbox/tibs/pysource/visit.py b/sandbox/tibs/pysource/visit.py
deleted file mode 100755
index ec5a2992f..000000000
--- a/sandbox/tibs/pysource/visit.py
+++ /dev/null
@@ -1,2074 +0,0 @@
-#! /usr/bin/env python
-"""Extract information from a Python file (module) for the DOCUTILS
-
-An example of using Jeremy Hylton's compiler module.
-
-Originally based on an example *by* Jeremy Hylton. In the introduction
-to that example, he said:
-
- Here's a trivial example program that extracts some information
- about methods and attributes from a class and its methods.
- I wasn't exhaustive here. I'll get attributes assigned to by
- `self.x` in a method body and I'll get method definitions in
- the class body. I don't deal with obvious things like attributes
- defined at the class level.
-
-I'm expanding it, initially as a bigger example, and also so I get to
-understand how things work!
-
-Note: there should be an example Python file called test.py in the
-same directory as this module - it's meant to be a suitable input
-for testing/learning purposes.
-
-:Author: Tibs <tibs@tibsnjoan.co.uk>
-:Version: Whatever. Oh, 0.4, then
-:Date: 2002-January-18
-
-Aims for DOCUTILS
------------------
-1. Locate all modules, classes, functions, methods and their docstrings.
-2. "Filter" these to leave the ones that DOCUTILS is interested in.
-3. Annotate functions and methods with their arguments.
-4. Locate all assignments which have docstrings.
-5. Similarly "filter" these.
-6. Locate all uses of `global` assignments.
-7. Filter out those which are not obvious from the module level,
- so that the user can be warned about them.
-8. Produce a tree structure suitable for DOCUTILS processing, containing
- the suitable results of the above.
-
-(At least some of) 1, 3 and 4 have already been done.
-
-Still to do
------------
-* *all* sorts of assignment should be visited, so that
- we can tie down the use of globals properly.
-* the option of ignoring _name and __name things should be
- available (should this be the default?)
-* Some consideration should be given to freeing up this mess of things
- when they are all finished with - there are so many interconnections
- that automatic deletion is unlikely to work well
-* other things as they occur to me
-* Finish off InstanceValue (its potential link to the class that defines it)
-
-Names and fullnames
--------------------
-A "name" is taken to be the name as presented in Python code. Note that
-for class instance attribute references (e.g., "self.fred"), the name is
-includes the class reference, dot and attribute name (e.g., "self.fred").
-
-A "fullname" includes the full path to the name as well - that is,
-including all of the elements required to "reach" this item. Thus, for
-instance, a method Fred in class Jim in module Bill would be::
-
- Bill.Jim.Fred
-
-whilst a name A defined within Fred would be::
-
- Bill.Jim.Fred:A
-
-Note that if Fred contains a reference to self.B, then that would (for the
-moment at least) be written as::
-
- Bill.Jim.Fred:self.B
-
-Within an eventual HTML document, such fullnames become anchor and link
-names for nodes. For that purpose, they will be transformed so that they
-do not contain "." or ":", but are still not accidentally confusable with
-legitimate Python names. Thus the last example would be transformed to::
-
- Bill-Jim-Fred--self-B
-
-Note that we also have a "special" label, artificially "generated" - that
-is, there is a single label for all arguments to a function or method,
-which is formed of the label for the function or method, followed by
-*three* hyphens, and then the text "args" - so, for example:
-
- Bill-Jim---args
-
-Special cases
--------------
-Notes on special cases in name resolution:
-
-- obviously I should be taking account of explicit roles.
-
-- if it can't find the name directly via the "scope", it should be looking
- up in the module - so the ScopeMixin needs to provide support for that...
-
-- the module name should be recognised as, in some sense, within the
- module's "parent" - even if there is no such beast.
-
-- that generalises - in general, an object's own name should be visible
- to its docstring, I think - so, for instance::
-
- digit = 3
- '''We store the current digit of pi in `digit`'''
-
- (yes, I know that's poor documentation, but even so)
-
-- <self>.name in a method (where <self> is the first argument to said
- method) should be regarded as being a name in the class containing
- the method, in some sense (but what sense?)
-""" #"
-
-import os
-import sys
-import string
-import compiler
-
-from docutils.parsers.rst import Parser
-
-# Local modules
-import utils
-import visit
-
-__docformat__ = "reST"
-
-
-# ----------------------------------------------------------------------
-def make_Docstring(text, settings):
- """A factory function to handle non-existant docstrings.
- """
- if text:
- return Docstring(text, settings)
- else:
- return None
-
-class Docstring:
- """We use this to represent a docstring, parsed and unparsed.
- """
-
- def __init__(self, text, settings, debug=0):
- """Instantiate a new Docstring from its text.
- """
- self.text = self._trim(text)
- """The text of the docstring.
- """
- self.document = None
- """The result of parsing the docstring, if requested.
- (thus, only non-None if we *are* parsing docstrings in
- the containing module).
- """
- self.settings = settings
- """The docutils settings to apply to new document parsers.
- """
-
- self.debug = debug
-
- def _trim(self,docstring):
- """Trim leading space appropriately from the docstring text.
-
- When the docstring is read from the source file, it is likely
- to have all but the first line indented with respect to the
- first - for example, consider this docstring.
-
- Before it is *used* for anything (e.g., typing it out to be
- read by the user), it is necessary to adjust for this. The
- way to do this is well-defined (???where???).
-
- Returns the adjusted text.
- """
-
- # Remove any confusing tabs - follow the normal Python rules
- # - and split into convenient lines
- lines = string.split(string.expandtabs(docstring),"\n")
-
- # Find significant indentation
- firstline = lines[0]
- if firstline and firstline[0] == " ":
- oldlen = len(firstline)
- firstline = string.lstrip(firstline)
- indent = oldlen - len(firstline)
- else:
- indent = 0
- for line in lines[1:]:
- oldlen = len(line)
- lin = string.lstrip(line)
- if lin:
- indent = oldlen - len(lin)
- break
-
- # And remove it...
- newlines = [firstline]
- for line in lines[1:]:
- oldlen = len(line)
- lin = string.lstrip(line)
- if lin:
- extra = oldlen - len(lin) - indent
- if extra > 0:
- lin = " "*extra + lin
- newlines.append(lin)
-
- # Don't introduce a trailing blank line if they did some
- # variant of the following layout::
- # """Some text
- # """
- if newlines and newlines[-1] == "":
- del newlines[-1]
-
- # And lastly, reassemble it back into text again
- return string.join(newlines,"\n")
-
- def show(self,stream,spaces=""):
- # Not optimised for efficiency...
- lines = string.split(self.text,"\n")
-
- # For the moment, don't try to format it very nicely at all...
- stream.write('%s"""%s\n'%(spaces,lines[0]))
- for line in lines[1:]:
- stream.write(spaces+line+"\n")
- stream.write('%s"""\n'%spaces)
-
- def parse(self,parser):
- """Parse our text with the given parser.
- """
- import docutils
- self.document = docutils.utils.new_document(self.text, self.settings)
- parser.parse(self.text,self.document)
-
- def add_to_DPS(self,dps):
- """Add this docstring content to a DOCUTILS subtree.
-
- Calls the appropriate things from `dps`, which is a
- builtree.BuildTree instance.
- """
- if self.document:
- for child in self.document.children:
- dps.addsubtree(child)
- else:
- dps.start("literal_block")
- dps.add("text",self.text)
- dps.end("literal_block")
-
- # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- # Experimental <interpreted> node code...
- # Copied from transform.py, and not adjusted yet (except superficially
- # and stupidly) for its position in this class.
- # - despite the comments in the docstring, it doesn't *do* anything yet...
-
- def transform_interpreted(self,thing):
- """Deal with <interpreted> nodes in this docstring.
-
- The intent is to find any <interpreted> nodes, try to locate the
- relevant Python value, and insert an appropriate cross-reference.
-
- `thing` is the `Module`, `Class`, `Function`, `Method` or
- `Name` instance to which this docstring is "attached". It
- is used to resolve the <interpreted> names.
- """
- if self.debug:
- print "\n*** Locating <interpreted> items for %s"%thing.fullname
- self.show(sys.stdout," ")
- self.locate_interpreted(self.document,thing)
-
- def locate_interpreted(self,element,thing):
- """Deal with finding "interpreted" nodes in a document subtree.
- """
- for node in element:
- if node.tagname == "#text":
- continue
- elif node.tagname == "interpreted":
- self.treat_interpreted(node,thing)
- else:
- self.locate_interpreted(node,thing)
-
- def treat_interpreted(self,element,thing):
- """Do something interesting with an "interpreted" node.
- """
- if element.has_key("role"):
- role = element["role"]
- else:
- role = None
-
- name = element.astext()
-
- #if role:
- # print "...<interpreted> :%s: %s"%(role,name)
- #else:
- # print "...<interpreted> %s"%name
-
- # Attempt to work out what this <interpreted> item refers to
- target = thing.scope_find_name(name,role=role,indent="...")
- if target:
- element["refname"] = target
-
-
-# ----------------------------------------------------------------------
-class ScopeMixin:
- """Learning about how to represent scope.
-
- The idea of this mixin class is to work out the best way of representing
- scope, so that I can use the results when working out exactly what an
- <interpreted> item in a docstring refers to.
-
- Note that I do not intend (at least, for the moment) to worry about Python
- before 2.2 - i.e., before embedded scope became non-optional. This is
- purely laziness on my part...
- """
-
- scope_debug = 0
-
- def scope_init(self):
- """Call at the end of `__init__` to initilise our experiments
- """
-
- self.scope_module = None
- """Which Module we are in.
- """
-
- self.scope_parent = None
- """The *immediate* parent entity.
- Note that for a method, this will be the class defining it.
-
- (Ultimately, it might be better if this were a weak reference.)
- """
-
- self.scope_encloser = None
- """The innermost enclosing block. Note that for a method,
- this should *not* be the class, but the innermost enclosing
- function/method/module/whatever (whatever?).
- """
-
- self.scope_defines = []
- """A list of the names *defined* by this entity
- (by assignment, definition or whatever).
-
- The list is ordered by last occurrence of the name.
- """
-
- self.scope_fullname = {}
- """The key is the name from `self.scope_defines`, the value is the
- "full" name for the defined value.
- """
-
- self.scope_children = {}
- """A dictionary of the entities defined by this entity.
-
- The keys are the entity name (so correspond to those in
- `self.scope_defines`), and the values are NULL if the entity
- is defined by simple assignment, otherwise the relevant
- "scope" instance (e.g., a Method or Class).
- """
-
- self.scope_globals = []
- """A list of names which are declared global in this scope.
- """
-
- def scope_define_parent(self,parent=None,module=None):
- """Define our parent and encloser.
- """
- self.scope_module = module
- self.scope_parent = parent
- self.scope_encloser = parent
- if isinstance(self,Method):
- while isinstance(self.scope_encloser,Class):
- self.scope_encloser = self.scope_encloser.scope_parent
-
- def scope_define_name(self,name,fullname,child=None):
- """Add a name that is defined in this scope.
-
- - `name` is the obvious name of the name being defined.
- - `fullname` is the "path" to it, starting at the module.
- - `child` is the class representing that name - e.g., a Class
- or Name instance.
-
- Note - remember that functions/methods "define" their arguments...
-
- HOWEVER we are not trying for a general solution to the problem of
- "find the item that is being referred to" - we are just trying to
- provide useful links between <interpreted> items in docstrings and
- those things that they might reasonably be expected to be referring to.
-
- Furthermore, we know that we will not show attributes, docstring or
- not, if they are not
-
- a. At module level (so a ModuleValue)
- b. Within a class (so a ClassValue)
- c. Within a method called __init__ or __new__.
- d. An argument (we always want to know about arguments).
-
- So we discard any attributes that do not match these criteria...
- """
- if self.scope_debug:
- if name in self.scope_defines:
- redef = "(re)"
- else:
- redef = " "
- print "%-15s %-30s %sdefined in %s"%(child.__class__.__name__,
- name,redef,self.name)
-
- # Should we ignore this name?
- if isinstance(child,Name):
- if self.__class__ not in [Package,Module,Class] and \
- not (self.__class__ == Method and
- self.name in ["__init__","__new__"]) and \
- child.__class__ != Argument:
- return
- # Remember to ensure the name is always at the END of the list
- # (even if it was already there)
- if name in self.scope_defines:
- self.scope_defines.remove(name)
- self.scope_defines.append(name)
- self.scope_fullname[name] = fullname
- self.scope_children[name] = child
-
- def scope_define_global(self,name):
- """Indicate that a name is actually global.
-
- Note that it is entirely possible that the name is also present
- in `self.scope_defines` - being global should be remembered as taking
- precedence.
- """
- if self.scope_debug:
- if name in self.scope_defines:
- redef = "(re)"
- else:
- redef = " "
- print "%-10s %-30s %sdefined in %s"%("[Global]",
- name,redef,self.name)
- if name not in self.scope_globals:
- self.scope_globals.append(name)
-
- def scope_get_object(self,name):
- """Return the defined object corresponding to `name`, or None.
- """
- try:
- return self.scope_children[name]
- except:
- return None
-
- def scope_get_type(self,name):
- """Return the "type" of the defined object corresponding to `name`.
- """
- try:
- return self.scope_children[name].__class__.__name__
- except:
- return None
-
- def scope_name_in_self(self,name):
- """Return true if the `name` is defined by ourselves.
- """
- return name in self.scope_defines
-
- def scope_name_in_encloser(self,name):
- """Return true if the `name` is defined by our encloser.
-
- (If we don't *have* an encloser - e.g., we're a module - then
- it obviously returns false.)
- """
- if self.scope_encloser:
- return name in self.scope_encloser.scope_defines
- else:
- return 0
-
- def scope_name_in_module(self,name):
- """Return true if the `name` is defined by our module.
- """
- if self.scope_module:
- return name in self.scope_module.scope_defines
- else:
- return 0
-
- def scope_up_is_module(self):
- """Is our encloser the module?
- """
- return self.scope_module == self.scope_encloser
-
- # We need a dictionary to relate role names to the classes we use
- # A value of None against a key means that we are not attempting
- # to handle this yet.
- roles = {"package" : "Package",
- "module" : "Module",
- "class" : "Class",
- "method" : "Method",
- "function" : "Function",
- "module_attribute" : "ModuleValue",
- "class_attribute" : "ClassValue",
- "instance_attribute": "InstanceValue",
- "variable" : "Name",
- "parameter" : "Argument",
- "type" : None,
- "exception_class" : None,
- "exception" : None,
- "warning_class" : None,
- "warning" : None}
-
- def scope_obj_role_match(self,what,role):
- """Decide if the role (if any) makes sense with respect to `what`.
-
- `what` is the object we thing might be our item of interest,
- and `role` is the role we're looking for, or None if we're not
- particular.
- """
- if role:
- if what.__class__.__name__ == self.roles[role]:
- return 1
- else:
- return 0
- else:
- return 1
-
- def scope_class_role_match(self,class_name,role):
- """Decide if the role (if any) makes sense with respect to `what`.
-
- `what` is the class name of the object we thing might be our item
- of interest, and `role` is the role we're looking for, or None if
- we're not particular.
- """
- if role:
- if class_name == self.roles[role]:
- return 1
- else:
- return 0
- else:
- return 1
-
- def scope_callable_match(self,what,need_callable):
- """Does the callable state of the `what` match our needs? Do we care?
- """
- if need_callable:
- return what.is_callable()
- else:
- return 1
-
- def scope_find_name(self,name,role=None,indent=" "):
- """A first pass at looking up names in scope.
-
- - `name` is the text that the user has enclosed in backquotes,
- to make it interpreted
- - `role`, if given, specifies exactly what sort of name the
- user determines it to be.
-
- This makes no attempt to do anything beyond looking up a
- simple name - it doesn't try to deal with (for instance)
- a "()" at the end of the name, nor does it try to cope
- with dotted names in any clever way.
-
- Returns either the label for the referenced entity (which is
- a translation of its `fullname` into something legal as an
- XML name), or None.
- """
- if name.endswith("()"):
- name = name[:-2]
- need_callable = 1
- else:
- need_callable = 0
-
- if self.scope_debug:
- print indent,
- if role:
- print ":%s:"%role,
-
- # Is it a reference to ourself?
- if name == self.name and \
- self.scope_obj_role_match(self,role) and \
- self.scope_callable_match(self,need_callable):
- if self.scope_debug:
- print "%s '%s' IS %s %s"%\
- (self.__class__.__name__,name,
- self.__class__.__name__,self.name)
- return self.label()
-
- # Is it a reference to one of our children?
- if self.scope_name_in_self(name):
- what = self.scope_get_type(name)
- whom = self.scope_children[name]
- if self.scope_class_role_match(what,role) and \
- self.scope_callable_match(whom,need_callable):
- if self.scope_debug:
- print "%s '%s' found HERE in %s %s"%\
- (what,name,self.__class__.__name__,self.name)
- if whom.__class__ == Argument:
- return self.args_label()
- else:
- return whom.label()
-
- # Is it a reference to one of our encloser's children?
- if self.scope_name_in_encloser(name):
- what = self.scope_encloser.scope_get_type(name)
- whom = self.scope_encloser.scope_children[name]
- if self.scope_class_role_match(what,role) and \
- self.scope_callable_match(whom,need_callable):
- if self.scope_debug:
- print "%s '%s' found UP in %s %s"%\
- (what,name,self.scope_encloser.__class__.__name__,
- self.scope_encloser.name)
- if whom.__class__ == Argument:
- return self.scope_encloser.args_label()
- else:
- return whom.label()
-
- # Is it a reference to our encloser?
- if self.scope_encloser and name == self.scope_encloser.name:
- # I'm not sure about this one - *should* we be able to "see"
- # the name of our encloser? Or is what I'm *really* after
- # the name of the *parent*?
- #
- # Specific instance - consider a method M in class C
- # - should `C` in `M`s docstring refer to class C,
- # even if class C is *not* defined at module level?
- if self.scope_obj_role_match(self.scope_encloser,role) and \
- self.scope_callable_match(self.scope_encloser,need_callable):
- if self.scope_debug:
- print "%s '%s' IS %s %s"%\
- (self.scope_encloser.__class__.__name__,name,
- self.scope_encloser.__class__.__name__,
- self.scope_encloser.name)
- return self.scope_encloser.label()
-
- # Is it a reference to a child of our module?
- if not self.scope_up_is_module() and self.scope_name_in_module(name):
- what = self.scope_module.scope_get_type(name)
- whom = self.scope_module.scope_children[name]
- if self.scope_class_role_match(what,role) and \
- self.scope_callable_match(whom,need_callable):
- if self.scope_debug:
- print "%s '%s' found GLOBAL in %s %s"%\
- (what,name,self.scope_module.__class__.__name__,
- self.scope_module.name)
- # Modules don't have arguments...
- return whom.label()
-
- # Is it a reference to our module itself?
- if name == self.scope_module.name:
- if self.scope_obj_role_match(self.scope_module,role) and \
- not need_callable:
- if self.scope_debug:
- print "%s '%s' IS %s %s"%\
- (self.scope_module.__class__.__name__,name,
- self.scope_module.__class__.__name__,
- self.scope_module.name)
- return self.scope_module.label()
-
- if self.scope_debug:
- print "'%s' not in %s %s"%(name,self.__class__.__name__,self.name),
- if self.scope_encloser:
- print "or %s %s"%(self.scope_encloser.__class__.__name__,
- self.scope_encloser.name),
- if self.scope_up_is_module():
- print
- else:
- print "or %s %s"%(self.scope_module.__class__.__name__,
- self.scope_module.name)
- return None
-
- def scope_show(self,indent=""):
- print "%s%s %s"%(indent,self.__class__.__name__,self.name),
- if self.scope_encloser and self.scope_encloser != self.scope_parent:
- print "<<upscope %s %s>>"%(self.scope_encloser.__class__.__name__,
- self.scope_encloser.name)
- else:
- print
-
- extra_indent = indent+" "
-
- if self.scope_globals:
- print "%sglobals %s"%(extra_indent,self.scope_globals)
-
- for name in self.scope_defines:
- child = self.scope_children[name]
- if child:
- child.scope_show(extra_indent)
-
-
-# ----------------------------------------------------------------------
-class Base(ScopeMixin):
- """A simple base class for common functionality.
- """
-
- verbose = 0
-
- def __init__(self, settings, name, fullname, docstring=None):
- self.settings = settings
- """ The parser settings
- """
-
- self.name = name
- """The name of this scope entity.
- """
-
- self.fullname = fullname
- """The fully qualified name of this entity
- - for instance, for a method `fred` in a class `Jim`
- in a module `bob`, this would be "bob.Jim.fred"
- """
-
- self.docstring = make_Docstring(docstring, settings)
- """The docstring for this scope, or None.
- Note that, at least for the moment, we're only supporting
- one docstring for an entity. This may need to change for
- proper DOCUTILS support (but I [1]_, personally, hope not).
-
- .. [1] "I" being Tibs, at this point, and at this time [2]_.
- .. [2] "This time" being April 2002.
- """
-
- self.imports = {}
- """Import statements within this scope. The key is the
- name of each module being imported, the value is a list
- of the names "as" which the module is imported, with
- `None` meaning "as itself".
- """
-
- self.from_imports = {}
- """From <module> import <names> statements within this
- scope. The key is the <module>, the value a dictionary
- like that used for `self.imports`.
- """
-
- self.classes = {}
- """Classes defined within this scope. The key is the
- class name, the value is the Class instance for this ``class``.
- """
-
- self.functions = {}
- """Functions or methods defined within this scope. The key is the
- function name, the value is the Function or Method instance
- for this ``def``.
- """
-
- self.attributes = {}
- """Attributes assigned to within a scope. The key is the
- attribute name, the value is the Name instance for this ``name``.
- """
-
- self.children = []
- """A list of all of the items contained herein which might
- have, or have children which have, docstrings - i.e., packages,
- modules, classes, functions, methods.
- """
-
- self.class_list = []
- """A list of the class names defined in this scope, in order.
- """
-
- self.function_list = []
- """A list of the function/method names defined in this scope, in order.
- """
-
- self.attribute_list = []
- """A list of the attribute names defined in this scope, in order.
- """
-
- self.globals = {}
- """The names mentioned in global statements within a scope.
- The key is the name, the value doesn't matter.
- """
-
- self.parser = None
- """We may need a reStructuredText parser to handle our docstrings
- - if so, we'll generate one "on demand"."""
-
- def getParser(self):
- """Retrieve a reStructuredText parser, for docstring usage.
- """
- if not self.parser:
- self.parser = Parser()
- return self.parser
-
- def parse_docstrings(self,parser):
- """If we are meant to, parse our docstrings.
- """
- if self.docstring:
- self.docstring.parse(parser)
- for child in self.children:
- child.parse_docstrings(parser)
-
- def is_callable(self):
- """Does it make sense to call an object of this type?
- """
- return 0
-
- def label(self):
- """Return an XML-legal name for this object.
-
- Note that we implicitly assume that all objects have their
- output XML/HTML representation written to the same file
- - i.e., that we do not have to worry about references that
- are anything beyond simple names.
- """
- str = string.replace(self.fullname,".","-")
- str = string.replace(str,":","--")
- return str
-
- def addGlobal(self,name):
- self.globals[name] = name
-
- def addClass(self,klass):
- self.classes[klass.name] = klass
- self.class_list.append(klass.name)
- self.children.append(klass)
-
- def addFunction(self,func):
- self.functions[func.name] = func
- self.function_list.append(func.name)
- self.children.append(func)
-
- def addAttribute(self,name,instance):
- self.attributes[name] = instance
- self.attribute_list.append(name)
- self.children.append(instance)
-
- def addImport(self,names):
- """Remember an import statement.
-
- `names` is a list of ``(name,as)`` tuples, where ``name``
- is the name of the item being imported, and ``as`` is either
- None of else the name "as" which this item is being imported
-
- Note we aren't even *trying* to remember its exact locality.
- """
- for name,as in names:
- if not self.imports.has_key(name):
- self.imports[name] = [as]
- else:
- if as not in self.imports[name]:
- self.imports[name].append(as)
-
- def addFromImport(self,modname,names):
- """Remember a from import statement.
-
- `modname` is the name of the module "from" which things are
- being imported.
-
- `names` is a list of ``(name,as)`` tuples, where ``name``
- is the name of the item being imported, and ``as`` is either
- None of else the name "as" which this item is being imported
-
- Note we aren't even *trying* to remember its exact locality.
- """
- if not self.from_imports.has_key(modname):
- self.from_imports[modname] = {}
-
- dict = self.from_imports[modname]
- for name,as in names:
- if not dict.has_key(name):
- dict[name] = [as]
- else:
- if as not in dict[name]:
- dict[name].append(as)
-
- def isGlobal(self,name):
- return self.globals.has_key(name)
-
- def getClassNames(self):
- return self.class_list
- #return self.classes.keys()
-
- def getClass(self,name):
- return self.classes[name]
-
- def getFunctionNames(self):
- return self.function_list
- #return self.functions.keys()
-
- def getFunction(self,name):
- return self.functions[name]
-
- def getAttributeNames(self):
- return self.attribute_list
- #return self.attributes.keys()
-
- def getAttribute(self,name):
- return self.attributes[name]
-
- def getAttributeDocstring(self,name):
- """Return an attribute docstring, or None
- """
- return self.attributes[name]
-
- def getImports(self):
- """Return our "import"s, but not in any particular order.
- """
- return self.imports
-
- def getFromImports(self):
- """Return our "from ... import"s, but not in any particular order.
- """
- return self.from_imports
-
- def getFromImportNames(self,name):
- return self.from_imports[name]
-
- def getSelf(self):
- """Return the name used for "self". Doesn't do much elsewhere.
-
- (Actually, for a method *or* a function, it returns the name
- of the first argument.)
- """
- return None
-
- def _show_body(self,stream,indent=0):
- spaces = indent*" "
-
- if self.docstring:
- self.docstring.show(stream,spaces+" ")
-
- if self.imports:
- names = self.imports.keys()
- stream.write("%s Import %s\n"%(spaces,string.join(names,", ")))
-
- if self.from_imports:
- modnames = self.from_imports.keys()
- for mod in modnames:
- names = self.from_imports[mod]
- stream.write("%s From %s import %s\n"%\
- (spaces,mod,string.join(names,", ")))
-
- # Should we sort things alphabetically within each list?
-
- if self.verbose:
- globals = self.globals.keys()
- if globals:
- stream.write("%s Global statements\n"%spaces)
- for name in globals:
- stream.write("%s %s\n"%(spaces,name))
-
- attributes = self.attributes.keys()
- if attributes:
- stream.write("%s Attributes\n"%spaces)
- for name in attributes:
- self.attributes[name].show(stream,indent+4)
-
- class_names = self.classes.keys()
- if class_names:
- for name in class_names:
- self.classes[name].show(stream,indent+2)
-
- func_names = self.functions.keys()
- if func_names:
- for name in func_names:
- self.functions[name].show(stream,indent+2)
-
- def show(self,stream,indent=0):
- """Override as necessary."""
- stream.write("%s%s %s\n"%(" "*indent,self.__class__.__name__,
- self.name))
- self._show_body(stream,indent)
-
- # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- # Experimental <interpreted> node code...
- def find_docstrings(self):
- """Find each docstring in our subtree.
- """
- if self.docstring:
- self.docstring.transform_interpreted(self)
- for child in self.children:
- child.find_docstrings()
- # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-
-# ----------------------------------------------------------------------
-class Package(Base):
- """The representation of a Python package.
-
- Unlike the other children of `Base`, this class actually visits
- its members itself - that is, it is self-constructing.
- """
-
- def __init__(self,settings,directory,parent=None,debug=0):
- """Instantiate a new package.
-
- If this is a "sub" package, then `parent` should be a Package
- instance, within which we may be found...
-
- `settings` will give the parsing settings -- `verbose_parse` will
- cause the generation of a message for each stage of the production
- of our data, and `debug` will give a message for each "entity"
- in the AST that we visit.
- """
-
- self.settings = settings
- self.verbose = settings.verbose_parse
- self.debug = debug
-
- path = os.path.expanduser(directory) # expand "~"
- path = os.path.expandvars(directory) # expand "$fred" or "%fred%"
- path = os.path.abspath(path) # expand to a 'full' path
- path = os.path.normpath(path) # sort out "/fred" versus "/fred/"
- self.directory = path
- """The `directory` is our best guess as to the actual
- path to the package."""
-
- # Take the package name to be the final component
- base,name = os.path.split(path)
- if parent:
- fullname = parent.fullname + "." + name
- Base.__init__(self,settings,name,fullname)
- else:
- # With no parent, our name and fullname are the same.
- Base.__init__(self,settings,name,name)
-
- self.modules = {}
- """Remember the modules (or Python files, really)
- in this package. The key is the module name, the
- value the Module instance for this module.
- """
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope setup
- self.scope_init()
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- self.parse_modules()
-
- def parse_modules(self):
- """Locate our constituent modules and parse them.
- """
- files = os.listdir(self.directory)
-
- if "__init__.py" not in files:
- raise ValueError,\
- "Directory %s does not contain an __init__.py file"%\
- self.directory
-
- # Parsing the __init__.py file may give us further information,
- # such as an __all__ value, which we may later want to use to
- # determine which files to read and parse, and which to ignore
- path = os.path.join(self.directory,"__init__.py")
- self.addModule(Module(self.settings,path,package=self, debug=self.debug))
-
- # But, for the moment, just parse all the Python files...
- for file in files:
- name,ext = os.path.splitext(file)
- if name == "__init__":
- continue
- elif ext in [".py",".pyw"]:
- path = os.path.join(self.directory,file)
- self.addModule(Module(self.settings,path,package=self,
- debug=self.debug))
-
- def addModule(self,mod):
- self.modules[mod.name] = mod
- self.children.append(mod)
-
- def getModuleNames(self):
- return self.modules.keys()
-
- def getModule(self,name):
- return self.modules[name]
-
- def getModules(self):
- """Return a list of Module instances.
- """
- return self.modules.values()
-
- def show(self,stream,indent=0):
- stream.write("%sPackage %s"%(" "*indent,self.name))
- if self.directory:
- stream.write("(in %s)\n"%self.directory)
- else:
- stream.write("\n")
-
- names = self.modules.keys()
- names.sort()
- for name in names:
- self.modules[name].show(stream)
-
- def show_ast(self,stream):
- """Print out a representation of our ASTs.
- """
- names = self.modules.keys()
- names.sort()
- for name in names:
- self.modules[name].show_ast(stream)
-
-
-# ----------------------------------------------------------------------
-class Module(Base):
- """The representation of a Python module.
-
- This class also knows how to *parse* a Python module.
-
- Still known to be missing:
-
- - visitLambda (I shudder)
- - should we also do visitExec?
-
- - visitAssign
- - visitAugAssign
-
- These last two are needed to allow us to link a Name with its value(s).
-
- If attribute docstrings are to be found, then the AST on which we
- act must first have been processed with `find_attr_docs()`.
-
- Note we also need to visit the *other* sorts of assignment, so
- we can update our Module with any globals used therein...
- """
-
- def __init__(self,settings,filename,docstring=None,package=None,debug=0):
- """Instantiate a new module.
-
- If this is a module within a package, then `package` should be
- a Package instance.
-
- `settings` will give the parsing settings -- `verbose_parse` will
- cause the generation of a message for each stage of the production
- of our data, and `debug` will give a message for each "entity"
- in the AST that we visit.
- """
- self.settings = settings
- self.package = package
- self.verbose = settings.verbose_parse
- self.debug = debug
-
- self.docformat,self.language = utils.docformat("plaintext")
-
- filename = os.path.expanduser(filename) # expand "~"
- filename = os.path.expandvars(filename) # expand "$fred" or "%fred%"
- filename = os.path.abspath(filename) # expand to a 'full' path
- filename = os.path.normpath(filename) # and tidy up
- self.filename = filename
- """The `filename` is our best guess as to the actual
- path to the module."""
-
- dir,file = os.path.split(filename)
- name,ext = os.path.splitext(file)
-
- if package:
- fullname = package.fullname + "." + name
- Base.__init__(self,settings, name,fullname,docstring)
- else:
- # Without a package, our name and fullname are the same
- Base.__init__(self,settings, name,name,docstring)
-
- self.ast = None
- """The parse tree, as produced by compiler.
- """
-
- self.globals_used = {}
- """Remember the globals promulgated on this module
- (that is, occurrences of a global statement, associated
- with assignment *to* the named global, within the same
- scope).
-
- The key is the global name, the value a list of
- (scope,superscope) pairs.
- """
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope setup
- self.scope_init()
- self.scope_define_parent(parent=package,module=self)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- # Now, parse ourselves!
- self.parse_module()
-
- # And then perform our "finishing off" operations
- self.determine_docformat()
-
- if self.verbose:
- print >>sys.stderr, \
- " >> docformat: %s, language %s"%(self.docformat,
- self.language)
-
- if self.docformat == utils.RESTRUCTUREDTEXT:
- if self.verbose:
- print >>sys.stderr," .. parsing docstrings in module",\
- self.name
- parser = self.getParser()
- self.parse_docstrings(parser)
- if self.verbose:
- print >>sys.stderr," .. finding <interpreted> nodes"
- self.find_docstrings()
-
- def parse_module(self):
- """Parse ourselves (!)
- """
- if self.verbose: print >>sys.stderr, "*** Parsing file",self.filename
- self.ast = compiler.parseFile(self.filename)
-
- # "Comb" the tree to sort out attribute docstrings
- if self.verbose: print >>sys.stderr, " Locating attribute docstrings"
- utils.find_attr_docs(self.ast)
-
- # And to link names and their values in assignments
- if self.verbose: print >>sys.stderr, " Locating attribute values"
- utils.find_attr_vals(self.ast)
-
- if self.verbose: print >>sys.stderr, " Walking the tree"
- compiler.walk(self.ast,self)
-
- def determine_docformat(self):
- """Call this after reading in the module, before "using" it.
-
- This detects whether there is a module value called __docformat__, and
- if so, inspect its value.
- """
- if self.attributes.has_key("__docformat__"):
- name = self.attributes["__docformat__"]
- try:
- value = name.actualLastValue()
- except ValueError, detail:
- print >>sys.stderr, "Ignoring __docformat__"
- print >>sys.stderr, detail
- return
- self.docformat,self.language = utils.docformat(value)
-
- def addGlobalUsed(self,name,where):
- if self.globals_used.has_key(name):
- self.globals_used[name].append(where)
- else:
- self.globals_used[name] = [where]
-
- def getObscureGlobals(self):
- """Return a list of (name,[fullname]) tuples
- """
- globals = self.globals_used.keys()
- globals.sort()
- attributes = self.attributes.keys()
- obscure = []
- for name in globals:
- if name not in attributes:
- wherelist = self.globals_used[name]
- obscure.append( (name,wherelist) )
- return obscure
-
- # ----------------------------------------------------------------------
- # Extraction code
-
- def _scopes(self,scope,superscope):
- str = ""
- if scope:
- str = str + " in %-8s %-12s"%(scope.__class__.__name__,
- `scope.name`)
- if superscope:
- str = str + " in %-8s %-12s"%(superscope.__class__.__name__,
- `superscope.name`)
- return str
-
- def _report(self,what,name,scope,superscope):
- print >>sys.stderr,\
- "%-8s %-12s"%(what,name) + self._scopes(scope,superscope)
-
- def visitModule(self,node,scope=None,superscope=None):
- """Visit a Module node - heh, this must be us!
-
- We expect `scope` and `superscope` both to be None
- """
- if self.debug:
- self._report("Module",self.filename,scope,superscope)
-
- self.docstring = make_Docstring(node.doc, self.settings)
-
- # Visit our children with ourselves as their scope
- self.visit(node.node,self)
-
- def visitClass(self,node,scope=None,superscope=None):
- """Visit a Class node
-
- `scope` is the scope of this Class, and `superscope` is
- that scope's scope (if any).
-
- We don't yet cope well with things like::
-
- class Fred(docutils.nodes)
-
- - this will need fixing.
- """
- if self.debug:
- self._report("Class",node.name,scope,superscope)
-
- if scope:
- fullname = "%s.%s"%(scope.fullname,node.name)
- else:
- fullname = node.name
-
- # If we were nice, we'd resolve the
- # Getattr(Getattr(Name('docutils'), 'nodes'), '_TextElement')
- # that we get for something like docutils.nodes into something
- # easier to deal with...
- cls = Class(self.settings,node.name,fullname,node.bases,node.doc)
- if scope:
- scope.addClass(cls)
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- if scope:
- cls.scope_define_parent(scope,self)
- scope.scope_define_name(node.name,fullname,cls)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- # Visit our children with ourselves as their scope,
- # and our scope as their superscope
- self.visit(node.code,cls,scope)
-
- def visitFunction(self,node,scope=None,superscope=None):
- """Visit a Function node (nb: this means "function or method")
-
- `scope` is the scope of this Function, and `superscope` is
- that scope's scope (if any).
- """
- if self.debug:
- if isinstance(scope,Class):
- self._report("Method",node.name,scope,superscope)
- else:
- self._report("Function",node.name,scope,superscope)
-
- fullname = "%s.%s"%(scope.fullname,node.name)
-
- if isinstance(scope,Class):
- fun = Method(self.settings,node.name,fullname,
- node.argnames,node.defaults,node.flags,node.doc)
- else:
- fun = Function(self.settings,node.name,fullname,
- node.argnames,node.defaults,node.flags,node.doc)
- scope.addFunction(fun)
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- fun.scope_define_parent(scope,self)
- scope.scope_define_name(node.name,fullname,fun)
- for argname in node.argnames:
- fullname = "%s.%s:%s"%(scope.fullname,node.name,argname)
- name = Argument(self.settings,argname,fullname)
- name.scope_define_parent(fun,self)
- fun.scope_define_name(argname,fullname,name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- # Visit our children with this function as the scope, and
- # our scope as the superscope
- self.visit(node.code,fun,scope)
-
- def visitAssAttr(self,node,scope,superscope=None):
- """Visit an attribute assignment node.
-
- For example::
-
- self.a = 1
-
- Note that this is assignment to a *single* attribute only.
-
- `scope` is the scope of this assignment, and `superscope` is
- that scope's scope (if any).
- """
- if self.debug:
- self._report("attr",node.attrname,scope,superscope)
-
- # An AssAttr contains:
- # .expr - the expression on the LH of the dot
- # .attrname - the attribute name on the RH of the dot
- # .flags
- # We're (to a first approximation) only interested in
- # assignments of the form <self>.<attr>, where "<self>"
- # is whatever name was passed down as the first argument
- # to a containing method.
- if isinstance(node.expr,compiler.ast.Name):
- fullname = "%s:%s.%s"%(scope.fullname,node.expr.name,node.attrname)
- selfname = "%s.%s"%(node.expr.name,node.attrname)
- if node.expr.name == scope.getSelf():
- what = InstanceValue
- else:
- what = Name # hmm, this feels wrong, but I do want to distinguish
-
- if hasattr(node,"docstring"):
- #name = what(node.attrname,fullname,node.expr.name,node.docstring)
- name = what(selfname,fullname,node.expr.name,node.docstring)
- else:
- #name = what(node.attrname,fullname,node.expr.name)
- name = what(selfname,fullname,node.expr.name)
- if hasattr(node,"assign_expr"):
- name.setValue(node.assign_expr)
- scope.addAttribute(selfname,name)
-
- if node.expr.name == scope.getSelf() and scope.__class__ == Class:
- name.set_class(scope)
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # We should do *something* for our experimental scope
- # work at this point - but I guess it would be to add
- # this name to the class that contains the method in
- # which we are - and if we're actually in a *function*
- # which is to be assigned to a class at run-time (for
- # instance), that is a bit difficult (!). So ignore
- # this case for now...
- # OR maybe we should be adding in "fullname" and not
- # "name" each time we add something to the scope.
- name.scope_define_parent(scope,self)
- scope.scope_define_name(selfname,fullname,name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- else:
- # What to do here???
- # - it's presumably something like fred[3].attr, so I guess
- # we don't want to do anything very clever with it, at least
- # for the moment.
-
- print
- print ">>> Unhandled AST node <<<"
- print " visitAssAttr: %s"%(node)
- print " i.e.: %s"%(utils.stringify_expr(node))
- print " location: Module %s, %s %s, %s %s"%\
- (self.scope_module.name,
- scope.__class__.__name__,scope.name,
- superscope.__class__.__name__,superscope.name)
- print
-
- # Hmm - what scope and superscope does the
- # subexpression *really* want...
- # - is there any point (from a DPV point of view)
- # in following down the innards of the expression?
- self.visit(node.expr,scope,superscope)
-
- def visitAssName(self,node,scope=None,superscope=None):
- """Visit a name assignment node.
-
- For example::
-
- a = 1
-
- Note that this is assignment to a *single* name only.
-
- `scope` is the scope of this assignment, and `superscope` is
- that scope's scope (if any).
- """
- if self.debug:
- self._report("name",node.name,scope,superscope)
-
- # For the moment, allow any assignments - later we may restrict
- # this (e.g., to Module, Class, __init__ method)
- if scope:
- fullname = "%s:%s"%(scope.fullname,node.name)
- else:
- fullname = node.name
-
- if scope.__class__ == Module:
- what = ModuleValue
- elif scope.__class__ == Class:
- what = ClassValue
- else:
- what = Name
-
- if hasattr(node,"docstring"):
- name = what(self.settings,node.name,fullname,
- docstring=node.docstring)
- else:
- name = what(self.settings,node.name,fullname)
- if hasattr(node,"assign_expr"):
- name.setValue(node.assign_expr)
- if scope.isGlobal(node.name):
- name.setGlobal()
- scope.addAttribute(node.name,name)
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- if scope:
- name.scope_define_parent(scope,self)
- scope.scope_define_name(node.name,fullname,name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- # Hmm - check whether the name is a global, and if so,
- # tell our Module about it...
- if scope.isGlobal(node.name):
- self.addGlobalUsed(node.name,scope.fullname)
-
- def visitAssTuple(self,node,scope=None,superscope=None):
- """Visit a tuple assignment statement.
-
- For example:
-
- a, b, c = 1, 2, 3
-
- Although we're not directly interested in these for docstring
- purposes, we *may* want to know that a variable has participated
- in one (why?).
- """
- for item in node.nodes:
- self.visit(item,scope,superscope)
-
- def visitAssList(self,node,scope=None,superscope=None):
- """Visit a list assignment statement.
-
- For example:
-
- a, b, c = [1, 2, 3]
-
- Although we're not directly interested in these for docstring
- purposes, we *may* want to know that a variable has participated
- in one (why?).
- """
- for item in node.nodes:
- self.visit(item,scope,superscope)
-
- def visitGlobal(self,node,scope=None,superscope=None):
- """Visit a global statement node
-
- `scope` is the scope of this global, and `superscope` is
- that scope's scope (if any).
- """
- if self.debug:
- for name in node.names:
- self._report("global",name,scope,superscope)
-
- for name in node.names:
- scope.addGlobal(name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- scope.scope_define_global(name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- def visitYield(self,node,scope=None,superscope=None):
- """Visit a yield statement.
-
- The presence of a yield statement within a function indicates
- that it is a generator (well, unless that statement is
- unreachable - but we shall not worry about that, at least
- for the moment!).
-
- `scope` is the scope of this statement, and `superscope` is
- that scope's scope (if any).
- """
- if self.debug:
- self._report("yield",node.value,scope,superscope)
-
- # So tell our scope that it is (probably) a generator
- scope.generator = 1
-
- # There seems little point in visiting our value, but on
- # the other hand, why not
- self.visit(node.value,scope,superscope)
-
-
- def visitImport(self,node,scope=None,superscope=None):
- """Visit an import statement node
-
- `scope` is the scope of this import statement, and
- `superscope` is that scope's scope (if any).
- """
- if self.debug:
- self._report("import","",scope,superscope)
- print >>sys.stderr, "%8s %12s %s"%(" "," ",node.names)
-
- if scope:
- scope.addImport(node.names)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- for item in node.names:
- fullname = scope.fullname + "." + item[0]
- name = ImportName(self.settings,item[0],fullname)
- name.scope_define_parent(scope,self)
- scope.scope_define_name(item[0],fullname,name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- def visitFrom(self,node,scope=None,superscope=None):
- """Visit a from .. import statement node
-
- The rules for `scope` and `superscope` should be identical
- to those for `visitImport()`.
- """
- if self.debug:
- self._report("from",node.modname,scope,superscope)
- print >>sys.stderr, "%8s %12s %s"%(" "," ",node.names)
-
- if scope is not None:
- scope.addFromImport(node.modname,node.names)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope work
- for item in node.names:
- fullname = scope.fullname + "." + item[0]
- name = ImportName(self.settings,item[0],fullname)
- name.scope_define_parent(scope,self)
- scope.scope_define_name(item[0],fullname,name)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- # ----------------------------------------------------------------------
-
- def _prt(self,stream,indent,name,place):
- stream.write("%sGlobal %-10s in %s\n"%(" "*indent,name,place))
-
- def _and(self,stream,indent,name,place):
- stream.write("%s %-10s and in %s\n"%(" "*indent," "*len(name),
- place))
-
- def _show_odd_globals(self,stream,indent=0):
- """Show which global names are defined and used below module level
-
- Obviously (!) we are only interested in things which are not
- already known to be module level attributes - we want to warn
- the user about things that are defined in non-obvious places.
- """
- obscure = self.getObscureGlobals()
- done_header = 0
- for name,wherelist in obscure:
- if not done_header:
- stream.write("Globals defined *and used* below"
- " the top level:\n")
- done_header = 1
- self._prt(stream,indent+2,name,wherelist[0])
- for place in wherelist[1:]:
- self._and(stream,indent+2,name,place)
-
- def show(self,stream,indent=0):
- stream.write("%sModule %s"%(" "*indent,self.name))
- if self.filename:
- stream.write("(in file %s)\n"%self.filename)
- else:
- stream.write("\n")
- self._show_body(stream,indent)
- self._show_odd_globals(stream,indent)
-
- def show_ast(self,stream):
- """Print out a representation of our AST.
- """
- stream.write("AST for module %s\n"%self.name)
- utils.treeprint(stream,self.ast)
-
-# ----------------------------------------------------------------------
-class Class(Base):
- """The representation of a Python class."""
-
- def __init__(self,settings,name,fullname,bases,docstring):
- Base.__init__(self,settings,name,fullname,docstring)
-
- self.bases = bases or []
- """A list of the base classes for this class."""
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope setup
- self.scope_init()
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- def is_callable(self):
- """Does it make sense to call an object of this type?
-
- NB: it only makes sense to call this *after* the class has
- been parsed!
- """
- return self.functions.has_key("__call__")
-
- def show(self,stream,indent=0):
- basestr = ""
- if self.bases:
- names = self.getBaseNames()
- basestr = "(" + string.join(names,",") + ")"
- stream.write("%sClass %s%s\n"%(" "*indent,self.name,basestr))
- self._show_body(stream,indent)
-
- def getBaseNames(self):
- names = []
- for base in self.bases:
- # Unfortunately, we don't yet cope with base classes
- # like "docutils.nodes" in our visitor...
- # Make the best of it we can, for now
- try:
- names.append(base.name)
- except:
- names.append("???")
- return names
-
- # Is it worth doing this?
- addMethod = Base.addFunction
- getMethodNames = Base.getFunctionNames
-
-
-# ----------------------------------------------------------------------
-class Function(Base):
- """The representation of a Python function (and thus also of a method).
-
- But see also `Method`.
- """
-
- def __init__(self,settings,name,fullname,args,defaults,flags,docstring):
- Base.__init__(self,settings,name,fullname,docstring)
-
- self.args = args
- """The arguments for this function or method."""
-
- self.defaults = defaults
- """The defaults (if any) for the latter arguments.
-
- Note that if there are 4 arguments, and only the last
- 2 have defaults, then this list will be 2 items long.
- """
-
- self.flags = flags
- """Used to indicate \*args and \**kwargs.
- """
-
- self.generator = 0
- """Set to true if this function appears to be a generator
- (i.e., it contains a "yield" statement). Obscure code that
- doesn't actually *reach* the yield statement - for instance::
-
- def fred():
- print "3"
- if 1: return
- yield "2"
-
- will also, incorrectly, be recognised as a generator - tough.
- """
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope setup
- self.scope_init()
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- def is_callable(self):
- """Does it make sense to call an object of this type?
- """
- return 1
-
- def args_label(self):
- """Return the specialised label we use for all of our arguments.
- """
- return self.label() + "---args"
-
- def getArgs(self):
- """Return a representation of our arguments as a list (of strings).
-
- This is then suitable for joining with commas and displaying.
- """
- args = utils.merge_args(self.args,self.defaults)
- if not args:
- return args
-
- # The file compiler/consts.py defines CO_VARARGS=1 and
- # CO_VARKEYWORDS=2.
-
- # The method Transformer.com_arglist() in file compiler/transformer.py
- # handles a function's argument list.
-
- # According to that, if there's a "*args" item, then "flags" gets the
- # CO_VARARGS bit set, and if there's a "**args" item, then "flags" gets
- # the CO_VARKEYWORDS bit set. In either case, we *know* they've got to
- # be the last arguments, so we can count backwards (as we do for
- # default arguments).
-
- if self.flags & compiler.consts.CO_VARKEYWORDS:
- # If it's there, this must always be the last one...
- args[-1] = "**" + args[-1]
-
- if self.flags & compiler.consts.CO_VARARGS:
- # But this one might be last OR last but one
- if self.flags & compiler.consts.CO_VARKEYWORDS:
- args[-2] = "*" + args[-2]
- else:
- args[-1] = "*" + args[-1]
-
- return args
-
- def show(self,stream,indent=0):
- stream.write("%s%s %s(%s)\n"%(" "*indent,self.__class__.__name__,
- self.name,
- string.join(self.getArgs(),", ")))
- self._show_body(stream,indent)
-
- def getSelf(self):
- """For a method, return the name used for "self".
-
- (Actually, for a method *or* a function, return the name of
- the first argument - we need it on functions as well in case
- someone is defining a function later to be assigned to a class
- and used as a method.)
- """
- if len(self.args) > 0:
- return self.args[0]
- else:
- return None
-
-
-# ----------------------------------------------------------------------
-class Method(Function):
- """Just to get the class name right, I'm afraid...
- """
- pass
-
-
-# ----------------------------------------------------------------------
-class Name(ScopeMixin):
- """Information about use of a name in assignment.
-
- STILL UNDER CONSTRUCTION
-
- Test using pysource.py's "--show" option...
-
-
- We are not interested in *all* names, nor in all information
- about them...
-
- (We *could* inherit from Base, but that really brings too much other
- stuff that we don't need with it - and it doesn't *quite* seem worth
- having a mixin class (although the more I work with this, the more
- that seems a wrong decision - maybe next refactor time will change
- things.)
- """
-
- def __init__(self,settings,name,fullname,selfname=None,docstring=None):
- """Instantiate a new Name.
-
- * `settings` -- the settings for the parser
- * `name` -- the name of this, erm, name
- * `fullname` -- the "fully qualified" name - this is the "path" from
- our top-level entity down to this name (e.g., module.class.name)
- * `selfname` -- if this is an instance attribute, the string used
- as the "self" equivalent
- * `docstring` -- the docstring for this name, if any.
- """
-
- self.name = name
- """The name of this, erm, name.
- """
-
- self.fullname = fullname
- """The fully qualified name of this name
- - for instance, for a name `fred` in a class `Jim`
- in a module `bob`, this would be "bob.Jim.fred"
- """
-
- self.docstring = make_Docstring(docstring, settings)
- """The docstring for this name, or None.
- Note that, at least for the moment, we're only supporting
- one docstring for an entity. See the equivalent comment
- in `Base`.
- """
-
- self.firstuse = None
- """Remember the first use of this name - i.e., what is
- assigned to it. The value stored is the AST expression
- assigned to our name.
- """
-
- self.lastuse = None
- """Also remember the last use of this name. The value
- stored is the AST expression, as for firstuse.
- """
-
- self.reused = 0
- """Assume it has not been assigned to more than once.
- If it has, then we can't *really* report on its 'content',
- and `self.firstuse` should be ignored.
- """
-
- self.selfname = selfname
- """If this name is referred to as something like 'self.name'
- then we want to remember the string used as 'self' (since the
- user *might* be using something else). This will be ``None``
- if there is no 'prefix'.
- """
-
- self.isglobal = 0
- """True if this name is global to its module.
- """
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Experimental scope setup
- self.scope_init()
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- def parse_docstrings(self,parser):
- """If we are meant to, parse our docstrings.
-
- (The oddly plural name is for compatibility with those things
- that inherit from `Base` - another reason for thinking that a
- mixin class may be about due...)
- """
- if self.docstring:
- self.docstring.parse(parser)
-
- # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- # Experimental <interpreted> node code...
- def find_docstrings(self):
- """Find each docstring in our subtree.
-
- (The oddly plural name is for compatibility with those things
- that inherit from `Base` - another reason for thinking that a
- mixin class may be about due...)
- """
- if self.docstring:
- self.docstring.transform_interpreted(self)
- # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
- def is_callable(self):
- """Does it make sense to call an object of this type?
- """
- return 0
-
- def label(self):
- """Return an XML-legal name for this object.
-
- Note that we implicitly assume that all objects have their
- output XML/HTML representation written to the same file
- - i.e., that we do not have to worry about references that
- are anything beyond simple names.
-
- (another duplicate of a method in Base)
- """
- str = string.replace(self.fullname,".","-")
- str = string.replace(str,":","--")
- return str
-
- def setValue(self,expr):
- self.lastuse = expr
- if not self.firstuse:
- self.firstuse = expr
- else:
- self.reused = 1
-
- def setGlobal(self):
- self.isglobal = 1
-
- def isGlobal(self):
- return self.isglobal
-
- def getDocstring(self):
- return self.docstring
-
- def getSelfName(self):
- return self.selfname
-
- def getValueString(self):
- if self.reused or not self.firstuse:
- return None
- else:
- return utils.stringify_expr(self.firstuse)
-
- def getLastValueString(self):
- """Return the stringified value of this name, or None.
- """
- return utils.stringify_expr(self.lastuse)
-
- def actualLastValue(self):
- """Return the actual value assigned to this name.
-
- If the value assigned is a constant, then return it, otherwise
- raise a ValueError (we can't just return NULL because that *is*
- a sensible constant!).
- """
- thing = self.lastuse
- # See utils.stringify_expr() for information on what we think
- # we're doing here...
- if isinstance(thing,compiler.ast.Const):
- return thing.value
- else:
- raise ValueError,"Value assigned to %s is not a constant:\n" \
- "(%s)"%(self.getSelfName(),self.getLastValueString())
-
- def getAsString(self):
- str = self.name
- val = self.getValueString()
- if val:
- str += " = " + val
- return str
-
- def show(self,stream,indent=0):
- """Override as necessary."""
- stream.write("%s%s %s"%(" "*indent,self.__class__.__name__,
- self.getAsString()))
- if self.isglobal:
- stream.write(" (global)\n")
- else:
- stream.write("\n")
- if self.docstring:
- self.docstring.show(stream," "*(indent+2))
-
-
-# ----------------------------------------------------------------------
-class Argument(Name):
- """An argument to a method or function.
-
- This is a separate class just to get the class name right, I'm afraid...
- """
- pass
-
-
-# ----------------------------------------------------------------------
-class ModuleValue(Name):
- """A name defined by assignment at the top level of a module.
-
- This is a separate class just to get the class name right, I'm afraid...
- """
- pass
-
-
-# ----------------------------------------------------------------------
-class ClassValue(Name):
- """A name defined by assignment within a class definition.
-
- This is a separate class just to get the class name right, I'm afraid...
- """
- pass
-
-
-# ----------------------------------------------------------------------
-class InstanceValue(Name):
- """An instance defined by assignment within a method - e.g., self.thing
-
- TO DO: Hmm - I need to actually *implement* the use of `self.our_class`
- and `self.see_also`.
- """
-
- def __init__(self,*args,**kws):
- Name.__init__(self,*args,**kws)
-
- self.our_class = None
- """If we are self.thing in a method, then "self" refers to a class
- (the one enclosing the method!), and this will be a reference to it.
- """
-
- self.see_also = None
- """If the class already defined a `ClassInstance` of this name,
- then we'll ultimately want a reference to that class here, so
- that our output can say "see also class instance XXX".
- """
-
- def set_class(self,klass):
- """Indicate which Class we really belong to.
- """
- self.our_class = klass
-
-
-# ----------------------------------------------------------------------
-class ImportName(Name):
- """A name assigned by "import" or "from ... import"
-
- Should we distinguish these? ((yes))
-
- This is a separate class just to get the class name right, I'm afraid...
-
- NB: we don't yet deal with "import ... as ..."
- """
-
- def is_callable(self):
- """Does it make sense to call an object of this type?
-
- Unfortunately, if it's something imported with "from ... import"
- there is no simple way of knowing - so maybe err on the side of
- assuming so.
-
- ((Note that this is actually a good argument for separating out
- the two sorts of import, since we know *modules* are not callable,
- and "import" just makes modules visible.))
- """
- return 1
-
-
-# ----------------------------------------------------------------------
-def test_parse_module(filename):
- print "Reading file %s"%filename
- return Module(filename,debug=0)
-
-def test_show_ast(thing):
- print
- print "AST"
- print "==="
- thing.show(sys.stdout)
-
-def test_show_scopes(thing):
- print
- print "Scopes"
- print "======"
- thing.scope_show()
-
-def test():
- print "Testing pysource/visit.py"
- if len(sys.argv) <= 1:
- print "Usage: pysource/visit.py <python-file>"
- return
- filename = sys.argv[1]
- thing = test_parse_module(filename)
- test_show_ast(thing)
- test_show_scopes(thing)
-
-if __name__ == "__main__":
- test()
diff --git a/sandbox/tibs/pysource2/__init__.py b/sandbox/tibs/pysource2/__init__.py
deleted file mode 100644
index d7e9d8a32..000000000
--- a/sandbox/tibs/pysource2/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""Package pysource2 - Python source to Python source documentation
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
diff --git a/sandbox/tibs/pysource2/log.txt b/sandbox/tibs/pysource2/log.txt
deleted file mode 100644
index 9bae3e9e0..000000000
--- a/sandbox/tibs/pysource2/log.txt
+++ /dev/null
@@ -1,113 +0,0 @@
-=============================
-Writing and testing pysource2
-=============================
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This document has been placed in the public domain.
-
-pysource2 is my attempt to rewrite the original pysource. pysource
-itself was a proof-of-concept module to find docstrings withing Python
-source files and present them as (by default) HTML documentation, as
-described by the Docutils project. Since it was written before the
-Docutils codebase became stabilised around its current Reader/Writer
-patterns, it doesn't really mesh well with the current approaches. Also,
-lots of the code is fairly grotty anyway, and could do with a rewrite on
-principle - not least because it is not well tested.
-
-So, pysource2 is both that rewrite, and also an attempt on my part to
-learn how to do test driven development.
-
-Setting the path
-================
-
-I want to take my docutils stuff directly from the source directories,
-so that I work with the latest CVS code, and don't have to keep installing
-things. Thus I need to set the Python path to point to the source
-directories::
-
- export PYTHONPATH=${PYTHONPATH}:${HOME}/docutils
-
-Since I'm using Python 2.2.3, I also need the modules in the "extras"
-directory::
-
- export PYTHONPATH=${PYTHONPATH}:${HOME}/docutils/extras
-
-If I want access to the testing stuff, I also need the "test"
-directory::
-
- export PYTHONPATH=${PYTHONPATH}:${HOME}/docutils/test
-
-
-NB: Relies upon the code in docutils/docutils/readers/python/moduleparser.py
-
-Log
-===
-The "obvious" place to start is with packages - the previous pysource
-never did quite get them right (for a start, it wouldn't cope with
-sub-packages). Also, having a utility to report on packages, then on
-modules, and gradually on to finer levels of detail, seems like giving
-something useful as soon as possible.
-
-It looked over-complex to adopt the docutils test framework itself,
-initially, especially since I am new both to unit testing *and* to test
-driven development. So I am being less ambitious, and working with
-"pure" unit tests - I reckon I'll learn more that way.
-
-So, the first pass gives me package.py and test_package.py.
-
-My first impressions of (such a little bit of) development is that TDD
-does indeed give one the feeling of reassurance I'd expected from my
-half-TDD efforts in Java at LSL.
-
-Initially, I was looking to detect a request for a package that didn't
-exist, or wasn't a directory file, explicitly, with dedicated
-exceptions. This felt rather over-complex, and indeed refactoring those
-tests out and just catching a (non-explicit) OSError in the tests works
-well enough - in reality, a user is not going to ask to parse a package
-that is not already known to be an existant directory (heck, the "user"
-is probably a program that's just figured out if the thing whose
-documentation is wanted is a file or a directory), and if they do then
-OSError makes sense since it is what one would normally get.
-
-
-Questions
-=========
-
-* Should we attempt to parse files that don't end in ".py"?
-
- What about ".pyw"?
-
- What about Python files on Unix which have had their extension removed and
- been made executable?
-
-* Should there be an option to produce a document for a directory of Python
- files that is not a package - e.g., a directory of useful scripts put
- together just to be on the UNIX path, or Python's own library.
-
-
-TODO
-====
-
- * Add a method to Module to indicate if it has an Attribute called
- __docformat__, and if so, what its value is.
-
- * That requires understanding how the testing for the moduleparser is
- organised and works, so I can add an appropriate test.
-
- * At which stage, should I incorporate Package (and NotPython) therein?
-
- * Write a simple transform (first learn how!) to parse any Docstring
- contents in a module with __docformat__ equal to one of the reStructuredText
- indicators.
-
- * Write another transform to turn the Pythonic doctree into a standard one.
-
- * At which point, we'll have something useful, albeit not very powerful,
- so provide an appropriate command line interface for (at least) HTML output.
-
- * Work out how to do attribute references, etc., in *this* context (I have
- no idea if the mechanisms from the original pysource will be any use).
-
diff --git a/sandbox/tibs/pysource2/not_a_directory b/sandbox/tibs/pysource2/not_a_directory
deleted file mode 100644
index e69de29bb..000000000
--- a/sandbox/tibs/pysource2/not_a_directory
+++ /dev/null
diff --git a/sandbox/tibs/pysource2/package.py b/sandbox/tibs/pysource2/package.py
deleted file mode 100644
index 96524693f..000000000
--- a/sandbox/tibs/pysource2/package.py
+++ /dev/null
@@ -1,185 +0,0 @@
-"""package.py - support for calculating package documentation.
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-from docutils.readers.python.moduleparser import Node, parse_module
-
-DEBUG = 0
-
-class NotAPackageException(Exception):
- pass
-
-
-# ----------------------------------------------------------------------
-class Package(Node):
- """This class represents a Python package.
-
- `filename` is the name of the package - i.e., the package name.
- This may be extended/altered/expanded to include/disambiguate the
- name of the package, the "full" name of the package (e.g., if it is
- a sub-package) and the full path of the package, as needs indicate.
-
- Note that a package must, by definition, include at least one module,
- i.e., __init__.py (otherwise, it isn't a package).
- """
-
- def __init__(self, filename):
- """Initialise a Package.
-
- Note that this does *not* take a "node" argument, since a Package
- is not actually quite like the Module and other sub-nodes.
-
- @@@ (Actually, there's a case to say that Node should be able to take
- a "node" value of None and cope, in which case our life would be
- easier - I may work on that later on...)
- """
- # Hackery - the following two lines copied from Node itself.
- self.children = []
- self.lineno = None
- self.filename = filename
-
- def attlist(self):
- return Node.attlist(self, filename=self.filename)
-
-
-
-# ----------------------------------------------------------------------
-class NotPython(Node):
- """This class is used to represent a non-Python file.
-
- @@@ If the file isn't Python, should we try for reStructuredText?
- """
-
- def __init__(self, filename):
- """Initialise a NotPython instance.
-
- @@@ Same caveats as Package.
- """
- # Hackery - the following two lines copied from Node itself.
- self.children = []
- self.lineno = None
- self.filename = filename
-
- def attlist(self):
- return Node.attlist(self, filename=self.filename)
-
-
-# ----------------------------------------------------------------------
-def parse_package_or_module(path):
- """Parse a package or module for documentation purposes.
-
- `path` should either be a directory representing a Python package, or
- a single Python file.
- """
- path = os.path.normpath(path)
- if os.path.isdir(path):
- return parse_package(path)
- else:
- return parse_file(path,path)
-
-def parse_package(package_path):
- """Parse a package for documentation purposes.
-
- `package_path` should be the system path of the package directory, which is
- not necessarily the same as the Python path...
- """
-
- if DEBUG: print "Parsing package",package_path
-
- package_path = os.path.normpath(package_path)
- dir,file = os.path.split(package_path)
- if dir == "":
- dir = "."
- return parse_subpackage(dir,file)
-
-def parse_subpackage(package_path,subpackage):
- """Parse a subpackage for documentation purposes.
-
- `package_path` should be the system path of the package directory,
- and `subpackage` is the (file) name of the subpackage therein. It
- is assumed that this is already known to be a directory.
- """
-
- sub_path = os.path.join(package_path,subpackage)
-
- if DEBUG: print "Parsing sub-package",sub_path
-
- files = os.listdir(sub_path)
- if "__init__.py" not in files:
- raise NotAPackageException,\
- "Directory '%s' is not a Python package"%sub_path
-
- node = Package(subpackage)
-
- # Should we sort the files? Well, if we don't have them in a predictable
- # order, it is harder to test the result(!), and also I believe that it
- # is easier to use the output if there is some obvious ordering. Of course,
- # the question then becomes whether packages and modules should be in the
- # same sequence, or separated.
- files.sort()
-
- for filename in files:
- fullpath = os.path.join(sub_path,filename)
- if os.path.isdir(fullpath):
- try:
- node.append(parse_subpackage(sub_path,filename))
- except NotAPackageException:
- pass
- else:
- # We do *not* want to try .pyc or .pyo files - we can guarantee
- # that they won't parse (the Python compiler code gets unhappy
- # about NULL bytes therein), and we definitely don't want an
- # entry for such files in our documentation.
- # Similarly, I work on Linux, and don't want to consider files
- # that end with "~" (this last is a bit nasty...)
- if os.path.splitext(filename)[1] not in (".pyc",".pyo") and \
- filename[-1] != "~":
- node.append(parse_file(fullpath,filename))
- return node
-
-def parse_file(fullpath,filename):
- """Parse a single file (which we hope is a Python file).
-
- * `fullpath` is the full path of the file
- * `filename` is the name we want to use for it in the docutils tree
-
- Returns a docutils parse tree for said file.
- """
-
- if DEBUG: print "Parsing file",fullpath
-
- # @@@ Should we worry about the extension of the file?
- # Trying to use that to predict the contents can be a problem
- # - we already know that we have to worry about ".pyw" as well
- # as ".py", not to mention the possibility (e.g., on Unix) of
- # having removed the extension in order to make an executable
- # file "look" more like a Unix executable. On the whole, it's
- # probably better to try to parse a file, and worry about it
- # not parsing if/when that occurs.
- module = open(fullpath)
- try:
- module_body = module.read()
- try:
- module_node = parse_module(module_body,filename)
- except SyntaxError:
- # OK - it wasn't Python - so what *should* we do with it?
- module_node = NotPython(filename)
- if DEBUG: print " (not Python)"
- return module_node
- finally:
- module.close()
-
-
-
-# ----------------------------------------------------------------------
-if __name__ == "__main__":
- result = parse_package("trivial_package")
- print result
diff --git a/sandbox/tibs/pysource2/pysrc2html.py b/sandbox/tibs/pysource2/pysrc2html.py
deleted file mode 100755
index 9aaf26782..000000000
--- a/sandbox/tibs/pysource2/pysrc2html.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-"""pysrc2html - Read Python package/modules and output HTML documentation
-
-@@@ I'm not terribly happy with the name of this module, but it will do for
-now (pydoc2html *might* be better?)
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-from package import parse_package_or_module
-import transform
-from docutils.writers.html4css1 import Writer
-from docutils.frontend import OptionParser
-
-usage = '%prog [options] [<package-directory> | <python-file> [html-file]]'
-description = ('Generates .html documentation for the given Python package'
- ' or module.')
-
-writer = Writer()
-
-option_parser = OptionParser(components=[writer],
- usage=usage,description=description)
-
-settings = option_parser.parse_args(sys.argv[1:])
-
-source_path = settings._source
-target_path = settings._destination
-
-nodes = parse_package_or_module(source_path)
-
-# That then needs converting to a docutils tree
-document = transform.make_document(nodes,settings)
-
-# And *that* wants converting to the appropriate output format
-try:
- target = open(target_path,"w")
- writer.write(document,target)
-finally:
- target.close()
diff --git a/sandbox/tibs/pysource2/reader.py b/sandbox/tibs/pysource2/reader.py
deleted file mode 100644
index 6e4c7dfd2..000000000
--- a/sandbox/tibs/pysource2/reader.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""reader.py - docutils Reader for Python source code
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import docutils.readers
-from docutils.readers.python.moduleparser import Node, parse_module
-#from package import parse_package
-from transform import make_document
-
-class Reader(docutils.readers.Reader):
- """A Python source code specific Reader.
- """
-
- config_section = 'python reader'
- config_section_dependencies = ('readers',)
-
- def parse(self):
- """Parse `self.input` into a document tree."""
-
- tree = parse_module(self.input,self.source.source_path)
- self.document = document = make_document(tree)
- #self.document = document = self.new_document()
- #self.parser.parse(self.input, document)
- document.current_source = document.current_line = None
diff --git a/sandbox/tibs/pysource2/temp.rst b/sandbox/tibs/pysource2/temp.rst
deleted file mode 100644
index fa2836232..000000000
--- a/sandbox/tibs/pysource2/temp.rst
+++ /dev/null
@@ -1,81 +0,0 @@
-<document source="temp.txt">
- <comment xml:space="preserve">
- This is a simple reStructuredText file that represents what I would
- <comment xml:space="preserve">
- like the output of transforming my test Python code to be
- <section class="package" id="package-trivial-package" name="package trivial_package">
- <title>
- Package trivial_package
- <section class="module" id="module-trivial-package-init" name="module trivial_package.__init__">
- <title>
- Module trivial_package.__init__
- <block_quote class="docstring">
- <paragraph>
- A simple docstring.
- <section class="module" id="module-trivial-package-file1" name="module trivial_package.file1">
- <title>
- Module trivial_package.file1
- <block_quote class="docstring"> ## Hmm - not quite right
- <paragraph>
- This is the first example file. It
- <emphasis>
- does
- use reStructuredText.
- <paragraph>
- Attributes:
- <bullet_list bullet="*">
- <list_item>
- <paragraph>
- __docformat__ = "reST" (line 5)
- <paragraph>
- Import: os (line 7)
- <section class="class" id="class-trivial-package-file1-fred" name="class trivial_package.file1.fred">
- <title>
- Class trivial_package.file1.Fred
- <field_list>
- <field>
- <field_name>
- line
- <field_body>
- <paragraph>
- 9
- <paragraph class="docstring"> ## Hmm
- An example class - it announces each instance as it is created.
- <section class="method" id="method-trivial-package-file1-fred-init" name="method trivial_package.file1.fred.__init__">
- <title>
- Method trivial_package.file1.Fred.__init__
- <field_list>
- <field>
- <field_name>
- line
- <field_body>
- <paragraph>
- 13
- <field>
- <field_name>
- parameters
- <field_body>
- <paragraph>
- self
- <section class="module" id="module-trivial-package-file2" name="module trivial_package.file2">
- <title>
- Module trivial_package.file2
- <block_quote class="docstring">
- <paragraph>
- This module is
- <emphasis>
- not
- using reStructuredText for its docstrings.
- <section class="file" id="file-trivial-package-not-python" name="file trivial_package.not_python">
- <title>
- File trivial_package.not_python
- <paragraph>
- (Not a Python module)
- <section class="package" id="package-trivial-package-sub-package" name="package trivial_package.sub_package">
- <title>
- Package trivial_package.sub_package
- <section class="module" id="module-trivial-package-sub-package-init" name="module trivial_package.sub_package.__init__">
- <title>
- Module trivial_package.sub_package.__init__
- <paragraph>
- (No documentation)
diff --git a/sandbox/tibs/pysource2/temp.txt b/sandbox/tibs/pysource2/temp.txt
deleted file mode 100644
index dc1e9640f..000000000
--- a/sandbox/tibs/pysource2/temp.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-.. This is a simple reStructuredText file that represents what I would
-.. like the output of transforming my test Python code to be
-
-.. class:: package
-
-=======================
-Package trivial_package
-=======================
-
-.. class:: module
-
-Module trivial_package.__init__
-===============================
-
- .. class:: docstring
-
- A simple docstring.
-
-.. class:: module
-
-Module trivial_package.file1
-============================
-
- .. class:: docstring
-
- This is the first example file. It *does* use reStructuredText.
-
- Attributes:
-
- * __docformat__ = "reST" (line 5)
-
- Import: os (line 7)
-
-.. class:: class
-
-Class trivial_package.file1.Fred
---------------------------------
-
-:line: 9
-
- .. class:: docstring
-
- An example class - it announces each instance as it is created.
-
-.. class:: method
-
-Method trivial_package.file1.Fred.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:line: 13
-:parameters: self
-
-.. class:: module
-
-Module trivial_package.file2
-============================
-
- .. class:: docstring
-
- This module is *not* using reStructuredText for its docstrings.
-
-.. class:: file
-
-File trivial_package.not_python
-===============================
-
-(Not a Python module)
-
-.. class:: package
-
-Package trivial_package.sub_package
-===================================
-
-.. class:: module
-
-Module trivial_package.sub_package.__init__
--------------------------------------------
-
-(No documentation)
diff --git a/sandbox/tibs/pysource2/test_package.py b/sandbox/tibs/pysource2/test_package.py
deleted file mode 100644
index d267d3937..000000000
--- a/sandbox/tibs/pysource2/test_package.py
+++ /dev/null
@@ -1,179 +0,0 @@
-#! /usr/bin/env python
-"""test_package.py
-
-Unit tests for parsing packages for pysource.
-
-Initially, this is a standalone test, but ultimately it may be merged into the
-mechanisms used for the Docutils self-tests.
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import unittest
-
-from package import parse_package, NotAPackageException
-from transform import make_document
-
-# The following is to ensure that there are .pyc files in the package
-# - this is important for testing, since the Python compiler gets quite
-# unhappy if given a non-text file to play with (it doesn't like null bytes),
-# so we need to do something about that...
-import trivial_package
-
-class PackageTest(unittest.TestCase):
-
- def testNoSuchDirectory(self):
- """Not a package - no such directory.
- """
-
- self.assertRaises(OSError,
- parse_package,
- "no_such_directory")
-
- def testNotADirectory(self):
- """Not a package - file is not a directory.
- """
-
- self.assertRaises(OSError,
- parse_package,
- "not_a_directory")
-
- def testNotAPackage(self):
- """Not a package - directory is empty.
- """
-
- self.assertRaises(NotAPackageException,
- parse_package,
- "not_a_package")
-
- def testPackage(self):
- """A package containing subpackage(s)
-
- The directory is called "trivial_package" for historical reasons.
- """
-
- wanted_result = """\
-<Package filename="trivial_package">
- <Module filename="__init__.py">
- <Docstring>
- A simple docstring.
- <Module filename="file1.py">
- <Docstring>
- This is the first example file. It *does* use reStructuredText.
- <Attribute lineno="5" name="__docformat__">
- <Expression lineno="5">
- "reST"
- <Import lineno="7">
- os
- <Class lineno="9" name="Fred">
- <Docstring lineno="9">
- An example class - it announces each instance as it is created.
- <Method lineno="13" name="__init__">
- <ParameterList lineno="13">
- <Parameter lineno="13" name="self">
- <Module filename="file2.py">
- <Docstring>
- This module is *not* using reStructuredText for its docstrings.
- <NotPython filename="not_python">
- <Package filename="sub_package">
- <Module filename="__init__.py">\n"""
-
- actual_result = str(parse_package("trivial_package"))
-
- if wanted_result != actual_result:
- print "+++++++++++++++++++++++++ WANT"
- print wanted_result
- print "+++++++++++++++++++++++++ GOT"
- print actual_result
- print "+++++++++++++++++++++++++"
-
- self.assertEqual(actual_result,wanted_result)
-
- def testMakeDocument(self):
- """
- Turn our Package tree into a docutils Document.
- """
-
- # I've split the wanted result string up into substrings so I can
- # amend it more easily (or so I hope).
- trivial_package = """\
-<document source="Package trivial_package">
- <section class="package" id="package-trivial-package" name="package trivial_package">
- <title>
- Package trivial_package\n"""
-
- # The "xml:space" attribute is by observation, not prediction
- module_init = """\
- <section class="module" id="module-trivial-package-init" name="module trivial_package.__init__">
- <title>
- Module trivial_package.__init__
- <literal_block class="docstring" xml:space="preserve">
- A simple docstring.\n"""
-
- module_file1 = """\
- <section class="module" id="module-trivial-package-file1" name="module trivial_package.file1">
- <title>
- Module trivial_package.file1
- <literal_block class="docstring" xml:space="preserve">
- This is the first example file. It *does* use reStructuredText.
- <section class="class" id="class-trivial-package-file1-fred" name="class trivial_package.file1.fred">
- <title>
- Class trivial_package.file1.Fred
- <literal_block class="docstring" xml:space="preserve">
- An example class - it announces each instance as it is created.\n"""
-
- module_file2 = """\
- <section class="module" id="module-trivial-package-file2" name="module trivial_package.file2">
- <title>
- Module trivial_package.file2
- <literal_block class="docstring" xml:space="preserve">
- This module is *not* using reStructuredText for its docstrings.\n"""
-
- non_python_file = """\
- <section class="file" id="file-trivial-package-not-python" name="file trivial_package.not_python">
- <title>
- File trivial_package.not_python
- <paragraph>
- File
- <literal>
- not_python
- is not a Python module.\n"""
-
- sub_package = """\
- <section class="package" id="package-trivial-package-sub-package" name="package trivial_package.sub_package">
- <title>
- Package trivial_package.sub_package\n"""
-
- sub_module_init = """\
- <section class="module" id="module-trivial-package-sub-package-init" name="module trivial_package.sub_package.__init__">
- <title>
- Module trivial_package.sub_package.__init__\n"""
-
- wanted_result = (trivial_package + module_init + module_file1 +
- module_file2 + non_python_file + sub_package +
- sub_module_init)
-
- tree = parse_package("trivial_package")
-
- document = make_document(tree)
-
- actual_result = document.pformat()
-
- if wanted_result != actual_result:
- print "+++++++++++++++++++++++++ WANT"
- print wanted_result
- print "+++++++++++++++++++++++++ GOT"
- print actual_result
- print "+++++++++++++++++++++++++"
-
- self.assertEqual(actual_result,wanted_result)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/sandbox/tibs/pysource2/test_reader.py b/sandbox/tibs/pysource2/test_reader.py
deleted file mode 100644
index e48f20749..000000000
--- a/sandbox/tibs/pysource2/test_reader.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#! /usr/bin/env python
-"""test_reader.py
-
-Unit tests for the Python source Reader
-
-Initially, this is a standalone test, but ultimately it may be merged into the
-mechanisms used for the Docutils self-tests.
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import unittest
-
-from package import parse_package
-from transform import make_document
-from reader import Reader
-from docutils.core import publish_string
-from docutils.readers.python.moduleparser import parse_module
-
-class PackageTest(unittest.TestCase):
-
- def testReader(self):
- """Test the reader works as expected
- """
- reader = Reader()
-
- source="# A Python comment"
- source_path="test.py"
-
- # Hmm - extra debugging info...
- publish_string = publish_string_with_traceback
-
- actual_result = publish_string(reader=reader,reader_name="python",
- parser_name="restructuredtext",
- writer_name="pseudoxml",
- source=source, source_path=source_path)
-
- wanted_result = """\
-<document source="Module test">
- <section class="module" id="module-test" name="module test">
- <title>
- Module test\n"""
-
-
- if wanted_result != actual_result:
- print "+++++++++++++++++++++++++ WANT"
- print wanted_result
- print "+++++++++++++++++++++++++ GOT"
- print actual_result
- print "+++++++++++++++++++++++++"
-
- self.assertEqual(actual_result,wanted_result)
-
- def testTool(self):
- """Trying to think what to do for packages"""
- # The Reader interface is designed to work with single test entities,
- # either a string or the content of a text file (i.e., a single thing
- # that can be accessed via some sort of "read" method).
- # This doesn't work for packages, where one has multiple files.
- # Thus I suspect that the Reader interface is not appropriate for
- # what I want to do (at least, not without doing it unnecessary
- # violence and making it a lot more complicated).
- # So I need to do things "by hand"...
-
- source="# A Python comment"
- source_path="test.py"
-
- # Since a body of text is a Module, not a Package, we'll go straight
- # to it
- nodes = parse_module(source,source_path)
-
- # That then needs converting to a docutils tree
- document = make_document(nodes)
-
- # And *that* wants converting to the appropriate output format
-
- from docutils.writers.pseudoxml import Writer
- writer = Writer()
- writer.document = document
- writer.translate()
- actual_result = writer.output
-
- wanted_result = """\
-<document source="Module test">
- <section class="module" id="module-test" name="module test">
- <title>
- Module test\n"""
-
-
- if wanted_result != actual_result:
- print "+++++++++++++++++++++++++ WANT"
- print wanted_result
- print "+++++++++++++++++++++++++ GOT"
- print actual_result
- print "+++++++++++++++++++++++++"
-
- self.assertEqual(actual_result,wanted_result)
-
-
-def publish_string_with_traceback(reader=None,reader_name=None,
- parser_name=None,writer_name=None,
- source=None,source_path=None):
- """A modified version of publish_string, so I can request traceback.
- """
- from docutils.core import Publisher
- from docutils import io
- pub = Publisher(reader=reader,
- source_class=io.StringInput,
- destination_class=io.StringOutput)
- pub.set_components(reader_name="python",
- parser_name="restructuredtext",
- writer_name="pseudoxml")
-
- pub.process_command_line(argv=["--traceback"])
-
- pub.set_source(source=source, source_path=source_path)
- return pub.publish(enable_exit=False)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/sandbox/tibs/pysource2/transform.py b/sandbox/tibs/pysource2/transform.py
deleted file mode 100644
index 1be37bd02..000000000
--- a/sandbox/tibs/pysource2/transform.py
+++ /dev/null
@@ -1,157 +0,0 @@
-"""transform.py - create a docutils Document tree from a Package or Module tree
-
-:Author: Tibs
-:Contact: tibs@tibsnjoan.co.uk
-:Revision: $Revision$
-:Date: $Date$
-:Copyright: This module has been placed in the public domain.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-from docutils.utils import new_document
-import docutils.nodes as nodes
-from package import Package, NotPython
-from docutils.readers.python.moduleparser import Module, Class, Docstring
-
-def make_document(tree,settings=None):
- """Return a docutils Document tree constructed from this Python tree.
-
- The tree given must be either a Package or Module tree.
- """
-
- # @@@ Can it ever be anything other than a package or module?
- # I'd assert not - the module is the basic "smallest unit".
- # Should we test that?
- if isinstance(tree,Package):
- document = new_document("Package %s"%tree.filename,settings)
- section = make_package_section(tree)
- else:
- document = new_document("Module %s"%os.path.splitext(tree.filename)[0],
- settings)
- section = make_module_section(tree)
- document.append(section)
- return document
-
-def make_package_section(tree,parent_name=None):
- """Return a docutils tree constructed from this Package tree
- """
- if parent_name:
- tree_name = "%s.%s"%(parent_name,tree.filename)
- else:
- tree_name = tree.filename
- title = "Package %s"%(tree_name)
-
- # @@@ Do I really want to normalise (case fold, in particular)
- # the id/name for this section? Python names can legitimately
- # distinguish case, and whilst that's not terribly useful at
- # the file level (since not all OS/filesystems keep such a
- # distinction), it certainly is a valid possibility *within*
- # a file...
- #
- # make_id() produces a name that starts with [a-z] and continues
- # with a-z, 0-9 and hyphen (or something like that).
- #
- # fully_normalize_name() reduces spaces to single spaces (OK),
- # but also lowercases.
- #
- # @@@ Think more on usage here, I guess
- section = nodes.section(CLASS="package",id=nodes.make_id(title),
- name=nodes.fully_normalize_name(title))
- title = nodes.title(text=title)
- section.append(title)
-
- # @@@ I'm enforcing an order of modules before non-python files before
- # subpackages here
- # - do I really care?
- # - do I want some other way order?
- # - is this the best way to do it (e.g., I could sort the children
- # into order first instead)
- for child in tree.children:
- if isinstance(child,Module):
- subsection = make_module_section(child,tree_name)
- section.append(subsection)
- for child in tree.children:
- if isinstance(child,NotPython):
- subsection = make_not_python_section(child,tree_name)
- section.append(subsection)
- for child in tree.children:
- if isinstance(child,Package):
- subsection = make_package_section(child,tree_name)
- section.append(subsection)
- return section
-
-def make_module_section(tree,parent_name=None):
- """Return a docutils tree constructed from this Module sub-tree
- """
- module_name = os.path.splitext(tree.filename)[0]
- if parent_name:
- tree_name = "%s.%s"%(parent_name,module_name)
- else:
- tree_name = module_name
- title = "Module %s"%(tree_name)
-
- # @@@ Same considerations on id/name as above
- section = nodes.section(CLASS="module",id=nodes.make_id(title),
- name=nodes.fully_normalize_name(title))
- title = nodes.title(text=title)
- section.append(title)
-
- # Assume that the docstring must be the first child
- if len(tree.children) > 0 and \
- isinstance(tree.children[0],Docstring):
- section.append(make_docstring(tree.children[0]))
-
- # @@@ Again, I'm looking for classes before anything else
- for child in tree.children:
- if isinstance(child,Class):
- subsection = make_class_section(child,tree_name)
- section.append(subsection)
-
- return section
-
-def make_not_python_section(tree,parent_name=None):
- """Return a docutils tree constructed from this NotPython (file) sub-tree
- """
- if parent_name:
- tree_name = "%s.%s"%(parent_name,tree.filename)
- else:
- tree_name = tree.filename
- title = "File %s"%(tree_name)
-
- # @@@ Same considerations on id/name as above
- section = nodes.section(CLASS="file",id=nodes.make_id(title),
- name=nodes.fully_normalize_name(title))
- title = nodes.title(text=title)
- section.append(title)
- paragraph = nodes.paragraph(text="File ")
- paragraph.append(nodes.literal(text=tree.filename))
- paragraph.append(nodes.Text(" is not a Python module."))
- section.append(paragraph)
- return section
-
-def make_class_section(tree,parent_name):
- """Return a docutils tree constructed from this Class sub-tree
- """
- tree_name = "%s.%s"%(parent_name,tree.name)
- title = "Class %s"%(tree_name)
-
- # @@@ Same considerations on id/name as above
- section = nodes.section(CLASS="class",id=nodes.make_id(title),
- name=nodes.fully_normalize_name(title))
- title = nodes.title(text=title)
- section.append(title)
-
- # Assume that the docstring must be the first child
- if len(tree.children) > 0 and \
- isinstance(tree.children[0],Docstring):
- section.append(make_docstring(tree.children[0]))
-
- # @@@ Don't forget that we want base classes to be named at
- # some point
-
- return section
-
-def make_docstring(docstring):
- return nodes.literal_block(text=docstring.text,CLASS="docstring")
diff --git a/sandbox/tibs/pysource2/trivial_package/__init__.py b/sandbox/tibs/pysource2/trivial_package/__init__.py
deleted file mode 100644
index 3e664b315..000000000
--- a/sandbox/tibs/pysource2/trivial_package/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""A simple docstring.
-"""
diff --git a/sandbox/tibs/pysource2/trivial_package/file1.py b/sandbox/tibs/pysource2/trivial_package/file1.py
deleted file mode 100644
index 9636cb676..000000000
--- a/sandbox/tibs/pysource2/trivial_package/file1.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#! /usr/bin/env python
-"""This is the first example file. It *does* use reStructuredText.
-"""
-
-__docformat__ = "reST"
-
-import os
-
-class Fred:
- """An example class - it announces each instance as it is created.
- """
-
- def __init__(self):
- print "Aha"
diff --git a/sandbox/tibs/pysource2/trivial_package/file2.py b/sandbox/tibs/pysource2/trivial_package/file2.py
deleted file mode 100644
index d0e203574..000000000
--- a/sandbox/tibs/pysource2/trivial_package/file2.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""This module is *not* using reStructuredText for its docstrings.
-"""
diff --git a/sandbox/tibs/pysource2/trivial_package/not_python b/sandbox/tibs/pysource2/trivial_package/not_python
deleted file mode 100644
index b447bba55..000000000
--- a/sandbox/tibs/pysource2/trivial_package/not_python
+++ /dev/null
@@ -1,3 +0,0 @@
-The content of this file is not Python.
-
-(Although it *is*, in fact, reStructuredText.)
diff --git a/sandbox/tibs/pysource2/trivial_package/sub_package/__init__.py b/sandbox/tibs/pysource2/trivial_package/sub_package/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/sandbox/tibs/pysource2/trivial_package/sub_package/__init__.py
+++ /dev/null
diff --git a/sandbox/wilk/french/docutils.conf b/sandbox/wilk/french/docutils.conf
deleted file mode 100644
index da7b523d9..000000000
--- a/sandbox/wilk/french/docutils.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[general]
-
-language-code: fr
diff --git a/sandbox/wilk/french/quickstart-fr.txt b/sandbox/wilk/french/quickstart-fr.txt
deleted file mode 100644
index d6d0691ce..000000000
--- a/sandbox/wilk/french/quickstart-fr.txt
+++ /dev/null
@@ -1,375 +0,0 @@
-Introduction à ReStructuredText
-===============================
-
-:Auteur: Richard Jones
-:Version: 1.10
-:Traduction: William Dode <wilk *at* flibuste.net>
-
-.. contents::
-
-
-Ce texte contient des liens de la forme "(quickref__)". Ils sont
-relatifs au manuel de référence utilisateur `Quick reStructuredText`_.
-S'ils ne fonctionnent pas, référez vous au document `master quick
-reference`_.
-
-__
-.. _Quick reStructuredText: http://docutils.sourceforge.net/docs/rst/quickref.html
-.. _master quick reference:
- http://docutils.sourceforge.net/docs/rst/quickref.html
-
-
-Structure
----------
-
-Pour commencer, il me semble que "Structured Text" n'est pas tout à fait la
-bonne appellation. Nous devrions plutôt le nommer "Relaxed Text" qui contient
-quelques schémas logiques. Ces schémas sont interprétés par un convertisseur
-HTML pour produire "Very Structured Text" (un texte très structuré) qui pourra
-être utilisé par un navigateur web.
-
-Le schéma le plus simple est le **paragraphe** (quickref__).
-C'est un bloc de texte séparé par des lignes vides (une seule suffit).
-Les paragraphes doivent avoir le même décalage -- c'est à dire des espaces
-à gauche. Ces paragraphes produiront un texte décalé. Par exemple::
-
- Ceci est un paragraphe.
- Très court.
-
- Le texte de ce paragraphe sera décalé,
- généralement utilisé pour des citations.
-
- En voilà un autre
-
-Le résultat donne :
-
- Ceci est un paragraphe.
- Très court.
-
- Le texte de ce paragraphe sera décalé,
- généralement utilisé pour des citations.
-
- En voilà un autre
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#paragraphs
-
-Styles de texte
----------------
-
-(quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#inline-markup
-
-Dans les paragraphes et le corps du texte, nous pouvons utiliser
-des marqueurs pour *italique* avec "``*italique*``" ou **gras**
-avec "``**gras**``".
-
-Si l'on souhaite qu'un texte apparaisse dans une police à chasse
-fixe "````doubles apostrophes inversées````".
-Notez qu'aucun traitement supplémentaire n'est apporté entre deux
-doubles apostrophes inversées -- les astérisques, comme dans "``*``",
-sont donc conservées en l'état.
-
-Si vous souhaitez utiliser un de ces caractères "spéciaux" dans
-le texte, il n'y a généralement pas de problème -- reStructuredText
-est assez malin.
-Par exemple, cet astérisque * est traité correctement. Si vous
-souhaitez par contre \*entourer un texte par des astérisques*
-**sans** qu'il soit en italique, il est nécessaire d'indiquer que
-l'astérisque ne doit pas être interprété. Pour cela il suffit de placer
-une barre oblique inversée juste avant lui, comme ça "``\*``" (quickref__), ou
-en l'entourant de doubles apostrophes inversées (litteral), comme cela ::
-
- ``\*``
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#escaping
-
-Listes
-------
-
-Il y a trois types de listes: **numérotées**, **avec puces** et
-de **définitions**. Dans chaque cas, nous pouvons avoir autant
-de paragraphes, sous-listes, etc. que l'on souhaite, tant que
-le décalage à gauche est aligné sur la première ligne.
-
-Les listes doivent toujours démarrer un nouveau paragraphe
--- c'est à dire qu'il doit y avoir un saut de ligne juste avant.
-
-Listes **numérotées** (par des nombres, lettres, chiffres romains;
-quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#enumerated-lists
-
- En démarrant une ligne avec un numéro ou une lettre suivie d'un
- point ".", une parenthèse droite ")" ou entouré par des parenthèses
- -- comme vous préférez. Toutes ces formes sont reconnues::
-
- 1. nombres
-
- A. Lettres en majuscule
- qui continue sur plusieurs ligne
-
- avec deux paragraphes et tout !
-
- a. lettres minuscules
-
- 3. avec une sous-liste qui démarre à un nombre différent
- 4. faites attention à garder une séquence de nombre correcte !
-
- I. majuscules en chiffres romains
-
- i. minuscules en chiffres romains
-
- (1) des nombres à nouveau
-
- 1) et encore
-
- Le résultat (note : Tous les styles de listes ne sont pas toujours
- supportés par tous les navigateurs, vous ne verrez donc pas forcément
- les effets complets) :
-
- 1. nombres
-
- A. Lettres en majuscule
- qui continue sur plusieurs ligne
-
- avec deux paragraphes et tout !
-
- a. lettres minuscules
-
- 3. avec une sous-liste qui démarre à un nombre différent
- 4. faites attention à garder une séquence de nombre correcte !
-
- I. majuscules en chiffres romains
-
- i. minuscules en chiffres romains
-
- (1) des nombres à nouveau
-
- 1) et encore
-
-Listes **à puces** (quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#bullet-lists
-
- De la même manière que pour les listes numérotées, il faut démarrer
- la première ligne avec une puce -- soit "-", "+" ou "*"::
-
- * une puce "*"
-
- - une sous-liste avec "-"
-
- + à nouveau une sous-liste
-
- - une autre option
-
- Le résultat:
-
- * une puce "*"
-
- - une sous-liste avec "-"
-
- + à nouveau une sous-liste
-
- - une autre option
-
-Les listes de **définitions** (quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#definition-lists
-
- Comme les deux autres, les listes de définitions consistent en un
- terme et la définition de ce terme. Le format est le suivant::
-
- Quoi
- Les listes de définitions associent un terme avec une définition.
-
- *Comment*
- Le terme est une phrase d'une ligne, et la définition est d'un
- ou plusieurs paragraphes ou éléments, décalés par rapport au terme.
- Les lignes vides ne sont pas autorisées entre le terme et la définition.
-
- Le résultat:
-
- Quoi
- Les listes de définitions associent un terme avec une définition.
-
- *Comment*
- Le terme est une phrase d'une ligne, et la définition est d'un
- ou plusieurs paragraphes ou éléments, décalés par rapport au terme.
- Les lignes vides ne sont pas autorisées entre le terme et la définition.
-
-Préformatage
--------------
-(quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#literal-blocks
-
-Pour inclure un texte préformaté sans traitement
-il suffit de terminer le paragraphe par "``::``". Le texte préformaté est
-terminé lorsqu'une ligne retombe au niveau du décalage précédent. Par exemple::
-
- Un exemple::
-
- Espaces, nouvelles lignes, lignes vides, et toutes sortes de marqueurs
- (comme *ceci* ou \cela) sont préservés dans les bloc préformatés.
-
- Regardez ici, je suis descendu d'un niveau.
- (mais pas assez)
-
- Fin de l'exemple
-
-Le résultat:
-
- Un exemple::
-
- Espaces, nouvelles lignes, lignes vides, et toutes sortes de marqueurs
- (comme *ceci* ou \cela) sont préservés dans les bloc préformatés.
-
- Regardez ici, je suis descendu d'un niveau.
- (mais pas assez)
-
- Fin de l'exemple
-
-Notez que si le paragraphe contient seulement "``::``", il est ignoré.
-
- ::
-
- Ceci est un texte préformaté,
- le paragraphe "::" est ignoré.
-
-Sections
---------
-(quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#section-structure
-
-Pour diviser un texte en plusieurs sections, nous utilisons des
-**en-têtes de section**. C'est à dire une seule ligne de texte (d'un
-ou plusieurs mots) avec un ornement : juste en dessous et éventuellement
-dessus aussi, avec des tirets "``-----``", égal "``=====``", tildes
-"``~~~~~``" ou n'importe quel de ces caractères ``= - ` : ' " ~ ^ _ * + # < >``
-qui vous semble convenir. Un ornement simplement en dessous n'a pas la
-même signification qu'un ornement dessus-dessous avec le même caractère.
-Les ornements doivent avoir au moins la taille du texte. Soyez cohérent,
-les ornements identiques sont censés être du même niveau::
-
- Chapitre 1
- ==========
-
- Section 1.1
- -----------
-
- Sous-section 1.1.1
- ~~~~~~~~~~~~~~~~~~
-
- Section 1.2
- -----------
-
- Chapitre 2
- ==========
-
-Le résultat de cette structure, sous la forme pseudo-XML::
-
- <section>
- <title>
- Chapitre 1
- <section>
- <title>
- Section 1.1
- <section>
- <title>
- Sous-section 1.1.1
- <section>
- <title>
- Section 1.2
- <section>
- <title>
- Chapitre 2
-
-(Pseudo-XML utilise une indentation et n'as pas de balises finale. Il
-n'est pas possible de montrer le résultat, comme dans les autres exemples,
-du fait que les sections ne peuvent être utilisées à l'intérieur d'un
-paragraphe décalé. Pour un exemple concret, comparez la structure de
-ce document avec le résultat.)
-
-Notez que les en-têtes de section sont utilisable comme cible de liens,
-simplement en utilisant leur nom. Pour créer un lien sur la section Listes_,
-j'écris "``Listes_``". Si le titre comporte des espaces, il est nécessaire
-d'utiliser les doubles apostrophes inversées "```Styles de texte`_``".
-
-Pour indiquer le titre du document, utilisez un style d'ornement unique
-en début de document. Pour indiquer un sous-titre de document, utilisez
-un autre ornement unique juste après le titre.
-Par exemple::
-
- =================
- Titre du document
- =================
- ----------
- Sous-titre
- ----------
-
- Titre de la section
- ===================
-
- ...
-
-Notez que "Titre du document" et "Titre de la section" utilisent le signe
-égal, mais sont différents et sans relation. Le texte et l'ornement peuvent
-être de la même taille pour des questions d'esthétisme.
-
-
-Images
-------
-(quickref__)
-
-__ http://docutils.sourceforge.net/docs/rst/quickref.html#directives
-
-Pour inclure une image dans votre document, vous devez utiliser la directive__
-``image``.
-Par exemple::
-
- .. image:: images/biohazard.png
-
-Le résultat:
-
-.. image:: images/biohazard.png
-
-La partie ``images/biohazard.png`` indique le chemin d'accès au fichier
-de l'image qui doit apparaître. Il n'y a pas de restriction sur l'image
-(format, taille etc). Si l'image doit apparaître en HTML et que vous
-souhaitez lui ajouter des informations::
-
- .. image:: images/biohazard.png
- :height: 100
- :width: 200
- :scale: 50
- :alt: texte alternatif
-
-Consultez la documentation__ complète de la directive image pour plus d'informations.
-
-__ ../../spec/rst/directives.html
-__ ../../spec/rst/directives.html#images
-
-
-Et ensuite ?
-------------
-
-Cette introduction montre les possibilités les plus courantes de reStructuredText,
-mais il y en a bien d'autres à explorer. Le manuel de référence utilisateur
-'Quick reStructuredText`_ est recommandé pour aller plus loin. Pour les détails complets
-consultez `reStructuredText Markup Specification`_ [#]_.
-
-Les utilisateurs ayant besoin d'aide avec Docutils ou reStructuredText peuvent
-`poster un message`_ sur la liste de diffusion `Docutils-Users mailing list`_.
-Le `Docutils project web site`_ comporte davantage d'informations.
-
-.. [#] Si ce lien relatif ne fonctionne pas, consultez le document principal:
- http://docutils.sourceforge.net/spec/rst/reStructuredText.html.
-
-.. _reStructuredText Markup Specification:
- ../../spec/rst/reStructuredText.html
-.. _poster un message: mailto:docutils-users@lists.sourceforge.net
-.. _Docutils-Users mailing list:
- http://lists.sourceforge.net/lists/listinfo/docutils-users
-.. _Docutils project web site: http://docutils.sourceforge.net/
diff --git a/docutils/setup.py b/setup.py
index 84032bdac..84032bdac 100755
--- a/docutils/setup.py
+++ b/setup.py
diff --git a/docutils/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
index c30b263d6..c30b263d6 100644
--- a/docutils/test/DocutilsTestSupport.py
+++ b/test/DocutilsTestSupport.py
diff --git a/docutils/test/alltests.py b/test/alltests.py
index b28541af1..b28541af1 100755
--- a/docutils/test/alltests.py
+++ b/test/alltests.py
diff --git a/docutils/test/coverage.sh b/test/coverage.sh
index 3edea0e2a..3edea0e2a 100755
--- a/docutils/test/coverage.sh
+++ b/test/coverage.sh
diff --git a/docutils/test/data/config_1.txt b/test/data/config_1.txt
index b19a213b3..b19a213b3 100644
--- a/docutils/test/data/config_1.txt
+++ b/test/data/config_1.txt
diff --git a/docutils/test/data/config_2.txt b/test/data/config_2.txt
index 35c307c6c..35c307c6c 100644
--- a/docutils/test/data/config_2.txt
+++ b/test/data/config_2.txt
diff --git a/docutils/test/data/config_error_handler.txt b/test/data/config_error_handler.txt
index 82e341649..82e341649 100644
--- a/docutils/test/data/config_error_handler.txt
+++ b/test/data/config_error_handler.txt
diff --git a/docutils/test/data/config_list.txt b/test/data/config_list.txt
index fde6793c9..fde6793c9 100644
--- a/docutils/test/data/config_list.txt
+++ b/test/data/config_list.txt
diff --git a/docutils/test/data/config_list_2.txt b/test/data/config_list_2.txt
index 6f8d69f07..6f8d69f07 100644
--- a/docutils/test/data/config_list_2.txt
+++ b/test/data/config_list_2.txt
diff --git a/docutils/test/data/config_old.txt b/test/data/config_old.txt
index fa07d6dab..fa07d6dab 100644
--- a/docutils/test/data/config_old.txt
+++ b/test/data/config_old.txt
diff --git a/docutils/test/data/csv_data.txt b/test/data/csv_data.txt
index f33f47f7f..f33f47f7f 100644
--- a/docutils/test/data/csv_data.txt
+++ b/test/data/csv_data.txt
diff --git a/docutils/test/data/csv_dep.txt b/test/data/csv_dep.txt
index 14620a926..14620a926 100644
--- a/docutils/test/data/csv_dep.txt
+++ b/test/data/csv_dep.txt
diff --git a/docutils/test/data/dependencies.txt b/test/data/dependencies.txt
index cc18c8f0c..cc18c8f0c 100644
--- a/docutils/test/data/dependencies.txt
+++ b/test/data/dependencies.txt
diff --git a/docutils/test/data/include.txt b/test/data/include.txt
index ae2a894bb..ae2a894bb 100644
--- a/docutils/test/data/include.txt
+++ b/test/data/include.txt
diff --git a/docutils/test/data/raw.txt b/test/data/raw.txt
index e69de29bb..e69de29bb 100644
--- a/docutils/test/data/raw.txt
+++ b/test/data/raw.txt
diff --git a/docutils/test/data/stylesheet.txt b/test/data/stylesheet.txt
index e69de29bb..e69de29bb 100644
--- a/docutils/test/data/stylesheet.txt
+++ b/test/data/stylesheet.txt
diff --git a/docutils/test/docutils.conf b/test/docutils.conf
index df4b1e46a..df4b1e46a 100644
--- a/docutils/test/docutils.conf
+++ b/test/docutils.conf
diff --git a/docutils/test/docutils_difflib.py b/test/docutils_difflib.py
index a41d4d5ba..a41d4d5ba 100644
--- a/docutils/test/docutils_difflib.py
+++ b/test/docutils_difflib.py
diff --git a/docutils/test/functional/README.txt b/test/functional/README.txt
index fc104d52e..fc104d52e 100644
--- a/docutils/test/functional/README.txt
+++ b/test/functional/README.txt
diff --git a/docutils/test/functional/expected/compact_lists.html b/test/functional/expected/compact_lists.html
index a486f378a..a486f378a 100644
--- a/docutils/test/functional/expected/compact_lists.html
+++ b/test/functional/expected/compact_lists.html
diff --git a/docutils/test/functional/expected/dangerous.html b/test/functional/expected/dangerous.html
index bba9f3408..bba9f3408 100644
--- a/docutils/test/functional/expected/dangerous.html
+++ b/test/functional/expected/dangerous.html
diff --git a/docutils/test/functional/expected/field_name_limit.html b/test/functional/expected/field_name_limit.html
index b4148c043..b4148c043 100644
--- a/docutils/test/functional/expected/field_name_limit.html
+++ b/test/functional/expected/field_name_limit.html
diff --git a/docutils/test/functional/expected/latex_docinfo.tex b/test/functional/expected/latex_docinfo.tex
index 04d9438f7..04d9438f7 100644
--- a/docutils/test/functional/expected/latex_docinfo.tex
+++ b/test/functional/expected/latex_docinfo.tex
diff --git a/docutils/test/functional/expected/misc_rst_html4css1.html b/test/functional/expected/misc_rst_html4css1.html
index f91844693..f91844693 100644
--- a/docutils/test/functional/expected/misc_rst_html4css1.html
+++ b/test/functional/expected/misc_rst_html4css1.html
diff --git a/docutils/test/functional/expected/pep_html.html b/test/functional/expected/pep_html.html
index 8c1a077c5..8c1a077c5 100644
--- a/docutils/test/functional/expected/pep_html.html
+++ b/test/functional/expected/pep_html.html
diff --git a/docutils/test/functional/expected/standalone_rst_html4css1.html b/test/functional/expected/standalone_rst_html4css1.html
index 4f823b504..4f823b504 100644
--- a/docutils/test/functional/expected/standalone_rst_html4css1.html
+++ b/test/functional/expected/standalone_rst_html4css1.html
diff --git a/docutils/test/functional/expected/standalone_rst_latex.tex b/test/functional/expected/standalone_rst_latex.tex
index ba5b63bb0..ba5b63bb0 100644
--- a/docutils/test/functional/expected/standalone_rst_latex.tex
+++ b/test/functional/expected/standalone_rst_latex.tex
diff --git a/docutils/test/functional/expected/standalone_rst_pseudoxml.txt b/test/functional/expected/standalone_rst_pseudoxml.txt
index 193f8c37c..193f8c37c 100644
--- a/docutils/test/functional/expected/standalone_rst_pseudoxml.txt
+++ b/test/functional/expected/standalone_rst_pseudoxml.txt
diff --git a/docutils/test/functional/expected/standalone_rst_s5_html_1.html b/test/functional/expected/standalone_rst_s5_html_1.html
index 54caa3916..54caa3916 100644
--- a/docutils/test/functional/expected/standalone_rst_s5_html_1.html
+++ b/test/functional/expected/standalone_rst_s5_html_1.html
diff --git a/docutils/test/functional/expected/standalone_rst_s5_html_2.html b/test/functional/expected/standalone_rst_s5_html_2.html
index e6e474a25..e6e474a25 100644
--- a/docutils/test/functional/expected/standalone_rst_s5_html_2.html
+++ b/test/functional/expected/standalone_rst_s5_html_2.html
diff --git a/docutils/test/functional/expected/ui/default/blank.gif b/test/functional/expected/ui/default/blank.gif
index 75b945d25..75b945d25 100644
--- a/docutils/test/functional/expected/ui/default/blank.gif
+++ b/test/functional/expected/ui/default/blank.gif
Binary files differ
diff --git a/docutils/test/functional/expected/ui/default/framing.css b/test/functional/expected/ui/default/framing.css
index c4727f303..c4727f303 100644
--- a/docutils/test/functional/expected/ui/default/framing.css
+++ b/test/functional/expected/ui/default/framing.css
diff --git a/docutils/test/functional/expected/ui/default/iepngfix.htc b/test/functional/expected/ui/default/iepngfix.htc
index 9f3d628b5..9f3d628b5 100644
--- a/docutils/test/functional/expected/ui/default/iepngfix.htc
+++ b/test/functional/expected/ui/default/iepngfix.htc
diff --git a/docutils/test/functional/expected/ui/default/opera.css b/test/functional/expected/ui/default/opera.css
index c9d1148be..c9d1148be 100644
--- a/docutils/test/functional/expected/ui/default/opera.css
+++ b/test/functional/expected/ui/default/opera.css
diff --git a/docutils/test/functional/expected/ui/default/outline.css b/test/functional/expected/ui/default/outline.css
index fa767e227..fa767e227 100644
--- a/docutils/test/functional/expected/ui/default/outline.css
+++ b/test/functional/expected/ui/default/outline.css
diff --git a/docutils/test/functional/expected/ui/default/pretty.css b/test/functional/expected/ui/default/pretty.css
index 1cede72d4..1cede72d4 100644
--- a/docutils/test/functional/expected/ui/default/pretty.css
+++ b/test/functional/expected/ui/default/pretty.css
diff --git a/docutils/test/functional/expected/ui/default/print.css b/test/functional/expected/ui/default/print.css
index 9d057cc8c..9d057cc8c 100644
--- a/docutils/test/functional/expected/ui/default/print.css
+++ b/test/functional/expected/ui/default/print.css
diff --git a/docutils/test/functional/expected/ui/default/s5-core.css b/test/functional/expected/ui/default/s5-core.css
index 6965f5e8f..6965f5e8f 100644
--- a/docutils/test/functional/expected/ui/default/s5-core.css
+++ b/test/functional/expected/ui/default/s5-core.css
diff --git a/docutils/test/functional/expected/ui/default/slides.css b/test/functional/expected/ui/default/slides.css
index 82bdc0ee0..82bdc0ee0 100644
--- a/docutils/test/functional/expected/ui/default/slides.css
+++ b/test/functional/expected/ui/default/slides.css
diff --git a/docutils/test/functional/expected/ui/default/slides.js b/test/functional/expected/ui/default/slides.js
index 81e04e5d4..81e04e5d4 100644
--- a/docutils/test/functional/expected/ui/default/slides.js
+++ b/test/functional/expected/ui/default/slides.js
diff --git a/docutils/test/functional/expected/ui/small-black/blank.gif b/test/functional/expected/ui/small-black/blank.gif
index 75b945d25..75b945d25 100644
--- a/docutils/test/functional/expected/ui/small-black/blank.gif
+++ b/test/functional/expected/ui/small-black/blank.gif
Binary files differ
diff --git a/docutils/test/functional/expected/ui/small-black/framing.css b/test/functional/expected/ui/small-black/framing.css
index 70287dd06..70287dd06 100644
--- a/docutils/test/functional/expected/ui/small-black/framing.css
+++ b/test/functional/expected/ui/small-black/framing.css
diff --git a/docutils/test/functional/expected/ui/small-black/iepngfix.htc b/test/functional/expected/ui/small-black/iepngfix.htc
index fa9f99659..fa9f99659 100644
--- a/docutils/test/functional/expected/ui/small-black/iepngfix.htc
+++ b/test/functional/expected/ui/small-black/iepngfix.htc
diff --git a/docutils/test/functional/expected/ui/small-black/opera.css b/test/functional/expected/ui/small-black/opera.css
index c9d1148be..c9d1148be 100644
--- a/docutils/test/functional/expected/ui/small-black/opera.css
+++ b/test/functional/expected/ui/small-black/opera.css
diff --git a/docutils/test/functional/expected/ui/small-black/outline.css b/test/functional/expected/ui/small-black/outline.css
index fa767e227..fa767e227 100644
--- a/docutils/test/functional/expected/ui/small-black/outline.css
+++ b/test/functional/expected/ui/small-black/outline.css
diff --git a/docutils/test/functional/expected/ui/small-black/pretty.css b/test/functional/expected/ui/small-black/pretty.css
index 5c1932704..5c1932704 100644
--- a/docutils/test/functional/expected/ui/small-black/pretty.css
+++ b/test/functional/expected/ui/small-black/pretty.css
diff --git a/docutils/test/functional/expected/ui/small-black/print.css b/test/functional/expected/ui/small-black/print.css
index 9d057cc8c..9d057cc8c 100644
--- a/docutils/test/functional/expected/ui/small-black/print.css
+++ b/test/functional/expected/ui/small-black/print.css
diff --git a/docutils/test/functional/expected/ui/small-black/s5-core.css b/test/functional/expected/ui/small-black/s5-core.css
index 6965f5e8f..6965f5e8f 100644
--- a/docutils/test/functional/expected/ui/small-black/s5-core.css
+++ b/test/functional/expected/ui/small-black/s5-core.css
diff --git a/docutils/test/functional/expected/ui/small-black/slides.css b/test/functional/expected/ui/small-black/slides.css
index 82bdc0ee0..82bdc0ee0 100644
--- a/docutils/test/functional/expected/ui/small-black/slides.css
+++ b/test/functional/expected/ui/small-black/slides.css
diff --git a/docutils/test/functional/expected/ui/small-black/slides.js b/test/functional/expected/ui/small-black/slides.js
index d628dfeaf..d628dfeaf 100644
--- a/docutils/test/functional/expected/ui/small-black/slides.js
+++ b/test/functional/expected/ui/small-black/slides.js
diff --git a/docutils/test/functional/input/compact_lists.txt b/test/functional/input/compact_lists.txt
index ec13a97be..ec13a97be 100644
--- a/docutils/test/functional/input/compact_lists.txt
+++ b/test/functional/input/compact_lists.txt
diff --git a/docutils/test/functional/input/dangerous.txt b/test/functional/input/dangerous.txt
index 8f75386c8..8f75386c8 100644
--- a/docutils/test/functional/input/dangerous.txt
+++ b/test/functional/input/dangerous.txt
diff --git a/docutils/test/functional/input/data/custom_roles.txt b/test/functional/input/data/custom_roles.txt
index 0f209d61e..0f209d61e 100644
--- a/docutils/test/functional/input/data/custom_roles.txt
+++ b/test/functional/input/data/custom_roles.txt
diff --git a/docutils/test/functional/input/data/errors.txt b/test/functional/input/data/errors.txt
index 557f479d3..557f479d3 100644
--- a/docutils/test/functional/input/data/errors.txt
+++ b/test/functional/input/data/errors.txt
diff --git a/docutils/test/functional/input/data/header_footer.txt b/test/functional/input/data/header_footer.txt
index 875c9fac0..875c9fac0 100644
--- a/docutils/test/functional/input/data/header_footer.txt
+++ b/test/functional/input/data/header_footer.txt
diff --git a/docutils/test/functional/input/data/latex.txt b/test/functional/input/data/latex.txt
index 20d59db1e..20d59db1e 100644
--- a/docutils/test/functional/input/data/latex.txt
+++ b/test/functional/input/data/latex.txt
diff --git a/docutils/test/functional/input/data/list_table.txt b/test/functional/input/data/list_table.txt
index 632285e36..632285e36 100644
--- a/docutils/test/functional/input/data/list_table.txt
+++ b/test/functional/input/data/list_table.txt
diff --git a/docutils/test/functional/input/data/nonalphanumeric.txt b/test/functional/input/data/nonalphanumeric.txt
index 4c4ee7343..4c4ee7343 100644
--- a/docutils/test/functional/input/data/nonalphanumeric.txt
+++ b/test/functional/input/data/nonalphanumeric.txt
diff --git a/docutils/test/functional/input/data/standard.txt b/test/functional/input/data/standard.txt
index a0d1570ed..a0d1570ed 100644
--- a/docutils/test/functional/input/data/standard.txt
+++ b/test/functional/input/data/standard.txt
diff --git a/docutils/test/functional/input/data/table_colspan.txt b/test/functional/input/data/table_colspan.txt
index 54294fdd2..54294fdd2 100644
--- a/docutils/test/functional/input/data/table_colspan.txt
+++ b/test/functional/input/data/table_colspan.txt
diff --git a/docutils/test/functional/input/data/table_complex.txt b/test/functional/input/data/table_complex.txt
index 8ff37180e..8ff37180e 100644
--- a/docutils/test/functional/input/data/table_complex.txt
+++ b/test/functional/input/data/table_complex.txt
diff --git a/docutils/test/functional/input/data/table_rowspan.txt b/test/functional/input/data/table_rowspan.txt
index 5df3109c4..5df3109c4 100644
--- a/docutils/test/functional/input/data/table_rowspan.txt
+++ b/test/functional/input/data/table_rowspan.txt
diff --git a/docutils/test/functional/input/data/unicode.txt b/test/functional/input/data/unicode.txt
index 4bdd57653..4bdd57653 100644
--- a/docutils/test/functional/input/data/unicode.txt
+++ b/test/functional/input/data/unicode.txt
diff --git a/docutils/test/functional/input/field_list.txt b/test/functional/input/field_list.txt
index fa04ba6ca..fa04ba6ca 100644
--- a/docutils/test/functional/input/field_list.txt
+++ b/test/functional/input/field_list.txt
diff --git a/docutils/test/functional/input/latex_docinfo.txt b/test/functional/input/latex_docinfo.txt
index f6c9ba2e4..f6c9ba2e4 100644
--- a/docutils/test/functional/input/latex_docinfo.txt
+++ b/test/functional/input/latex_docinfo.txt
diff --git a/docutils/test/functional/input/pep_html.txt b/test/functional/input/pep_html.txt
index 483077131..483077131 100644
--- a/docutils/test/functional/input/pep_html.txt
+++ b/test/functional/input/pep_html.txt
diff --git a/docutils/test/functional/input/simple.txt b/test/functional/input/simple.txt
index 492e4233b..492e4233b 100644
--- a/docutils/test/functional/input/simple.txt
+++ b/test/functional/input/simple.txt
diff --git a/docutils/test/functional/input/standalone_rst_html4css1.txt b/test/functional/input/standalone_rst_html4css1.txt
index 3c2cf80c6..3c2cf80c6 100644
--- a/docutils/test/functional/input/standalone_rst_html4css1.txt
+++ b/test/functional/input/standalone_rst_html4css1.txt
diff --git a/docutils/test/functional/input/standalone_rst_latex.txt b/test/functional/input/standalone_rst_latex.txt
index 09a4f8890..09a4f8890 100644
--- a/docutils/test/functional/input/standalone_rst_latex.txt
+++ b/test/functional/input/standalone_rst_latex.txt
diff --git a/docutils/test/functional/input/standalone_rst_newlatex.txt b/test/functional/input/standalone_rst_newlatex.txt
index 81b4e5ea6..81b4e5ea6 100644
--- a/docutils/test/functional/input/standalone_rst_newlatex.txt
+++ b/test/functional/input/standalone_rst_newlatex.txt
diff --git a/docutils/test/functional/input/standalone_rst_pseudoxml.txt b/test/functional/input/standalone_rst_pseudoxml.txt
index 05f0287d0..05f0287d0 100644
--- a/docutils/test/functional/input/standalone_rst_pseudoxml.txt
+++ b/test/functional/input/standalone_rst_pseudoxml.txt
diff --git a/docutils/test/functional/input/standalone_rst_s5_html.txt b/test/functional/input/standalone_rst_s5_html.txt
index 863cc77b6..863cc77b6 100644
--- a/docutils/test/functional/input/standalone_rst_s5_html.txt
+++ b/test/functional/input/standalone_rst_s5_html.txt
diff --git a/docutils/test/functional/output/README.txt b/test/functional/output/README.txt
index ce6dc9861..ce6dc9861 100644
--- a/docutils/test/functional/output/README.txt
+++ b/test/functional/output/README.txt
diff --git a/docutils/test/functional/tests/_default.py b/test/functional/tests/_default.py
index 2835c5b2e..2835c5b2e 100644
--- a/docutils/test/functional/tests/_default.py
+++ b/test/functional/tests/_default.py
diff --git a/docutils/test/functional/tests/_standalone_rst_defaults.py b/test/functional/tests/_standalone_rst_defaults.py
index b51704929..b51704929 100644
--- a/docutils/test/functional/tests/_standalone_rst_defaults.py
+++ b/test/functional/tests/_standalone_rst_defaults.py
diff --git a/docutils/test/functional/tests/compact_lists.py b/test/functional/tests/compact_lists.py
index 3ac4c3f8b..3ac4c3f8b 100644
--- a/docutils/test/functional/tests/compact_lists.py
+++ b/test/functional/tests/compact_lists.py
diff --git a/docutils/test/functional/tests/dangerous.py b/test/functional/tests/dangerous.py
index 620a927ba..620a927ba 100644
--- a/docutils/test/functional/tests/dangerous.py
+++ b/test/functional/tests/dangerous.py
diff --git a/docutils/test/functional/tests/field_name_limit.py b/test/functional/tests/field_name_limit.py
index db79d4c67..db79d4c67 100644
--- a/docutils/test/functional/tests/field_name_limit.py
+++ b/test/functional/tests/field_name_limit.py
diff --git a/docutils/test/functional/tests/latex_docinfo.py b/test/functional/tests/latex_docinfo.py
index 3f9c34455..3f9c34455 100644
--- a/docutils/test/functional/tests/latex_docinfo.py
+++ b/test/functional/tests/latex_docinfo.py
diff --git a/docutils/test/functional/tests/misc_rst_html4css1.py b/test/functional/tests/misc_rst_html4css1.py
index 861a9e9c5..861a9e9c5 100644
--- a/docutils/test/functional/tests/misc_rst_html4css1.py
+++ b/test/functional/tests/misc_rst_html4css1.py
diff --git a/docutils/test/functional/tests/pep_html.py b/test/functional/tests/pep_html.py
index 00e127ba7..00e127ba7 100644
--- a/docutils/test/functional/tests/pep_html.py
+++ b/test/functional/tests/pep_html.py
diff --git a/docutils/test/functional/tests/standalone_rst_html4css1.py b/test/functional/tests/standalone_rst_html4css1.py
index c34298eab..c34298eab 100644
--- a/docutils/test/functional/tests/standalone_rst_html4css1.py
+++ b/test/functional/tests/standalone_rst_html4css1.py
diff --git a/docutils/test/functional/tests/standalone_rst_latex.py b/test/functional/tests/standalone_rst_latex.py
index f0c40b75a..f0c40b75a 100644
--- a/docutils/test/functional/tests/standalone_rst_latex.py
+++ b/test/functional/tests/standalone_rst_latex.py
diff --git a/docutils/test/functional/tests/standalone_rst_pseudoxml.py b/test/functional/tests/standalone_rst_pseudoxml.py
index b9b2df309..b9b2df309 100644
--- a/docutils/test/functional/tests/standalone_rst_pseudoxml.py
+++ b/test/functional/tests/standalone_rst_pseudoxml.py
diff --git a/docutils/test/functional/tests/standalone_rst_s5_html_1.py b/test/functional/tests/standalone_rst_s5_html_1.py
index ce27f687a..ce27f687a 100755
--- a/docutils/test/functional/tests/standalone_rst_s5_html_1.py
+++ b/test/functional/tests/standalone_rst_s5_html_1.py
diff --git a/docutils/test/functional/tests/standalone_rst_s5_html_2.py b/test/functional/tests/standalone_rst_s5_html_2.py
index aea7a9207..aea7a9207 100755
--- a/docutils/test/functional/tests/standalone_rst_s5_html_2.py
+++ b/test/functional/tests/standalone_rst_s5_html_2.py
diff --git a/docutils/test/package_unittest.py b/test/package_unittest.py
index 43d724cd1..43d724cd1 100644
--- a/docutils/test/package_unittest.py
+++ b/test/package_unittest.py
diff --git a/docutils/test/test_dependencies.py b/test/test_dependencies.py
index 46e8ff846..46e8ff846 100755
--- a/docutils/test/test_dependencies.py
+++ b/test/test_dependencies.py
diff --git a/docutils/test/test_functional.py b/test/test_functional.py
index dcec9cf45..dcec9cf45 100755
--- a/docutils/test/test_functional.py
+++ b/test/test_functional.py
diff --git a/docutils/test/test_io.py b/test/test_io.py
index b82911e44..b82911e44 100755
--- a/docutils/test/test_io.py
+++ b/test/test_io.py
diff --git a/docutils/test/test_language.py b/test/test_language.py
index 0571275e7..0571275e7 100755
--- a/docutils/test/test_language.py
+++ b/test/test_language.py
diff --git a/docutils/test/test_nodes.py b/test/test_nodes.py
index 5467c5490..5467c5490 100755
--- a/docutils/test/test_nodes.py
+++ b/test/test_nodes.py
diff --git a/docutils/test/test_parsers/__init__.py b/test/test_parsers/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_parsers/__init__.py
+++ b/test/test_parsers/__init__.py
diff --git a/docutils/test/test_parsers/test_rst/__init__.py b/test/test_parsers/test_rst/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_parsers/test_rst/__init__.py
+++ b/test/test_parsers/test_rst/__init__.py
diff --git a/docutils/test/test_parsers/test_rst/includes/include9.txt b/test/test_parsers/test_rst/includes/include9.txt
index 9164722b3..9164722b3 100644
--- a/docutils/test/test_parsers/test_rst/includes/include9.txt
+++ b/test/test_parsers/test_rst/includes/include9.txt
diff --git a/docutils/test/test_parsers/test_rst/test_SimpleTableParser.py b/test/test_parsers/test_rst/test_SimpleTableParser.py
index aee037206..aee037206 100755
--- a/docutils/test/test_parsers/test_rst/test_SimpleTableParser.py
+++ b/test/test_parsers/test_rst/test_SimpleTableParser.py
diff --git a/docutils/test/test_parsers/test_rst/test_TableParser.py b/test/test_parsers/test_rst/test_TableParser.py
index 84e4b7563..84e4b7563 100755
--- a/docutils/test/test_parsers/test_rst/test_TableParser.py
+++ b/test/test_parsers/test_rst/test_TableParser.py
diff --git a/docutils/test/test_parsers/test_rst/test_block_quotes.py b/test/test_parsers/test_rst/test_block_quotes.py
index dd7561723..dd7561723 100755
--- a/docutils/test/test_parsers/test_rst/test_block_quotes.py
+++ b/test/test_parsers/test_rst/test_block_quotes.py
diff --git a/docutils/test/test_parsers/test_rst/test_bullet_lists.py b/test/test_parsers/test_rst/test_bullet_lists.py
index 12ede6cf1..12ede6cf1 100755
--- a/docutils/test/test_parsers/test_rst/test_bullet_lists.py
+++ b/test/test_parsers/test_rst/test_bullet_lists.py
diff --git a/docutils/test/test_parsers/test_rst/test_citations.py b/test/test_parsers/test_rst/test_citations.py
index c50e28e0b..c50e28e0b 100755
--- a/docutils/test/test_parsers/test_rst/test_citations.py
+++ b/test/test_parsers/test_rst/test_citations.py
diff --git a/docutils/test/test_parsers/test_rst/test_comments.py b/test/test_parsers/test_rst/test_comments.py
index a90135ec5..a90135ec5 100755
--- a/docutils/test/test_parsers/test_rst/test_comments.py
+++ b/test/test_parsers/test_rst/test_comments.py
diff --git a/docutils/test/test_parsers/test_rst/test_definition_lists.py b/test/test_parsers/test_rst/test_definition_lists.py
index d9f3211c0..d9f3211c0 100755
--- a/docutils/test/test_parsers/test_rst/test_definition_lists.py
+++ b/test/test_parsers/test_rst/test_definition_lists.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/__init__.py b/test/test_parsers/test_rst/test_directives/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/__init__.py
+++ b/test/test_parsers/test_rst/test_directives/__init__.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/empty.txt b/test/test_parsers/test_rst/test_directives/empty.txt
index e69de29bb..e69de29bb 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/empty.txt
+++ b/test/test_parsers/test_rst/test_directives/empty.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include 11.txt b/test/test_parsers/test_rst/test_directives/include 11.txt
index 7b57bd29e..7b57bd29e 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include 11.txt
+++ b/test/test_parsers/test_rst/test_directives/include 11.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include1.txt b/test/test_parsers/test_rst/test_directives/include1.txt
index 82f605320..82f605320 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include1.txt
+++ b/test/test_parsers/test_rst/test_directives/include1.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include10.txt b/test/test_parsers/test_rst/test_directives/include10.txt
index 8eb5b1720..8eb5b1720 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include10.txt
+++ b/test/test_parsers/test_rst/test_directives/include10.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include2.txt b/test/test_parsers/test_rst/test_directives/include2.txt
index 3149a7bf6..3149a7bf6 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include2.txt
+++ b/test/test_parsers/test_rst/test_directives/include2.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include3.txt b/test/test_parsers/test_rst/test_directives/include3.txt
index 9996a4452..9996a4452 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include3.txt
+++ b/test/test_parsers/test_rst/test_directives/include3.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/include8.txt b/test/test_parsers/test_rst/test_directives/include8.txt
index e7fc57a3d..e7fc57a3d 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/include8.txt
+++ b/test/test_parsers/test_rst/test_directives/include8.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/includes/include4.txt b/test/test_parsers/test_rst/test_directives/includes/include4.txt
index 384772a77..384772a77 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/includes/include4.txt
+++ b/test/test_parsers/test_rst/test_directives/includes/include4.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/includes/include5.txt b/test/test_parsers/test_rst/test_directives/includes/include5.txt
index 64b3e3aa2..64b3e3aa2 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/includes/include5.txt
+++ b/test/test_parsers/test_rst/test_directives/includes/include5.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/includes/more/include6.txt b/test/test_parsers/test_rst/test_directives/includes/more/include6.txt
index 8ac403b01..8ac403b01 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/includes/more/include6.txt
+++ b/test/test_parsers/test_rst/test_directives/includes/more/include6.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt b/test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
index fe85aa963..fe85aa963 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
+++ b/test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/raw1.txt b/test/test_parsers/test_rst/test_directives/raw1.txt
index 7ea03651b..7ea03651b 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/raw1.txt
+++ b/test/test_parsers/test_rst/test_directives/raw1.txt
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_admonitions.py b/test/test_parsers/test_rst/test_directives/test_admonitions.py
index aaa5aa8d3..aaa5aa8d3 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_admonitions.py
+++ b/test/test_parsers/test_rst/test_directives/test_admonitions.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_compound.py b/test/test_parsers/test_rst/test_directives/test_compound.py
index eea4dd53b..eea4dd53b 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_compound.py
+++ b/test/test_parsers/test_rst/test_directives/test_compound.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_container.py b/test/test_parsers/test_rst/test_directives/test_container.py
index 3c740611a..3c740611a 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_container.py
+++ b/test/test_parsers/test_rst/test_directives/test_container.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_contents.py b/test/test_parsers/test_rst/test_directives/test_contents.py
index cb7bbec0f..cb7bbec0f 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_contents.py
+++ b/test/test_parsers/test_rst/test_directives/test_contents.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_date.py b/test/test_parsers/test_rst/test_directives/test_date.py
index 0364331b1..0364331b1 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_date.py
+++ b/test/test_parsers/test_rst/test_directives/test_date.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_decorations.py b/test/test_parsers/test_rst/test_directives/test_decorations.py
index c770c6a49..c770c6a49 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_decorations.py
+++ b/test/test_parsers/test_rst/test_directives/test_decorations.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_default_role.py b/test/test_parsers/test_rst/test_directives/test_default_role.py
index fc9343247..fc9343247 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_default_role.py
+++ b/test/test_parsers/test_rst/test_directives/test_default_role.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_figures.py b/test/test_parsers/test_rst/test_directives/test_figures.py
index 91fd91596..91fd91596 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_figures.py
+++ b/test/test_parsers/test_rst/test_directives/test_figures.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_images.py b/test/test_parsers/test_rst/test_directives/test_images.py
index 50f555ba1..50f555ba1 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_images.py
+++ b/test/test_parsers/test_rst/test_directives/test_images.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
index c9b5f7378..c9b5f7378 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_include.py
+++ b/test/test_parsers/test_rst/test_directives/test_include.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_line_blocks.py b/test/test_parsers/test_rst/test_directives/test_line_blocks.py
index 131ceaa05..131ceaa05 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_line_blocks.py
+++ b/test/test_parsers/test_rst/test_directives/test_line_blocks.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_meta.py b/test/test_parsers/test_rst/test_directives/test_meta.py
index 7c8b34002..7c8b34002 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_meta.py
+++ b/test/test_parsers/test_rst/test_directives/test_meta.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_raw.py b/test/test_parsers/test_rst/test_directives/test_raw.py
index 9e1a17974..9e1a17974 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_raw.py
+++ b/test/test_parsers/test_rst/test_directives/test_raw.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_replace.py b/test/test_parsers/test_rst/test_directives/test_replace.py
index f5fd2495b..f5fd2495b 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_replace.py
+++ b/test/test_parsers/test_rst/test_directives/test_replace.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_role.py b/test/test_parsers/test_rst/test_directives/test_role.py
index 0cd10c967..0cd10c967 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_role.py
+++ b/test/test_parsers/test_rst/test_directives/test_role.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_rubrics.py b/test/test_parsers/test_rst/test_directives/test_rubrics.py
index 271802736..271802736 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_rubrics.py
+++ b/test/test_parsers/test_rst/test_directives/test_rubrics.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_sidebars.py b/test/test_parsers/test_rst/test_directives/test_sidebars.py
index a84fc248d..a84fc248d 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_sidebars.py
+++ b/test/test_parsers/test_rst/test_directives/test_sidebars.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
index da88510e7..da88510e7 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_tables.py
+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_target_notes.py b/test/test_parsers/test_rst/test_directives/test_target_notes.py
index 18dc1d207..18dc1d207 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_target_notes.py
+++ b/test/test_parsers/test_rst/test_directives/test_target_notes.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_test_directives.py b/test/test_parsers/test_rst/test_directives/test_test_directives.py
index b90b26473..b90b26473 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_test_directives.py
+++ b/test/test_parsers/test_rst/test_directives/test_test_directives.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_topics.py b/test/test_parsers/test_rst/test_directives/test_topics.py
index 4d0fae27b..4d0fae27b 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_topics.py
+++ b/test/test_parsers/test_rst/test_directives/test_topics.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_unicode.py b/test/test_parsers/test_rst/test_directives/test_unicode.py
index bd028cf42..bd028cf42 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_unicode.py
+++ b/test/test_parsers/test_rst/test_directives/test_unicode.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/test_unknown.py b/test/test_parsers/test_rst/test_directives/test_unknown.py
index 3c859faa3..3c859faa3 100755
--- a/docutils/test/test_parsers/test_rst/test_directives/test_unknown.py
+++ b/test/test_parsers/test_rst/test_directives/test_unknown.py
diff --git a/docutils/test/test_parsers/test_rst/test_directives/utf-16.csv b/test/test_parsers/test_rst/test_directives/utf-16.csv
index ba60d155e..ba60d155e 100644
--- a/docutils/test/test_parsers/test_rst/test_directives/utf-16.csv
+++ b/test/test_parsers/test_rst/test_directives/utf-16.csv
Binary files differ
diff --git a/docutils/test/test_parsers/test_rst/test_doctest_blocks.py b/test/test_parsers/test_rst/test_doctest_blocks.py
index c9637c6d6..c9637c6d6 100755
--- a/docutils/test/test_parsers/test_rst/test_doctest_blocks.py
+++ b/test/test_parsers/test_rst/test_doctest_blocks.py
diff --git a/docutils/test/test_parsers/test_rst/test_east_asian_text.py b/test/test_parsers/test_rst/test_east_asian_text.py
index 1ac27743e..1ac27743e 100755
--- a/docutils/test/test_parsers/test_rst/test_east_asian_text.py
+++ b/test/test_parsers/test_rst/test_east_asian_text.py
diff --git a/docutils/test/test_parsers/test_rst/test_enumerated_lists.py b/test/test_parsers/test_rst/test_enumerated_lists.py
index 0375b33e9..0375b33e9 100755
--- a/docutils/test/test_parsers/test_rst/test_enumerated_lists.py
+++ b/test/test_parsers/test_rst/test_enumerated_lists.py
diff --git a/docutils/test/test_parsers/test_rst/test_field_lists.py b/test/test_parsers/test_rst/test_field_lists.py
index 2e715770c..2e715770c 100755
--- a/docutils/test/test_parsers/test_rst/test_field_lists.py
+++ b/test/test_parsers/test_rst/test_field_lists.py
diff --git a/docutils/test/test_parsers/test_rst/test_footnotes.py b/test/test_parsers/test_rst/test_footnotes.py
index cca255cbc..cca255cbc 100755
--- a/docutils/test/test_parsers/test_rst/test_footnotes.py
+++ b/test/test_parsers/test_rst/test_footnotes.py
diff --git a/docutils/test/test_parsers/test_rst/test_functions.py b/test/test_parsers/test_rst/test_functions.py
index e6694b2c5..e6694b2c5 100755
--- a/docutils/test/test_parsers/test_rst/test_functions.py
+++ b/test/test_parsers/test_rst/test_functions.py
diff --git a/docutils/test/test_parsers/test_rst/test_inline_markup.py b/test/test_parsers/test_rst/test_inline_markup.py
index 7185d723d..7185d723d 100755
--- a/docutils/test/test_parsers/test_rst/test_inline_markup.py
+++ b/test/test_parsers/test_rst/test_inline_markup.py
diff --git a/docutils/test/test_parsers/test_rst/test_interpreted.py b/test/test_parsers/test_rst/test_interpreted.py
index a5392d497..a5392d497 100755
--- a/docutils/test/test_parsers/test_rst/test_interpreted.py
+++ b/test/test_parsers/test_rst/test_interpreted.py
diff --git a/docutils/test/test_parsers/test_rst/test_line_blocks.py b/test/test_parsers/test_rst/test_line_blocks.py
index 10eaa8354..10eaa8354 100755
--- a/docutils/test/test_parsers/test_rst/test_line_blocks.py
+++ b/test/test_parsers/test_rst/test_line_blocks.py
diff --git a/docutils/test/test_parsers/test_rst/test_literal_blocks.py b/test/test_parsers/test_rst/test_literal_blocks.py
index 332e0eb27..332e0eb27 100755
--- a/docutils/test/test_parsers/test_rst/test_literal_blocks.py
+++ b/test/test_parsers/test_rst/test_literal_blocks.py
diff --git a/docutils/test/test_parsers/test_rst/test_option_lists.py b/test/test_parsers/test_rst/test_option_lists.py
index a5afc498b..a5afc498b 100755
--- a/docutils/test/test_parsers/test_rst/test_option_lists.py
+++ b/test/test_parsers/test_rst/test_option_lists.py
diff --git a/docutils/test/test_parsers/test_rst/test_outdenting.py b/test/test_parsers/test_rst/test_outdenting.py
index 1522b7f30..1522b7f30 100755
--- a/docutils/test/test_parsers/test_rst/test_outdenting.py
+++ b/test/test_parsers/test_rst/test_outdenting.py
diff --git a/docutils/test/test_parsers/test_rst/test_paragraphs.py b/test/test_parsers/test_rst/test_paragraphs.py
index 8ec8cbbc5..8ec8cbbc5 100755
--- a/docutils/test/test_parsers/test_rst/test_paragraphs.py
+++ b/test/test_parsers/test_rst/test_paragraphs.py
diff --git a/docutils/test/test_parsers/test_rst/test_section_headers.py b/test/test_parsers/test_rst/test_section_headers.py
index 3c5a21170..3c5a21170 100755
--- a/docutils/test/test_parsers/test_rst/test_section_headers.py
+++ b/test/test_parsers/test_rst/test_section_headers.py
diff --git a/docutils/test/test_parsers/test_rst/test_substitutions.py b/test/test_parsers/test_rst/test_substitutions.py
index fb8af4c2d..fb8af4c2d 100755
--- a/docutils/test/test_parsers/test_rst/test_substitutions.py
+++ b/test/test_parsers/test_rst/test_substitutions.py
diff --git a/docutils/test/test_parsers/test_rst/test_tables.py b/test/test_parsers/test_rst/test_tables.py
index 81c423bc4..81c423bc4 100755
--- a/docutils/test/test_parsers/test_rst/test_tables.py
+++ b/test/test_parsers/test_rst/test_tables.py
diff --git a/docutils/test/test_parsers/test_rst/test_targets.py b/test/test_parsers/test_rst/test_targets.py
index 362bf2cca..362bf2cca 100755
--- a/docutils/test/test_parsers/test_rst/test_targets.py
+++ b/test/test_parsers/test_rst/test_targets.py
diff --git a/docutils/test/test_parsers/test_rst/test_transitions.py b/test/test_parsers/test_rst/test_transitions.py
index c60a28e96..c60a28e96 100755
--- a/docutils/test/test_parsers/test_rst/test_transitions.py
+++ b/test/test_parsers/test_rst/test_transitions.py
diff --git a/docutils/test/test_publisher.py b/test/test_publisher.py
index 708c3ef87..708c3ef87 100755
--- a/docutils/test/test_publisher.py
+++ b/test/test_publisher.py
diff --git a/docutils/test/test_readers/__init__.py b/test/test_readers/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_readers/__init__.py
+++ b/test/test_readers/__init__.py
diff --git a/docutils/test/test_readers/test_pep/__init__.py b/test/test_readers/test_pep/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_readers/test_pep/__init__.py
+++ b/test/test_readers/test_pep/__init__.py
diff --git a/docutils/test/test_readers/test_pep/test_inline_markup.py b/test/test_readers/test_pep/test_inline_markup.py
index 4965af3d1..4965af3d1 100755
--- a/docutils/test/test_readers/test_pep/test_inline_markup.py
+++ b/test/test_readers/test_pep/test_inline_markup.py
diff --git a/docutils/test/test_readers/test_pep/test_rfc2822.py b/test/test_readers/test_pep/test_rfc2822.py
index 82fa27543..82fa27543 100755
--- a/docutils/test/test_readers/test_pep/test_rfc2822.py
+++ b/test/test_readers/test_pep/test_rfc2822.py
diff --git a/docutils/test/test_readers/test_python/__init__.py b/test/test_readers/test_python/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_readers/test_python/__init__.py
+++ b/test/test_readers/test_python/__init__.py
diff --git a/docutils/test/test_readers/test_python/showast b/test/test_readers/test_python/showast
index e7d846307..e7d846307 100755
--- a/docutils/test/test_readers/test_python/showast
+++ b/test/test_readers/test_python/showast
diff --git a/docutils/test/test_readers/test_python/showdoc b/test/test_readers/test_python/showdoc
index 6461960f8..6461960f8 100755
--- a/docutils/test/test_readers/test_python/showdoc
+++ b/test/test_readers/test_python/showdoc
diff --git a/docutils/test/test_readers/test_python/showparse b/test/test_readers/test_python/showparse
index 8144256d6..8144256d6 100755
--- a/docutils/test/test_readers/test_python/showparse
+++ b/test/test_readers/test_python/showparse
diff --git a/docutils/test/test_readers/test_python/showtok b/test/test_readers/test_python/showtok
index efd250ce1..efd250ce1 100755
--- a/docutils/test/test_readers/test_python/showtok
+++ b/test/test_readers/test_python/showtok
diff --git a/docutils/test/test_readers/test_python/test_functions.py b/test/test_readers/test_python/test_functions.py
index d521b2203..d521b2203 100755
--- a/docutils/test/test_readers/test_python/test_functions.py
+++ b/test/test_readers/test_python/test_functions.py
diff --git a/docutils/test/test_readers/test_python/test_parser.py b/test/test_readers/test_python/test_parser.py
index 1ccfbdc10..1ccfbdc10 100755
--- a/docutils/test/test_readers/test_python/test_parser.py
+++ b/test/test_readers/test_python/test_parser.py
diff --git a/docutils/test/test_readers/test_python/test_token_parser.py b/test/test_readers/test_python/test_token_parser.py
index 23015a7dc..23015a7dc 100755
--- a/docutils/test/test_readers/test_python/test_token_parser.py
+++ b/test/test_readers/test_python/test_token_parser.py
diff --git a/docutils/test/test_settings.py b/test/test_settings.py
index c18d613de..c18d613de 100755
--- a/docutils/test/test_settings.py
+++ b/test/test_settings.py
diff --git a/docutils/test/test_statemachine.py b/test/test_statemachine.py
index 4ca2a0144..4ca2a0144 100755
--- a/docutils/test/test_statemachine.py
+++ b/test/test_statemachine.py
diff --git a/docutils/test/test_transforms/__init__.py b/test/test_transforms/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_transforms/__init__.py
+++ b/test/test_transforms/__init__.py
diff --git a/docutils/test/test_transforms/test___init__.py b/test/test_transforms/test___init__.py
index 30e60afd3..30e60afd3 100755
--- a/docutils/test/test_transforms/test___init__.py
+++ b/test/test_transforms/test___init__.py
diff --git a/docutils/test/test_transforms/test_class.py b/test/test_transforms/test_class.py
index 4cd874ea3..4cd874ea3 100755
--- a/docutils/test/test_transforms/test_class.py
+++ b/test/test_transforms/test_class.py
diff --git a/docutils/test/test_transforms/test_contents.py b/test/test_transforms/test_contents.py
index 19705b5ba..19705b5ba 100755
--- a/docutils/test/test_transforms/test_contents.py
+++ b/test/test_transforms/test_contents.py
diff --git a/docutils/test/test_transforms/test_docinfo.py b/test/test_transforms/test_docinfo.py
index 994d034ea..994d034ea 100755
--- a/docutils/test/test_transforms/test_docinfo.py
+++ b/test/test_transforms/test_docinfo.py
diff --git a/docutils/test/test_transforms/test_doctitle.py b/test/test_transforms/test_doctitle.py
index 3000f53a5..3000f53a5 100755
--- a/docutils/test/test_transforms/test_doctitle.py
+++ b/test/test_transforms/test_doctitle.py
diff --git a/docutils/test/test_transforms/test_expose_internals.py b/test/test_transforms/test_expose_internals.py
index 69193246a..69193246a 100755
--- a/docutils/test/test_transforms/test_expose_internals.py
+++ b/test/test_transforms/test_expose_internals.py
diff --git a/docutils/test/test_transforms/test_filter.py b/test/test_transforms/test_filter.py
index 009600d81..009600d81 100755
--- a/docutils/test/test_transforms/test_filter.py
+++ b/test/test_transforms/test_filter.py
diff --git a/docutils/test/test_transforms/test_footnotes.py b/test/test_transforms/test_footnotes.py
index 86cbd2110..86cbd2110 100755
--- a/docutils/test/test_transforms/test_footnotes.py
+++ b/test/test_transforms/test_footnotes.py
diff --git a/docutils/test/test_transforms/test_hyperlinks.py b/test/test_transforms/test_hyperlinks.py
index cef12a4f1..cef12a4f1 100755
--- a/docutils/test/test_transforms/test_hyperlinks.py
+++ b/test/test_transforms/test_hyperlinks.py
diff --git a/docutils/test/test_transforms/test_messages.py b/test/test_transforms/test_messages.py
index 6ff8c9987..6ff8c9987 100755
--- a/docutils/test/test_transforms/test_messages.py
+++ b/test/test_transforms/test_messages.py
diff --git a/docutils/test/test_transforms/test_peps.py b/test/test_transforms/test_peps.py
index 5e34aea80..5e34aea80 100755
--- a/docutils/test/test_transforms/test_peps.py
+++ b/test/test_transforms/test_peps.py
diff --git a/docutils/test/test_transforms/test_sectnum.py b/test/test_transforms/test_sectnum.py
index 60237cea1..60237cea1 100755
--- a/docutils/test/test_transforms/test_sectnum.py
+++ b/test/test_transforms/test_sectnum.py
diff --git a/docutils/test/test_transforms/test_strip_comments.py b/test/test_transforms/test_strip_comments.py
index e3efc1e14..e3efc1e14 100755
--- a/docutils/test/test_transforms/test_strip_comments.py
+++ b/test/test_transforms/test_strip_comments.py
diff --git a/docutils/test/test_transforms/test_substitutions.py b/test/test_transforms/test_substitutions.py
index 196bec9a1..196bec9a1 100755
--- a/docutils/test/test_transforms/test_substitutions.py
+++ b/test/test_transforms/test_substitutions.py
diff --git a/docutils/test/test_transforms/test_target_notes.py b/test/test_transforms/test_target_notes.py
index cf625572d..cf625572d 100755
--- a/docutils/test/test_transforms/test_target_notes.py
+++ b/test/test_transforms/test_target_notes.py
diff --git a/docutils/test/test_transforms/test_transitions.py b/test/test_transforms/test_transitions.py
index 098c8bba3..098c8bba3 100755
--- a/docutils/test/test_transforms/test_transitions.py
+++ b/test/test_transforms/test_transitions.py
diff --git a/docutils/test/test_transforms/test_writer_aux.py b/test/test_transforms/test_writer_aux.py
index 5ec040a69..5ec040a69 100755
--- a/docutils/test/test_transforms/test_writer_aux.py
+++ b/test/test_transforms/test_writer_aux.py
diff --git a/docutils/test/test_utils.py b/test/test_utils.py
index 006495ac9..006495ac9 100755
--- a/docutils/test/test_utils.py
+++ b/test/test_utils.py
diff --git a/docutils/test/test_viewlist.py b/test/test_viewlist.py
index 85164b148..85164b148 100755
--- a/docutils/test/test_viewlist.py
+++ b/test/test_viewlist.py
diff --git a/docutils/test/test_writers/__init__.py b/test/test_writers/__init__.py
index 46fc50e06..46fc50e06 100644
--- a/docutils/test/test_writers/__init__.py
+++ b/test/test_writers/__init__.py
diff --git a/docutils/test/test_writers/test_docutils_xml.py b/test/test_writers/test_docutils_xml.py
index c51d71379..c51d71379 100755
--- a/docutils/test/test_writers/test_docutils_xml.py
+++ b/test/test_writers/test_docutils_xml.py
diff --git a/docutils/test/test_writers/test_html4css1.py b/test/test_writers/test_html4css1.py
index 7d87ee324..7d87ee324 100755
--- a/docutils/test/test_writers/test_html4css1.py
+++ b/test/test_writers/test_html4css1.py
diff --git a/docutils/test/test_writers/test_html4css1_misc.py b/test/test_writers/test_html4css1_misc.py
index 8b63d6f1c..8b63d6f1c 100755
--- a/docutils/test/test_writers/test_html4css1_misc.py
+++ b/test/test_writers/test_html4css1_misc.py
diff --git a/docutils/test/test_writers/test_latex2e.py b/test/test_writers/test_latex2e.py
index 04448883a..04448883a 100755
--- a/docutils/test/test_writers/test_latex2e.py
+++ b/test/test_writers/test_latex2e.py
diff --git a/docutils/test/test_writers/test_null.py b/test/test_writers/test_null.py
index da385e565..da385e565 100755
--- a/docutils/test/test_writers/test_null.py
+++ b/test/test_writers/test_null.py
diff --git a/docutils/test/test_writers/test_pseudoxml.py b/test/test_writers/test_pseudoxml.py
index db8bed7cb..db8bed7cb 100755
--- a/docutils/test/test_writers/test_pseudoxml.py
+++ b/test/test_writers/test_pseudoxml.py
diff --git a/docutils/tools/buildhtml.py b/tools/buildhtml.py
index e9ee0d16d..e9ee0d16d 100755
--- a/docutils/tools/buildhtml.py
+++ b/tools/buildhtml.py
diff --git a/docutils/tools/dev/README.txt b/tools/dev/README.txt
index ca9e99ee8..ca9e99ee8 100644
--- a/docutils/tools/dev/README.txt
+++ b/tools/dev/README.txt
diff --git a/docutils/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
index 1d1a2f8a0..1d1a2f8a0 100755
--- a/docutils/tools/dev/create_unimap.py
+++ b/tools/dev/create_unimap.py
diff --git a/docutils/tools/dev/profile_docutils.py b/tools/dev/profile_docutils.py
index 1f79c655e..1f79c655e 100755
--- a/docutils/tools/dev/profile_docutils.py
+++ b/tools/dev/profile_docutils.py
diff --git a/docutils/tools/dev/unicode2rstsubs.py b/tools/dev/unicode2rstsubs.py
index abc85e48b..abc85e48b 100755
--- a/docutils/tools/dev/unicode2rstsubs.py
+++ b/tools/dev/unicode2rstsubs.py
diff --git a/docutils/tools/docutils.conf b/tools/docutils.conf
index f4bcf8c6c..f4bcf8c6c 100644
--- a/docutils/tools/docutils.conf
+++ b/tools/docutils.conf
diff --git a/docutils/tools/editors/README.txt b/tools/editors/README.txt
index 517c0558a..517c0558a 100644
--- a/docutils/tools/editors/README.txt
+++ b/tools/editors/README.txt
diff --git a/docutils/tools/editors/emacs/README.txt b/tools/editors/emacs/README.txt
index 2c3e32ce5..2c3e32ce5 100644
--- a/docutils/tools/editors/emacs/README.txt
+++ b/tools/editors/emacs/README.txt
diff --git a/docutils/tools/editors/emacs/docutils.conf b/tools/editors/emacs/docutils.conf
index a74f08d4a..a74f08d4a 100644
--- a/docutils/tools/editors/emacs/docutils.conf
+++ b/tools/editors/emacs/docutils.conf
diff --git a/docutils/tools/editors/emacs/rst.el b/tools/editors/emacs/rst.el
index 88a74e2fe..88a74e2fe 100644
--- a/docutils/tools/editors/emacs/rst.el
+++ b/tools/editors/emacs/rst.el
diff --git a/docutils/tools/editors/emacs/tests/Makefile b/tools/editors/emacs/tests/Makefile
index ea024e3fd..ea024e3fd 100644
--- a/docutils/tools/editors/emacs/tests/Makefile
+++ b/tools/editors/emacs/tests/Makefile
diff --git a/docutils/tools/editors/emacs/tests/README b/tools/editors/emacs/tests/README
index a1f4b0e4a..a1f4b0e4a 100644
--- a/docutils/tools/editors/emacs/tests/README
+++ b/tools/editors/emacs/tests/README
diff --git a/docutils/tools/editors/emacs/tests/tests-adjust-section.el b/tools/editors/emacs/tests/tests-adjust-section.el
index a4d39f2bc..a4d39f2bc 100644
--- a/docutils/tools/editors/emacs/tests/tests-adjust-section.el
+++ b/tools/editors/emacs/tests/tests-adjust-section.el
diff --git a/docutils/tools/editors/emacs/tests/tests-basic.el b/tools/editors/emacs/tests/tests-basic.el
index 5f94304ce..5f94304ce 100644
--- a/docutils/tools/editors/emacs/tests/tests-basic.el
+++ b/tools/editors/emacs/tests/tests-basic.el
diff --git a/docutils/tools/editors/emacs/tests/tests-runner.el b/tools/editors/emacs/tests/tests-runner.el
index 014093e6d..014093e6d 100644
--- a/docutils/tools/editors/emacs/tests/tests-runner.el
+++ b/tools/editors/emacs/tests/tests-runner.el
diff --git a/docutils/tools/quicktest.py b/tools/quicktest.py
index fbccb1aaa..fbccb1aaa 100755
--- a/docutils/tools/quicktest.py
+++ b/tools/quicktest.py
diff --git a/docutils/tools/rst2html.py b/tools/rst2html.py
index 35e5558aa..35e5558aa 100755
--- a/docutils/tools/rst2html.py
+++ b/tools/rst2html.py
diff --git a/docutils/tools/rst2latex.py b/tools/rst2latex.py
index 5f51f34e2..5f51f34e2 100755
--- a/docutils/tools/rst2latex.py
+++ b/tools/rst2latex.py
diff --git a/docutils/tools/rst2newlatex.py b/tools/rst2newlatex.py
index 46524753f..46524753f 100755
--- a/docutils/tools/rst2newlatex.py
+++ b/tools/rst2newlatex.py
diff --git a/docutils/tools/rst2pseudoxml.py b/tools/rst2pseudoxml.py
index 627b3d198..627b3d198 100755
--- a/docutils/tools/rst2pseudoxml.py
+++ b/tools/rst2pseudoxml.py
diff --git a/docutils/tools/rst2s5.py b/tools/rst2s5.py
index b4a9396d1..b4a9396d1 100755
--- a/docutils/tools/rst2s5.py
+++ b/tools/rst2s5.py
diff --git a/docutils/tools/rst2xml.py b/tools/rst2xml.py
index 8e2ad757f..8e2ad757f 100755
--- a/docutils/tools/rst2xml.py
+++ b/tools/rst2xml.py
diff --git a/docutils/tools/rstpep2html.py b/tools/rstpep2html.py
index 5aa4b8afc..5aa4b8afc 100755
--- a/docutils/tools/rstpep2html.py
+++ b/tools/rstpep2html.py
diff --git a/web/.htaccess b/web/.htaccess
deleted file mode 100644
index adb439505..000000000
--- a/web/.htaccess
+++ /dev/null
@@ -1,62 +0,0 @@
-# Do not edit arbitrarily. Check with docutils-develop@lists.sf.net first.
-
-# Moved files and directories.
-
-Redirect permanent docs/ref/rst/substitutions.html http://docutils.sourceforge.net/docs/ref/rst/definitions.html
-Redirect permanent docs/ref/rst/substitutions.txt http://docutils.sourceforge.net/docs/ref/rst/definitions.txt
-Redirect permanent /sandbox/felixwiemann http://docutils.sourceforge.net/sandbox/fwiemann
-
-# Redirect snapshots to BerliOS. The target URL may change in the
-# future, so use a temporary redirect (status 302).
-
-RedirectMatch temp /(.*-snapshot.tgz) ftp://ftp.berlios.de/pub/docutils/$1
-
-# Redirection from old URLs to new URLs after a site reorganization.
-
-Redirect permanent /docs/config.html http://docutils.sourceforge.net/docs/user/config.html
-Redirect permanent /docs/config.txt http://docutils.sourceforge.net/docs/user/config.txt
-Redirect permanent /docs/latex.html http://docutils.sourceforge.net/docs/user/latex.html
-Redirect permanent /docs/latex.txt http://docutils.sourceforge.net/docs/user/latex.txt
-Redirect permanent /docs/tools.html http://docutils.sourceforge.net/docs/user/tools.html
-Redirect permanent /docs/tools.txt http://docutils.sourceforge.net/docs/user/tools.txt
-
-Redirect permanent /docs/rst/ http://docutils.sourceforge.net/docs/user/rst/
-
-Redirect permanent /spec/howto/ http://docutils.sourceforge.net/docs/howto/
-
-Redirect permanent /spec/pysource.dtd http://docutils.sourceforge.net/docs/dev/pysource.dtd
-Redirect permanent /spec/pysource.txt http://docutils.sourceforge.net/docs/dev/pysource.txt
-Redirect permanent /spec/pysource.html http://docutils.sourceforge.net/docs/dev/pysource.html
-Redirect permanent /spec/semantics.txt http://docutils.sourceforge.net/docs/dev/semantics.txt
-Redirect permanent /spec/semantics.html http://docutils.sourceforge.net/docs/dev/semantics.html
-Redirect permanent /spec/notes.txt http://docutils.sourceforge.net/docs/dev/todo.txt
-Redirect permanent /spec/notes.html http://docutils.sourceforge.net/docs/dev/todo.html
-
-Redirect permanent /spec/doctree.txt http://docutils.sourceforge.net/docs/ref/doctree.txt
-Redirect permanent /spec/doctree.html http://docutils.sourceforge.net/docs/ref/doctree.html
-Redirect permanent /spec/docutils.dtd http://docutils.sourceforge.net/docs/ref/docutils.dtd
-Redirect permanent /spec/soextblx.dtd http://docutils.sourceforge.net/docs/ref/soextblx.dtd
-
-Redirect permanent /spec/transforms.txt http://docutils.sourceforge.net/docs/ref/transforms.txt
-Redirect permanent /spec/transforms.html http://docutils.sourceforge.net/docs/ref/transforms.html
-
-Redirect permanent /spec/rst/alternatives.txt http://docutils.sourceforge.net/docs/dev/rst/alternatives.txt
-Redirect permanent /spec/rst/alternatives.html http://docutils.sourceforge.net/docs/dev/rst/alternatives.html
-Redirect permanent /spec/rst/problems.txt http://docutils.sourceforge.net/docs/dev/rst/problems.txt
-Redirect permanent /spec/rst/problems.html http://docutils.sourceforge.net/docs/dev/rst/problems.html
-
-Redirect permanent /spec/rst/reStructuredText.txt http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.txt
-Redirect permanent /spec/rst/reStructuredText.html http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html
-Redirect permanent /spec/rst/restructuredtext.txt http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.txt
-Redirect permanent /spec/rst/restructuredtext.html http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html
-Redirect permanent /spec/rst/directives.txt http://docutils.sourceforge.net/docs/ref/rst/directives.txt
-Redirect permanent /spec/rst/directives.html http://docutils.sourceforge.net/docs/ref/rst/directives.html
-Redirect permanent /spec/rst/interpreted.txt http://docutils.sourceforge.net/docs/ref/rst/roles.txt
-Redirect permanent /spec/rst/interpreted.html http://docutils.sourceforge.net/docs/ref/rst/roles.html
-Redirect permanent /spec/rst/introduction.txt http://docutils.sourceforge.net/docs/ref/rst/introduction.txt
-Redirect permanent /spec/rst/introduction.html http://docutils.sourceforge.net/docs/ref/rst/introduction.html
-
-RedirectMatch permanent /spec/pep-(.*) http://docutils.sourceforge.net/docs/peps/pep-$1
-
-Redirect permanent /tools/test.txt http://docutils.sourceforge.net/docs/user/rst/demo.txt
-Redirect permanent /tools/test.html http://docutils.sourceforge.net/docs/user/rst/demo.html
diff --git a/web/PyBanner016.png b/web/PyBanner016.png
deleted file mode 100644
index 3c79b2ef7..000000000
--- a/web/PyBanner016.png
+++ /dev/null
Binary files differ
diff --git a/web/index.txt b/web/index.txt
deleted file mode 100644
index 0ede85268..000000000
--- a/web/index.txt
+++ /dev/null
@@ -1,148 +0,0 @@
-===================================
- Docutils: Documentation Utilities
-===================================
----------------------------------------------------------
- Written in Python, for General- and Special-Purpose Use
----------------------------------------------------------
-
-Docutils is an open-source text processing system for processing
-plaintext documentation into useful formats, such as HTML or LaTeX.
-It includes reStructuredText_, the easy to read, easy to use,
-what-you-see-is-what-you-get plaintext markup language.
-
-----------------------------------------------------------------------
-
-**To get up & running quickly**, see the Quick-Start_ section of the
-README_ file.
-
-All **documentation** can be reached from the `Docutils Project
-Documentation Overview`_.
-
-To the developers of an open source project, **feedback** is a great
-motivator and is very welcome. We also rely on feedback for
-determining what features to implement. Thus, if you tell us what you
-need, you may just get it! Please post any feedback to the
-Docutils-users_ mailing list.
-
-All **discussion** about Docutils takes place on the `mailing lists`_.
-
-If you find a **bug**, please file a `bug report`_ or send email to
-the Docutils-users_ mailing list. **Patch** submissions should be
-filed in the `patch tracker`_ or sent to Docutils-develop_.
-
-We welcome all kinds of **contributions**. There's a `To Do list`_
-full of interesting ideas awaiting a champion. If you have any
-questions regarding how to extend Docutils, please feel free to ask on
-the Docutils-develop_ mailing list. Please also consider **donating**
-to Docutils: |donate|.
-
-The only **requirement** for running Docutils is Python_ 2.2 or later.
-(Python 2.1 may be used providing the compiler package is installed.
-The compiler package can be found in the Tools/ directory of Python's
-source distribution.)
-
-Docutils is in active development and should be considered **highly
-experimental**. APIs are subject to change at any time.
-
-
-Download
-========
-
-We recommend that you use the latest **snapshot**,
-`<docutils-snapshot.tgz>`_. The snapshots usually contain *more
-features* and *fewer bugs* than the "official" releases |---| they're
-not only for developers!
-
-The latest **release package** is `docutils-0.3.9.tgz`__. It has been
-released on 2005-05-26 and is mostly intended for distributors. See
-the `announcement posting`_ for a list of changes since the previous
-release (0.3.7).
-
-__ http://prdownloads.sourceforge.net/docutils/docutils-0.3.9.tar.gz?download
-.. _announcement posting:
- http://article.gmane.org/gmane.text.docutils.user/2054
-
-More snapshots:
-
-- `Snapshot of the Sandbox`_ (experimental, contributed code; see the
- Sandbox_ for details)
-- `Snapshot of DocFactory project files`_ (this is a subset of the
- Sandbox snapshot above; you don't need both)
-
-You can also access `Docutils' Subversion repository`_ directly.
-
-.. class:: credits
-
-Web site, tracker and mailing lists hosted by |SourceForge|_.
-Subversion repository hosted by |BerliOS|_.
-Powered by |Python|_.
-
-.. class:: hidden
-
-Google should index the mailing lists: `Docutils-users
-<http://news.gmane.org/group/gmane.text.docutils.user/last=/force_load=t>`__,
-`Docutils-develop
-<http://news.gmane.org/group/gmane.text.docutils.devel/last=/force_load=t>`__,
-and `Docutils-checkins
-<http://news.gmane.org/group/gmane.text.docutils.cvs/last=/force_load=t>`__.
-
-.. |---| unicode:: U+02014 .. em dash
- :trim:
-.. _latest snapshot: http://docutils.sourceforge.net/docutils-snapshot.tgz
-.. _Snapshot of the Sandbox:
- http://docutils.sourceforge.net/docutils-sandbox-snapshot.tgz
-.. _Snapshot of DocFactory project files:
- http://docutils.sourceforge.net/docfactory-snapshot.tgz
-.. _bug report: http://sourceforge.net/tracker/?group_id=38414&atid=422030
-.. _patch tracker: http://sourceforge.net/tracker/?group_id=38414&atid=422032
-.. _mailing lists: docs/user/mailing-lists.html
-.. _Docutils-users: docs/user/mailing-lists.html#docutils-users
-.. _Docutils-develop: docs/user/mailing-lists.html#docutils-develop
-.. _sandbox: sandbox/README.html
-.. _reStructuredText: rst.html
-.. _project files page:
- http://sourceforge.net/project/showfiles.php?group_id=38414
-.. _To Do list: docs/dev/todo.html
-.. _README: README.html
-.. _Quick-Start: README.html#quick-start
-.. _Docutils Project Documentation Overview: docs/index.html
-.. _Docutils' Subversion repository: docs/dev/repository.html
-.. |donate| image:: http://images.sourceforge.net/images/project-support.jpg
- :target: http://sourceforge.net/donate/index.php?group_id=38414
- :align: middle
- :width: 88
- :height: 32
- :alt: Support the Docutils project!
-.. |SourceForge| image::
- http://sourceforge.net/sflogo.php?group_id=38414
- :alt: SourceForge Logo
- :align: middle
- :class: borderless
- :width: 88
- :height: 31
-.. |BerliOS| image::
- http://developer.berlios.de/sflogo.php?group_id=2920
- :alt: BerliOS Logo
- :align: middle
- :class: borderless
- :width: 124
- :height: 32
-.. |Python| image:: python.png
- :alt: Python Logo
- :align: middle
- :class: borderless
- :width: 193
- :height: 32
-.. _BerliOS: http://developer.berlios.de/
-.. _SourceForge: http://sourceforge.net/
-.. _Python: http://www.python.org/
-
-
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End:
diff --git a/web/mirror/setext.txt b/web/mirror/setext.txt
deleted file mode 100644
index 48d0ee6db..000000000
--- a/web/mirror/setext.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-=========================
- Setext Documents Mirror
-=========================
-
-Here are `local copies of some Setext documents`__, made available to
-document the prehistory of the Docutils_ project (and especially the
-reStructuredText_ markup).
-
-__
-.. _Setext mirror: setext/
-.. _Docutils: ../
-.. _reStructuredText: ../rst.html
-
-The source for the original Setext (structure-enhanced text) documents
-was http://www.bsdi.com/setext/, but it seems to have disappeared from
-the Web. The files in the "`Setext mirror`_" are all the files
-relating to Setext that I have (including `a tarball of the lot`__).
-
-__ setext/setext.tgz
-
-I have not been able to locate the originators of Setext, Ian Feldman
-or Tony Sanders. If you know how to contact them, or if you know of
-an official repository for the Setext documents, please `inform me`__.
-
-__ mailto:goodger@users.sourceforge.net
-
-David Goodger, 2002-03-25
diff --git a/web/python.png b/web/python.png
deleted file mode 100644
index ba92bf33a..000000000
--- a/web/python.png
+++ /dev/null
Binary files differ
diff --git a/web/rst.png b/web/rst.png
deleted file mode 100644
index cc6218efe..000000000
--- a/web/rst.png
+++ /dev/null
Binary files differ
diff --git a/web/rst.txt b/web/rst.txt
deleted file mode 100644
index 1d0de417a..000000000
--- a/web/rst.txt
+++ /dev/null
@@ -1,234 +0,0 @@
-====================
- |reStructuredText|
-====================
--------------------------------------------------
- Markup Syntax and Parser Component of Docutils_
--------------------------------------------------
-
-:Date: $Date$
-
-.. contents::
-
-reStructuredText is an easy-to-read, what-you-see-is-what-you-get
-plaintext markup syntax and parser system. It is useful for in-line
-program documentation (such as Python docstrings), for quickly
-creating simple web pages, and for standalone documents.
-reStructuredText is designed for extensibility for specific
-application domains. The reStructuredText parser is a component of
-Docutils_. reStructuredText is a revision and reinterpretation of the
-StructuredText_ and Setext_ lightweight markup systems.
-
-The primary goal of reStructuredText is to define and implement a
-markup syntax for use in Python docstrings and other documentation
-domains, that is readable and simple, yet powerful enough for
-non-trivial use. The intended purpose of the markup is the conversion
-of reStructuredText documents into useful structured data formats.
-
-See statemachine.py_ for an example of a Python module fully
-documented using reStructuredText.
-
-
-User Documentation
-==================
-
-- `A ReStructuredText Primer`__ (HTML file, or `text source`__).
-- `Quick reStructuredText`__ (user reference)
-- `reStructuredText Cheat Sheet`__ (text only; 1 page for syntax, 1
- page directive & role reference)
-
-Users who have questions or need assistance with Docutils or
-reStructuredText should post a message to the Docutils-users_ mailing
-list.
-
-__ docs/user/rst/quickstart.html
-__ docs/user/rst/quickstart.txt
-__ docs/user/rst/quickref.html
-__ docs/user/rst/cheatsheet.txt
-.. _Docutils-users: docs/user/mailing-lists.html#docutils-users
-
-
-Reference Documentation
-=======================
-
-- `An Introduction to reStructuredText`__ (includes the Goals__ and
- History__ of reStructuredText)
-- `reStructuredText Markup Specification`__
-- `reStructuredText Directives`__
-- `reStructuredText Interpreted Text Roles`__
-
-__ docs/ref/rst/introduction.html
-__ docs/ref/rst/introduction.html#goals
-__ docs/ref/rst/introduction.html#history
-__ docs/ref/rst/restructuredtext.html
-__ docs/ref/rst/directives.html
-__ docs/ref/rst/roles.html
-
-
-Developer Documentation
-=======================
-
-- `A Record of reStructuredText Syntax Alternatives`__
-- `Problems With StructuredText`__
-
-__ docs/dev/rst/alternatives.html
-__ docs/dev/rst/problems.html
-
-
-How-To's
---------
-
-- `Creating reStructuredText Directives`__
-- `Creating reStructuredText Interpreted Text Roles`__
-
-__ docs/howto/rst-directives.html
-__ docs/howto/rst-roles.html
-
-
-Testimonials
-============
-
-The following testimonials are excerpts from unsolicited posts to
-mailing lists and the comp.lang.python newsgroup. Being excerpts,
-there's often context missing, which sometimes tones down the message.
-
-`Ueli Schlaepfer on Doc-SIG, 2002-03-28`__:
-
-__ http://mail.python.org/pipermail/doc-sig/2002-March/002526.html
-
- I have adopted reST as my tool of choice for producing notes while
- doing lab work (mostly in a matlab environment). Since then, the
- quality of such documentation has increased noticeably, mostly for
- two reasons:
-
- - I no longer need to switch to another tool, so the threshold has
- fallen to very low. Note that "another tool" means Winword...
- - Still, I have a powerful set of markup constructs at my
- fingertips that let me create the kind of documents I need with
- more ease than any other tool I can think of.
-
- Thanks to reST/DPS [now Docutils --ed], I'll soon be able to go
- ahead and apply the same tools for extracting documentation out of
- my Python code. Hey, that's a printable and a browsable version
- *for free*! Personally, I consider this a large benefit.
-
- ... All essential constructs for everyday use are there, and much
- more if needed. ...
-
-`Guido van Rossum, enthusiastic about PEP 287 but a bit hasty (see the
-follow-ups) on Python-Dev, 2002-04-02`__:
-
-__ http://mail.python.org/pipermail/python-dev/2002-April/022131.html
-
- Good PEP, David! What's the next step? Should the processing
- code be incorporated in the standard library? Should we start
- converting the standard library docs to reStructuredText?
-
-`Timothy Delaney on comp.lang.python, 2002-04-03`__:
-
-__ http://mail.python.org/pipermail/python-list/2002-April/096013.html
-
- I read through all the reStructuredText docs, comparing the text
- versions to the html versions. I found the text versions to be
- *very* easy to read, whilst making it obvious in most cases when
- something was "special".
-
- I particularly like the system of doing hyperlinks...
-
- Definitely +1 from me ... I would really like a standard, clean
- docstring format. Might make it easier to get my next project
- done in Python...
-
-`Guido van Rossum on Python-Dev, 2002-04-03`__:
-
-__ http://mail.python.org/pipermail/python-dev/2002-April/022212.html
-
- I think that reStructuredText is a good format for marking up
- docstrings; it's probably as good as it gets given the
- requirements (a fairly elaborate feature set, yet more readable
- "in the raw" than HTML).
-
-`Richard Jones on comp.lang.python, 2002-04-03`__:
-
-__ http://mail.python.org/pipermail/python-list/2002-April/096117.html
-
- How I see it is that ReST is a middle ground between markup and
- non-. It has markup, and you can use it to the extreme. Or you
- can follow some simple conventions (the most basic form of markup)
- and not worry about all the finer detail stuff. The difference
- between::
-
- @section{The Section Title}
-
- and::
-
- The Section Title
- -----------------
-
- Is pretty clearly to me that the second doesn't *look* like
- markup, even though it is.
-
-`Guido van Rossum on Python-Dev, 2002-04-04`__:
-
-__ http://mail.python.org/pipermail/python-dev/2002-April/022247.html
-
- Structured text is really a great idea for certain situations;
- reST is a much better implementation of the idea than any versions
- I've seen before.
-
-`Max M on comp.lang.python, 2002-04-05`__:
-
-__ http://mail.python.org/pipermail/python-list/2002-April/096656.html
-
- Any programmer can learn the basics in 15 minutes or less.
-
- And it really is very very easy to write documents in it. I do
- belive that if I were ever to write a book (again) I would write
- it in ReST.
-
- And as far as I can tell from the specs, ReST solves most of the
- problems I have had with structured text. A few things gets a
- little more complicated and some get simpler. All in all a good
- bargain.
-
- I would certainly use it. I also hope that it gets integrated
- into Zope.
-
-`David Abrahams on Python-Dev, 2002-04-06`__:
-
-__ http://mail.python.org/pipermail/python-dev/2002-April/022443.html
-
- Incidentally, I'm really excited about reST. I've been looking
- for a tolerable markup for C++ comments, and reST looks like it
- might fit the bill.
-
-`Eric Jones on Python-Dev, 2002-08-01`__:
-
-__ http://mail.python.org/pipermail/python-dev/2002-August/027198.html
-
- I would very much like to see reStructuredText, or some minor
- variation on it, move forward as a "standard" for doc-strings very
- soon. I have long lamented not having a prescribed format *and*
- an associated processing tool suite included in the standard
- library. Even if the format isn't perfect (I think it looks very
- good), it is time to pick a reasonable candidate and go.
-
-This being the Internet, there were plenty of people opposed to the
-idea of reStructuredText, some vehemently. Discovering *those* gems
-is left as an exercise for the reader.
-
-.. _Docutils: index.html
-.. _StructuredText:
- http://dev.zope.org/Members/jim/StructuredTextWiki/FrontPage/
-.. _Setext: mirror/setext.html
-.. _statemachine.py: docutils/statemachine.py
-
-.. |reStructuredText| image:: rst.png
-
-
-..
- Local Variables:
- mode: indented-text
- indent-tabs-mode: nil
- sentence-end-double-space: t
- fill-column: 70
- End: