summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR. Tyler Ballance <tyler@slide.com>2009-05-02 19:58:06 -0400
committerR. Tyler Ballance <tyler@slide.com>2009-05-02 19:58:06 -0400
commit5dc95cfcd015628665d3672e56d0551943b5db6b (patch)
treeec45f8f3494fddbf6d9444776bbd32d073869270
parent73875d9d66427bc213dc7a2874c921c07409dd0b (diff)
downloadpython-cheetah-5dc95cfcd015628665d3672e56d0551943b5db6b.tar.gz
Delete the "old" docs directory to make way for fancy smancy sphinx
Signed-off-by: R. Tyler Ballance <tyler@slide.com>
-rw-r--r--docs/COPYING122
-rw-r--r--docs/OnePageTutorial.html546
-rw-r--r--docs/README15
-rw-r--r--docs/TODO46
-rwxr-xr-xdocs/devel_guide_src/Makefile38
-rwxr-xr-xdocs/devel_guide_src/README9
-rwxr-xr-xdocs/devel_guide_src/bnf.tex7
-rwxr-xr-xdocs/devel_guide_src/cache.tex365
-rwxr-xr-xdocs/devel_guide_src/comments.tex100
-rwxr-xr-xdocs/devel_guide_src/compiler.tex8
-rwxr-xr-xdocs/devel_guide_src/design.tex102
-rwxr-xr-xdocs/devel_guide_src/devel_guide.tex55
-rwxr-xr-xdocs/devel_guide_src/documenting.tex8
-rwxr-xr-xdocs/devel_guide_src/errorHandling.tex309
-rwxr-xr-xdocs/devel_guide_src/files.tex11
-rwxr-xr-xdocs/devel_guide_src/flowControl.tex360
-rwxr-xr-xdocs/devel_guide_src/history.tex92
-rwxr-xr-xdocs/devel_guide_src/inheritanceEtc.tex232
-rwxr-xr-xdocs/devel_guide_src/introduction.tex29
-rwxr-xr-xdocs/devel_guide_src/output.tex282
-rwxr-xr-xdocs/devel_guide_src/parser.tex9
-rw-r--r--docs/devel_guide_src/parserInstructions.tex61
-rwxr-xr-xdocs/devel_guide_src/patching.tex134
-rwxr-xr-xdocs/devel_guide_src/placeholders.tex478
-rwxr-xr-xdocs/devel_guide_src/pyModules.tex246
-rwxr-xr-xdocs/devel_guide_src/safeDelegation.tex44
-rwxr-xr-xdocs/devel_guide_src/template.tex11
-rwxr-xr-xdocs/howto_extras/comparisions.txt451
-rwxr-xr-xdocs/users_guide_2_src/01_introduction.txt291
-rw-r--r--docs/users_guide_2_src/02_glossary.txt66
-rwxr-xr-xdocs/users_guide_2_src/03_gettingStarted.txt262
-rwxr-xr-xdocs/users_guide_2_src/04_howItWorks.txt369
-rwxr-xr-xdocs/users_guide_2_src/05_language.txt651
-rw-r--r--docs/users_guide_2_src/05_placeholders_and_the_namemapper.txt0
-rwxr-xr-xdocs/users_guide_2_src/06_comments.txt99
-rwxr-xr-xdocs/users_guide_2_src/07_output.txt548
-rwxr-xr-xdocs/users_guide_2_src/08_inheritanceEtc.txt564
-rwxr-xr-xdocs/users_guide_2_src/09_flowControl.txt414
-rwxr-xr-xdocs/users_guide_2_src/10_errorHandling.txt145
-rwxr-xr-xdocs/users_guide_2_src/11_parserInstructions.txt116
-rw-r--r--docs/users_guide_2_src/12_moduleFormatting.txt1
-rwxr-xr-xdocs/users_guide_2_src/13_tipsAndTroubleshooting.txt549
-rw-r--r--docs/users_guide_2_src/13a_precompiledTemplateModules.txt109
-rwxr-xr-xdocs/users_guide_2_src/14_webware.txt582
-rwxr-xr-xdocs/users_guide_2_src/15_otherHtml.txt95
-rwxr-xr-xdocs/users_guide_2_src/16_nonHtml.txt17
-rwxr-xr-xdocs/users_guide_2_src/17_libraries.txt306
-rwxr-xr-xdocs/users_guide_2_src/18_editors.txt39
-rwxr-xr-xdocs/users_guide_2_src/A_links.txt112
-rwxr-xr-xdocs/users_guide_2_src/B_examples.txt24
-rwxr-xr-xdocs/users_guide_2_src/C_comparisions.txt451
-rw-r--r--docs/users_guide_2_src/E_license.txt32
-rw-r--r--docs/users_guide_2_src/Makefile16
-rw-r--r--docs/users_guide_2_src/default.css293
-rw-r--r--docs/users_guide_2_src/eg_1.py11
-rw-r--r--docs/users_guide_2_src/eg_2.py10
-rw-r--r--docs/users_guide_2_src/eg_3.py18
-rw-r--r--docs/users_guide_2_src/eg_4.py22
-rw-r--r--docs/users_guide_2_src/eg_5.py25
-rwxr-xr-xdocs/users_guide_2_src/latex2rst.py45
-rw-r--r--docs/users_guide_2_src/unused.txt67
-rwxr-xr-xdocs/users_guide_src/Makefile39
-rwxr-xr-xdocs/users_guide_src/README9
-rwxr-xr-xdocs/users_guide_src/comments.tex99
-rwxr-xr-xdocs/users_guide_src/comparisons.tex451
-rwxr-xr-xdocs/users_guide_src/editors.tex39
-rwxr-xr-xdocs/users_guide_src/errorHandling.tex145
-rwxr-xr-xdocs/users_guide_src/examples.tex24
-rwxr-xr-xdocs/users_guide_src/flowControl.tex414
-rwxr-xr-xdocs/users_guide_src/gettingStarted.tex266
-rw-r--r--docs/users_guide_src/glossary.tex96
-rwxr-xr-xdocs/users_guide_src/howItWorks.tex420
-rwxr-xr-xdocs/users_guide_src/inheritanceEtc.tex492
-rwxr-xr-xdocs/users_guide_src/introduction.tex392
-rwxr-xr-xdocs/users_guide_src/language.tex651
-rwxr-xr-xdocs/users_guide_src/libraries.tex306
-rwxr-xr-xdocs/users_guide_src/links.tex112
-rwxr-xr-xdocs/users_guide_src/moreverb.sty197
-rwxr-xr-xdocs/users_guide_src/nonHtml.tex17
-rwxr-xr-xdocs/users_guide_src/optikLicense.tex43
-rwxr-xr-xdocs/users_guide_src/otherHtml.tex95
-rwxr-xr-xdocs/users_guide_src/output.tex548
-rwxr-xr-xdocs/users_guide_src/parserInstructions.tex116
-rwxr-xr-xdocs/users_guide_src/tipsAndTricks.tex544
-rwxr-xr-xdocs/users_guide_src/users_guide.tex54
-rwxr-xr-xdocs/users_guide_src/webware.tex575
86 files changed, 0 insertions, 16663 deletions
diff --git a/docs/COPYING b/docs/COPYING
deleted file mode 100644
index ee79713..0000000
--- a/docs/COPYING
+++ /dev/null
@@ -1,122 +0,0 @@
-The Cheetah Users' Guide, Cheetah Developers' Guide and all other
-documentation in this directory is released under the Open
-Publication License (http://www.opencontent.org/openpub/).
-
-Regarding section VI of the Open Publication License, there are no
-"license options" (=additional restrictions) on these works.
-
-A text version of the Open Publication License follows. It was
-downloaded from http://www.opencontent.org/openpub/, converted to
-text with 'links', and (minimally) reformatted by hand.
-
-###################################################################
- Open Publication License
- v1.0, 8 June 1999
-
- I. REQUIREMENTS ON BOTH UNMODIFIED AND MODIFIED VERSIONS
-
- The Open Publication works may be reproduced and distributed in whole or in
- part, in any medium physical or electronic, provided that the terms of this
- license are adhered to, and that this license or an incorporation of it by
- reference (with any options elected by the author(s) and/or publisher) is
- displayed in the reproduction.
-
- Proper form for an incorporation by reference is as follows:
-
- Copyright (c) <year> by <author's name or designee>. This material may be
- distributed only subject to the terms and conditions set forth in the Open
- Publication License, vX.Y or later (the latest version is presently
- available at http://www.opencontent.org/openpub/).
-
- The reference must be immediately followed with any options elected by the
- author(s) and/or publisher of the document (see section VI).
-
- Commercial redistribution of Open Publication-licensed material is permitted.
-
- Any publication in standard (paper) book form shall require the citation of
- the original publisher and author. The publisher and author's names shall
- appear on all outer surfaces of the book. On all outer surfaces of the book
- the original publisher's name shall be as large as the title of the work and
- cited as possessive with respect to the title.
-
- II. COPYRIGHT
-
- The copyright to each Open Publication is owned by its author(s) or designee.
-
- III. SCOPE OF LICENSE
-
- The following license terms apply to all Open Publication works, unless
- otherwise explicitly stated in the document.
-
- Mere aggregation of Open Publication works or a portion of an Open
- Publication work with other works or programs on the same media shall not
- cause this license to apply to those other works. The aggregate work shall
- contain a notice specifying the inclusion of the Open Publication material
- and appropriate copyright notice.
-
- SEVERABILITY. If any part of this license is found to be unenforceable in any
- jurisdiction, the remaining portions of the license remain in force.
-
- NO WARRANTY. Open Publication works are licensed and provided "as is" without
- warranty of any kind, express or implied, including, but not limited to, the
- implied warranties of merchantability and fitness for a particular purpose or
- a warranty of non-infringement.
-
- IV. REQUIREMENTS ON MODIFIED WORKS
-
- All modified versions of documents covered by this license, including
- translations, anthologies, compilations and partial documents, must meet the
- following requirements:
-
- 1. The modified version must be labeled as such.
- 2. The person making the modifications must be identified and the
- modifications dated.
- 3. Acknowledgement of the original author and publisher if applicable must
- be retained according to normal academic citation practices.
- 4. The location of the original unmodified document must be identified.
- 5. The original author's (or authors') name(s) may not be used to assert or
- imply endorsement of the resulting document without the original author's
- (or authors') permission.
-
- V. GOOD-PRACTICE RECOMMENDATIONS
-
- In addition to the requirements of this license, it is requested from and
- strongly recommended of redistributors that:
-
- 1. If you are distributing Open Publication works on hardcopy or CD-ROM, you
- provide email notification to the authors of your intent to redistribute
- at least thirty days before your manuscript or media freeze, to give the
- authors time to provide updated documents. This notification should
- describe modifications, if any, made to the document.
- 2. All substantive modifications (including deletions) be either clearly
- marked up in the document or else described in an attachment to the
- document.
- 3. Finally, while it is not mandatory under this license, it is considered
- good form to offer a free copy of any hardcopy and CD-ROM expression of
- an Open Publication-licensed work to its author(s).
-
- VI. LICENSE OPTIONS
-
- The author(s) and/or publisher of an Open Publication-licensed document may
- elect certain options by appending language to the reference to or copy of
- the license. These options are considered part of the license instance and
- must be included with the license (or its incorporation by reference) in
- derived works.
-
- A. To prohibit distribution of substantively modified versions without the
- explicit permission of the author(s). "Substantive modification" is defined
- as a change to the semantic content of the document, and excludes mere
- changes in format or typographical corrections.
-
- To accomplish this, add the phrase `Distribution of substantively modified
- versions of this document is prohibited without the explicit permission of
- the copyright holder.' to the license reference or copy.
-
- B. To prohibit any publication of this work or derivative works in whole or
- in part in standard (paper) book form for commercial purposes is prohibited
- unless prior permission is obtained from the copyright holder.
-
- To accomplish this, add the phrase 'Distribution of the work or derivative of
- the work in any standard (paper) book form is prohibited unless prior
- permission is obtained from the copyright holder.' to the license reference
- or copy.
diff --git a/docs/OnePageTutorial.html b/docs/OnePageTutorial.html
deleted file mode 100644
index eaa9acc..0000000
--- a/docs/OnePageTutorial.html
+++ /dev/null
@@ -1,546 +0,0 @@
-<!-- OnePageTutorial.html :
- Originally this was Chuck Esterbrook's tutorial for his template
- maintainers. Eventually this may expand into the future Cheetah
- Quick Reference or Beginners' Guide.
--->
-
-<html>
-
-<head>
-<title>Cheetah Template One-Page Tutorial</title>
-
-<style type="text/css">
-<!--
-
-/* Document-wide styles */
-
-BODY {
- background-color: white;
-}
-
-
-/* Header styles */
-
-TD.banner-top {
- background-color: #A43403;
-}
-TD.banner-bottom {
- background-color: #C75509;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: normal;
- font-size: 14px;
-}
-TD.banner-bottom-active {
- background-color: #C75509;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: normal;
- font-size: 14px;
-}
-TD.banner-bottom-inactive {
- background-color: #C75509;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: normal;
- font-size: 14px;
-}
-SPAN.banner-bottom-active {
- background-color: #A43403;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: bold;
- font-size: 14px;
-}
-SPAN.banner-bottom-inactive {
- background-color: #C75509;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: bold;
- font-size: 14px;
-}
-
-
-
-TD.banner-menu {
- background-color: #A43403;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: normal;
- font-size: 14px;
-}
-SPAN.banner-menu {
- background-color: #A43403;
- color: #EFA84B;
- font-family: sans-serif;
- font-weight: bold;
- font-size: 14px;
-}
-
-
-
-
-
-/* Interface body styles */
-
-
-A:link {
- color: #00638E;
- font-family: sans-serif;
- font-weight: bold;
- text-decoration: none;
-}
-
-/* A:visited */
-/* A:active */
-
-TD.action-header {
- color: #7A311C;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 16px;
-}
-
-TD.body {
- color: #C75509;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 14px;
-}
-SPAN.doc_title {
- color: #666666;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 12px;
-}
-
-P.instructions {
- color: #C75509;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 12px;
-}
-
-
- /*
- * Top level page
- */
-
- body {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 80%;
- background-color: #FFFFFF;
- color: black;
- }
-
- p {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 12px;
- color: black;
- }
-
- table.banner {
- width: 100%;
- }
-
- td.bannerLogo {
- color: #FFA;
- background-color: orange;
- text-align: center;
- border: 2px solid #FFA;
- padding-left: 3px;
- padding-right: 3px;
- letter-spacing: -2px;
- white-space: nowrap;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 18px;
- }
-
- td.bannerTitle {
- width: 95%;
- color: darkorange;
- text-align: center;
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 24px;
- }
-
- td.bannerStuff {
- text-align: right;
- white-space: nowrap;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- a.bannerStuff {
- text-decoration: none;
- }
-
- a.bannerStuff:hover {
- text-decoration: underline;
- }
-
- span.pageFooter {
- }
-
- a.mainMenuLink {
- font-size: 175%;
- }
-
- .error {
- color: red;
- }
-
- /*
- * Tab navigation
- */
-
- tr.tabTop {
- font-size: 14px;
- }
-
- tr.tabBottom {
- background-color: #149;
- }
-
- td.activeTab {
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- color: #FFA;
- background-color: #149;
- }
-
- td.inactiveTab {
- font-family: Arial, Helvetica, sans-serif;
- color: #FFA;
- background-color: #DEF;
- }
-
- a.activeTab {
- color: #FFA;
- text-decoration: none;
- }
-
- a.activeTab:hover {
- color: #FFA;
- text-decoration: underline;
- }
-
- a.inactiveTab {
- color: black;
- text-decoration: none;
- }
-
- a.inactiveTab:hover {
- color: black;
- text-decoration: underline;
- }
-
- /*
- * Panels
- */
-
- table.panel {
- }
-
- tr.panelTitle {
- font-weight: bold;
- background-color: lightblue;
- }
-
- td.panelTitle {
- }
-
- tr.panelBody {
- background-color: #EEEEEE;
- }
-
-
- /*
- * Other
- */
-
- table.ObjectBrowser {
- }
-
- tr.ObjectBrowser{
- }
-
- /* This is for a body row of the document list table */
- td.ObjectBrowserBody {
- background-color: #EEE;
- }
-
- /* This is for the header row of the document list table */
- td.ObjectBrowserHeader {
- background-color: #C6EFF7;
- font-weight: bold;
- }
-
- td.ObjectBrowserLink {
- background-color: #DEF3BD;
- font-weight: bold;
- }
-
- table.ObjectViewer {
- }
-
- tr.ObjectViewer {
- }
-
- /* This is for the name column of the object view table */
- td.ObjectViewerName {
- background-color: #C6EFF7;
- font-weight: bold;
- }
-
- /* This is for the value column of the object view table */
- td.ObjectViewerValue {
- background-color: #EEE;
- }
-
- /* This is for the info column of the object view table */
- td.ObjectViewerInfo {
- background-color: white;
- }
-
- table.ObjectEditor {
- }
-
- tr.ObjectEditor {
- }
-
- /* This is for the section label of the document edit table */
- td.ObjectEditorSection {
- background-color: #E6E6E6;
- font-weight: bold;
- font-size: 18px;
- color: #AC003B;
- }
-
- /* This is for the field name column of the document edit table */
- td.ObjectEditorName {
- background-color: white;
- font-weight: bold;
- }
-
- /* This is for the field value column of the document edit table */
- td.ObjectEditorValue {
- background-color: white;
- }
-
- /* This is for the info column of the object edit table */
- td.ObjectEditorInfo {
- background-color: white;
- }
-
- /* This is for the error column of the object edit table */
- td.ObjectEditorError {
- background-color: white;
- color: red;
- font-weight: bold;
- font-size: 12px;
- }
-
-
- /*
- * Help
- */
-
- blockquote.example {
- background-color: #EEE;
- }
-
-
- /*********************** from other site *********************/
-
- td.ColumnHeading {
- font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
- font-size: 150%;
- font-weight: bold;
- background-color: #FFFF77;
- }
-
-
- /*
- * Sidebar
- */
-
- span.SidebarHeading {
- font-weight: bold;
- }
-
- a.SidebarLink {
- }
-
-
- /*
- * News
- */
-
- span.NewsHeading {
- font-family: Tahoma;
- font-size: 14px;
- font-weight: bold;
- }
-
-
- /*
- * Headings
- */
-
- h1 {
- font-family: Arial, Helvetica;
- font-size: 14px;
- padding-top: 1em;
- padding-bottom: 0;
- }
-
- /*
- * Other
- */
-
- h2 { font-family: Arial, Helvetica;
- font-size: 14px;
- color: darkblue;
- padding-top: 1em;
- padding-bottom: 0;
- }
- h3 { font-family: Arial, Helvetica;
- font-size: 13px;
- padding-top: 1em;
- padding-bottom: 0;
- }
- h4 { font-family: Arial, Helvetica;
- font-size: 12px;
- padding-top: 1em;
- padding-bottom: 0;
- }
- dl { padding-left: 2em;
- }
- ol { padding-left: 0.5em;
- }
- ul { list-style-type: disc;
- padding-left: 1.0em;
- }
- li { padding-top: 0em;
- }
- table {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 100%;
- color: black;
- }
-
--->
-</style>
-
-</head>
-
-<body>
-
-<h1>Cheetah Template One-Page Tutorial<BR>
-<SMALL>By Chuck Esterbrook, now maintained by Mike Orr<BR>
-Updated May 17, 2002</SMALL></h1>
-
-<h2>Substitution</h2>
-
-<p> The most commonly used templating feature is substitution:
-
-<blockquote class=example><pre>
-My name is $name
-</pre></blockquote>
-
-<p> You can use <i>dotted notation</i> to traverse objects. For example:
-
-<blockquote class=example><pre>
-$author.person.primaryEmail
-</pre></blockquote>
-
-<p> When a variable name is flush against other text you must use curly braces to separate it:
-
-<blockquote class=example><pre>
-Jim is a ${vice}maniac.
-</pre></blockquote>
-
-<p> However, the template language is savvy enough to handle sentence endings and variables:
-
-<blockquote class=example><pre>
-My name is $name.
-$foo$bar
-</pre></blockquote>
-
-
-<h2>#if (conditional)</h2>
-
-<p> The <i>#if</i> statement can be used to detect if a value is blank/undefined/NULL. The most common use for an #if statement is showing a different form of content if something is undefined.
-
-<blockquote class=example><pre>
-#if $keywords
- $keywords
-#else
- There are no keywords!
-#end if
-</pre></blockquote>
-
-<p> The #else part is optional:
-
-<blockquote class=example><pre>
-#if $keywords
- &lt;span class=keywords&gt;$keywords&lt;/span&gt;
-#end if
-</blockquote>
-
-
-<h2>#for (looping)</h2>
-
-<p> The <i>#for</i> statement is used to loop through any kind of list.
-
-<blockquote class=example><pre>
-#for $author in $authors
- $author.person.fullName
-#end for
-</pre></blockquote>
-
-
-<h2>Combining statements</h2>
-
-<p> You can combine statements. For example,
-
-<p> Template.html:
-<blockquote class=example><pre>
-$name
-
-&lt;p&gt; $content
-
-#include "authors.html"
-</pre></blockquote>
-
-Authors.html:
-<blockquote class=example><pre>
-#if $authors
- &lt;table class=Author&gt;
- #for $author in $authors
- &lt;tr class=Author&gt; &lt;td class=Author&gt;
- $author
- &lt;/td&gt; &lt;/tr&gt;
- #end for
- &lt;/table&gt;
-#end if
-</pre></blockquote>
-
-
-<h2>Examples</h2>
-
-<p> Here is an example that lists several names and puts commas between them. Note the use of #slurp to slurp up extra whitespace that might interfere.
-
-<blockquote class=example><pre>
-#set sep = ''
-#for $author in $authors
-${sep}${author.person}#slurp
-#set sep = ', '
-#end for
-</pre></blockquote>
-
-</body>
-
-</html>
diff --git a/docs/README b/docs/README
deleted file mode 100644
index 3f3fcd7..0000000
--- a/docs/README
+++ /dev/null
@@ -1,15 +0,0 @@
-users_guide_src/ :
- Users' Guide for Cheetah 1.0. Will be deleted when users Guide 2 is
- finished.
-
-users_guide_2_src/ :
- Users' Guide and Cookbook for Cheetah 2.0. HTML version has both parts
- in one; PDF version has them as two documents. This section is under
- construction.
-
-devel_guide_src/ :
- Developers' Guide for Cheetah 1.0. Will be deleted when Users' Guide 2
- is finished.
-
-howto_extras/ :
- Extra content for future HOWTOs and FAQs. May or may not be up to date.
diff --git a/docs/TODO b/docs/TODO
deleted file mode 100644
index 8c22561..0000000
--- a/docs/TODO
+++ /dev/null
@@ -1,46 +0,0 @@
-Cheetah Documentation TODO
---------------------------
-
-Cheetah FAQ
-===============================================================================
-A place for specific questions & answers for troubleshooting. Some questions
-may duplicate material in the Users' Guide, but some paragraphs in the UG will
-be moved to the FAQ.
-- Why am I getting a NotFound error? I put my variable in the searchList!
-- Why is my template output empty?
-- Why are my $property, $file, ... placeholders misbehaving?
-
-Users' Guide:
-===============================================================================
-- 200+ e-mails in MO's mailbox regarding possible doc updates.
-- more examples in the Webware section (EL)
-- more examples/advice all over the Users' Guide about recommended/
- non-recommended strategies (MO)
-
-Developers' Guide:
-===============================================================================
-- Finish. (MO)
-
-Quick Reference Guide:
-===============================================================================
-Cheat sheet on Cheetah syntax and usage. (MO but not soon)
-
-Beginners' Guide:
-===============================================================================
-Written for somebody who has to maintain templates but
-doesn't know Python. Looking for a writer, somebody who trains such
-maintainers and knows what their needs are. To get the correct LaTeX
-structure, copy users_guide.tex and one of its chapters, and modify as
-necessary.
-
-
-HOWTOs:
-=======
-Somebody offered to write some HOWTOs on specialized topics. Who was it?
-
-BNF:
-====
-- write a formalized grammar for Cheetah in BNF. MO partly did in
-a Developer's Guide appendix. Essentially, the directives still need
-to be done, and a proofreading of the rest. Move to separate text file and
-find somebody to finish it.
diff --git a/docs/devel_guide_src/Makefile b/docs/devel_guide_src/Makefile
deleted file mode 100755
index 9e5da96..0000000
--- a/docs/devel_guide_src/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-# You must change PYTHONSRC to the path of your Python source distributon.
-PYTHONSRC=/home/tavis/tmp/Python-2.2
-DOCNAME=devel_guide
-MKHOWTO=$(PYTHONSRC)/Doc/tools/mkhowto
-MAIN_TEX_FILE= devel_guide.tex
-
-all: ps pdf html htmlMultiPage text
-
-almost-all: ps html htmlMultiPage text
-
-pdf:
- $(MKHOWTO) --pdf $(MAIN_TEX_FILE)
- mv $(DOCNAME).pdf ../
-
-ps:
- $(MKHOWTO) --ps $(MAIN_TEX_FILE)
- mv $(DOCNAME).ps ../
-html:
- -rm -rf $(DOCNAME)
- $(MKHOWTO) --html --split 1 --iconserver . $(MAIN_TEX_FILE)
- -rm -rf ../$(DOCNAME)_html
- mv $(DOCNAME) ../$(DOCNAME)_html
-
-htmlMultiPage:
- -rm -rf $(DOCNAME)
- $(MKHOWTO) --html --iconserver . $(MAIN_TEX_FILE)
- -rm -rf ../$(DOCNAME)_html_multipage
- mv $(DOCNAME) ../$(DOCNAME)_html_multipage
-
-text:
- $(MKHOWTO) --text $(MAIN_TEX_FILE)
- mv $(DOCNAME).txt ../
-
-clean:
- -rm -rf $(DOCNAME)
- -rm -f *.aux *.l2h *~ *.log *.ind *.bkm *.how *.toc
- -rm -rf ../html
-
diff --git a/docs/devel_guide_src/README b/docs/devel_guide_src/README
deleted file mode 100755
index 3b45564..0000000
--- a/docs/devel_guide_src/README
+++ /dev/null
@@ -1,9 +0,0 @@
-To build the Cheetah documentation, you need the 'mkhowto' program from
-the Python source distribution. So:
-
-1) Get the Python source distribution and unpack it in some directory.
-
-2) Edit the Cheetah documentation's Makefile and change PYTHONSRC to
-point to the top-level directory of your Python source distribution.
-
-3) Run 'make'.
diff --git a/docs/devel_guide_src/bnf.tex b/docs/devel_guide_src/bnf.tex
deleted file mode 100755
index aa7149c..0000000
--- a/docs/devel_guide_src/bnf.tex
+++ /dev/null
@@ -1,7 +0,0 @@
-\section{A BNF Grammar of Cheetah}
-\label{bnf}
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/cache.tex b/docs/devel_guide_src/cache.tex
deleted file mode 100755
index 043b8cf..0000000
--- a/docs/devel_guide_src/cache.tex
+++ /dev/null
@@ -1,365 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Caching placeholders and \#cache}
-\label{cache}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Dynamic placeholder -- no cache}
-\label{cache.dynamic}
-
-The template:
-\begin{verbatim}
-Dynamic variable: $voom
-\end{verbatim}
-
-The command line and the output:
-\begin{verbatim}
-% voom='Voom!' python x.py --env
-Dynamic variable: Voom!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write('Dynamic variable: ')
-write(filter(VFS(SL,"voom",1))) # generated from '$voom' at line 1, col 20.
-write('\n')
-\end{verbatim}
-
-Just what we expected, like any other dynamic placeholder.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Static placeholder}
-\label{cache.static}
-
-The template:
-\begin{verbatim}
-Cached variable: $*voom
-\end{verbatim}
-
-The command line and output:
-\begin{verbatim}
-% voom='Voom!' python x.py --env
-Cached variable: Voom!
-\end{verbatim}
-
-The generated code, with line numbers:
-\begin{verbatim}
- 1 write('Cached variable: ')
- 2 ## START CACHE REGION: at line, col (1, 19) in the source.
- 3 RECACHE = True
- 4 if not self._cacheData.has_key('19760169'):
- 5 pass
- 6 else:
- 7 RECACHE = False
- 8 if RECACHE:
- 9 orig_trans = trans
-10 trans = cacheCollector = DummyTransaction()
-11 write = cacheCollector.response().write
-12 write(filter(VFS(SL,"voom",1))) # generated from '$*voom' at line 1,
- # col 19.
-13 trans = orig_trans
-14 write = trans.response().write
-15 self._cacheData['19760169'] = cacheCollector.response().getvalue()
-16 del cacheCollector
-17 write(self._cacheData['19760169'])
-18 ## END CACHE REGION
-
-19 write('\n')
-\end{verbatim}
-
-That one little star generated a whole lotta code. First, instead of an
-ordinary \code{VFS} lookup (searchList) lookup, it converted the
-placeholder to a lookup in the \code{.\_cacheData} dictionary. Cheetah also
-generated a unique key (\code{'19760169'}) for our cached item -- this is its
-cache ID.
-
-Second, Cheetah put a pair of if-blocks before the \code{write}. The first
-(lines 3-7) determine whether the cache value is missing or out of date, and
-sets local variable \code{RECACHE} true or false.
-This stanza may look unnecessarily verbose -- lines 3-7 could be eliminated if
-line 8 was changed to
-\begin{verbatim}
-if not self._cacheData.has_key('19760169'):
-\end{verbatim}
--- but this model is expandable for some of the cache features we'll see below.
-
-The second if-block, lines 8-16, do the cache updating if necessary.
-Clearly, the programmer is trying to stick as close to normal (dynamic)
-workflow as possible. Remember that \code{write}, even though it looks like a
-local function, is actually a method of a file-like object. So we create a
-temporary file-like object to divert the \code{write} object into, then read
-the result and stuff it into the cache.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Timed-refresh placeholder}
-\label{cache.timed}
-
-The template:
-\begin{verbatim}
-Timed cache: $*.5m*voom
-\end{verbatim}
-
-The command line and the output:
-\begin{verbatim}
-% voom='Voom!' python x.py --env
-Timed cache: Voom!
-\end{verbatim}
-
-The generated method's docstring:
-\begin{verbatim}
-"""
-This is the main method generated by Cheetah
-This cache will be refreshed every 30.0 seconds.
-"""
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- 1 write('Timed cache: ')
- 2 ## START CACHE REGION: at line, col (1, 15) in the source.
- 3 RECACHE = True
- 4 if not self._cacheData.has_key('55048032'):
- 5 self.__cache55048032__refreshTime = currentTime() + 30.0
- 6 elif currentTime() > self.__cache55048032__refreshTime:
- 7 self.__cache55048032__refreshTime = currentTime() + 30.0
- 8 else:
- 9 RECACHE = False
-10 if RECACHE:
-11 orig_trans = trans
-12 trans = cacheCollector = DummyTransaction()
-13 write = cacheCollector.response().write
-14 write(filter(VFS(SL,"voom",1))) # generated from '$*.5m*voom' at
- # line 1, col 15.
-15 trans = orig_trans
-16 write = trans.response().write
-17 self._cacheData['55048032'] = cacheCollector.response().getvalue()
-18 del cacheCollector
-19 write(self._cacheData['55048032'])
-20 ## END CACHE REGION
-
-21 write('\n')
-\end{verbatim}
-
-This code is identical to the static cache example except for the docstring
-and the first if-block. (OK, so the cache ID is different and the comment on
-line 14 is different too. Big deal.)
-
-Each timed-refresh cache item has a corrsponding private attribute
-\code{.\_\_cache\#\#\#\#\#\#\#\#\_\_refreshTime} giving the refresh time
-in ticks (=seconds since January 1, 1970). The first if-block (lines 3-9)
-checks whether the cache value is missing or its update time has passed, and if
-so, sets \code{RECACHE} to true and also schedules another refresh at the next
-interval.
-
-The method docstring reminds the user how often the cache will be refreshed.
-This information is unfortunately not as robust as it could be. Each
-timed-cache placeholder blindly generates a line in the docstring. If all
-refreshes are at the same interval, there will be multiple identical lines
-in the docstring. If the refreshes are at different intervals, you get a
-situation like this:
-\begin{verbatim}
-"""
-This is the main method generated by Cheetah
-This cache will be refreshed every 30.0 seconds.
-This cache will be refreshed every 60.0 seconds.
-This cache will be refreshed every 120.0 seconds.
-"""
-\end{verbatim}
-The docstring tells only that ``something'' will be refreshed every 60.0
-seconds, but doesn't reveal {\em which} placeholder that is. Only if you
-know the relative order of the placeholders in the template can you figure
-that out.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Timed-refresh placeholder with braces}
-\label{cache.timed.braces}
-
-This example is the same but with the long placeholder syntax. It's here
-because it's a Cheetah FAQ whether to put the cache interval inside or outside
-the braces. (It's also here so I can look it up because I frequently forget.)
-The answer is: outside. The braces go around only the placeholder name (and
-perhaps some output-filter arguments.)
-
-The template:
-\begin{verbatim}
-Timed with {}: $*.5m*{voom}
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Timed with {}: Voom!
-\end{verbatim}
-
-The generated code differs only in the comment. Inside the cache-refresh
-if-block:
-\begin{verbatim}
-write(filter(VFS(SL,"voom",1))) # generated from '$*.5m*{voom}' at line 1,
- #col 17.
-\end{verbatim}
-
-If you try to do it this way:
-\begin{verbatim}
-Timed with {}: ${*.5m*voom} ## Wrong!
-\end{verbatim}
-you get:
-\begin{verbatim}
-Timed with {}: ${*.5m*voom}
-\end{verbatim}
-\verb+${+ is not a valid placeholder, so it gets treated as ordinary text.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#cache}
-\label{cache.directive}
-
-The template:
-\begin{verbatim}
-#cache
-This is a cached region. $voom
-#end cache
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-This is a cached region. Voom!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- 1 ## START CACHE REGION: at line, col (1, 1) in the source.
- 2 RECACHE = True
- 3 if not self._cacheData.has_key('23711421'):
- 4 pass
- 5 else:
- 6 RECACHE = False
- 7 if RECACHE:
- 8 orig_trans = trans
- 9 trans = cacheCollector = DummyTransaction()
-10 write = cacheCollector.response().write
-11 write('This is a cached region. ')
-12 write(filter(VFS(SL,"voom",1))) # generated from '$voom' at line 2,
- # col 27.
-13 write('\n')
-14 trans = orig_trans
-15 write = trans.response().write
-16 self._cacheData['23711421'] = cacheCollector.response().getvalue()
-17 del cacheCollector
-18 write(self._cacheData['23711421'])
-19 ## END CACHE REGION
-\end{verbatim}
-
-This is the same as the \code{\$*voom} example, except that the plain text
-around the placeholder is inside the second if-block.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#cache with timer and id}
-\label{cache.directive.timer}
-
-The template:
-\begin{verbatim}
-#cache timer='.5m', id='cache1'
-This is a cached region. $voom
-#end cache
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-This is a cached region. Voom!
-\end{verbatim}
-
-The generated code is the same as the previous example except the first
-if-block:
-\begin{verbatim}
-RECACHE = True
-if not self._cacheData.has_key('13925129'):
- self._cacheIndex['cache1'] = '13925129'
- self.__cache13925129__refreshTime = currentTime() + 30.0
-elif currentTime() > self.__cache13925129__refreshTime:
- self.__cache13925129__refreshTime = currentTime() + 30.0
-else:
- RECACHE = False
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#cache with test: expression and method conditions}
-\label{cache.directive.test}
-
-The template:
-\begin{verbatim}
-#cache test=$isDBUpdated
-This is a cached region. $voom
-#end cache
-\end{verbatim}
-
-(Analysis postponed: bug in Cheetah produces invalid Python.)
-
-%The output:
-%\begin{verbatim}
-%\end{verbatim}
-
-%The generated code:
-%\begin{verbatim}
-%\end{verbatim}
-
-
-The template:
-\begin{verbatim}
-#cache id='cache1', test=($isDBUpdated or $someOtherCondition)
-This is a cached region. $voom
-#end cache
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-This is a cached region. Voom!
-\end{verbatim}
-
-The first if-block in the generated code:
-\begin{verbatim}
-RECACHE = True
-if not self._cacheData.has_key('36798144'):
- self._cacheIndex['cache1'] = '36798144'
-elif (VFS(SL,"isDBUpdated",1) or VFS(SL,"someOtherCondition",1)):
- RECACHE = True
-else:
- RECACHE = False
-\end{verbatim}
-The second if-block is the same as in the previous example. If you leave
-out the \code{()} around the test expression, the result is the same, although
-it may be harder for the template maintainer to read.
-
-You can even combine arguments, although this is of questionable value.
-
-The template:
-\begin{verbatim}
-#cache id='cache1', timer='30m', test=$isDBUpdated or $someOtherCondition
-This is a cached region. $voom
-#end cache
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-This is a cached region. Voom!
-\end{verbatim}
-
-The first if-block:
-\begin{verbatim}
-RECACHE = True
-if not self._cacheData.has_key('88939345'):
- self._cacheIndex['cache1'] = '88939345'
- self.__cache88939345__refreshTime = currentTime() + 1800.0
-elif currentTime() > self.__cache88939345__refreshTime:
- self.__cache88939345__refreshTime = currentTime() + 1800.0
-elif VFS(SL,"isDBUpdated",1) or VFS(SL,"someOtherCondition",1):
- RECACHE = True
-else:
- RECACHE = False
-\end{verbatim}
-
-We are planning to add a \code{'varyBy'} keyword argument in the future that
-will allow separate cache instances to be created for a variety of conditions,
-such as different query string parameters or browser types. This is inspired by
-ASP.net's varyByParam and varyByBrowser output caching keywords. Since this is
-not implemented yet, I cannot provide examples here.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/comments.tex b/docs/devel_guide_src/comments.tex
deleted file mode 100755
index 4a7bdbd..0000000
--- a/docs/devel_guide_src/comments.tex
+++ /dev/null
@@ -1,100 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Directives: Comments}
-\label{comments}
-
-The template:
-
-\begin{verbatim}
-Text before the comment.
-## The comment.
-Text after the comment.
-#* A multi-line comment spanning several lines.
- It spans several lines, too.
-*#
-Text after the multi-line comment.
-\end{verbatim}
-
-The output:
-
-\begin{verbatim}
-Text before the comment.
-Text after the comment.
-
-Text after the multi-line comment.
-
-\end{verbatim}
-
-The generated code:
-
-\begin{verbatim}
- write('Text before the comment.\n')
- # The comment.
- write('Text after the comment.\n')
- # A multi-line comment spanning several lines.
- # It spans several lines, too.
- write('\nText after the multi-line comment.\n')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Docstring and header comments}
-\label{comments.docstring}
-
-The template:
-\begin{verbatim}
-##doc: .respond() method comment.
-##doc-method: Another .respond() method comment.
-##doc-class: A class comment.
-##doc-module: A module comment.
-##header: A header comment.
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-
-\end{verbatim}
-
-The beginning of the generated \code{.respond} method:
-\begin{verbatim}
-def respond(self,
- trans=None,
- dummyTrans=False,
- VFS=valueFromSearchList,
- VFN=valueForName,
- getmtime=getmtime,
- currentTime=time.time):
-
- """
- This is the main method generated by Cheetah
- .respond() method comment.
- Another .respond() method comment.
- """
-\end{verbatim}
-
-The class docstring:
-\begin{verbatim}
-"""
-A class comment.
-
-Autogenerated by CHEETAH: The Python-Powered Template Engine
-"""
-\end{verbatim}
-
-The top of the module:
-\begin{verbatim}
-#!/usr/bin/env python
-# A header comment.
-
-"""A module comment.
-
-Autogenerated by CHEETAH: The Python-Powered Template Engine
- CHEETAH VERSION: 0.9.13a1
- Generation time: Fri Apr 26 22:39:23 2002
- Source file: x.tmpl
- Source file last modified: Fri Apr 26 22:36:23 2002
-"""
-\end{verbatim}
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/compiler.tex b/docs/devel_guide_src/compiler.tex
deleted file mode 100755
index e27aa94..0000000
--- a/docs/devel_guide_src/compiler.tex
+++ /dev/null
@@ -1,8 +0,0 @@
-\section{The compiler}
-\label{compiler}
-
-How templates are compiled: a walk through Compiler.py.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/design.tex b/docs/devel_guide_src/design.tex
deleted file mode 100755
index 3008a63..0000000
--- a/docs/devel_guide_src/design.tex
+++ /dev/null
@@ -1,102 +0,0 @@
-\section{Design Decisions and Tradeoffs}
-\label{design}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Delimiters}
-\label{design.Delimiters}
-
-One of the first decisions we encountered was which delimiter syntax to use.
-We decided to follow Velocity's \code{\$placeholder} and \code{\#directive}
-syntax because the former is widely used in other languages for the same
-purpose, and the latter stands out in an HTML or text document. We also
-implemented the \verb+${longPlaceholder}+ syntax like the shells for cases
-where Cheetah or you might be confused where a placeholder ends. Tavis went
-ahead and made \verb+${longPlaceholder}+ and \verb+$[longPlaceholder]+
-interchangeable with it since it was trivial to implement. Finally,
-the \code{\#compiler} directive allows you to change the delimiters if you
-don't like them or if they conflict with the text in your document.
-(Obviously, if your document contains a Perl program listing, you don't
-necessarily want to backslash each and every \code{\$} and \code{\#}, do you?)
-
-The choice of comment delimiters was more arbitrary. \code{\#\#} and
-\code{\#* \ldots *\#} doesn't match any language, but it's reminiscent of
-Python and C while also being consistent with our ``\code{\#} is for
-directives'' convention.
-
-We specifically chose {\em not} to use pseudo HTML tags for placeholders and
-directives, as described more thoroughly in the Cheetah Users' Guide
-introduction. Pseudo HTML tags may be easier to see in a visual editor
-(supposedly), but in text editors they're hard to distinguish from ``real''
-HTML tags unless you look closely, and they're many more keystrokes to type.
-Also, if you make a mistake, the tag will show up as literal text in the
-rendered HTML page where it will be easy to notice and eradicate, rather than
-disappearing as bogus HTML tags do in browsers.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Late binding}
-\label{design.lateBinding}
-
-One of Cheetah's unique features is the name mapper, which lets you write
-\code{\$a.b} without worrying much about the type of \code{a} or \code{b}.
-Prior to version 0.9.7, Cheetah did the entire NameMapper lookup at runtime.
-This provided maximum flexibility at the expense of speed. Doing a NameMapper
-lookup is intrinsically more expensive than an ordinary Python expression
-because Cheetah has to decide what type of container \code{a} is, whether the
-the value is a function (autocall it), issue the appropriate Python incantation
-to look up \code{b} in it, autocall again if necessary, and then convert the
-result to a string.
-
-To maximize run-time (filling-time) performance, Cheetah 0.9.7 pushed much of
-this work back into the compiler. The compiler looked up \code{a} in the
-searchList at compile time, noted its type, and generated an eval'able Python
-expression based on that.
-
-This approach had two significant drawbacks. What if \code{a} later changes
-type before a template filling? Answer: unpredictable exceptions occur. What
-if \code{a} does not exist in the searchList at compile time? Answer: the
-template can't compile.
-
-To prevent these catastrophes, users were required to prepopulate the
-searchList before instantiating the template instance, and then not to change
-\code{a}'s type. Static typing is repugnant in a dynamic language like Python,
-and having to prepopulate the searchList made certain usages impossible. For
-example, you couldn't instantiate the template object without a searchList and
-then set \code{self} attributes to specify the values.
-
-After significant user complaints about the fragility of this system, Tavis
-rewrote placeholder handling, and in version 0.9.8a3 (August 2001), Tavis
-moved the name mapper lookup back into runtime. Performance wasn't crippled
-because he discovered that writing a C version of the name mapper was easier
-than anticipated, and the C version completed the lookup quickly. Now Cheetah
-had ``late binding'', meaning the compiler does not look up \code{a} or care
-whether it exists. This allows users to create \code{a} or change its type
-anytime before a template filling.
-
-The lesson we learned is that it's better to decide what you want and then
-figure out how to do it, rather than assuming that certain goals are
-unattainable due to performance considerations.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Caching framework}
-\label{design.cache}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Webware compatibility and the transaction framework}
-\label{design.webware}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Single inheritance}
-\label{design.singleInheritance}
-
-
-
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/devel_guide.tex b/docs/devel_guide_src/devel_guide.tex
deleted file mode 100755
index 1e795c4..0000000
--- a/docs/devel_guide_src/devel_guide.tex
+++ /dev/null
@@ -1,55 +0,0 @@
-\documentclass{howto}
-\usepackage{moreverb} %% Verbatim Code Listings
-
-\title{Cheetah Developers' Guide}
-\release{0.9.15a1}
-
-\author{Mike Orr with assistance from Tavis Rudd}
-\authoraddress{\email{iron@mso.oz.net}}
-
-\begin{document}
-\maketitle
-
-
-\tableofcontents
-
-\copyright{Copyright 2002, Mike Orr.
- This document may be copied and modified under the terms of the
- {\bf Open Publication License} \url{http://www.opencontent.org/openpub/} }
-
-
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \include{introduction}
-
- %% How the directives affect the .py template module.
- \include{pyModules}
- \include{placeholders}
- \include{cache}
- \include{comments}
- \include{output}
- \include{inheritanceEtc}
- \include{flowControl}
- \include{errorHandling}
- \include{parserInstructions}
-
- %% A walk through the Cheetah source.
- \include{files}
- \include{template}
- \include{parser}
- \include{compiler}
-
- %% Other development issues and howtos.
- \include{history}
- \include{design}
- \include{patching}
- \include{documenting}
-
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \appendix
- \include{bnf}
- \include{safeDelegation}
-\end{document}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/devel_guide_src/documenting.tex b/docs/devel_guide_src/documenting.tex
deleted file mode 100755
index 51d5153..0000000
--- a/docs/devel_guide_src/documenting.tex
+++ /dev/null
@@ -1,8 +0,0 @@
-\section{Documenting Cheetah}
-\label{documenting}
-
-How to build the documentation. Why LaTeX, a minimum LaTeX reference, etc.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/errorHandling.tex b/docs/devel_guide_src/errorHandling.tex
deleted file mode 100755
index 02079d5..0000000
--- a/docs/devel_guide_src/errorHandling.tex
+++ /dev/null
@@ -1,309 +0,0 @@
-\section{Directives: Error Handling}
-\label{errorHandling}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#try and \#raise}
-\label{errorHandling.try}
-
-The template:
-\begin{verbatim}
-#import traceback
-#try
-#raise RuntimeError
-#except RuntimeError
-A runtime error occurred.
-#end try
-
-#try
-#raise RuntimeError("Hahaha!")
-#except RuntimeError
-#echo $sys.exc_info()[1]
-#end try
-
-#try
-#echo 1/0
-#except ZeroDivisionError
-You can't divide by zero, idiot!
-#end try
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-A runtime error occurred.
-
-Hahaha!
-
-You can't divide by zero, idiot!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-try:
- raise RuntimeError
-except RuntimeError:
- write('A runtime error occurred.\n')
-write('\n')
-try:
- raise RuntimeError("Hahaha!")
-except RuntimeError:
- write(filter(VFN(sys,"exc_info",0)()[1]))
- write('\n')
-write('\n')
-try:
- write(filter(1/0))
- write('\n')
-except ZeroDivisionError:
- write("You can't divide by zero, idiot!\n")
-\end{verbatim}
-
-\code{\#finally} works just like in Python.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#assert}
-\label{errorHandling.assert}
-
-The template:
-\begin{verbatim}
-#assert False, "You lose, buster!"
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Traceback (most recent call last):
- File "x.py", line 117, in ?
- x().runAsMainProgram()
- File "/local/opt/Python/lib/python2.2/site-packages/Webware/Cheetah/
-Template.py", line 331, in runAsMainProgram
- CmdLineIface(templateObj=self).run()
- File "/local/opt/Python/lib/python2.2/site-packages/Webware/Cheetah/
-TemplateCmdLineIface.py", line 59, in run
- print self._template
- File "x.py", line 91, in respond
- assert False, "You lose, buster!"
-AssertionError: You lose, buster!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-assert False, "You lose, buster!"
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#errorCatcher}
-\label{errorHandling.errorCatcher}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{No error catcher}
-\label{errorHandling.errorCatcher.no}
-
-The template:
-\begin{verbatim}
-$noValue
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-
-Traceback (most recent call last):
- File "x.py", line 118, in ?
- x().runAsMainProgram()
- File "/local/opt/Python/lib/python2.2/site-packages/Webware/Cheetah/
-Template.py", line 331, in runAsMainProgram
- CmdLineIface(templateObj=self).run()
- File "/local/opt/Python/lib/python2.2/site-packages/Webware/Cheetah/
-TemplateCmdLineIface.py", line 59, in run
- print self._template
- File "x.py", line 91, in respond
- write(filter(VFS(SL,"noValue",1))) # generated from '$noValue' at line
-1, col 1.
-NameMapper.NotFound: noValue
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write(filter(VFS(SL,"noValue",1))) # generated from '$noValue' at line 1,
- # col 1.
-write('\n')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Echo and BigEcho}
-\label{errorHandling.errorCatcher.echo}
-
-The template:
-\begin{verbatim}
-#errorCatcher Echo
-$noValue
-#errorCatcher BigEcho
-$noValue
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-$noValue
-===============&lt;$noValue could not be found&gt;===============
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-if self._errorCatchers.has_key("Echo"):
- self._errorCatcher = self._errorCatchers["Echo"]
-else:
- self._errorCatcher = self._errorCatchers["Echo"] = ErrorCatchers.Echo(self)
-write(filter(self.__errorCatcher1(localsDict=locals())))
- # generated from '$noValue' at line 2, col 1.
-write('\n')
-if self._errorCatchers.has_key("BigEcho"):
- self._errorCatcher = self._errorCatchers["BigEcho"]
-else:
- self._errorCatcher = self._errorCatchers["BigEcho"] = \
- ErrorCatchers.BigEcho(self)
-write(filter(self.__errorCatcher1(localsDict=locals())))
- # generated from '$noValue' at line 4, col 1.
-write('\n')
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{ListErrors}
-\label{errorHandling.errorCatcher.listErrors}
-
-The template:
-\begin{verbatim}
-#import pprint
-#errorCatcher ListErrors
-$noValue
-$anotherMissingValue.really
-$pprint.pformat($errorCatcher.listErrors)
-## This is really self.errorCatcher().listErrors()
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-$noValue
-$anotherMissingValue.really
-[{'code': 'VFS(SL,"noValue",1)',
- 'exc_val': <NameMapper.NotFound instance at 0x8170ecc>,
- 'lineCol': (3, 1),
- 'rawCode': '$noValue',
- 'time': 'Wed May 15 00:38:23 2002'},
- {'code': 'VFS(SL,"anotherMissingValue.really",1)',
- 'exc_val': <NameMapper.NotFound instance at 0x816d0fc>,
- 'lineCol': (4, 1),
- 'rawCode': '$anotherMissingValue.really',
- 'time': 'Wed May 15 00:38:23 2002'}]
-\end{verbatim}
-
-The generated import:
-\begin{verbatim}
-import pprint
-\end{verbatim}
-
-Then in the generated class, we have our familiar \code{.respond} method
-and several new methods:
-\begin{verbatim}
-def __errorCatcher1(self, localsDict={}):
- """
- Generated from $noValue at line, col (3, 1).
- """
-
- try:
- return eval('''VFS(SL,"noValue",1)''', globals(), localsDict)
- except self._errorCatcher.exceptions(), e:
- return self._errorCatcher.warn(exc_val=e, code= 'VFS(SL,"noValue",1)' ,
- rawCode= '$noValue' , lineCol=(3, 1))
-
-def __errorCatcher2(self, localsDict={}):
- """
- Generated from $anotherMissingValue.really at line, col (4, 1).
- """
-
- try:
- return eval('''VFS(SL,"anotherMissingValue.really",1)''', globals(),
- localsDict)
- except self._errorCatcher.exceptions(), e:
- return self._errorCatcher.warn(exc_val=e,
- code= 'VFS(SL,"anotherMissingValue.really",1)' ,
- rawCode= '$anotherMissingValue.really' , lineCol=(4, 1))
-
-def __errorCatcher3(self, localsDict={}):
- """
- Generated from $pprint.pformat($errorCatcher.listErrors) at line, col
- (5, 1).
- """
-
- try:
- return eval('''VFN(pprint,"pformat",0)(VFS(SL,
- "errorCatcher.listErrors",1))''', globals(), localsDict)
- except self._errorCatcher.exceptions(), e:
- return self._errorCatcher.warn(exc_val=e, code=
- 'VFN(pprint,"pformat",0)(VFS(SL,"errorCatcher.listErrors",1))' ,
- rawCode= '$pprint.pformat($errorCatcher.listErrors)' ,
- lineCol=(5, 1))
-\end{verbatim}
-\begin{verbatim}
-def respond(self,
- trans=None,
- dummyTrans=False,
- VFS=valueFromSearchList,
- VFN=valueForName,
- getmtime=getmtime,
- currentTime=time.time):
-
-
- """
- This is the main method generated by Cheetah
- """
-
- if not trans:
- trans = DummyTransaction()
- dummyTrans = True
- write = trans.response().write
- SL = self._searchList
- filter = self._currentFilter
- globalSetVars = self._globalSetVars
-
- ########################################
- ## START - generated method body
-
- if exists(self._filePath) and getmtime(self._filePath) > self._fileMtime:
- self.compile(file=self._filePath)
- write(getattr(self, self._mainCheetahMethod_for_x)(trans=trans))
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
- if self._errorCatchers.has_key("ListErrors"):
- self._errorCatcher = self._errorCatchers["ListErrors"]
- else:
- self._errorCatcher = self._errorCatchers["ListErrors"] = \
- ErrorCatchers.ListErrors(self)
- write(filter(self.__errorCatcher1(localsDict=locals())))
- # generated from '$noValue' at line 3, col 1.
- write('\n')
- write(filter(self.__errorCatcher2(localsDict=locals())))
- # generated from '$anotherMissingValue.really' at line 4, col 1.
- write('\n')
- write(filter(self.__errorCatcher3(localsDict=locals())))
- # generated from '$pprint.pformat($errorCatcher.listErrors)' at line
- # 5, col 1.
- write('\n')
- # This is really self.errorCatcher().listErrors()
-
- ########################################
- ## END - generated method body
-
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
-\end{verbatim}
-
-So whenever an error catcher is active, each placeholder gets wrapped in its
-own method. No wonder error catchers slow down the system!
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/files.tex b/docs/devel_guide_src/files.tex
deleted file mode 100755
index 0ce45a9..0000000
--- a/docs/devel_guide_src/files.tex
+++ /dev/null
@@ -1,11 +0,0 @@
-\section{Files}
-\label{files}
-
-This chapter will be an overview of the files in the Cheetah package,
-and how they interrelate in compiling and filling a template. We'll
-also look at files in the Cheetah tarball that don't get copied into
-the package.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/flowControl.tex b/docs/devel_guide_src/flowControl.tex
deleted file mode 100755
index 936df67..0000000
--- a/docs/devel_guide_src/flowControl.tex
+++ /dev/null
@@ -1,360 +0,0 @@
-\section{Directives: Flow Control}
-\label{flowControl}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#for}
-\label{flowControl.for}
-
-The template:
-\begin{verbatim}
-#for $i in $range(10)
-$i #slurp
-#end for
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-0 1 2 3 4 5 6 7 8 9
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-for i in range(10):
- write(filter(i)) # generated from '$i' at line 2, col 1.
- write(' ')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#repeat}
-\label{flowControl.repeat}
-
-The template:
-\begin{verbatim}
-#repeat 3
-My bonnie lies over the ocean
-#end repeat
-O, bring back my bonnie to me!
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-My bonnie lies over the ocean
-My bonnie lies over the ocean
-My bonnie lies over the ocean
-O, bring back my bonnie to me!
-\end{verbatim}
-(OK, so the second line should be ``sea'' instead of ``ocean''.)
-
-The generated code:
-\begin{verbatim}
-for __i0 in range(3):
- write('My bonnie lies over the ocean\n')
-write('O, bring back my bonnie to me!\n')
-\end{verbatim}
-
-Note that a new local variable of the form \code{\_\_i\$num} will be
-used for each instance of \code{repeat} in order to permit nesting.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#while}
-\label{flowControl.while}
-
-The template:
-\begin{verbatim}
-#set $alive = True
-#while $alive
-I am alive!
-#set $alive = False
-#end while
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-I am alive!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-alive = True
-while alive:
- write('I am alive!\n')
- alive = False
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#if}
-\label{}
-
-The template:
-\begin{verbatim}
-#set $size = 500
-#if $size >= 1500
-It's big
-#else if $size < 1500 and $size > 0
-It's small
-#else
-It's not there
-#end if
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-It's small
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-size = 500
-if size >= 1500:
- write("It's big\n")
-elif size < 1500 and size > 0:
- write("It's small\n")
-else:
- write("It's not there\n")
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#unless}
-\label{flowControl.unless}
-
-The template:
-\begin{verbatim}
-#set $count = 9
-#unless $count + 5 > 15
-Count is in range.
-#end unless
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Count is in range.
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- count = 9
- if not (count + 5 > 15):
- write('Count is in range.\n')
-\end{verbatim}
-
-{\em Note:} There is a bug in Cheetah 0.9.13. It's forgetting the
-parentheses in the \code{if} expression, which could lead to it calculating
-something different than it should.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#break and \#continue}
-\label{flowControl.break}
-
-The template:
-\begin{verbatim}
-#for $i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']
-#if $i == 10
- #continue
-#end if
-#if $i == 'Joe'
- #break
-#end if
-$i - #slurp
-#end for
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 11 - 12 - James -
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']:
- if i == 10:
- write('')
- continue
- if i == 'Joe':
- write('')
- break
- write(filter(i)) # generated from '$i' at line 8, col 1.
- write(' - ')
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#pass}
-\label{flowControl.pass}
-
-The template:
-\begin{verbatim}
-Let's check the number.
-#set $size = 500
-#if $size >= 1500
-It's big
-#elif $size > 0
-#pass
-#else
-Invalid entry
-#end if
-Done checking the number.
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Let's check the number.
-Done checking the number.
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write("Let's check the number.\n")
-size = 500
-if size >= 1500:
- write("It's big\n")
-elif size > 0:
- pass
-else:
- write('Invalid entry\n')
-write('Done checking the number.\n')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#stop}
-\label{flowControl.stop}
-
-The template:
-\begin{verbatim}
-A cat
-#if 1
- sat on a mat
- #stop
- watching a rat
-#end if
-in a flat.
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-A cat
- sat on a mat
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write('A cat\n')
-if 1:
- write(' sat on a mat\n')
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
- write(' watching a rat\n')
-write('in a flat.\n')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#return}
-\label{flowControl.return}
-
-The template:
-\begin{verbatim}
-1
-$test[1]
-3
-#def test
-1.5
-#if 1
-#return '123'
-#else
-99999
-#end if
-#end def
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-1
-2
-3
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- def test(self,
- trans=None,
- dummyTrans=False,
- VFS=valueFromSearchList,
- VFN=valueForName,
- getmtime=getmtime,
- currentTime=time.time):
-
-
- """
- Generated from #def test at line 5, col 1.
- """
-
- if not trans:
- trans = DummyTransaction()
- dummyTrans = True
- write = trans.response().write
- SL = self._searchList
- filter = self._currentFilter
- globalSetVars = self._globalSetVars
-
- ########################################
- ## START - generated method body
-
- write('1.5\n')
- if 1:
- return '123'
- else:
- write('99999\n')
-
- ########################################
- ## END - generated method body
-
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
-\end{verbatim}
-\begin{verbatim}
- def respond(self,
- trans=None,
- dummyTrans=False,
- VFS=valueFromSearchList,
- VFN=valueForName,
- getmtime=getmtime,
- currentTime=time.time):
-
-
- """
- This is the main method generated by Cheetah
- """
-
- if not trans:
- trans = DummyTransaction()
- dummyTrans = True
- write = trans.response().write
- SL = self._searchList
- filter = self._currentFilter
- globalSetVars = self._globalSetVars
-
- ########################################
- ## START - generated method body
-
- write('\n1\n')
- write(filter(VFS(SL,"test",1)[1])) # generated from '$test[1]' at line 3, col 1.
- write('\n3\n')
-
- ########################################
- ## END - generated method body
-
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
-\end{verbatim}
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/history.tex b/docs/devel_guide_src/history.tex
deleted file mode 100755
index d5444d5..0000000
--- a/docs/devel_guide_src/history.tex
+++ /dev/null
@@ -1,92 +0,0 @@
-\section{History of Cheetah}
-\label{history}
-
-In Spring 2001, several members of the webware-discuss mailing list expressed
-the need for a template engine. Webware like Python is great for organizing
-logic, but they both suffer when you need to do extensive variable
-interpolation into large pieces of text, or to build up a text string from its
-nested parts. Python's \code{\%} operator gets you only so far, the syntax is
-cumbersome, and you have to use a separate format string for each nested part.
-Most of us had used template systems from other platforms--chiefly Zope's DTML,
-PHPLib's Template object and Java's Velocity--and wanted to port something like
-those so it could be used both in Webware servlets and in standalone Python
-programs.
-
-% @@MO: What influence did PSP have on Cheetah?
-
-Since I (Mike Orr) am writing this history, I'll describe how I encountered
-Cheetah. I had written a template module called PlowPlate based on PHPLib's
-Template library. Like PHPLib, it used regular expressions to search
-and destroy--er, replace--placeholders, behaved like a dictionary to
-specify placeholder values, contained no directives, but did have BEGIN and
-END markers which could be used to extract a named block (subtemplate).
-Meanwhile, Tavis Rudd was also on webware-discuss and interested in templates,
-and he lived just a few hours away. So on 12 May 2001 we met in Vancouver at
-a gelato shop on Denman Street and discussed Webware, and he drew on a napkin
-the outline of a template system he was working on.
-
-[Note from Tavis: Mikes got the dates and sequence of things a little out of order,
-but what the hell ...]
-
-Instead of filling the template by search-and-replace, he wanted to break it up
-into parts. This was a primitive form of template compiling: do the
-time-consuming work once and put it to a state where you can fill the template
-quickly multiple times. A template without directives happens to break down
-naturally into a list of alternating text/placeholder pairs. The odd
-subscript values are literal strings; the even subscripts are string keys into
-a dictionary of placeholder values. The project was called TemplateServer.
-
-In a couple months, Tavis decided that instead of compiling to a list, he
-wanted to compile to Python source code: a series of \code{write} calls that
-would output into a file-like object. This was the nucleus that became
-Cheetah. I thought that idea was stupid, but it turned out that this
-not-so-stupid idea blew all the others out of the water in terms of
-performance.
-
-Another thing Tavis pushed hard for from near the beginning was ``display
-logic'', or simple directives like \code{\#for}, \code{\#if} and
-\code{\#echo}. (OK, \code{\#echo} came later, but conceptually it belongs
-here. I thought display logic was even stupider than compiling to Python
-source code because it would just lead to ``DTML hell''--complicated templates
-that are hard to read and maintain, and for which you have to learn (and debug)
-a whole new language when Python does it just fine. But others (hi Chuck!) had
-templates that were maintained by secretaries who didn't know Python, and the
-secretaries needed display logic, so that was that. Finally, after working
-with Cheetah templates (with display logic) and PlowPlate templates (with just
-blocks rather than display logic), I realized Tavis was smarter than I was and
-display logic really did belong in the template.
-
-The next step was making directives for all the Python flow-control
-statements: \code{\#while}, \code{\#try}, \code{\#assert}, etc. Some of
-them we couldn't think of a use for. Nevertheless, they were easy to code,
-and ``somebody'' would probably need them ``someday'', so we may as well
-implement them now.
-
-During all this, Chuck Esterbrook, Ian Bicking and others offered (and still
-offer) their support and suggestions, and Chuck gave us feedback about his use
-of Cheetah--its first deployment in a commercial production environment.
-Later, Edmund Lian became our \#1 bug reporter and suggester as he used Cheetah
-in his web applications.
-
-% @@MO: Write more about the contributions of Chuck, Ian and others. My
-% memory is faulty so I'll have to ask them.
-
-We were going to release 1.0 in January 2002, but we decided to delay it
-until more people used it in real-world situations and gave us feedback
-about what is still needed. This has led to many refinements, and we have
-added (and removed) features according to this feedback. Nevertheless,
-Cheetah has been changing but stable since the late-binding rewrite in
-fall 2001, and anybody who keeps up with the cheetah-discuss mailing list
-will know when changes occur that require modifying one's template, and
-since most people use point releases rather than CVS, they generally have
-a few week's warning about any significant changes.
-
-More detail on Cheetah's history and evolution, and why it is the way it is,
-can be found in our paper for the Python10 conference,
-\url{http://www.cheetahtemplate.org/Py10.html}.
-
-% @@MO: Look through the changelog for important milestones to mention.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/inheritanceEtc.tex b/docs/devel_guide_src/inheritanceEtc.tex
deleted file mode 100755
index 0179555..0000000
--- a/docs/devel_guide_src/inheritanceEtc.tex
+++ /dev/null
@@ -1,232 +0,0 @@
-\section{Directives: Import, Inheritance, Declaration and Assignment}
-\label{inheritanceEtc}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#import and \#from}
-\label{inheritanceEtc.import}
-
-The template:
-\begin{verbatim}
-#import math
-\end{verbatim}
-
-This construct does not produce any output.
-
-The generated module, at the bottom of the import section:
-\begin{verbatim}
-import math
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#extends}
-\label{inheritanceEtc.extends}
-
-The template:
-\begin{verbatim}
-#extends SomeClass
-\end{verbatim}
-
-The generated import (skipped if \code{SomeClass} has already been
-imported):
-\begin{verbatim}
-from SomeClass import SomeClass
-\end{verbatim}
-
-The generated class:
-\begin{verbatim}
-class x(SomeClass):
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#implements}
-\label{inheritanceEtc.implements}
-
-The template:
-\begin{verbatim}
-#implements doOutput
-\end{verbatim}
-
-In the generated class, the main method is \code{.doOutput} instead of
-\code{.respond}, and the attribute naming this method is:
-\begin{verbatim}
-_mainCheetahMethod_for_x2= 'doOutput'
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#set and \#set global}
-\label{inheritanceEtc.set}
-
-The template:
-\begin{verbatim}
-#set $namesList = ['Moe','Larry','Curly']
-$namesList
-#set global $toes = ['eeny', 'meeny', 'miney', 'moe']
-$toes
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-['Moe', 'Larry', 'Curly']
-['eeny', 'meeny', 'miney', 'moe']
-\end{verbatim}
-
-
-The generated code:
-\begin{verbatim}
-1 namesList = ['Moe','Larry','Curly']
-2 write(filter(namesList)) # generated from '$namesList' at line 2, col 1.
-3 write('\n')
-4 globalSetVars["toes"] = ['eeny', 'meeny', 'miney', 'moe']
-5 write(filter(VFS(SL,"toes",1))) # generated from '$toes' at line 4, col 1.
-6 write('\n')
-\end{verbatim}
-
-\code{globalSetVars} is a local variable referencing \code{.\_globalSetVars}.
-Writes go into it directly, but reads take advantage of the fact that
-\code{.\_globalSetVars} is on the searchList. (In fact, it's the very first
-namespace.)
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#del}
-\label{inheritanceEtc.del}
-
-The template:
-\begin{verbatim}
-#set $a = 1
-#del $a
-#set $a = 2
-#set $arr = [0, 1, 2]
-#del $a, $arr[1]
-\end{verbatim}
-
-In the generated class:
-\begin{verbatim}
-1 a = 1
-2 del a
-3 a = 2
-4 arr = [0, 1, 2]
-5 del a, arr[1]
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#attr}
-\label{inheritanceEtc.attr}
-
-The template:
-\begin{verbatim}
-#attr $namesList = ['Moe', 'Larry', 'Curly']
-\end{verbatim}
-
-In the generated class:
-\begin{verbatim}
-## GENERATED ATTRIBUTES
-
-namesList = ['Moe', 'Larry', 'Curly']
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#def}
-\label{inheritanceEtc.def}
-
-The template:
-\begin{verbatim}
-#def printArg($arg)
-The argument is $arg.
-#end def
-My method returned $printArg(5).
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-My method returned The argument is 5.
-.
-\end{verbatim}
-
-Hmm, not exactly what we expected. The method returns a trailing newline
-because we didn't end the last line with \code{\#slurp}. So the second
-period (outside the method) appears on a separate line.
-
-The \code{\#def} generates a method \code{.printArg} whose structure is similar
-to the main method:
-\begin{verbatim}
-def printArg(self,
- arg,
- trans=None,
- dummyTrans=False,
- VFS=valueFromSearchList,
- VFN=valueForName,
- getmtime=getmtime,
- currentTime=time.time):
-
-
- """
- Generated from #def printArg($arg) at line 1, col 1.
- """
-
- if not trans:
- trans = DummyTransaction()
- dummyTrans = True
- write = trans.response().write
- SL = self._searchList
- filter = self._currentFilter
- globalSetVars = self._globalSetVars
-
- ########################################
- ## START - generated method body
-
- write('The argument is ')
- write(filter(arg)) # generated from '$arg' at line 2, col 17.
- write('.\n')
-
- ########################################
- ## END - generated method body
-
- if dummyTrans:
- return trans.response().getvalue()
- else:
- return ""
-\end{verbatim}
-
-When \code{.printArg} is called from a placeholder, only the arguments the user
-supplied are passed. The other arguments retain their default values.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#block}
-\label{inheritanceEtc.block}
-
-The template:
-\begin{verbatim}
-#block content
-This page is under construction.
-#end block
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-This page is under construction.
-\end{verbatim}
-
-This construct generates a method \code{.content} in the same structure
-as \code{.printArg} above, containing the write code:
-\begin{verbatim}
-write('This page is under construction.\n')
-\end{verbatim}
-
-In the main method, the write code is:
-\begin{verbatim}
-self.content(trans=trans) # generated from ('content', '#block content')
- # at line 1, col 1.
-\end{verbatim}
-
-So a block placeholder implicitly passes the current transaction to the method.
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/introduction.tex b/docs/devel_guide_src/introduction.tex
deleted file mode 100755
index 3403d7e..0000000
--- a/docs/devel_guide_src/introduction.tex
+++ /dev/null
@@ -1,29 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Introduction}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Who should read this Guide?}
-
-The Cheetah Developers' Guide is for those who want to learn how Cheetah works
-internally, or wish to modify or extend Cheetah. It is assumed that
-you've read the Cheetah Users' Guide and have an intermediate knowledge of
-Python.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Contents}
-
-This Guide takes a behaviorist approach. First we'll look at what the
-Cheetah compiler generates when it compiles a template definition, and
-how it compiles the various \$placeholder features and \#directives.
-Then we'll stroll through the files in the Cheetah source distribution
-and show how each file contributes to the compilation and/or filling of
-templates. Then we'll list every method/attribute inherited by a template
-object. Finally, we'll describe how to submit bugfixes/enhancements to
-Cheetah, and how to add to the documentation.
-
-Appendix A will contain a BNF syntax of the Cheetah template language.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/devel_guide_src/output.tex b/docs/devel_guide_src/output.tex
deleted file mode 100755
index 1b714c2..0000000
--- a/docs/devel_guide_src/output.tex
+++ /dev/null
@@ -1,282 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Directives: Output}
-\label{output}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#echo}
-\label{output.echo}
-
-The template:
-\begin{verbatim}
-Here is my #echo ', '.join(['silly']*5) # example
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Here is my silly, silly, silly, silly, silly example
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write('Here is my ')
-write(filter(', '.join(['silly']*5) ))
-write(' example\n')
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#silent}
-\label{output.silent}
-
-The template:
-\begin{verbatim}
-Here is my #silent ', '.join(['silly']*5) # example
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Here is my example
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- write('Here is my ')
- ', '.join(['silly']*5)
- write(' example\n')
-\end{verbatim}
-
-OK, it's not quite covert because that extra space gives it away, but it
-almost succeeds.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#raw}
-\label{output.raw}
-
-The template:
-\begin{verbatim}
-Text before raw.
-#raw
-Text in raw. $alligator. $croc.o['dile']. #set $a = $b + $c.
-#end raw
-Text after raw.
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Text before raw.
-Text in raw. $alligator. $croc.o['dile']. #set $a = $b + $c.
-Text after raw.
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
- write('''Text before raw.
-Text in raw. $alligator. $croc.o['dile']. #set $a = $b + $c.
-Text after raw.
-''')
-\end{verbatim}
-
-So we see that \code{\#raw} is really like a quoting mechanism. It says that
-anything inside it is ordinary text, and Cheetah joins a \code{\#raw} section
-with adjacent string literals rather than generating a separate \code{write}
-call.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#include}
-\label{output.include}
-
-The main template:
-\begin{verbatim}
-#include "y.tmpl"
-\end{verbatim}
-
-The included template y.tmpl:
-\begin{verbatim}
-Let's go $voom!
-\end{verbatim}
-
-The shell command and output:
-\begin{verbatim}
-% voom="VOOM" x.py --env
-Let's go VOOM!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write(self._includeCheetahSource("y.tmpl", trans=trans, includeFrom="file",
- raw=0))
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{\#include raw}
-\label{output.include.raw}
-
-The main template:
-\begin{verbatim}
-#include raw "y.tmpl"
-\end{verbatim}
-
-The shell command and output:
-\begin{verbatim}
-% voom="VOOM" x.py --env
-Let's go $voom!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write(self._includeCheetahSource("y.tmpl", trans=trans, includeFrom="fil
-e", raw=1))
-\end{verbatim}
-
-That last argument, \code{raw}, makes the difference.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{\#include from a string or expression (eval)}
-\label{output.include.expression}
-
-The template:
-\begin{verbatim}
-#attr $y = "Let's go $voom!"
-#include source=$y
-#include raw source=$y
-#include source="Bam! Bam!"
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-% voom="VOOM" x.py --env
-Let's go VOOM!Let's go $voom!Bam! Bam!
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write(self._includeCheetahSource(VFS(SL,"y",1), trans=trans,
- includeFrom="str", raw=0, includeID="481020889808.74"))
-write(self._includeCheetahSource(VFS(SL,"y",1), trans=trans,
- includeFrom="str", raw=1, includeID="711020889808.75"))
-write(self._includeCheetahSource("Bam! Bam!", trans=trans,
- includeFrom="str", raw=0, includeID="1001020889808.75"))
-\end{verbatim}
-
-Later in the generated class:
-\begin{verbatim}
-y = "Let's go $voom!"
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#slurp}
-\label{output.slurp}
-
-The template:
-\begin{verbatim}
-#for $i in range(5)
-$i
-#end for
-#for $i in range(5)
-$i #slurp
-#end for
-Line after slurp.
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-0
-1
-2
-3
-4
-0 1 2 3 4 Line after slurp.
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-for i in range(5):
- write(filter(i)) # generated from '$i' at line 2, col 1.
- write('\n')
-for i in range(5):
- write(filter(i)) # generated from '$i' at line 5, col 1.
- write(' ')
-write('Line after slurp.\n')
-\end{verbatim}
-
-The space after each number is because of the space before \code{\#slurp} in
-the template definition.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#filter}
-\label{output.filter}
-
-The template:
-\begin{verbatim}
-#attr $ode = ">> Rubber Ducky, you're the one! You make bathtime so much fun! <<"
-$ode
-#filter WebSafe
-$ode
-#filter MaxLen
-${ode, maxlen=13}
-#filter None
-${ode, maxlen=13}
-\end{verbatim}
-
-The output:
-\begin{verbatim}
->> Rubber Ducky, you're the one! You make bathtime so much fun! <<
-&gt;&gt; Rubber Ducky, you're the one! You make bathtime so much fun! &lt;&lt;
->> Rubber Duc
->> Rubber Ducky, you're the one! You make bathtime so much fun! <<
-\end{verbatim}
-
-The \code{WebSafe} filter escapes characters that have a special meaning in
-HTML. The \code{MaxLen} filter chops off values at the specified length.
-\code{\#filter None} returns to the default filter, which ignores the \code{maxlen}
-argument.
-
-The generated code:
-\begin{verbatim}
- 1 write(filter(VFS(SL,"ode",1))) # generated from '$ode' at line 2, col 1.
- 2 write('\n')
- 3 filterName = 'WebSafe'
- 4 if self._filters.has_key("WebSafe"):
- 5 filter = self._currentFilter = self._filters[filterName]
- 6 else:
- 7 filter = self._currentFilter = \
- 8 self._filters[filterName] = getattr(self._filtersLib,
- filterName)(self).filter
- 9 write(filter(VFS(SL,"ode",1))) # generated from '$ode' at line 4, col 1.
-10 write('\n')
-11 filterName = 'MaxLen'
-12 if self._filters.has_key("MaxLen"):
-13 filter = self._currentFilter = self._filters[filterName]
-14 else:
-15 filter = self._currentFilter = \
-16 self._filters[filterName] = getattr(self._filtersLib,
- filterName)(self).filter
-17 write(filter(VFS(SL,"ode",1), maxlen=13)) # generated from
- #'${ode, maxlen=13}' at line 6, col 1.
-18 write('\n')
-19 filter = self._initialFilter
-20 write(filter(VFS(SL,"ode",1), maxlen=13)) # generated from
- #'${ode, maxlen=13}' at line 8, col 1.
-21 write('\n')
-\end{verbatim}
-
-As we've seen many times, Cheetah wraps all placeholder lookups in a
-\code{filter} call. (This also applies to non-searchList lookups: local,
-global and builtin variables.) The \code{filter} ``function''
-is actually an alias to the current filter object:
-\begin{verbatim}
-filter = self._currentFilter
-\end{verbatim}
-as set at the top of the main method. Here in lines 3-8 and 11-16 we see
-the filter being changed. Whoops, I lied. \code{filter} is not an alias to
-the filter object itself but to that object's \code{.filter} method. Line 19
-switches back to the default filter.
-
-In line 17 we see the \code{maxlen} argument being passed as a keyword
-argument to \code{filter} (not to \code{VFS}). In line 20 the same thing
-happens although the default filter ignores the argument.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/parser.tex b/docs/devel_guide_src/parser.tex
deleted file mode 100755
index 0198b5d..0000000
--- a/docs/devel_guide_src/parser.tex
+++ /dev/null
@@ -1,9 +0,0 @@
-\section{The parser}
-\label{parser}
-
-How templates are compiled: a walk through Parser.py's source.
-(Also need to look at Lexer.py, but not too closely.)
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/parserInstructions.tex b/docs/devel_guide_src/parserInstructions.tex
deleted file mode 100644
index 0af065f..0000000
--- a/docs/devel_guide_src/parserInstructions.tex
+++ /dev/null
@@ -1,61 +0,0 @@
-\section{Directives: Parser Instructions}
-\label{parserInstructions}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#breakpoint}
-\label{parserInstructions.breakpoint}
-
-
-The template:
-\begin{verbatim}
-Text before breakpoint.
-#breakpoint
-Text after breakpoint.
-#raise RuntimeError
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-Text before breakpoint.
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write('Text before breakpoint.\n')
-\end{verbatim}
-
-Nothing after the breakpoint was compiled.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#compiler}
-\label{parserInstructions.compiler}
-
-The template:
-\begin{verbatim}
-// Not a comment
-#compiler commentStartToken = '//'
-// A comment
-#compiler reset
-// Not a comment
-\end{verbatim}
-
-The output:
-\begin{verbatim}
-// Not a comment
-// Not a comment
-\end{verbatim}
-
-The generated code:
-\begin{verbatim}
-write('// Not a comment\n')
-# A comment
-write('// Not a comment\n')
-\end{verbatim}
-
-So this didn't affect the generated program, it just affected how the
-template definition was read.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/patching.tex b/docs/devel_guide_src/patching.tex
deleted file mode 100755
index 6049068..0000000
--- a/docs/devel_guide_src/patching.tex
+++ /dev/null
@@ -1,134 +0,0 @@
-\section{Patching Cheetah}
-\label{patching}
-
-How to commit changes to CVS or submit patches, how to run the test suite.
-Describe distutils and how the regression tests work.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{File Requirements}
-\label{patching.fileRequirements}
-
-The code{Template} class contains not only the Cheetah infrastructure, but also
-some convenience methods useful in all templates. More methods may be added if
-it's generally agreed among Cheetah developers that the method is sufficiently
-useful to all types of templates, or at least to all types of HTML-output
-templates. If a method is too long to fit into \code{Template} -- especially
-if it has helper methods -- put it in a mixin class under \code{Cheetah.Utils}
-and inherit it.
-
-Routines for a specific problem domain should be put under
-\code{Cheetah.Tools}, so that it doesn't clutter the namespace unless the user
-asks for it.
-
-Remember: \code{Cheetah.Utils} is for objects required by any part of Cheetah's
-core. \code{Cheetah.Tools} is for completely optional objects. It should
-always be possible to delete \code{Cheetah.Tools} without breaking Cheetah's
-core services.
-
-If a core method needs to look up an attribute defined under
-\code{Cheetah.Tools}, it should use \code{hasattr()} and gracefully provide a
-default if the attribute does not exist (meaning the user has not imported that
-subsystem).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Testing Changes and Building Regression Tests}
-\label{patching.testing}
-
-Cheetah ships with a regression test suite. To run the built-in tests,
-execute at the shell prompt:
-\begin{verbatim}
- cheetah test
-\end{verbatim}
-
-Before checking any changes in, run the tests and verify they all pass. That
-way, users can check out the CVS version of Cheetah at any time with a fairly
-high confidence that it will work. If you fix a bug or add a feature, please
-take the time to add a test that exploits the bug/feature. This will help in
-the future, to prevent somebody else from breaking it again without realizing
-it. Users can also run the test suite to verify all the features work on their
-particular platform and computer.
-
-The general procedure for modifying Cheetah is as follows:
-\begin{enumerate}
-\item Write a simple Python program that exploits the bug/feature you're
- working on. You can either write a regression test (see below), or a
- separate program that writes the template output to one file and put the
- expected output in another file; then you can run \code{diff} on the two
- outputs. (\code{diff} is a utility included on all Unix-like systems. It
- shows the differences between two files line by line. A precompiled
- Windows version is at
- \url{http://gnuwin32.sourceforge.net/packages/diffutils.htm}, and MacOS
- sources at \url{http://perso.wanadoo.fr/gilles.depeyrot/DevTools\_en.html}.)
-\item Make the change in your Cheetah CVS sandbox or in your installed
- version of Cheetah. If you make it in the sandbox, you'll have to run
- \code{python setup.py install} before testing it. If you make it in the
- installed version, do {\em not} run the installer or it will overwrite your
- changes!
-\item Run \code{cheetah test} to verify you didn't break anything. Then run
- your little test program.
-\item Repeat steps 2-3 until everything is correct.
-\item Turn your little program into a regression test as described below.
-\item When \code{cheetah test} runs cleanly with your regression test
- included, update the \code{CHANGES} file and check in your changes. If you
- made the changes in your installed copy of Cheetah, you'll have to copy
- them back into the CVS sandbox first. If you added any files that must be
- distributed, {\em be sure to} \code{cvs add} them before committing.
- Otherwise Cheetah will run fine on your computer but fail on anybody
- else's, and the test suite can't check for this.
-\item Announce the change on the cheetahtemplate-discuss list and provide a
- tutorial if necessary. The documentation maintainer will update the
- Users' Guide and Developers' Guide based on this message and on the
- changelog.
-\end{enumerate}
-
-If you add a directory to Cheetah, you have to mention it in \code{setup.py} or
-it won't be installed.
-
-The tests are in the \code{Cheetah.Tests} package, aka the \code{src/Tests/}
-directory of your CVS sandbox. Most of the tests are in
-\code{SyntaxAndOutput.py}. You can either run all the tests or choose which
-to run:
-\begin{description}
-\item{\code{python Test.py}}
- Run all the tests. (Equivalent to \code{cheetah test}.)
-\item{\code{python SyntaxAndOutput.py}}
- Run only the tests in that module.
-\item{\code{python SyntaxAndOutput.py CGI}}
- Run only the tests in the class \code{CGI} inside the module. The class
- must be a direct or indirect subclass of
- \code{unittest\_local\_copy.TestCase}.
-\item{\code{python SyntaxAndOutput.py CGI Indenter}}
- Run the tests in classes \code{CGI} and \code{Indenter}.
-\item{\code{python SyntaxAndOutput.py CGI.test1}}
- Run only test \code{test1}, which is a method in the \code{CGI} class.
-\item{etc...}
-\end{description}
-
-To make a SyntaxAndOutput test, first see if your test logically fits into one
-of the existing classes. If so, simply add a method; e.g., \code{test16}.
-The method should not require any arguments except \code{self}, and should
-call \code{.verify(source, expectedOutput)}, where the two arguments are
-a template definition string and a control string. The tester will complain
-if the template output does not match the control string. You have a wide
-variety of placeholder variables to choose from, anything that's included in
-the \code{defaultTestNameSpace} global dictionary. If that's not enough, add
-items to the dictionary, but please keep it from being cluttered with wordy
-esoteric items for a single test).
-
-If your test logically belongs in a separate class, create a subclass of
-\code{OutputTest}. You do not need to do anything else; the test suite will
-automatically find your class in the module. Having a separate class allows
-you to define state variables needed by your tests (see the \code{CGI} class)
-or override \code{.searchList()} (see the \code{Indenter} class) to provide
-your own searchList.
-
-To modify another test module or create your own test module, you'll have to
-study the existing modules, the \code{unittest\_local\_copy} source, and the
-\code{unittest} documentation in the Python Library Reference. Note that we
-are using a hacked version of \code{unittest} to make a more convenient test
-structure for Cheetah. The differences between \code{unittest\_local\_copy}
-and Python's standard \code{unittest} are documented at the top of the module.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/placeholders.tex b/docs/devel_guide_src/placeholders.tex
deleted file mode 100755
index e487d09..0000000
--- a/docs/devel_guide_src/placeholders.tex
+++ /dev/null
@@ -1,478 +0,0 @@
-\section{Placeholders}
-\label{placeholders}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Simple placeholders}
-\label{placeholders.simple}
-
-Let's add a few \$placeholders to our template:
-
-\begin{verbatim}
->>> from Cheetah.Template import Template
->>> values = {'what': 'surreal', 'punctuation': '?'}
->>> t = Template("""\
-... Hello, $what world$punctuation
-... One of Python's least-used functions is $xrange.
-... """, [values])
->>> print t
-Hello, surreal world?
-One of Python's least-used functions is <built-in function xrange>.
-
->>> print t.generatedModuleCode()
- 1 #!/usr/bin/env python
-
- 2 """
- 3 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 4 CHEETAH VERSION: 0.9.12
- 5 Generation time: Sun Apr 21 00:53:01 2002
- 6 """
-
- 7 __CHEETAH_genTime__ = 'Sun Apr 21 00:53:01 2002'
- 8 __CHEETAH_version__ = '0.9.12'
-
- 9 ##################################################
- 10 ## DEPENDENCIES
-
- 11 import sys
- 12 import os
- 13 import os.path
- 14 from os.path import getmtime, exists
- 15 import time
- 16 import types
- 17 from Cheetah.Template import Template
- 18 from Cheetah.DummyTransaction import DummyTransaction
- 19 from Cheetah.NameMapper import NotFound, valueForName,
- valueFromSearchList
- 20 import Cheetah.Filters as Filters
- 21 import Cheetah.ErrorCatchers as ErrorCatchers
-
- 22 ##################################################
- 23 ## MODULE CONSTANTS
-
- 24 try:
- 25 True, False
- 26 except NameError:
- 27 True, False = (1==1), (1==0)
-
- 28 ##################################################
- 29 ## CLASSES
-
- 30 class GenTemplate(Template):
- 31 """
- 32
- 33 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 34 """
-
- 35 ##################################################
- 36 ## GENERATED METHODS
-
-\end{verbatim}
-\begin{verbatim}
-
- 37 def __init__(self, *args, **KWs):
- 38 """
- 39
- 40 """
-
- 41 Template.__init__(self, *args, **KWs)
-
- 42 def respond(self,
- 43 trans=None,
- 44 dummyTrans=False,
- 45 VFS=valueFromSearchList,
- 46 VFN=valueForName,
- 47 getmtime=getmtime,
- 48 currentTime=time.time):
-
-
- 49 """
- 50 This is the main method generated by Cheetah
- 51 """
-
- 52 if not trans:
- 53 trans = DummyTransaction()
- 54 dummyTrans = True
- 55 write = trans.response().write
- 56 SL = self._searchList
- 57 filter = self._currentFilter
- 58 globalSetVars = self._globalSetVars
- 59
- 60 ########################################
- 61 ## START - generated method body
- 62
- 63 write('Hello, ')
- 64 write(filter(VFS(SL,"what",1))) # generated from '$what' at
- # line 1, col 8.
- 65 write(' world')
- 66 write(filter(VFS(SL,"punctuation",1))) # generated from
- # '$punctuation' at line 1, col 19.
- 67 write("\nOne of Python's least-used methods is ")
- 68 write(filter(xrange)) # generated from '$xrange' at line 2,
- # col 39.
- 69 write('.\n')
- 70
- 71 ########################################
- 72 ## END - generated method body
- 73
- 74 if dummyTrans:
- 75 return trans.response().getvalue()
- 76 else:
- 77 return ""
-\end{verbatim}
-\begin{verbatim}
- 78
- 79 ##################################################
- 80 ## GENERATED ATTRIBUTES
-
- 81 __str__ = respond
- 82 _mainCheetahMethod_for_GenTemplate= 'respond'
-
- 83 # CHEETAH was developed by Tavis Rudd, Chuck Esterbrook, Ian Bicking
- # and Mike Orr;
- 84 # with code, advice and input from many other volunteers.
- 85 # For more information visit http://www.CheetahTemplate.org
-
- 86 ##################################################
- 87 ## if run from command line:
- 88 if __name__ == '__main__':
- 89 GenTemplate().runAsMainProgram()
-
-\end{verbatim}
-
-(Again, I have added line numbers and split the lines as in the previous
-chapter.)
-
-This generated template module is different from the previous one in several
-trivial respects and one important respect. Trivially,
-\code{.\_filePath} and \code{.\_fileMtime} are not updated in
-\code{.\_\_init\_\_}, so they inherit the value \code{None} from
-\code{Template}. Also, that if-stanza in \code{.respond} that recompiles the
-template if the source file changes is missing -- because there is no source
-file. So this module is several lines shorter than the other one.
-
-But the important way this module is different is that instead of the one
-\code{write} call outputting a string literal, this module has a series of
-\code{write} calls (lines 63-69) outputting successive chunks of the
-template. Regular text has been translated into a string literal, and
-placeholders into function calls. Every placeholder is wrapped inside a
-\code{filter} call to apply the current output filter. (The default
-output filter converts all objects to strings, and \code{None} to \code{""}.)
-
-Placeholders referring to a Python builtin like \code{xrange} (line 68)
-generate a bare variable name. Placeholders to be looked up in the searchList
-have a nested function call; e.g.,
-\begin{verbatim}
-write(filter(VFS(SL,"what",1))) # generated from '$what' at line 1, col 8.
-\end{verbatim}
-\code{VFS}, remember, is a function imported from \code{Cheetah.NameMapper}
-that looks up a value in a searchList. So we pass it the searchList, the
-name to look up, and a boolean (1) indicating we want autocalling. (It's
-\code{1} rather than \code{True} because it's generated from an
-\code{and} expression, and that's what Python 2.2 outputs for true \code{and}
-expressions.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Complex placeholders}
-\label{placeholders.complex}
-
-Placeholders can get far more complicated than that. This example shows what
-kind of code the various NameMapper features produce. The formulas are
-taken from Cheetah's test suite, in the
-\code{Cheetah.Tests.SyntaxAndOutput.Placeholders} class.
-
-\begin{verbatim}
-1 placeholder: $aStr
-2 placeholders: $aStr $anInt
-2 placeholders, back-to-back: $aStr$anInt
-1 placeholder enclosed in {}: ${aStr}
-1 escaped placeholder: \$var
-func placeholder - with (): $aFunc()
-func placeholder - with (int): $aFunc(1234)
-func placeholder - with (string): $aFunc('aoeu')
-func placeholder - with ('''\nstring'\n'''): $aFunc('''\naoeu'\n''')
-func placeholder - with (string*int): $aFunc('aoeu'*2)
-func placeholder - with (int*float): $aFunc(2*2.0)
-Python builtin values: $None $True $False
-func placeholder - with ($arg=float): $aFunc($arg=4.0)
-deeply nested argstring: $aFunc( $arg = $aMeth( $arg = $aFunc( 1 ) ) ):
-function with None: $aFunc(None)
-autocalling: $aFunc! $aFunc().
-nested autocalling: $aFunc($aFunc).
-list subscription: $aList[0]
-list slicing: $aList[:2]
-list slicing and subcription combined: $aList[:2][0]
-dict - NameMapper style: $aDict.one
-dict - Python style: $aDict['one']
-dict combined with autocalled string method: $aDict.one.upper
-dict combined with string method: $aDict.one.upper()
-nested dict - NameMapper style: $aDict.nestedDict.two
-nested dict - Python style: $aDict['nestedDict']['two']
-nested dict - alternating style: $aDict['nestedDict'].two
-nested dict - NameMapper style + method: $aDict.nestedDict.two.upper
-nested dict - alternating style + method: $aDict['nestedDict'].two.upper
-nested dict - NameMapper style + method + slice: $aDict.nestedDict.two.upper[:4]
-nested dict - Python style, variable key: $aDict[$anObj.meth('nestedDict')].two
-object method: $anObj.meth1
-object method + complex slice: $anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ]
-very complex slice: $( anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ] )
-$_('a call to gettext')
-\end{verbatim}
-
-We'll need a big program to set up the placeholder values. Here it is:
-
-\begin{verbatim}
-#!/usr/bin/env python
-from ComplexExample import ComplexExample
-
-try: # Python >= 2.2.1
- True, False
-except NameError: # Older Python
- True, False = (1==1), (1==0)
-
-class DummyClass:
- _called = False
- def __str__(self):
- return 'object'
-
- def meth(self, arg="arff"):
- return str(arg)
-
- def meth1(self, arg="doo"):
- return arg
-
- def meth2(self, arg1="a1", arg2="a2"):
- return str(arg1) + str(arg2)
-
- def callIt(self, arg=1234):
- self._called = True
- self._callArg = arg
-
-def dummyFunc(arg="Scooby"):
- return arg
-
-defaultTestNameSpace = {
- 'aStr':'blarg',
- 'anInt':1,
- 'aFloat':1.5,
- 'aList': ['item0','item1','item2'],
- 'aDict': {'one':'item1',
- 'two':'item2',
- 'nestedDict':{1:'nestedItem1',
- 'two':'nestedItem2'
- },
- 'nestedFunc':dummyFunc,
- },
- 'aFunc': dummyFunc,
- 'anObj': DummyClass(),
- 'aMeth': DummyClass().meth1,
- '_': lambda x: 'translated ' + x
-}
-
-print ComplexExample( searchList=[defaultTestNameSpace] )
-\end{verbatim}
-
-Here's the output:
-
-\begin{verbatim}
-1 placeholder: blarg
-2 placeholders: blarg 1
-2 placeholders, back-to-back: blarg1
-1 placeholder enclosed in {}: blarg
-1 escaped placeholder: $var
-func placeholder - with (): Scooby
-func placeholder - with (int): 1234
-func placeholder - with (string): aoeu
-func placeholder - with ('''\nstring'\n'''):
-aoeu'
-
-func placeholder - with (string*int): aoeuaoeu
-func placeholder - with (int*float): 4.0
-Python builtin values: 1 0
-func placeholder - with ($arg=float): 4.0
-deeply nested argstring: 1:
-function with None:
-autocalling: Scooby! Scooby.
-nested autocalling: Scooby.
-list subscription: item0
-list slicing: ['item0', 'item1']
-list slicing and subcription combined: item0
-dict - NameMapper style: item1
-dict - Python style: item1
-dict combined with autocalled string method: ITEM1
-dict combined with string method: ITEM1
-nested dict - NameMapper style: nestedItem2
-nested dict - Python style: nestedItem2
-nested dict - alternating style: nestedItem2
-nested dict - NameMapper style + method: NESTEDITEM2
-nested dict - alternating style + method: NESTEDITEM2
-nested dict - NameMapper style + method + slice: NEST
-nested dict - Python style, variable key: nestedItem2
-object method: doo
-object method + complex slice: do
-very complex slice: do
-translated a call to gettext
-
-\end{verbatim}
-
-And here -- tada! -- is the generated module.
-To save space, I've included only the lines containing the \code{write} calls.
-The rest of the module is the same as in the first example, chapter
-\ref{pyModules.example}. I've split some of the lines to make them fit on
-the page.
-
-\begin{verbatim}
- 1 write('1 placeholder: ')
- 2 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 1, col 16.
- 3 write('\n2 placeholders: ')
- 4 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 2, col 17.
- 5 write(' ')
- 6 write(filter(VFS(SL,"anInt",1)))
- # generated from '$anInt' at line 2, col 23.
- 7 write('\n2 placeholders, back-to-back: ')
- 8 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 3, col 31.
- 9 write(filter(VFS(SL,"anInt",1)))
- # generated from '$anInt' at line 3, col 36.
-10 write('\n1 placeholder enclosed in {}: ')
-11 write(filter(VFS(SL,"aStr",1))) # generated from '${aStr}' at line 4,
- # col 31.
-12 write('\n1 escaped placeholder: $var\nfunc placeholder - with (): ')
-13 write(filter(VFS(SL,"aFunc",0)())) # generated from '$aFunc()' at line 6,
- # col 29.
-14 write('\nfunc placeholder - with (int): ')
-15 write(filter(VFS(SL,"aFunc",0)(1234))) # generated from '$aFunc(1234)' at
- # line 7, col 32.
-16 write('\nfunc placeholder - with (string): ')
-17 write(filter(VFS(SL,"aFunc",0)('aoeu'))) # generated from "$aFunc('aoeu')"
- # at line 8, col 35.
-18 write("\nfunc placeholder - with ('''\\nstring'\\n'''): ")
-19 write(filter(VFS(SL,"aFunc",0)('''\naoeu'\n'''))) # generated from
- # "$aFunc('''\\naoeu'\\n''')" at line 9, col 46.
-20 write('\nfunc placeholder - with (string*int): ')
-21 write(filter(VFS(SL,"aFunc",0)('aoeu'*2))) # generated from
- # "$aFunc('aoeu'*2)" at line 10, col 39.
-22 write('\nfunc placeholder - with (int*float): ')
-23 write(filter(VFS(SL,"aFunc",0)(2*2.0))) # generated from '$aFunc(2*2.0)'
- # at line 11, col 38.
-24 write('\nPython builtin values: ')
-25 write(filter(None)) # generated from '$None' at line 12, col 24.
-26 write(' ')
-27 write(filter(True)) # generated from '$True' at line 12, col 30.
-28 write(' ')
-29 write(filter(False)) # generated from '$False' at line 12, col 36.
-30 write('\nfunc placeholder - with ($arg=float): ')
-31 write(filter(VFS(SL,"aFunc",0)(arg=4.0))) # generated from
- # '$aFunc($arg=4.0)' at line 13, col 40.
-32 write('\ndeeply nested argstring: ')
-33 write(filter(VFS(SL,"aFunc",0)(
- arg = VFS(SL,"aMeth",0)( arg = VFS(SL,"aFunc",0)( 1 ) ) )))
- # generated from '$aFunc( $arg = $aMeth( $arg = $aFunc( 1 ) ) )'
- # at line 14, col 26.
-34 write(':\nfunction with None: ')
-35 write(filter(VFS(SL,"aFunc",0)(None))) # generated from '$aFunc(None)' at
- # line 15, col 21.
-36 write('\nautocalling: ')
-37 write(filter(VFS(SL,"aFunc",1))) # generated from '$aFunc' at line 16,
- # col 14.
-38 write('! ')
-39 write(filter(VFS(SL,"aFunc",0)())) # generated from '$aFunc()' at line 16,
- # col 22.
-\end{verbatim}
-\begin{verbatim}
-40 write('.\nnested autocalling: ')
-41 write(filter(VFS(SL,"aFunc",0)(VFS(SL,"aFunc",1)))) # generated from
- # '$aFunc($aFunc)' at line 17, col 21.
-42 write('.\nlist subscription: ')
-43 write(filter(VFS(SL,"aList",1)[0])) # generated from '$aList[0]' at line
- # 18, col 20.
-44 write('\nlist slicing: ')
-45 write(filter(VFS(SL,"aList",1)[:2])) # generated from '$aList[:2]' at
- # line 19, col 15.
-46 write('\nlist slicing and subcription combined: ')
-47 write(filter(VFS(SL,"aList",1)[:2][0])) # generated from '$aList[:2][0]'
- # at line 20, col 40.
-48 write('\ndict - NameMapper style: ')
-49 write(filter(VFS(SL,"aDict.one",1))) # generated from '$aDict.one' at line
- # 21, col 26.
-50 write('\ndict - Python style: ')
-51 write(filter(VFS(SL,"aDict",1)['one'])) # generated from "$aDict['one']"
- # at line 22, col 22.
-52 write('\ndict combined with autocalled string method: ')
-53 write(filter(VFS(SL,"aDict.one.upper",1))) # generated from
- # '$aDict.one.upper' at line 23, col 46.
-54 write('\ndict combined with string method: ')
-55 write(filter(VFN(VFS(SL,"aDict.one",1),"upper",0)())) # generated from
- # '$aDict.one.upper()' at line 24, col 35.
-56 write('\nnested dict - NameMapper style: ')
-57 write(filter(VFS(SL,"aDict.nestedDict.two",1))) # generated from
- # '$aDict.nestedDict.two' at line 25, col 33.
-58 write('\nnested dict - Python style: ')
-59 write(filter(VFS(SL,"aDict",1)['nestedDict']['two'])) # generated from
- # "$aDict['nestedDict']['two']" at line 26, col 29.
-60 write('\nnested dict - alternating style: ')
-61 write(filter(VFN(VFS(SL,"aDict",1)['nestedDict'],"two",1))) # generated
- # from "$aDict['nestedDict'].two" at line 27, col 34.
-62 write('\nnested dict - NameMapper style + method: ')
-63 write(filter(VFS(SL,"aDict.nestedDict.two.upper",1))) # generated from
- # '$aDict.nestedDict.two.upper' at line 28, col 42.
-64 write('\nnested dict - alternating style + method: ')
-65 write(filter(VFN(VFS(SL,"aDict",1)['nestedDict'],"two.upper",1)))
- # generated from "$aDict['nestedDict'].two.upper" at line 29, col 43.
-66 write('\nnested dict - NameMapper style + method + slice: ')
-\end{verbatim}
-\begin{verbatim}
-67 write(filter(VFN(VFS(SL,"aDict.nestedDict.two",1),"upper",1)[:4]))
- # generated from '$aDict.nestedDict.two.upper[:4]' at line 30, col 50.
-68 write('\nnested dict - Python style, variable key: ')
-69 write(filter(VFN(VFS(SL,"aDict",1)
- [VFN(VFS(SL,"anObj",1),"meth",0)('nestedDict')],"two",1)))
- # generated from "$aDict[$anObj.meth('nestedDict')].two" at line 31,
- # col 43.
-70 write('\nobject method: ')
-71 write(filter(VFS(SL,"anObj.meth1",1))) # generated from '$anObj.meth1' at
- # line 32, col 16.
-72 write('\nobject method + complex slice: ')
-73 write(filter(VFN(VFS(SL,"anObj",1),"meth1",1)
- [0: ((4/4*2)*2)/VFN(VFS(SL,"anObj",1),"meth1",0)(2) ]))
- # generated from '$anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ]'
- # at line 33, col 32.
-74 write('\nvery complex slice: ')
-75 write(filter(VFN(VFS(SL,"anObj",1),"meth1",1)
- [0: ((4/4*2)*2)/VFN(VFS(SL,"anObj",1),"meth1",0)(2) ] ))
- # generated from '$( anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ] )'
- # at line 34, col 21.
-76 if False:
-77 _('foo')
-78 write(filter(VFS(SL,"_",0)("a call to gettext")))
- # generated from "$_('a call to gettext')"
- # at line 35, col 1.
-79 write('\n')
-\end{verbatim}
-
-For each placeholder lookup, the the innermost level of nesting is a \code{VFS}
-call, which looks up the first (leftmost) placeholder component in the
-searchList. This is wrapped by zero or more \code{VFN} calls, which perform
-Universal Dotted Notation lookup on the next dotted component of the
-placeholder, looking for an attribute or key by that name within the previous
-object (not in the searchList). Autocalling is performed by \code{VFS} and
-\code{VFN}: that's the reason for their third argument.
-
-Explicit function/method arguments, subscripts and keys (which
-are all expressions) are left unchanged, besides expanding any embedded
-\$placeholders in them. This means they must result in valid Python
-expressions, following the standard Python quoting rules.
-
-Built-in Python values (\code{None}, \code{True} and \code{False}) are
-converted to \code{filter(None)}, etc. They use normal Python variable
-lookup rather than \code{VFS}. (Cheetah emulates \code{True} and \code{False}
-using global variables for Python < 2.2.1, when they weren't builtins yet.)
-
-Notice the last line is a call to \code{_} (i.e. \code{gettext}) which is used
-for internationalization (see
-\url{http://docs.python.org/lib/module-gettext.html}). The code is converted
-normally, but an \code{if False} block is used so that gettext can
-successfully mark the string for translation when parsing the generated Python.
-Otherwise, the NameMapper syntax would get in the way of this.
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/pyModules.tex b/docs/devel_guide_src/pyModules.tex
deleted file mode 100755
index 2aa3236..0000000
--- a/docs/devel_guide_src/pyModules.tex
+++ /dev/null
@@ -1,246 +0,0 @@
-\section{.py Template Modules}
-\label{pyModules}
-
-This chapter examines the structure of a .py template module. The following
-few chapters will then show how each placeholder and directive affects the
-generated Python code.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{An example}
-\label{pyModules.example}
-
-Our first template follows a long noble tradition in computer tutorials.
-It produces a familiar, friendly greeting. Here's the template:
-
-\begin{verbatim}
-Hello, world!
-\end{verbatim}
-
-... the output:
-
-\begin{verbatim}
-Hello, world!
-\end{verbatim}
-
-... and the .py template module cheetah-compile produced, with line
-numbers added:
-
-% @@MO: Is it possible to print the line numbers gray instead of black?
-
-\begin{verbatim}
- 1 #!/usr/bin/env python
-
- 2 """
- 3 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 4 CHEETAH VERSION: 0.9.12
- 5 Generation time: Sat Apr 20 14:27:47 2002
- 6 Source file: x.tmpl
- 7 Source file last modified: Wed Apr 17 22:10:59 2002
- 8 """
-
- 9 __CHEETAH_genTime__ = 'Sat Apr 20 14:27:47 2002'
- 10 __CHEETAH_src__ = 'x.tmpl'
- 11 __CHEETAH_version__ = '0.9.12'
-
- 12 ##################################################
- 13 ## DEPENDENCIES
-
- 14 import sys
- 15 import os
- 16 import os.path
- 17 from os.path import getmtime, exists
- 18 import time
- 19 import types
- 20 from Cheetah.Template import Template
- 21 from Cheetah.DummyTransaction import DummyTransaction
- 22 from Cheetah.NameMapper import NotFound, valueForName,
- valueFromSearchList
- 23 import Cheetah.Filters as Filters
- 24 import Cheetah.ErrorCatchers as ErrorCatchers
-
- 25 ##################################################
- 26 ## MODULE CONSTANTS
-
- 27 try:
- 28 True, False
- 29 except NameError:
- 30 True, False = (1==1), (1==0)
-
- 31 ##################################################
- 32 ## CLASSES
-
- 33 class x(Template):
- 34 """
- 35
- 36 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 37 """
-\end{verbatim}
-\begin{verbatim}
- 38 ##################################################
- 39 ## GENERATED METHODS
-
-
- 40 def __init__(self, *args, **KWs):
- 41 """
- 42
- 43 """
-
- 44 Template.__init__(self, *args, **KWs)
- 45 self._filePath = 'x.tmpl'
- 46 self._fileMtime = 1019106659
-
- 47 def respond(self,
- 48 trans=None,
- 49 dummyTrans=False,
- 50 VFS=valueFromSearchList,
- 51 VFN=valueForName,
- 52 getmtime=getmtime,
- 53 currentTime=time.time):
-
-
- 54 """
- 55 This is the main method generated by Cheetah
- 56 """
-
- 57 if not trans:
- 58 trans = DummyTransaction()
- 59 dummyTrans = True
- 60 write = trans.response().write
- 61 SL = self._searchList
- 62 filter = self._currentFilter
- 63 globalSetVars = self._globalSetVars
- 64
- 65 ########################################
- 66 ## START - generated method body
- 67
- 68 if exists(self._filePath) and getmtime(self._filePath) > \
- self._fileMtime:
- 69 self.compile(file=self._filePath)
- 70 write(getattr(self, self._mainCheetahMethod_for_x)
- (trans=trans))
- 71 if dummyTrans:
- 72 return trans.response().getvalue()
- 73 else:
- 74 return ""
- 75 write('Hello, world!\n')
- 76
- 77 ########################################
- 78 ## END - generated method body
- 79
- 80 if dummyTrans:
- 81 return trans.response().getvalue()
- 82 else:
- 83 return ""
-\end{verbatim}
-\begin{verbatim}
- 84
- 85 ##################################################
- 86 ## GENERATED ATTRIBUTES
-
-
- 87 __str__ = respond
-
- 88 _mainCheetahMethod_for_x= 'respond'
-
-
- 89 # CHEETAH was developed by Tavis Rudd, Chuck Esterbrook, Ian Bicking
- # and Mike Orr;
- 90 # with code, advice and input from many other volunteers.
- 91 # For more information visit http://www.CheetahTemplate.org
-
- 92 ##################################################
- 93 ## if run from command line:
- 94 if __name__ == '__main__':
- 95 x().runAsMainProgram()
-
-\end{verbatim}
-
-(I added the line numbers for this Guide, and split a few lines to fit the
-page width. The continuation lines don't have line numbers, and I added
-indentation, backslashes and '\#' as necessary to make the result a valid
-Python program.)
-
-The examples were generated from CVS versions of Cheetah between 0.9.12 and
-0.9.14.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{A walk through the example}
-\label{pyModules.walk}
-
-Lines 20-24 are the Cheetah-specific imports. Line 33 introduces our generated
-class, \code{x}, a subclass of \code{Template}. It's called x because the
-source file was x.tmpl.
-
-Lines 40-46 are the \code{.\_\_init\_\_} method called when the template is
-instantiated or used as a Webware servlet, or when the module is run as a
-standalone program. We can see it calling its superclass constructor and
-setting \code{.\_filePath} and \code{.\_fileMtime} to the filename and
-modification time (in Unix ticks) of the source .tmpl file.
-
-Lines 47-84 are the main method \code{.respond}, the one that fills the
-template. Normally you call it without arguments, but Webware calls it with a
-Webware \code{Transaction} object representing the current request. Lines
-57-59 set up the \code{trans} variable. If a real or dummy transaction is
-passed in, the method uses it. Otherwise (if the \code{trans} argument is
-\code{None}), the method creates a \code{DummyTransaction} instance.
-\code{dummyTrans} is a flag that just tells whether a dummy transaction is in
-effect; it'll be used at the end of the method.
-
-The other four \code{.respond} arguments aren't anything you'd ever want to
-pass in; they exist solely to speed up access to these frequently-used
-global functions. This is a standard Python trick described in question 4.7
-of the Python FAQ (\url{http://www.python.org/cgi-bin/faqw.py}).
-\code{VFS} and \code{VFN} are the functions that give your template the
-benefits of NameMapper lookup, such as the ability to use the searchList.
-
-Line 60 initializes the \code{write} variable. This important variable is
-discussed below.
-
-Lines 60-63 initialize a few more local variables. \code{SL} is the
-searchList. \code{filter} is the current output filter. \code{globalSetVars}
-are the variables that have been defined with \code{\#set global}.
-
-The comments at lines 65 and 78 delimit the start and end of the code that
-varies with each template. The code outside this region is identical in all
-template modules. That's not quite true -- \code{\#import} for instance
-generates additional \code{import} statements at the top of the module --
-but it's true enough for the most part.
-
-Lines 68-74 exist only if the template source was a named file rather than
-a string or file object. The stanza recompiles the template if the source
-file has changed. Lines 70-74 seem to be redundant with 75-83: both
-fill the template and send the output. The reason the first set of lines
-exists is because the second set may become invalid when the template is
-recompiled. (This is for {\em re}\ compilation only. The initial compilation
-happened in the \code{.\_\_init\_\_} method if the template wasn't
-precompiled.)
-
-Line 75 is the most interesting line in this module. It's a direct
-translation of what we put in the template definition, ``Hello, world!'' Here
-the content is a single string literal. \code{write} looks like an ordinary
-function call, but remember that line 60 made it an alias to
-\code{trans.response().write}, a method in the transaction. The next few
-chapters describe how the different placeholders and directives influence this
-portion of the generated class.
-
-Lines 80-83 finish the template filling. If \code{trans} is a real Webware
-transaction, \code{write} has already sent the output to Webware for handling,
-so we return \code{""}. If \code{trans} is a dummy transaction,
-\code{write} has been accumulating the output in a Python \code{StringIO}
-object rather than sending it anywhere, so we have to return it.
-
-Line 83 is the end of the \code{.respond} method.
-
-Line 87 makes code{.\_\_str\_\_} an alias for the main method, so that you
-can \code{print} it or apply \code{str} to it and it will fill the template.
-Line 88 gives the name of the main method, because sometimes it's not
-\code{.respond}.
-
-Lines 94-95 allow the module to be run directly as a script. Essentially,
-they process the command-line arguments and them make the template fill
-itself.
-
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/devel_guide_src/safeDelegation.tex b/docs/devel_guide_src/safeDelegation.tex
deleted file mode 100755
index dd1a8aa..0000000
--- a/docs/devel_guide_src/safeDelegation.tex
+++ /dev/null
@@ -1,44 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Safe Delegation}
-\label{safeDelegation}
-
-% @@MO: Does this really belong in the Developers' Guide or any guide?
-% It's more of a wiki Wishlist item, no? Especially since nobody has
-% expressed a need for it.
-
-Safe delegation, as provided by Zope and Allaire's Spectra, is not implemented
-in Cheetah. The core aim has been to help developers and template maintainers
-get things done, without throwing unnecessary complications in their
-way. So you should give write access to your templates only to those whom you
-trust. However, several hooks have been built into Cheetah so that safe
-delegation can be implemented at a later date.
-
-It should be possible to implement safe delegation via a future configuration
-Setting \code{safeDelegationLevel} (0=none, 1=semi-secure, 2-alcatraz). This
-is not implemented but the steps are listed here in case somebody wants to try
-them out and test them.
-
-Of course, you would also need to benchmark your code
-and verify it does not impact performance when safe delegation is off, and
-impacts it only modestly when it is on." All necessary changes can be made
-at compile time, so there should be no performance impact when filling the
-same TO multiple times.
-
-\begin{enumerate}
-
-\item Only give untrusted developers access to the .tmpl files.
-(Verifying what this means. Why can't trusted developers access them?)
-
-\item Disable the \code{\#attr} directive and maybe the \code{\#set} directive.
-
-\item Use Cheetah's directive validation hooks to disallow
-references to \code{self}, etc
-(e.g. \code{\#if \$steal(self.thePrivateVar)} )
-
-\item Implement a validator for the \$placeholders and use it
-to disallow '\_\_' in \$placeholders so that tricks like
-\code{\$obj.\_\_class\_\_.\_\_dict\_\_} are not possible.
-
-\end{enumerate}
-
-
diff --git a/docs/devel_guide_src/template.tex b/docs/devel_guide_src/template.tex
deleted file mode 100755
index 1ad21c4..0000000
--- a/docs/devel_guide_src/template.tex
+++ /dev/null
@@ -1,11 +0,0 @@
-\section{Template}
-\label{template}
-
-This chapter will mainly walk through the \code{Cheetah.Template} constructor
-and not at what point the template is compiled.
-
-(Also need to look at Transaction,py and Servlet.py.)
-
-% Local Variables:
-% TeX-master: "devel_guide"
-% End:
diff --git a/docs/howto_extras/comparisions.txt b/docs/howto_extras/comparisions.txt
deleted file mode 100755
index 56a0fb3..0000000
--- a/docs/howto_extras/comparisions.txt
+++ /dev/null
@@ -1,451 +0,0 @@
-\section{Cheetah vs. Other Template Engines}
-\label{comparisons}
-
-This appendix compares Cheetah with various other template/emdedded scripting
-languages and Internet development frameworks. As Cheetah is similar to
-Velocity at a superficial level, you may also wish to read comparisons between
-Velocity and other languages at
-\url{http://jakarta.apache.org/velocity/ymtd/ymtd.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Which features are unique to Cheetah}
-\label{comparisons.unique}
-
-\begin{itemize}
-\item The {\bf block framework} (section \ref{inheritanceEtc.block})
-\item Cheetah's powerful yet simple {\bf caching framework} (section
- \ref{output.caching})
-\item Cheetah's {\bf Unified Dotted Notation} and {\bf autocalling}
- (sections \ref{language.namemapper.dict} and
- \ref{language.namemapper.autocalling})
-\item Cheetah's searchList (section \ref{language.searchList})
- information.
-\item Cheetah's \code{\#raw} directive (section \ref{output.raw})
-\item Cheetah's \code{\#slurp} directive (section \ref{output.slurp})
-\item Cheetah's tight integration with Webware for Python (section
- \ref{webware})
-\item Cheetah's {\bf SkeletonPage framework} (section
- \ref{libraries.templates.skeletonPage})
-\item Cheetah's ability to mix PSP-style code with Cheetah
- Language syntax (section \ref{tips.PSP})
- Because of Cheetah's design and Python's flexibility it is
- relatively easy to extend Cheetah's syntax with syntax elements from almost
- any other template or embedded scripting language.
-\end{itemize}
-
-%% @@MO: What about the new features we've been adding?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Velocity}
-\label{comparisons.velocity}
-
-For a basic introduction to Velocity, visit
-\url{http://jakarta.apache.org/velocity}.
-
-Velocity is a Java template engine. It's older than Cheetah, has a larger user
-base, and has better examples and docs at the moment. Cheetah, however, has a
-number of advantages over Velocity:
-\begin{itemize}
-\item Cheetah is written in Python. Thus, it's easier to use and extend.
-\item Cheetah's syntax is closer to Python's syntax than Velocity's is to
-Java's.
-\item Cheetah has a powerful caching mechanism. Velocity has no equivalent.
-\item It's far easier to add data/objects into the namespace where \$placeholder
- values are extracted from in Cheetah. Velocity calls this namespace a 'context'.
- Contexts are dictionaries/hashtables. You can put anything you want into a
- context, BUT you have to use the .put() method to populate the context;
- e.g.,
-
-\begin{verbatim}
-VelocityContext context1 = new VelocityContext();
-context1.put("name","Velocity");
-context1.put("project", "Jakarta");
-context1.put("duplicate", "I am in context1");
-\end{verbatim}
-
- Cheetah takes a different approach. Rather than require you to manually
- populate the 'namespace' like Velocity, Cheetah will accept any existing
- Python object or dictionary AS the 'namespace'. Furthermore, Cheetah
- allows you to specify a list namespaces that will be searched in sequence
- to find a varname-to-value mapping. This searchList can be extended at
- run-time.
-
- If you add a `foo' object to the searchList and the `foo' has an attribute
- called 'bar', you can simply type \code{\$bar} in the template. If the
- second item in the searchList is dictionary 'foofoo' containing
- \code{\{'spam':1234, 'parrot':666\}}, Cheetah will first look in the `foo'
- object for a `spam' attribute. Not finding it, Cheetah will then go to
- `foofoo' (the second element in the searchList) and look among its
- dictionary keys for `spam'. Finding it, Cheetah will select
- \code{foofoo['spam']} as \code{\$spam}'s value.
-
-\item In Cheetah, the tokens that are used to signal the start of
- \$placeholders and \#directives are configurable. You can set them to any
- character sequences, not just \$ and \#.
-\end{itemize}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. WebMacro}
-\label{comparisons.webmacro}
-
-For a basic introduction to WebMacro, visit
-\url{http://webmacro.org}.
-
-The points discussed in section \ref{comparisons.velocity} also apply to the
-comparison between Cheetah and WebMacro. For further differences please refer
-to \url{http://jakarta.apache.org/velocity/differences.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope's DTML}
-\label{comparisons.dtml}
-
-For a basic introduction to DTML, visit
-\url{http://www.zope.org/Members/michel/ZB/DTML.dtml}.
-
-\begin{itemize}
-\item Cheetah is faster than DTML.
-\item Cheetah does not use HTML-style tags; DTML does. Thus, Cheetah tags are
- visible in rendered HTML output if something goes wrong.
-\item DTML can only be used with ZOPE for web development; Cheetah can be
- used as a standalone tool for any purpose.
-\item Cheetah's documentation is more complete than DTML's.
-\item Cheetah's learning curve is shorter than DTML's.
-\item DTML has no equivalent of Cheetah's blocks, caching framework,
- unified dotted notation, and \code{\#raw} directive.
-\end{itemize}
-
-Here are some examples of syntax differences between DTML and Cheetah:
-\begin{verbatim}
-<ul>
-<dtml-in frogQuery>
- <li><dtml-var animal_name></li>
-</dtml-in>
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<ul>
-#for $animal_name in $frogQuery
- <li>$animal_name</li>
-#end for
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<dtml-if expr="monkeys > monkey_limit">
- <p>There are too many monkeys!</p>
-<dtml-elif expr="monkeys < minimum_monkeys">
- <p>There aren't enough monkeys!</p>
-<dtml-else>
- <p>There are just enough monkeys.</p>
-</dtml-if>
-\end{verbatim}
-
-\begin{verbatim}
-#if $monkeys > $monkey_limit
- <p>There are too many monkeys!</p>
-#else if $monkeys < $minimum_monkeys
- <p>There aren't enough monkeys!</p>
-#else
- <p>There are just enough monkeys.</p>
-#end if
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-<dtml-in expr="objectValues('File')">
- <dtml-if sequence-even>
- <tr bgcolor="grey">
- <dtml-else>
- <tr>
- </dtml-if>
- <td>
- <a href="&dtml-absolute_url;"><dtml-var title_or_id></a>
- </td></tr>
-</dtml-in>
-</table>
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-#set $evenRow = 0
-#for $file in $files('File')
- #if $evenRow
- <tr bgcolor="grey">
- #set $evenRow = 0
- #else
- <tr>
- #set $evenRow = 1
- #end if
- <td>
- <a href="$file.absolute_url">$file.title_or_id</a>
- </td></tr>
-#end for
-</table>
-\end{verbatim}
-
-The last example changed the name of \code{\$objectValues} to
-\code{\$files} because that's what a Cheetah developer would write.
-The developer would be responsible for ensuring \code{\$files} returned a
-list (or tuple) of objects (or dictionaries) containing the attributes (or
-methods or dictionary keys) `absolute\_url' and `title\_or\_id'. All these
-names (`objectValues', `absolute\_url' and `title\_or\_id') are standard parts
-of Zope, but in Cheetah the developer is in charge of writing them and giving
-them a reasonable behaviour.
-
-Some of DTML's features are being ported to Cheetah, such as
-\code{Cheetah.Tools.MondoReport}, which is based on the
-\code{<dtml-in>} tag. We are also planning an output filter as flexible as
-the \code{<dtml-var>} formatting options. However, neither of these are
-complete yet.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope Page Templates}
-\label{comparisons.zpt}
-
-For a basic introduction to Zope Page Templates, please visit
-\url{http://www.zope.org/Documentation/Articles/ZPT2}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHP's Smarty templates}
-\label{comparisons.smarty}
-
-PHP (\url{http://www.php.net/}) is one of the few scripting languages
-expressly designed for web servlets. However, it's also a full-fledged
-programming language with libraries similar to Python's and Perl's. The
-syntax and functions are like a cross between Perl and C plus some original
-ideas (e.g.; a single array type serves as both a list and a dictionary,
-\verb+$arr[]="value";+ appends to an array).
-
-Smarty (\url{http://smarty.php.net/}) is an advanced template engine for
-PHP. ({\em Note:} this comparision is based on Smarty's on-line documentation.
-The author has not used Smarty. Please send corrections or ommissions to the
-Cheetah mailing list.) Like Cheetah, Smarty:
-
-\begin{itemize}
-\item compiles to the target programming language (PHP).
-\item has configurable delimeters.
-\item passes if-blocks directly to PHP, so you can use any PHP expression in
-them.
-\item allows you to embed PHP code in a template.
-\item has a caching framework (although it works quite differently).
-\item can read the template definition from any arbitrary source.
-\end{itemize}
-
-Features Smarty has that Cheetah lacks:
-\begin{itemize}
-\item Preprocessors, postprocessors and output filters. You can emulate a
-preprocessor in Cheetah by running your template definition through a filter
-program or function before Cheetah sees it. To emulate a postprocessor, run a
-.py template module through a filter program/function. To emulate a Smarty
-output filter, run the template output through a filter program/function. If
-you want to use ``cheetah compile'' or ``cheetah fill'' in a pipeline, use
-\code{-} as the input file name and \code{--stdout} to send the result to
-standard output. Note that Cheetah uses the term ``output filter'' differently
-than Smarty: Cheetah output filters (\code{\#filter}) operate on placeholders,
-while Smarty output filters operate on the entire template output. There has
-been a proposed \code{\#sed} directive that would operate on the entire output
-line by line, but it has not been implemented.
-\item Variable modifiers. In some cases, Python has equivalent string
-methods (\code{.strip}, \code{.capitalize}, \code{.replace(SEARCH, REPL)}),
-but in other cases you must wrap the result in a function call or write
-a custom output filter (\code{\#filter}).
-\item Certain web-specific functions, which can be emulated with
-third-party functions.
-\item The ability to ``plug in'' new directives in a modular way. Cheetah
-directives are tightly bound to the compiler. However, third-party
-{\em functions} can be freely imported and called from placeholders, and
-{\em methods} can be mixed in via \code{\#extends}. Part of this is
-because Cheetah distinguishes between functions and directives, while
-Smarty treats them all as ``functions''. Cheetah's design does not
-allow functions to have flow control effect outside the function
-(e.g., \code{\#if} and \code{\#for}, which operate on template body lines),
-so directives like these cannot be encoded as functions.
-\item Configuration variables read from an .ini-style file. The
-\code{Cheetah.SettingsManager} module can parse such a file, but you'd
-have to invoke it manually. (See the docstrings in the module for
-details.) In Smarty, this feature is used for
-multilingual applications. In Cheetah, the developers maintain that everybody
-has their own preferred way to do this (such as using Python's \code{gettext}
-module), and it's not worth blessing one particular strategy in Cheetah since
-it's easy enough to integrate third-party code around the template, or to add
-the resulting values to the searchList.
-\end{itemize}
-
-Features Cheetah has that Smarty lacks:
-\begin{itemize}
-\item Saving the compilation result in a Python (PHP) module for quick
-reading later.
-\item Caching individual placeholders or portions of a template. Smarty
-caches only the entire template output as a unit.
-\end{itemize}
-
-Comparisions of various Smarty constructs:
-\begin{verbatim}
-{assign var="name" value="Bob"} (#set has better syntax in the author's opinion)
-counter (looks like equivalent to #for)
-eval (same as #include with variable)
-fetch: insert file content into output (#include raw)
-fetch: insert URL content into output (no euqivalent, user can write
- function calling urllib, call as $fetchURL('URL') )
-fetch: read file into variable (no equivalent, user can write function
- based on the 'open/file' builtin, or on .getFileContents() in
- Template.)
-fetch: read URL content into variable (no equivalent, use above
- function and call as: #set $var = $fetchURL('URL')
-html_options: output an HTML option list (no equivalent, user can
- write custom function. Maybe FunFormKit can help.)
-html_select_date: output three dropdown controls to specify a date
- (no equivalent, user can write custom function)
-html_select_time: output four dropdown controls to specify a time
- (no equvalent, user can write custom function)
-math: eval calculation and output result (same as #echo)
-math: eval calculation and assign to variable (same as #set)
-popup_init: library for popup windows (no equivalent, user can write
- custom method outputting Javascript)
-
-
-Other commands:
-capture (no equivalent, collects output into variable. A Python
- program would create a StringIO instance, set sys.stdout to
- it temporarily, print the output, set sys.stdout back, then use
- .getvalue() to get the result.)
-config_load (roughly analagous to #settings, which was removed
- from Cheetah. Use Cheetah.SettingsManager manually or write
- a custom function.)
-include (same as #include, but can include into variable.
- Variables are apparently shared between parent and child.)
-include_php: include a PHP script (e.g., functions)
- (use #extends or #import instead)
-insert (same as #include not in a #cache region)
-{ldelim}{rdelim} (escape literal $ and # with a backslash,
- use #compiler-settings to change the delimeters)
-literal (#raw)
-php (``<% %>'' tags)
-section (#for $i in $range(...) )
-foreach (#for)
-strip (like the #sed tag which was never implemented. Strips
- leading/trailing whitespace from lines, joins several lines
- together.)
-
-
-Variable modifiers:
-capitalize ( $STRING.capitalize() )
-count_characters ( $len(STRING) )
-count_paragraphs/sentances/words (no equivalent, user can write function)
-date_format (use 'time' module or download Egenix's mx.DateTime)
-default ($getVar('varName', 'default value') )
-escape: html encode ($cgi.escape(VALUE) )
-escape: url encode ($urllib.quote_plus(VALUE) )
-escape: hex encode (no equivalent? user can write function)
-escape: hex entity encode (no equivalent? user can write function)
-indent: indent all lines of a var's output (may be part of future
- #indent directive)
-lower ($STRING.lower() )
-regex_replace ('re' module)
-replace ($STRING.replace(OLD, NEW, MAXSPLIT) )
-spacify (#echo "SEPARATOR".join(SEQUENCE) )
-string_format (#echo "%.2f" % FLOAT , etc.)
-strip_tags (no equivalent, user can write function to strip HTML tags,
- or customize the WebSafe filter)
-truncate (no equivalent, user can write function)
-upper ($STRING.upper() )
-wordwrap ('writer' module, or a new module coming in Python 2.3)
-\end{verbatim}
-
-Some of these modifiers could be added to the super output filter we
-want to write someday.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHPLib's Template class}
-\label{comparisons.php}
-
-PHPLib (\url(http://phplib.netuse.de/) is a collection of classes for various
-web objects (authentication, shopping cart, sessions, etc), but what we're
-interested in is the \code{Template} object. It's much more primitive than
-Smarty, and was based on an old Perl template class. In fact, one of the
-precursors to Cheetah was based on it too. Differences from Cheetah:
-
-\begin{itemize}
-\item Templates consist of text with \code{\{placeholders\}} in braces.
-\item Instead of a searchList, there is one flat namespace. Every variable
- must be assigned via the \code{set\_var} method. However, you can pass
- this method an array (dictionary) of several variables at once.
-\item You cannot embed lookups or calculations into the template. Every
- placeholder must be an exact variable name.
-\item There are no directives. You must do all display logic (if, for, etc)
- in the calling routine.
-\item There is, however, a ``block'' construct. A block is a portion of text
- between the comment markers \code{<!-- BEGIN blockName --> \ldots
- <!-- END blockName>}. The \code{set\_block} method extracts this text
- into a namespace variable and puts a placeholder referring to it in the
- template. This has a few parallels with Cheetah's \code{\#block}
- directive but is overall quite different.
-\item To do the equivalent of \code{\#if}, extract the block. Then if true, do
- nothing. If false, assign the empty string to the namespace variable.
-\item To do the equivalent of \code{\#for}, extract the block. Set any
- namespace variables needed inside the loop. To parse one iteration, use
- the \code{parse} method to fill the block variable (a mini-template) into
- another namespace variable, appending to it. Refresh the namespace
- variables needed inside the loop and parse again; repeat for each
- iteration. You'll end up with a mini-result that will be plugged into the
- main template's placeholder.
-\item To read a template definition from a file, use the \code{set\_file}
- method. This places the file's content in a namespace variable.
- To read a template definition from a string, assign it to a namespace
- variable.
-\item Thus, for complicated templates, you are doing a lot of recursive block
- filling and file reading and parsing mini-templates all into one flat
- namespace as you finally build up values for the main template. In
- Cheetah, all this display logic can be embedded into the template using
- directives, calling out to Python methods for the more complicated tasks.
-\item Although you can nest blocks in the template, it becomes tedious and
- arguably hard to read, because all blocks have identical syntax. Unless
- you choose your block names carefully and put comments around them, it's
- hard to tell which blocks are if-blocks and which are for-blocks, or what
- their nesting order is.
-\item PHPLib templates do not have caching, output filters, etc.
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PSP, PHP, ASP, JSP, Embperl, etc.}
-\label{comparisons.pspEtc}
-
-\begin{description}
-\item[Webware's PSP Component] -- \url{http://webware.sourceforge.net/Webware/PSP/Docs/}
-\item[Tomcat JSP Information] -- \url{http://jakarta.apache.org/tomcat/index.html}
-\item[ASP Information at ASP101] -- \url{http://www.asp101.com/}
-\item[Embperl] -- \url{http://perl.apache.org/embperl/}
-\end{description}
-
-
-Here's a basic Cheetah example:
-\begin{verbatim}
-<TABLE>
-#for $client in $service.clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-\end{verbatim}
-
-Compare this with PSP:
-
-\begin{verbatim}
-<TABLE>
-<% for client in service.clients(): %>
-<TR>
-<TD><%=client.surname()%>, <%=client.firstname()%></TD>
-<TD><A HREF="mailto:<%=client.email()%>"><%=client.email()%></A></TD>
-</TR>
-<%end%>
-</TABLE>
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/01_introduction.txt b/docs/users_guide_2_src/01_introduction.txt
deleted file mode 100755
index 34beeb6..0000000
--- a/docs/users_guide_2_src/01_introduction.txt
+++ /dev/null
@@ -1,291 +0,0 @@
-Introduction
-============
-
-..
- :label: intro
-
-Who should read this Guide?
----------------------------
-
-..
- :label: intro.whoShouldRead
-
-This Users' Guide is for Python programmers. Part I is a tutorial/reference
-and should be read by everybody. Part II is a cookbook of of techniques for
-using Cheetah with various web frameworks and various non-HTML output formats,
-plus some technical appendices. The PDF version of this Guide is distributed
-as two files so you can print Part I to read offline without having to print a
-lot of pages from Part II that don't apply to you.
-
-What is Cheetah?
-----------------
-
-..
- :label: intro.whatIs
-
-Cheetah is a template engine for Python. A template engine is like Python's
-``%`` operator for strings: it has fixed parts which are output verbatim, and
-*placeholders* which are replaced by their values::
-
- # Python's "%" operator (not Cheetah)
- >>> "The king is a %(noun)s!" % {"noun": "fink"}
- 'The king is a fink!"
-
-Templates are useful for form letters, dynamic web pages, customized source
-code or SQL, and innumerable other tasks. Cheetah is like a super-powered
-``%`` operator, but it also has many other features needed in real-world
-templating situations.
-
-Viewed another way, Cheetah is an alternate source format for Python modules,
-one that's friendlier for large chunks of text. Compiled templates are
-ordinary Python modules which can be imported. Cheetah is one of Python's
-oldest template engines and perhaps the most widely used. This is mainly due
-to its speed (hence the name Cheetah), stability, and suitability for many
-output formats. Cheetah has been used in production environments since 2001
-(0.9.9a1), and changes are committed conservatively, so even the CVS version is
-usually more bug-free than the previous release.
-
-Cheetah's syntax uses ``$`` before placeholders and a ``#``
-before control structures (directives), although these characters can be
-changed. This differs from Python's other template systems which generally use
-XML tags (Kid and Tal) or a function syntax (PTL and QPY). The difference
-allows Cheetah to be more suitable for a variety of output formats, and even
-users of the other systems often use Cheetah for non-HTML output such as
-text, Python source code, or SQL. Cheetah's syntax and behavior was
-inspired most directly by Velocity, a Java template engine. In PHP, Smarty is
-Cheetah's closest equivalent. Cheetah templates tend to be function-driven:
-define a method with ``#def``, and call it via a placeholder with arguments.
-Cheetah also has PSP-style tags (``<% %>``) and ``#include``, which will be
-familiar to people coming from ASP/JSP/PHP. However, we'll argue that these
-should be used sparingly, since there are other constructs which are more
-readable.
-
-
-Cheetah:
-
-* generates HTML, SGML, XML, SQL, Postscript, form email, LaTeX, or any
- other text-based format. It has also been used to produce Python, Java
- and PHP source code.
-
-* cleanly separates content, graphic design, and program code. This leads
- to highly modular, flexible, and reusable site architectures; faster
- development time; and HTML and program code that is easier to understand
- and maintain. It is particularly well suited for team efforts.
-
-* blends the power and flexibility of Python with a simple template language
- that non*programmers can understand.
-
-* gives template writers full access in their templates to any Python data
- structure, module, function, object, or method.
-
-* makes code reuse easy by providing an object-oriented interface to
- templates that is accessible from Python code or other Cheetah templates.
- One template can subclass another and selectively reimplement sections of
- it. A compiled template {\em is} a Python class, so it can subclass a
- pure Python class and vice*versa.
-
-* provides a simple yet powerful caching mechanism
-
-Here's a simple example of a Cheetah template::
-
- <HTML>
- <HEAD><TITLE>$title</TITLE></HEAD>
- <BODY>
-
- <TABLE>
- #for client in clients
- <TR>
- <TD>$client.surname, $client.firstname</TD>
- <TD><A HREF="mailto:$client.email">$client.email</A></TD>
- </TR>
- #end for
- </TABLE>
-
- </BODY>
- </HTML>
-
-* has a lot of features but most of them are optional. Cheetah is easy to use
- in simple cases, and scales well to complex cases. Most of Cheetah's
- features were added due to demonstrated needs in production environments
- where Cheetah was already runing.
-
-Cheetah is distributed under a BSD-style open-source license. See appendix E
-(E_license.txt) for details. Cheetah exists thanks to the help of many
-open-source volunteers (http://cheetahtemplate.sourceforge.net/credits.html).
-
-
-
-What is the philosophy behind Cheetah?
---------------------------------------
-
-..
- :label: intro.philosophy
-
-Cheetah's design was guided by these principles:
-
-* Python for the back end (business logic), Cheetah for the front end
- (presentation format). Cheetah was designed to complement Python, not
- replace it.
-
-* Cheetah's core syntax should be easy for non-programmers to learn.
-
-* Cheetah should make code reuse easy by providing an object-oriented
- interface to templates that is accessible from Python code or other
- Cheetah templates.
-
-* Python objects, functions, and other data structures should be fully
- accessible in Cheetah.
-
-* Cheetah should provide flow control and error handling. Logic
- that belongs in the front end shouldn't be relegated to the
- back end simply because it's complex.
-
-* It should be easy to {\bf separate} content, graphic design, and program
- code, but also easy to {\bf integrate} them.
-
- A clean separation makes it easier for a team of content writers,
- HTML/graphic designers, and programmers to work together without stepping
- on each other's toes and polluting each other's work. The HTML framework
- and the content it contains are two separate things, and analytical
- calculations (program code) is a third thing. Each team member should be
- able to concentrate on their specialty and to implement their changes
- without having to go through one of the others (i.e., the dreaded
- "webmaster bottleneck").
-
- While it should be easy to develop content, graphics and program
- code separately, it should be easy to integrate them together into a
- website. In particular, it should be easy:
-
- - for {\bf programmers} to create reusable components and functions
- that are accessible and understandable to designers.
- - for {\bf designers} to mark out placeholders for content and
- dynamic components in their templates.
- - for {\bf designers} to soft-code aspects of their design that are
- either repeated in several places or are subject to change.
- - for {\bf designers} to reuse and extend existing templates and thus
- minimize duplication of effort and code.
- - and, of course, for {\bf content writers} to use the templates that
- designers have created.
-
-* Features are added only to support a demonstrated need in production
- applications, and generally only if the feature is useful for a wide variety
- of situations and output formats. This prevents Cheetah from accumulating
- lots of esoteric features which are used only rarely.
-
-
-Why Cheetah doesn't use HTML-style tags
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-..
- :label: intro.htmlStyleTags
-
-Cheetah does not use HTML/XML-style tags for flow control, unlike some other
-Python template engines, for the following reasons:
-
-* Cheetah is not limited to HTML,
-* HTML-style tags are hard to distinguish from real HTML tags,
-* HTML-style tags are not visible in rendered HTML when something goes wrong,
-* HTML-style tags often lead to invalid HTML (e.g.,
- \code{<img src="<template*directive>">}),
-
-Cheetah tags are less verbose and easier to understand than HTML-style tags,
-and HTML-style tags aren't compatible with most WYSIWYG editors. In a WSYWIG
-editor, Cheetah tags appear to be literal text.
-
-Besides being much more compact, Cheetah also has some advantages over
-languages that put information inside the HTML tags, such as Zope Page
-Templates or PHP:
-
-* HTML or XML-bound languages do not work well with other languages,
-* While ZPT-like syntaxes work well in many ways with WYSIWYG HTML editors,
- they also give up a significant advantage of those editors -- concrete
- editing of the document. When logic is hidden away in (largely
- inaccessible) tags it is hard to understand a page simply by viewing it,
- and it is hard to confirm or modify that logic.
-
-
-How stable is Cheetah? How do I upgrade?
------------------------------------------
-
-..
- :label: intro.stable
-
-Cheetah 2.0 was released [MONTH] [YEAR] with internal restructuring,
-easier-to-understand usage, updated documentation, and many other improvements.
-Cheetah 1.0 was released December 2005 after a three-year stable beta.
-Production sites have been using Cheetah since 2001. Most changes since then
-have been based on requests from production sites: things they need that we
-hadn't considered.
-
-Templates and calling code from Cheetah 1.0 remain 100% compatible. Those from
-pre-1.0 versions since December 2001 (0.9.9) remain compatible except in rare
-cases.
-
-.. important::
- You must recompile all precompiled templates when upgrading
- to Cheetah 2.0.
-
-Upgrades from 2.0 to a future version may or may not require
-recompilation. Try filling a single precompiled template and see if you get a
-version exception. If you do, recompile them all. Or to be safe on a
-production site, just recompile them all anyway.
-
-Cheetah's development version is normally as stable as the last release if not
-better. All CVS checkins are installed and run through the test suite before
-being checked in.
-
-Additional information is in these files in the Cheetah source distribution:
-
-CHANGES:
- All changes in each version.
-BUGS:
- Known bugs we haven't fixed yet.
-TODO:
- Enhancements we're planning, thing's like to do someday, and user requests
- we haven't committed to.
-
-
-Web site and mailing list
--------------------------
-
-..
- :label: intro.news
-
-Cheetah releases and other stuff can be obtained from the the Cheetah
-{\bf Web site}:
-\url{http://CheetahTemplate.sourceforge.net}
-
-Cheetah discussions take place on the {\bf mailing list}
-\email{cheetahtemplate-discuss@lists.sourceforge.net}. This is where to hear
-the latest news first.
-
-If you encounter difficulties, or are unsure about how to do something,
-please post a detailed message to the list. Also please share your
-experiences, tricks, customizations, and frustrations. And if you have a
-success story for the "Who Is Using Cheetah"
-(http://cheetahtemplate.sourceforge.net/whouses.html) or
-"Testimonials" (http://cheetahtemplate.sourceforge.net/praise.html)
-page on the website, send it to the mailing list.
-
-
-Bug reports, patches, and the test suite
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-If you think there is a bug in Cheetah, send a message to the mailing list
-with the following information:
-
-* a description of what you were trying to do and what happened
-* all tracebacks and error output
-* your version of Cheetah
-* your version of Python
-* your operating system
-* whether you have changed anything in the Cheetah installation
-
-Cheetah is packaged with a regression testing suite that is run with each
-new release to ensure that everything is working as expected and that recent
-changes haven't broken anything. The test cases are in the Cheetah.Tests
-module. If you find a reproduceable bug please consider writing a test case
-that will pass only when the bug is fixed. Send any new test cases to the email
-list with the subject-line "new test case for Cheetah". (@@MO Shorten
-paragraph, link to testing section.)
-
diff --git a/docs/users_guide_2_src/02_glossary.txt b/docs/users_guide_2_src/02_glossary.txt
deleted file mode 100644
index 49988fd..0000000
--- a/docs/users_guide_2_src/02_glossary.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-Glossary
-========
-
-..
- :label: glossary
-
-**Template** is an informal term meaning a template definition, a template
-class or a template instance. A **template definition** is what the human
-maintainer writes: a file or string consisting of text, placeholders and
-directives. **Placeholders** are variables that will be looked up when the
-template is filled. **Directives** are commands to be executed when the
-template is filled, or instructions to the Cheetah compiler. Placeholders
-normally start with "$"; directives with "#". The conventional suffix for a
-file containing a template definition is **.tmpl**.
-
-To use a template, you first **compile** the template definition into
-**template class**. Then you instantiate the class and **fill** it by calling
-one of its instance methods. Filling does all the placeholder lookups and
-returns the finished result. Templates can be compiled in memory or written to
-a Python module, called a **precompiled template**.
-
-Every template has a **main** method that fills the entire template. The main
-method is usually ``.respond()``. Calling ``str()`` or ``unicode()`` on a
-template instance is the same as calling the main method. Templates can also
-contain **#def methods** (via ``#def`` or ``#block``), which can be called
-directly.
-
-A **placeholder** consists of one or more **identifiers** separated by periods.
-Identifiers must follow the same rules as Python variable names, and may be
-followed by the usual ``[]`` and ``()`` as in Python. Example with three
-identifiers: ``a.b[2].c("arg")``. The value discovered at fill time is the
-**placeholder value**.
-
-The first (or only) identifier of a placeholder name represents a **variable**
-to be looked up. If Cheetah's **NameMapper** is turned on (the default), it
-looks in various **namespaces** including the template instance's ``self``,
-Python variables local/global to the template method, and an arbitrary list of
-**user-defined namespaces** you may have passed to the template constructor.
-A user-defined namespace is any Python object; Cheetah searches its attributes
-and keys for a matching name. ``#set`` and ``#for`` create local
-variables. ``#import`` and ``#set module global`` create global variables.
-``#attr``, ``#def``, and ``#block`` create ``self`` variables. When the
-NameMapper is turned off, only local/global variables are accessible.
-
-The NameMapper also handles universal dotted notation and autocalling.
-**Universal dotted notation** means that keys may be written as if they were
-attributes: ``a.b`` instead of ``a['b']``. **Autocalling** means that
-if any identifier's value is found to be a function or method, Cheetah will
-call it without arguments if there is no ``()`` following. More about the
-NameMapper is in section \ref{language.namemapper}.
-
-Cheetah 1 used the term "searchList" for user-defined namespaces. However,
-Cheetah has another **search list** internally: the actual list of namespaces
-it consults. This is almost the same thing but not quite. To avoid confusion,
-this Guide uses the term "search list" only for the internal list.
-
-Some directives are multi-line, meaning they have a matching **\#end** tag.
-The lines of text between the start and end tags is the **body** of the
-directive. Arguments on the same line as the start tag, in contrast, are
-considered part of the directive tag.
-
-A **template-servlet** is a Webware_-specific construct. Any .py template
-module in a Webware servlet directory can be filled directly through the web by
-requesting the URL.
-
-.. _Webware: http://www.webwareforpython.org/
diff --git a/docs/users_guide_2_src/03_gettingStarted.txt b/docs/users_guide_2_src/03_gettingStarted.txt
deleted file mode 100755
index 6e447c2..0000000
--- a/docs/users_guide_2_src/03_gettingStarted.txt
+++ /dev/null
@@ -1,262 +0,0 @@
-Getting Started
-========================================
-
-..
- :label: gettingStarted
-
-
-Requirements
-----------------------------------------
-
-..
- :label: gettingStarted.requirements
-
-Cheetah requires Python release 2.2 or newer, and has been tested with all
-versions through 2.4.2. It should run everywhere Python runs, and has been
-tested on Linux, Windows NT/98/XP, FreeBSD, Solaris, and Mac OS X.
-
-99% of Cheetah is written in Python. There is one small C module
-(``_namemapper.so``) for speed, but Cheetah automatically falls back to a
-Python equivalent (``NameMapper.py``) if the C module is not available.
-
-
-Installation
-----------------------------------------
-
-..
- :label: gettingStarted.install
-
-If you have ``easy_install``
-(http://peak.telecommunity.com/DevCenter/EasyInstall) set up, this command will
-download and install the latest version of Cheetah as a Python Egg
-(http://peak.telecommunity.com/DevCenter/PythonEggs)::
-
- # easy_install Cheetah
-
-Or from an already-downloaded tarball::
-
- # easy_install Cheetah-2.0.tar.gz
-
-Or from an unpacked source directory or CVS sandbox::
-
- # easy_install .
-
-If you don't have ``easy_install``, you'll have to install Cheetah manually::
-
- # tar xzvf Cheetah-2.0.tar.gz
- # cd Cheetah-2.0
- # python setup.py install
-
-You can also specify non-default locations::
-
- # python setup.py install --install-lib=/home/tavis/python
- # python setup.py install --home=/home/tavis
- # python setup.py install --help
-
-.. tip::
-
- If you install Cheetah manually and then install an egg that depends on
- Cheetah (like TurboCheetah_), ``easy_install`` may *reinstall*
- Cheetah as an egg. This leaves two copies of Cheetah on your system,
- possibly different versions. Python will use whichever version comes
- first in the Python path. To avoid this, use ``easy_install``'s
- **--no-deps** option or delete the copy you don't wish to use.
-
-
-Uninstalling
-----------------------------------------
-
-..
- :label: gettingstarted.uninstalling
-
-To uninstall Cheetah:
-
-1. Delete the "cheetah" program
-from whichever bin/ directory it was put in (perhaps /usr/local/bin/).
-
-2. If Cheetah was installed as an egg, delete the egg directory
-(e.g., /usr/local/lib/python2.4/site-packages/Cheetah-2.0-py2.4.egg/), and
-remove the "Cheetah" line in **easy-install.pth** in the same directory.
-
-3. If Cheetah was not installed as an egg, delete the package directory
-(e.g., /usr/local/lib/python2.4/site-packages/Cheetah/).
-
-
-The 'cheetah' command
-----------------------------------------
-
-..
- :label: gettingStarted.cheetah
-
-Cheetah comes with a utility "cheetah" that provides a command-line
-interface to various housekeeping tasks. The command's first argument is
-the name of the task. The following commands are currently supported::
-
- cheetah compile [options] [FILES ...] : Compile template definitions
- cheetah fill [options] [FILES ...] : Fill template definitions
- cheetah help : Print this help message
- cheetah options : Print options help message
- cheetah test : Run Cheetah's regression tests
- cheetah version : Print Cheetah version number
-
-You only have to type the first letter of the command:
-``cheetah c`` is the same as ``cheetah compile``.
-
-The test suite is described in the next section. The ``compile``
-command in section \ref{howWorks.cheetah-compile},
-and the ``fill`` command in section \ref{howWorks.cheetah-fill}.
-
-
-Testing your installation
-----------------------------------------
-
-..
- :label: gettingStarted.test
-
-After installing Cheetah, you can run its self-test routine to verify it's
-working properly on your system. First cd to to any directory you have write
-permission in (the tests write temporary files) *except* the unpacked Cheetah
-source directory (it might produce spurious errors). Type the following at the
-command prompt::
-
- $ cheetah test
-
-The tests will run for about three minutes and print a success/failure
-message. If the tests pass, start Python in interactive mode and try the
-example in the next section.
-
-Sometimes the CheetahWrapper tests fail on Windows because they can't execute
-"cheetah" via ``os.system()``. Ignore these; you won't be doing this when
-you use Cheetah.
-
-If any other tests fail, please send a message to the e-mail list with a copy
-of the test output and the following details about your installation:
-
-* your version of Cheetah
-* your version of Python
-* your operating system
-* whether you have changed anything in the Cheetah installation
-
-
-
-Quickstart tutorial
-----------------------------------------
-
-..
- :label: gettingStarted.tutorial
-
-This tutorial briefly introduces how to use Cheetah from the Python prompt.
-The following chapters will discuss other ways to use templates and more of
-Cheetah's features.
-
-The core of Cheetah is the ``Template`` class in the ``Cheetah.Template``
-module. The following example shows how to use the ``Template`` class in an
-interactive Python session. ``t`` is the Template instance. Lines prefixed
-with ``>>>`` and ``...`` are user input. The remaining lines are Python
-output. ::
-
- >>> from Cheetah.Template import Template
- >>> templateDef = """
- ... <HTML>
- ... <HEAD><TITLE>$title</TITLE></HEAD>
- ... <BODY>
- ... $contents
- ... ## this is a single-line Cheetah comment and won't appear in the output
- ... #* This is a multi-line comment and won't appear in the output
- ... blah, blah, blah
- ... *#
- ... </BODY>
- ... </HTML>"""
- >>> namespace = {'title': 'Hello World Example', 'contents': 'Hello World!'}
- >>> t = Template(templateDef, namespaces=[namespace])
- >>> print t
-
- <HTML>
- <HEAD><TITLE>Hello World Example</TITLE></HEAD>
- <BODY>
- Hello World!
- </BODY>
- </HTML>
- >>> print t # print it as many times as you want
- [ ... same output as above ... ]
- >>> namespace['title'] = 'Example #2'
- >>> namespace['contents'] = 'Hiya Planet Earth!'
- >>> print t # Now with different plug-in values.
- <HTML>
- <HEAD><TITLE>Example #2</TITLE></HEAD>
- <BODY>
- Hiya Planet Earth!
- </BODY>
- </HTML>
-
-Because Cheetah is extremely flexible, you can achieve the same result this
-way::
-
- >>> t2 = Template(templateDef)
- >>> t2.title = 'Hello World Example!'
- >>> t2.contents = 'Hello World'
- >>> print t2
- [ ... same output as the first example above ... ]
- >>> t2.title = 'Example #2'
- >>> t2.contents = 'Hello World!'
- >>> print t2
- [ ... same as Example #2 above ... ]
-
-Or the values can be extracted from an object's attributes.
-
- >>> myInstance.title
- 'Hello World Example!'
- >>> myInstance.contents = 'Hello World!'
- >>> t2 = Template(templateDef, namespaces=[myInstance])
-
-The template will search your namespaces in order, then its own ``self``
-attributes, until it finds a match. The template definition can also
-come from a file rather than a string.
-
-Let's look at the ``Template`` constructor again::
-
- t = Template(templateDef, namespaces=[namespace])
-
-This does more than it appears. It compiles the template definition into a
-template class, a subclass of ``Template``, and instantiates it. Sometimes
-it's desirable to separate these operations, and the ``.compile`` class method
-does this::
-
- tclass = Template.compile(templateDef)
- t = tclass(namespaces=[namespace])
-
-The first line compiles the template class; the second line instantiates it.
-You can also do this on one line::
-
- t = Template.compile(templateDef)(namespaces=[namespace])
-
-You can use either ``Template()`` or ``Template.compile()`` in your programs,
-but you should learn both styles so you'll recognize them in other people's
-code.
-
-This is all fine for short templates, but for long templates or for an
-application that depends on many templates, it's easier to store the templates
-in separate \*.tmpl files and use the **cheetah** program to compile
-them into Python modules. This will be covered in section
-\ref{howWorks.cheetah-compile}. Here's how you use a precompiled template::
-
- >>> from MyPrecompiledTemplate import MyPrecompiledTemplate
- >>> t = MyPrecompiledTemplate()
- >>> t.name = "Fred Flintstone"
- >>> t.city = "Bedrock City"
- >>> print t
-
-Or::
-
- >>> from MyPrecompiledTemplate import MyPrecompiledTemplate
- >>> namespace = {"name": "Fred Flintstone", "city": "Bedrock City"}
- >>> t = MyPrecompiledTemplate(namespaces=[namespace])
- >>> print t
-
-For the minimalists out there, here's a template compilation,
-instantiation and filling all in one Python statement::
-
- >>> print Template("Templates are pretty useless without placeholders.")
- Templates are useless without placeholders.
-
-.. _TurboCheetah: http://python.org/pypi/TurboCheetah/
diff --git a/docs/users_guide_2_src/04_howItWorks.txt b/docs/users_guide_2_src/04_howItWorks.txt
deleted file mode 100755
index 17ee3d5..0000000
--- a/docs/users_guide_2_src/04_howItWorks.txt
+++ /dev/null
@@ -1,369 +0,0 @@
-How Cheetah Works
-=================
-
-..
- :label: howWorks
-
-
-
-Constructing Template Objects
------------------------------
-
-..
- :label: howWorks.templateClass
-
-..
- :label: howWorks.constructing
-
-The heart of Cheetah is the ``Template`` class in the
-``Cheetah.Template`` module. There are several ways to construct templates,
-each with slightly different arguments. Where *source* is shown, it's always
-the first argument and may be specified positionally. The order of the
-other arguments may change, so always specify them as keyword arguments.
-
-``Template()`` accepts the following arguments:
-
- source
- The template definition as a string. The source can be a string
- literal in your module, or perhaps a string you read from a database
- or other data structure.
-
- file
- A filename or file object containing the template definition. A
- filename must be a string, and a file object must be open for reading.
- By convention, template definition files have the extension **.tmpl**.
-
- namespaces, searchList
- A list of objects which Cheetah will search for placeholder values.
- (Cheetah also searches certain other objects automatically; see the
- "Placeholders" chapter for details.) Use either argument; they both
- mean the same thing.
-
- filter
- Equivalent to putting ``#filter`` at the top of the template. The
- argument may be a subclass of ``Cheetah.Filters.Filter``, or a string
- naming a class in filtersLib (the next argument below). See
- ``#filter`` for details.
-
- filtersLib
- A module containing the filters Cheetah should look up by name. The
- default is ``Cheetah.Filters``. All classes in this module that are
- subclasses of ``Cheetah.Filters.Filter`` are considered filters.
-
- errorCatcher
- Equivalent to putting ``#errorCatcher`` at the top of the template.
- The object may be a subclass of ``Cheetah.ErrorCatchers.ErrorCatcher``,
- or a string naming a class in ``Cheetah.ErrorCatchers``. See
- ``#errorCatcher`` for details.
-
- compilerSettings
- Equivalent to putting ``#compiler-settings`` at the top of the
- template. The argument is a dictionary or nesting of dictionaries.
- See ``#compiler-settings`` for details.
-
-A template class returned by ``Cheetah.compile`` or precompiled via "cheetah
-compile" takes the same constructor arguments as above, except "source" and
-"file" which are not allowed. Use keyword arguments for all arguments
-because their order may change.
-
-The class method ``Template.compile()`` takes the following
-arguments:
-
- source, file, compilerSettings
- Same as above. *These are the only arguments most users will ever
- use.* The other args below are for specialized advanced uses.
-
- returnAClass
- If true (default), return a subclass of ``Template`` specific to this
- template definition. If false, return the Python source of a module
- containing this class; i.e., what "cheetah compile" would write to a
- file.
-
- moduleName, className, mainMethodName
- Override the default names. For instance, TurboCheetah (a third-party
- library) requires its templates to have a fixed class name, so it uses
- *className*.
-
- compilerClass
- Use an You'll probably never need this.
-
- baseclass
- Equivalent to putting ``#extends`` at the top of the template.
- ``#extends`` overrides this, unlike other arguments.
-
- moduleGlobals
- In case you want to sneak in some extra variables that don't require
- the NameMapper.
-
- preprocessors
- A list of filter functions which will modify the template definition
- before Cheetah's compiler sees it. See chapter @@MO for details.
-
- compilerClass, cacheCompilationResults, useCache, cacheModuleFilesForTracebacks, cacheDirForModuleFiles, keepRefToGeneratedCode
- You'll probably never need these. They are used to provide an
- alternate compiler, disable Cheetah's template caching (*not* related
- to ``#cache``), or modify Cheetah's enhanced traceback reporting. See
- the ``Template.compile()`` docstring for details.
-
-Here are typical ways to create a template instance:
-
-``t = Template("The king is a \$placeholder1.")``
- Pass the template definition as a string.
-``t = Template(file="fink.tmpl")``
- Read the template definition from a file named "fink.tmpl".
-``t = Template(file=f)``
- Read the template definition from file-like object 'f'.
-``t = Template("The king is a \$placeholder1.", namespaces=[dict, obj])``
- Pass the template definition as a string. Also pass two namespaces for
- the namespaces: a dictionary 'dict' and an instance 'obj'.
-``t = Template(file="fink.txt", namespaces=[dict, obj])``
- Same, but pass a filename instead of a string.
-``t = Template(file=f, namespaces=[dict, obj])``
- Same with a file object.
-
-Filling templates and extracting data
--------------------------------------
-
-There are several ways to fill a template. Assume ``t`` is a template
-instance::
-
- 1 output = t.respond()
- 2 output = str(t) # Shortcut for "str(t.respond())".
- 3 output = unicode(t) # Shortcut for "unicode(t.respond())".
- 4 print t # Shortcut for "print str(t.respond())".
- 4 sys.stderr.write( unicode(t).encode('latin1') )
- 5 result = t.my_def_method(arg1, arg2)
-
-These all assume the template's main method is ``.respond``, which is true
-in the normal case. [#]_ ``str()`` and
-``unicode()`` will always call the main method whatever it's named.
-
-If the output contains non-ASCII characters, examples 2 and 4 will raise
-an exception. Use one of the other examples instead.
-
-Example 5 calls a ``#def`` method with arguments. Only that method's output
-is returned.
-
-If the template contains ``#attr`` attributes, you can access those directly::
-
- title = t.title
- author = t.author
-
-
-.. [#] See the Inheritance chapter... (#implements, mainMethodName,
- inheritance).
-
-"cheetah compile" and precompiled templates
--------------------------------------------
-
-..
- :label: howWorks.cheetah-compile
-
-To create a precompiled template module, do either of these::
-
- cheetah compile [options] [FILES ...]
- cheetah c [options] [FILES ...]
-
-There are several advantages of precompiled templates:
-
-- Precompiled templates are easier to debug because you can see the generated
- Python code, and the line numbers in error messages will correspond to the
- actual line in the template definition file. (If the template definition is
- embedded in a string literal inside a module, you'll have to count down from
- the first line in the string to find the error line.)
-
-- Data analysis programs can import the template classes and query their
- attributes, which can be set via ``#attr``. Example: a directory of
- templates can each contain ``.title`` and ``.author`` attributes, and
- another program can read them all and make an index page.
-
-- Slightly faster performance since the compilation is done before
- the user runs your application, and Python will optimize this further
- with .pyc or .pyo files. The actual speed difference is minimal --
- Cheetah appears to compile templates instantaneously anyway, and it caches
- templates in memory if possible, but precompiling templates will make
- some developers feel better for conserving electrons.
-
-- ``#extends`` requires that the base template be precompiled, or the
- child template cannot be instantiated. (@@MO: The *baseclass* constructor
- arg can be used to set the parent class for a dynamically-compiled
- template.)
-
-- Only precompiled templates may be used as Webware servlets.
-
-Some of Cheetah's developers use only precompiled templates and recommend the
-same. However, it's your choice whether to do this.
-
-The following options are supported::
-
- --idir DIR, --odir DIR : input/output directories (default: current dir)
- --iext EXT, --oext EXT : input/output filename extensions
- (default input: tmpl, default output: py)
- -R : recurse subdirectories looking for input files
- --debug : print lots of diagnostic output to standard error
- --flat : no destination subdirectories
- --nobackup : don't make backups
- --stdout, -p : output to standard output (pipe)
- --settings : a string representing the compiler settings to use
- e.g. --settings='useNameMapper=False,useFilters=False'
- This string is eval'd in Python so it should contain
- valid Python syntax.
- --templateAPIClass : a string representing a subclass of
- Cheetah.Template:Template to use for compilation
-
-.. tip::
- If Cheetah can't find your input files, or if it puts output files
- in the wrong place, use the ``--debug`` option to see how Cheetah
- interpreted your command line.
-
-The most basic usage is::
-
- cheetah compile a.tmpl : writes a.py
- cheetah compile a.tmpl b.tmpl : writes a.py and b.py
-
-
-Cheetah will automatically add the default input extension (.tmpl) if the exact
-file is not found. So the following two examples are the same as above if
-"a" and "b" don't exist::
-
- cheetah compile a : writes a.py (from a.tmpl)
- cheetah compile a b : writes a.py and b.py
-
-
-Use the ``-R`` option to recurse subdirectories::
-
- cheetah compile dir1 : error, file is a directory
- cheetah compile -R dir1 : look under `dir1' for files to compile
- cheetah compile : error, no file specified
- cheetah compile -R : compile all templates under current
- directory and subdirectories
- cheetah compile -R a b dir1 : compile files and recurse
-
-When recursing, only regular files that end in the input extension (.tmpl) are
-considered source files. All other filenames are ignored.
-
-The options ``--idir`` and ``--odir`` allow you to specify that
-the source (and/or destination) paths are relative to a certain directory
-rather than to the current directory. This is useful if you keep your
-\*.tmpl and \*.py files in separate directory hierarchies. After editing a
-source file, just run one of these (or put the command in a script or
-Makefile)::
-
- cheetah compile --odir /var/webware a.tmpl
- cheetah compile -R --odir /var/webware
- cheetah c --odir /var/webware sub/a.tmpl
- : writes /var/webware/sub/a.py
-
-
-"cheetah compile" overwrites any existing ``.py`` file it finds, after
-backing it up to FILENAME.py_bak (unless you specify ``--nobackup``). For
-this reason, you should make changes to the ``.tmpl`` version of the
-template rather than to the ``.py`` version.
-
-For the same reason, if your template requires custom Python methods or
-other Python code, don't put it in the ``FILENAME.py`` file or it will be
-overwritten! Instead, put it in a separate base class and use
-``#extends`` to inherit from it.
-
-Because FILENAME will be used as a class and module name, it must be a valid
-Python identifier. For instance, ``cheetah compile spam-eggs.tmpl`` is
-illegal because of the hyphen ("-"). This is sometimes inconvenient when
-converting a site of HTML files into Webware servlets. Fortunately, the
-*directory* it's in does not have to be an identifier. (*Hint:* for
-date-specific files, try converting 2002/04/12.html to 2002/04/12/index.tmpl.
-This also gives you a directory to store images or supplemental files.)
-
-Occasionally you may want output files put directly into the output directory
-(or current directory), rather than into subdirectories parallel to the input
-file. The ``--flat`` option does this. This may cause several input files
-might map to the same output file. Cheetah checks for output file collisions
-before writing any files, and aborts if there are any collisions. ::
-
- cheetah c sub/a.py : writes sub/a.py
- cheetah c --flat sub/a.py : writes a.py
- cheetah c --odir DEST sub/a.tmpl
- : writes DEST/sub/a.py
- cheetah c --flat --odir DEST sub/a.tmpl
- : writes DEST/a.py
- cheetah c --idir /home/henry sub/rollins.tmpl
- : writes sub/rollins.py
- cheetah c --flat --idir /home/henry sub/rollins.tmpl
- : writes rollins.py
- cheetah c --idir /home/henry --odir /home/henry sub/rollins.tmpl
- : writes /home/henry/sub/rollins.py
- cheetah c --flat --idir /home/henry --odir /home/henry sub/rollins.tmpl
- : writes /home/henry/rollins.py
-
-
-Whenever "cheetah compile" has to create an output directory or subdirectory,
-it also creates an __init__.py file in it. This file is necessary in order
-to make Python treat the directory as a Python package.
-
-Chapter @@MO has a look inside a precompiled template module.
-
-"cheetah fill"
---------------
-
-..
- :label: howWorks.cheetah-fill
-
-You can fill templates from the command line with "cheetah fill". The most
-common example is static HTML files which are generated from templates. The
-output extension is .html by default. The compiled template modules are not
-written to disk. All the options to "cheetah compile" are allowed.
-
-Examples::
-
- cheetah fill a.tmpl : writes a.html
- cheetah fill a.tmpl b.tmpl : writes a.html and b.html
- cheetah f --oext txt a : writes a.txt (from a.tmpl)
-
-You can't specify user-defined namespaces the normal way, so the templates must
-be written to have default values for all variables. However, there is limited
-support for gathering placeholder values from operating-system resources::
-
- --env : make the environment variables a user-defined namespace
- --pickle FILE : unpickle FILE and make that object a user-defined namespace
-
-Using ``--env`` may have security or reliability implications because the
-environment normally contains lots of variables you inherited rather than
-defining yourself. If any of these variables override any of yours (say a
-``#def``), you will get incorrect output, may reveal private information,
-and may get an exception due to the variable being an unexpected type
-(environment variables are always strings). Your calling program may wish
-to clear out the environment before setting environment variables for the
-template.
-
-There are two other differences between "cheetah compile" and "cheetah fill".
-Cheetah doesn't create __init__.py files when creating directories in
-fill mode. Also, the source filenames don't have to be identifiers. This
-allows you to create any .html filename even if it contains characters like "-"
-that are illegal in identifiers.
-
-
-Running a .py template module as a standalone program
------------------------------------------------------
-
-..
- :label: howWorks.standalone
-
-In addition to importing your .py template module file into a Python
-script or using it as a Webware servlet, you can also run it from the
-command line as a standalone program. The program will print the filled
-template on standard output. This is useful while debugging the template,
-and for producing formatted output in shell scripts.
-
-When running the template as a program, you cannot provide a searchList or
-set ``self.`` attributes in the normal way, so you must take
-alternative measures to ensure that every placeholder has a value.
-Otherwise, you will get the usual ``NameMapper.NotFound`` exception at
-the first missing value. You can either set default values in the template
-itself (via the ``\#attr`` or ``\#def`` directives) or in a Python
-superclass, or use the ``--env`` or ``--pickle`` command-line options,
-which work just like their "cheetah fill" counterparts.
-
-Run ``python FILENAME.py --help`` to see all the command-line
-options your .py template module accepts.
-
-
-
diff --git a/docs/users_guide_2_src/05_language.txt b/docs/users_guide_2_src/05_language.txt
deleted file mode 100755
index 673abca..0000000
--- a/docs/users_guide_2_src/05_language.txt
+++ /dev/null
@@ -1,651 +0,0 @@
-\section{Language Overview}
-\label{language}
-
-Cheetah's basic syntax was inspired by the Java-based template engines Velocity
-and WebMacro. It has two types of tags: {\bf \$placeholders} and {\bf
-\#directives}. Both types are case-sensitive.
-
-Placeholder tags begin with a dollar sign (\code{\$varName}) and are similar to
-data fields in a form letter or to the \code{\%(key)s} fields on the left side
-of Python's \code{\%} operator. When the template is filled, the placeholders
-are replaced with the values they refer to.
-
-Directive tags begin with a hash character (\#) and are used for comments,
-loops, conditional blocks, includes, and all other advanced features.
-({\em Note:} you can customize the start and end delimeters for placeholder
-and directive tags, but in this Guide we'll assume you're using the default.)
-
-Placeholders and directives can be escaped by putting a backslash before them.
-\verb+\$var+ and \verb+\#if+ will be output as literal text.
-
-A placeholder or directive can span multiple physical lines, following the same
-rules as Python source code: put a backslash (\verb+\+) at the end of all
-lines except the last line. However, if there's an unclosed parenthesis,
-bracket or brace pending, you don't need the backslash.
-
-\begin{verbatim}
-#if $this_is_a_very_long_line and $has_lots_of_conditions \
- and $more_conditions:
-<H1>bla</H1>
-#end if
-
-#if $country in ('Argentina', 'Uruguay', 'Peru', 'Colombia',
- 'Costa Rica', 'Venezuela', 'Mexico')
-<H1>Hola, senorita!</H1>
-#else
-<H1>Hey, baby!</H1>
-#end if
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Language Constructs -- Summary}
-\label{language.constructs}
-
-\begin{enumerate}
-\item Comments and documentation strings
- \begin{enumerate}
- \item \code{\#\# single line}
- \item \code{\#* multi line *\#}
- \end{enumerate}
-
-\item Generation, caching and filtering of output
- \begin{enumerate}
- \item plain text
- \item look up a value: \code{\$placeholder}
- \item evaluate an expression: \code{\#echo} \ldots
- \item same but discard the output: \code{\#silent} \ldots
- \item one-line if: \code{\#if EXPR then EXPR else EXPR}
- \item gobble the EOL: \code{\#slurp}
- \item parsed file includes: \code{\#include} \ldots
- \item raw file includes: \code{\#include raw} \ldots
- \item verbatim output of Cheetah code: \code{\#raw} \ldots \code{\#end raw}
- \item cached placeholders: \code{\$*var}, \code{\$*<interval>*var}
- \item cached regions: \code{\#cache} \ldots \code{\#end cache}
- \item set the output filter: \code{\#filter} \ldots
- \item control output indentation: \code{\#indent} \ldots ({\em not
-implemented yet})
- \end{enumerate}
-
-\item Importing Python modules and objects: \code{\#import} \ldots,
- \code{\#from} \ldots
-
-\item Inheritance
- \begin{enumerate}
- \item set the base class to inherit from: \code{\#extends}
- \item set the name of the main method to implement: \code{\#implements}
-\ldots
- \end{enumerate}
-
-\item Compile-time declaration
- \begin{enumerate}
- \item define class attributes: \code{\#attr} \ldots
- \item define class methods: \code{\#def} \ldots \code{\#end def}
- \item \code{\#block} \ldots \code{\#end block} provides a simplified
- interface to \code{\#def} \ldots \code{\#end def}
- \end{enumerate}
-
-\item Run-time assignment
- \begin{enumerate}
- \item local vars: \code{\#set} \ldots
- \item global vars: \code{\#set global} \ldots
- \item deleting local vars: \code{\#del} \ldots
- \end{enumerate}
-
-\item Flow control
- \begin{enumerate}
- \item \code{\#if} \ldots \code{\#else} \ldots \code{\#else if} (aka
- \code{\#elif}) \ldots \code{\#end if}
- \item \code{\#unless} \ldots \code{\#end unless}
- \item \code{\#for} \ldots \code{\#end for}
- \item \code{\#repeat} \ldots \code{\#end repeat}
- \item \code{\#while} \ldots \code{\#end while}
- \item \code{\#break}
- \item \code{\#continue}
- \item \code{\#pass}
- \item \code{\#stop}
- \end{enumerate}
-
-\item error/exception handling
- \begin{enumerate}
- \item \code{\#assert}
- \item \code{\#raise}
- \item \code{\#try} \ldots \code{\#except} \ldots \code{\#else} \ldots
- \code{\#end try}
- \item \code{\#try} \ldots \code{\#finally} \ldots \code{\#end try}
- \item \code{\#errorCatcher} \ldots set a handler for exceptions raised by
-\$placeholder calls.
- \end{enumerate}
-
-\item Instructions to the parser/compiler
- \begin{enumerate}
- \item \code{\#breakpoint}
- \item \code{\#compiler-settings} \ldots \code{\#end compiler-settings}
- \end{enumerate}
-
-\item Escape to pure Python code
- \begin{enumerate}
- \item evalute expression and print the output: \code{<\%=} \ldots
- \code{\%>}
- \item execute code and discard output: \code{<\%} \ldots \code{\%>}
- \end{enumerate}
-
-\item Fine control over Cheetah-generated Python modules
- \begin{enumerate}
- \item set the source code encoding of compiled template modules: \code{\#encoding}
- \item set the sh-bang line of compiled template modules: \code{\#shBang}
- \end{enumerate}
-
-\end{enumerate}
-
-The use of all these constructs will be covered in the next several chapters.
-
-%% @@MO: TODO: reconcile the order of this summary with the order in the
-%% detail sections.
-
-% @@MO: PSP chapter with examples. What does write() do? Print?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Placeholder Syntax Rules}
-\label{language.placeholders.syntax}
-
-\begin{itemize}
-
-\item Placeholders follow the same syntax rules as Python variables except
- that they are preceded by \code{\$} (the short form) or enclosed in
- \code{\$\{\}} (the long form).
- Examples:
-\begin{verbatim}
-$var
-${var}
-$var2.abc['def']('gh', $subplaceholder, 2)
-${var2.abc['def']('gh', $subplaceholder, 2)}
-\end{verbatim}
- We recommend \code{\$} in simple cases, and \code{\$\{\}} when followed
- directly by a letter or when Cheetah or a human template maintainer might
- get confused about where the placeholder ends. You may alternately use
- \verb+$()+ or \verb+$[]+, although this may confuse the (human) template
- maintainer:
-\begin{verbatim}
-$(var)
-$[var]
-$(var2.abc['def']('gh', $subplaceholder, 2))
-$[var2.abc['def']('gh', $subplaceholder, 2)]
-\end{verbatim}
- {\em Note:} Advanced users can change the delimiters to anything they
- want via the \code{\#compiler} directive.
-
- {\em Note 2:} The long form can be used only with top-level placeholders,
- not in expressions. See section \ref{language.placeholders.positions}
- for an elaboration on this.
-
-\item To reiterate Python's rules, placeholders consist of one or more
- identifiers separated by periods. Each identifier must start with a letter
- or an underscore, and the subsequent characters must be letters, digits or
- underscores. Any identifier may be followed by arguments enclosed in
- \verb+()+ and/or keys/subscripts in \verb+[]+.
-
-\item Identifiers are case sensitive. \code{\$var} does not equal \code{\$Var}
- or \code{\$vAr} or \code{\$VAR}.
-
-\item Arguments inside \verb+()+ or \verb+[]+ are just like in Python.
- Strings may be quoted using any Python quoting style. Each argument is an
- expression and may use any of Python's expression operators. Variables
- used in argument expressions are placeholders and should be prefixed with
- \code{\$}. This also applies to the *arg and **kw forms. However, you do
- {\em not} need the \code{\$} with the special Python constants \code{None},
- \code{True} and \code{False}.
- Examples:
-\begin{verbatim}
-$hex($myVar)
-$func($arg=1234)
-$func2($*args, $**kw)
-$func3(3.14159, $arg2, None, True)
-$myList[$mySubscript]
-\end{verbatim}
-
-\item Trailing periods are ignored. Cheetah will recognize that the placeholder
- name in \code{\$varName.} is \code{varName}, and the period will be left
- alone in the template output.
-
-\item The syntax \code{\$\{placeholderName, arg1="val1"\}} passes arguments to
- the output filter (see \code{\#filter}, section \ref{output.filter}.
- The braces and comma are required in this case. It's conventional to
- omit the \code{\$} before the keyword arguments (i.e. \code{arg1}) in this
- case.
-
-\item Cheetah ignores all dollar signs (\code{\$}) that are not followed by a
- letter or an underscore.
-
-\end{itemize}
-
-The following are valid \$placeholders:
-\begin{verbatim}
-$a $_ $var $_var $var1 $_1var $var2_ $dict.key $list[3]
-$object.method $object.method() $object.method
-$nest($nest($var))
-\end{verbatim}
-
-These are not \$placeholders but are treated as literal text:
-\begin{verbatim}
-$@var $^var $15.50 $$
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Where can you use placeholders?}
-\label{language.placeholders.positions}
-
-There are three places you can use placeholders: top-level position,
-expression position and LVALUE position. Each has slightly different
-syntax rules.
-
-Top-level position means interspersed in text. This is the only place
-you can use the placeholder long form: \code{\$\{var\}}.
-
-{\em Expression position} means inside a Cheetah expression, which is the same
-as a Python expression. The placeholder names a searchList or other variable
-to be read. Expression position occurs inside () and $[]$ arguments within
-placeholder tags (i.e., a placeholder inside a placeholder), and in several
-directive tags.
-
-{\em LVALUE position} means naming a variable that will be written to. LVALUE
-is a computer science term meaning ``the left side of an assignment
-statement''. The first argument of directives \code{\#set}, \code{\#for},
-\code{\#def}, \code{\#block} and \code{\#attr} is an LVALUE.
-
-This stupid example shows the three positions. Top-level position is shown
-in \code{courier}, expression position is {\em italic}, and LVALUE position is
-{\bf bold}.
-
-\begin{quote}
-\#for {\bf \$count} in {\em \$range}({\em \$ninetyNine}, 0, -1)\\
-\#set {\bf \$after} = {\em \$count} - 1\\
-\code{\$count} bottles of beer on the wall. \code{\$count} bottles of beer!\\
-~~~~Take one down, pass it around. \code{\$after} bottles of beer on the wall.\\
-\#end for\\
-\code{\$hex}({\em \$myVar}, {\bf \$default}={\em None})
-\end{quote}
-
-The output of course is:
-\begin{verbatim}
-99 bottles of beer on the wall. 99 bottles of beer!
- Take one down, pass it around. 98 bottles of beer on the wall.
-98 bottles of beer on the wall. 98 bottles of beer!
- Take one down, pass it around. 97 bottles of beer on the wall.
-...
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Are all those dollar signs really necessary?}
-\label{language.placeholders.dollar-signs}
-
-\code{\$} is a ``smart variable prefix''. When Cheetah sees \code{\$}, it
-determines both the variable's position and whether it's a searchList value or
-a non-searchList value, and generates the appropriate Python code.
-
-In top-level position, the \code{\$} is {\em required}. Otherwise there's
-nothing to distinguish the variable from ordinary text, and the variable name
-is output verbatim.
-
-In expression position, the \code{\$} is {\em required} if the value comes from
-the searchList or a ``\#set global'' variable, {\em recommended} for
-local/global/builtin variables, and {\em not necessary} for the special
-constants \code{None}, \code{True} and \code{False}. This works because
-Cheetah generates a function call for a searchList placeholder, but a bare
-variable name for a local/global/builtin variable.
-
-In LVALUE position, the \code{\$} is {\em recommended}. Cheetah knows where
-an LVALUE is expected, so it can handle your variable name whether it has
-\code{\$} or not.
-
-EXCEPTION: Do {\em not} use the \code{\$} prefix for intermediate variables in
-a Python list comprehensions. This is a limitation of Cheetah's parser; it
-can't tell which variables in a list comprehension are the intermediate
-variables, so you have to help it. For example:
-\begin{verbatim}
-#set $theRange = [x ** 2 for x in $range(10)]
-\end{verbatim}
-\code{\$theRange} is a regular \code{\#set} variable. \code{\$range} is a
-Python built-in function. But \code{x} is a scratch variable internal to
-the list comprehension: if you type \code{\$x}, Cheetah will miscompile
-it.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{NameMapper Syntax}
-\label{language.namemapper}
-
-One of our core aims for Cheetah was to make it easy for non-programmers to
-use. Therefore, Cheetah uses a simplified syntax for mapping placeholders
-in Cheetah to values in Python. It's known as the {\bf NameMapper syntax}
-and allows for non-programmers to use Cheetah without knowing (a) the
-difference between an instance and a dictionary, (b) what functions and methods
-are, and (c) what 'self' is. A side benefit is that you can change the
-underlying data structure (e.g., instance to dictionary or vice-versa) without
-having to modify the templates.
-
-NameMapper syntax is used for all variables in Cheetah placeholders and
-directives. If desired, it can be turned off via the \code{Template} class'
-\code{'useNameMapper'} compiler setting. But it's doubtful you'd ever want to
-turn it off.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Example}
-\label{language.namemapper.example}
-
-Consider this scenario:
-
-You are building a customer information system. The designers with you want to
-use information from your system on the client's website --AND-- they want to
-understand the display code and so they can maintian it themselves.
-
-You write a UI class with a 'customers' method that returns a dictionary of all
-the customer objects. Each customer object has an 'address' method that returns
-the a dictionary with information about the customer's address. The designers
-want to be able to access that information.
-
-Using PSP, the display code for the website would look something like the
-following, assuming your servlet subclasses the class you created for managing
-customer information:
-
-\begin{verbatim}
- <%= self.customer()[ID].address()['city'] %> (42 chars)
-\end{verbatim}
-
-With Cheetah's NameMapper syntax, you can use any of the following:
-
-\begin{verbatim}
- $self.customers()[$ID].address()['city'] (39 chars)
- --OR--
- $customers()[$ID].address()['city']
- --OR--
- $customers()[$ID].address().city
- --OR--
- $customers()[$ID].address.city
- --OR--
- $customers[$ID].address.city (27 chars)
-\end{verbatim}
-
-Which of these would you prefer to explain to the designers, who have no
-programming experience? The last form is 15 characters shorter than the PSP
-version and -- conceptually -- far more accessible. With PHP or ASP, the
-code would be even messier than with PSP.
-
-This is a rather extreme example and, of course, you could also just implement
-\code{\$getCustomer(\$ID).city} and obey the Law of Demeter (search Google for more
-on that). But good object orientated design isn't the point of this example.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Dictionary Access}
-\label{language.namemapper.dict}
-
-NameMapper syntax allows access to dictionary items with the same dotted
-notation used to access object attributes in Python. This aspect of NameMapper
-syntax is known as 'Unified Dotted Notation'.
-For example, with Cheetah it is possible to write:
-\begin{verbatim}
- $customers()['kerr'].address() --OR-- $customers().kerr.address()
-\end{verbatim}
-where the second form is in NameMapper syntax.
-
-This works only with dictionary keys that also happen to be valid Python
-identifiers.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Autocalling}
-\label{language.namemapper.autocalling}
-
-Cheetah automatically detects functions and methods in Cheetah \$variables and
-calls them if the parentheses have been left off. Our previous example can be
-further simplified to:
-\begin{verbatim}
- $customers.kerr.address
-\end{verbatim}
-
-As another example, if 'a' is an object, 'b' is a method
-\begin{verbatim}
- $a.b
-\end{verbatim}
-
-is equivalent to
-
-\begin{verbatim}
- $a.b()
-\end{verbatim}
-
-If b returns a dictionary, then following variations are possible
-\begin{verbatim}
- $a.b.c --OR-- $a.b().c --OR-- $a.b()['c']
-\end{verbatim}
-where 'c' is a key in the dictionary that a.b() returns.
-
-Further notes:
-\begin{itemize}
-\item When Cheetah autocalls a function/method, it calls it without any
-arguments. Thus, the function/method must have been declared without arguments
-(except \code{self} for methods) or to provide default values for all arguments.
-If the function requires arguments, you must use the \code{()}.
-
-\item Cheetah autocalls only functions and methods. Classes and other callable
-objects are not autocalled. The reason is that the primary purpose of a
-function/method is to call it, whereas the primary purpose of an instance is to
-look up its attributes or call its methods, not to call the instance itself.
-And calling a class may allocate large sums of memory uselessly or have other
-side effects, depending on the class. For instance, consider
-\code{\$myInstance.fname}. Do we want to look up \code{fname} in the namespace
-of \code{myInstance} or in the namespace of whatever \code{myinstance} returns?
-It could go either way, so Cheetah follows the principle of least surprise. If
-you {\em do} want to call the instance, put the \code{()} on, or rename the
-\code{.\_\_call\_\_()} method to \code{.\_\_str\_\_}.
-
-\item Autocalling can be disabled via Cheetah's 'useAutocalling' compiler
-setting. You can also disable it for one placeholder by using the syntax
-\code{\$getVar('varName', 'default value', False)}. (\code{.getVar()} works
-only with searchList values.)
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Namespace cascading and the searchList}
-\label{language.searchList}
-
-When Cheetah maps a variable name in a template to a Python value, it searches
-several namespaces in order:
-
-\begin{enumerate}
-\item {\bf Local variables:} created by \code{\#set},
- \code{\#for}, or predefined by Cheetah.
-\item The {\bf searchList}, consisting of:
- \begin{enumerate}
- \item \code{\#set\ global} variables.
- \item The {\bf searchList} containers you passed to the \code{Template}
- constructor, if any.
- \item The {\bf Template instance} (``self''). This contains any attributes
- you assigned, \code{\#def} methods and \code{\#block methods},
- attributes/methods inherited via \code{\#extends}, and other
- attributes/methods built into \code{Template} or inherited by it
- (there's a list of all these methods in section
- \ref{tips.allMethods}).
- \end{enumerate}
-\item {\bf Python globals:} created by \code{\#import},
- \code{\#from\ ...\ import}, or otherwise predefined by Cheetah.
-\item {\bf Python builtins:} \code{None}, \code{max}, etc.
-\end{enumerate}
-
-The first matching name found is used.
-
-Remember, these namespaces apply only to the {\em first} identifier after the
-\code{\$}. In a placeholder like \code{\$a.b}, only `a' is looked up in the
-searchList and other namespaces. `b' is looked up only inside `a'.
-
-A searchList container can be any Python object with attributes or keys:
-dictionaries, instances, classes or modules. If an instance contains both
-attributes and keys, its attributes are searched first, then its keys.
-
-Because the \code{Template} instance is part of the searchList, you can
-access its attributes/methods without `self': \code{\$myAttr}. However, use
-the `self' if you want to make sure you're getting the \code{Template}
-attribute and not a same-name variable defined in a higher namespace:
-\code{\$self.myAttr}. This works because ``self'' itself is a local variable.
-
-The final resulting value, after all lookups and function calls (but before the
-filter is applied) is called the {\em placeholder value}, no matter which
-namespace it was found in.
-
-{\em {\bf Note carefully:}} if you put an object `myObject' in the searchList,
-you {\em cannot} look up \code{\$myObject}! You can look up only the
-attributes/keys {\em inside} `myObject'.
-
-Earlier versions of Cheetah did not allow you to override Python builtin
-names, but this was fixed in Cheetah 0.9.15.
-
-If your template will be used as a Webware servlet, do not override methods
-'name' and 'log' in the \code{Template} instance or it will interfere with
-Webware's logging. However, it {\em is} OK to use those variables in a higher
-namespace, since Webware doesn't know about Cheetah namespaces.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Missing Values}
-\label{language.namemapper.missing}
-
-If NameMapper can not find a Python value for a Cheetah variable name, it will
-raise the NameMapper.NotFound exception. You can use the \code{\#errorCatcher}
-directive (section \ref{errorHandling.errorCatcher}) or {\bf errorCatcher}
-Template constructor argument (section \ref{howWorks.constructing}) to specify
-an alternate behaviour. BUT BE AWARE THAT errorCatcher IS ONLY INTENDED FOR
-DEBUGGING!
-
-To provide a default value for a placeholder, write it like this:
-\code{\$getVar('varName', 'default value')}. If you don't specify a default
-and the variable is missing, \code{NameMapper.NotFound} will be raised.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Directive Syntax Rules}
-\label{language.directives.syntax}
-
-
-Directive tags begin with a hash character (\#) and are used for comments,
-loops, conditional blocks, includes, and all other advanced features. Cheetah
-uses a Python-like syntax inside directive tags and understands any valid
-Python expression. {\bf However, unlike Python, Cheetah does not use colons
-(:) and indentation to mark off multi-line directives.} That doesn't work in
-an environment where whitespace is significant as part of the text. Instead,
-multi-line directives like \code{\#for} have corresponding closing tags
-(\code{\#end for}). Most directives are direct mirrors of Python statements.
-
-Many directives have arguments after the opening tag, which must be in the
-specified syntax for the tag. All end tags have the following syntax:
-\begin{verbatim}
-#end TAG_NAME [EXPR]
-\end{verbatim}
-The expression is ignored, so it's essentially a comment.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Directive closures and whitespace handling}
-\label{language.directives.closures}
-Directive tags can be closed explicitly with \code{\#}, or implicitly with the
-end of the line if you're feeling lazy.
-
-\begin{verbatim}
-#block testBlock #
-Text in the body of the
-block directive
-#end block testBlock #
-\end{verbatim}
-is identical to:
-\begin{verbatim}
-#block testBlock
-Text in the body of the
-block directive
-#end block testBlock
-\end{verbatim}
-
-When a directive tag is closed explicitly, it can be followed with other text on
-the same line:
-
-\begin{verbatim}
-bah, bah, #if $sheep.color == 'black'# black#end if # sheep.
-\end{verbatim}
-
-When a directive tag is closed implicitly with the end of the line, all trailing
-whitespace is gobbled, including the newline character:
-\begin{verbatim}
-"""
-foo #set $x = 2
-bar
-"""
-outputs
-"""
-foo bar
-"""
-
-while
-"""
-foo #set $x = 2 #
-bar
-"""
-outputs
-"""
-foo
-bar
-"""
-\end{verbatim}
-
-When a directive tag is closed implicitly AND there is no other text on the
-line, the ENTIRE line is gobbled up including any preceeding whitespace:
-\begin{verbatim}
-"""
-foo
- #set $x = 2
-bar
-"""
-outputs
-"""
-foo
-bar
-"""
-
-while
-"""
-foo
- - #set $x = 2
-bar
-"""
-outputs
-"""
-foo
- - bar
-"""
-\end{verbatim}
-
-The \code{\#slurp} directive (section \ref{output.slurp}) also gobbles up
-whitespace.
-
-Spaces outside directives are output {\em exactly} as written. In the
-black sheep example, there's a space before ``black'' and another before
-``sheep''. So although it's legal to put multiple directives on one line,
-it can be hard to read.
-
-\begin{verbatim}
-#if $a# #echo $a + 1# #end if
- - There's a space between each directive,
- or two extra spaces total.
-#if $a##echo $a + 1##end if
- - No spaces, but you have to look closely
- to verify none of the ``##'' are comment markers.
-#if $a##echo $a + 1##end if ### A comment.
- - In ``###'', the first ``#'' ends the directive,
- the other two begin the comment. (This also shows
- how you can add extra whitespace in the directive
- tag without affecting the output.)
-#if $a##echo $a + 1##end if # ## A comment.
- - More readable, but now there's a space before the
- comment.
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-% # vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_2_src/05_placeholders_and_the_namemapper.txt b/docs/users_guide_2_src/05_placeholders_and_the_namemapper.txt
deleted file mode 100644
index e69de29..0000000
--- a/docs/users_guide_2_src/05_placeholders_and_the_namemapper.txt
+++ /dev/null
diff --git a/docs/users_guide_2_src/06_comments.txt b/docs/users_guide_2_src/06_comments.txt
deleted file mode 100755
index 36323cf..0000000
--- a/docs/users_guide_2_src/06_comments.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Comments}
-\label{comments}
-
-Comments are used to mark notes, explanations, and decorative text that should
-not appear in the output. Cheetah maintains the comments in the Python module
-it generates from the Cheetah source code. There are two forms of the comment
-directive: single-line and multi-line.
-
-All text in a template definition that lies between two hash characters
-(\code{\#\#}) and the end of the line is treated as a single-line comment and
-will not show up in the output, unless the two hash characters are escaped with
-a backslash.
-\begin{verbatim}
-##============================= this is a decorative comment-bar
-$var ## this is an end-of-line comment
-##=============================
-\end{verbatim}
-
-Any text between \code{\#*} and \code{*\#} will be treated as a multi-line
-comment.
-\begin{verbatim}
-#*
- Here is some multiline
- comment text
-*#
-\end{verbatim}
-
-If you put blank lines around method definitions or loops to separate them,
-be aware that the blank lines will be output as is. To avoid this, make sure
-the blank lines are enclosed in a comment. Since you normally have a
-comment before the next method definition (right?), you can just extend that
-comment to include the blank lines after the previous method definition, like
-so:
-\begin{verbatim}
-#def method1
-... lines ...
-#end def
-#*
-
-
- Description of method2.
- $arg1, string, a phrase.
-*#
-#def method2($arg1)
-... lines ...
-#end def
-\end{verbatim}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Docstring Comments}
-\label{comments.docstring}
-
-Python modules, classes, and methods can be documented with inline
-'documentation strings' (aka 'docstrings'). Docstrings, unlike comments, are
-accesible at run-time. Thus, they provide a useful hook for interactive help
-utilities.
-
-Cheetah comments can be transformed into doctrings by adding one of the
-following prefixes:
-
-\begin{verbatim}
-##doc: This text will be added to the method docstring
-#*doc: If your template file is MyTemplate.tmpl, running "cheetah compile"
- on it will produce MyTemplate.py, with a class MyTemplate in it,
- containing a method .respond(). This text will be in the .respond()
- method's docstring. *#
-
-##doc-method: This text will also be added to .respond()'s docstring
-#*doc-method: This text will also be added to .respond()'s docstring *#
-
-##doc-class: This text will be added to the MyTemplate class docstring
-#*doc-class: This text will be added to the MyTemplate class docstring *#
-
-##doc-module: This text will be added to the module docstring MyTemplate.py
-#*doc-module: This text will be added to the module docstring MyTemplate.py*#
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Header Comments}
-\label{comments.headers}
-Cheetah comments can also be transformed into module header comments using the
-following syntax:
-
-\begin{verbatim}
-##header: This text will be added to the module header comment
-#*header: This text will be added to the module header comment *#
-\end{verbatim}
-
-Note the difference between \code{\#\#doc-module: } and \code{header: }:
-``cheetah-compile'' puts \code{\#\#doc-module: } text inside the module
-docstring. \code{header: } makes the text go {\em above} the docstring, as a
-set of \#-prefixed comment lines.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/07_output.txt b/docs/users_guide_2_src/07_output.txt
deleted file mode 100755
index 742291e..0000000
--- a/docs/users_guide_2_src/07_output.txt
+++ /dev/null
@@ -1,548 +0,0 @@
-\section{Generating, Caching and Filtering Output}
-\label{output}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Output from complex expressions: \#echo}
-\label{output.echo}
-
-Syntax:
-\begin{verbatim}
-#echo EXPR
-\end{verbatim}
-
-The \code{\#echo} directive is used to echo the output from expressions that
-can't be written as simple \$placeholders.
-
-\begin{verbatim}
-Here is my #echo ', '.join(['silly']*5) # example
-\end{verbatim}
-
-This produces:
-
-\begin{verbatim}
-Here is my silly, silly, silly, silly, silly example.
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Executing expressions without output: \#silent}
-\label{output.silent}
-
-Syntax:
-\begin{verbatim}
-#silent EXPR
-\end{verbatim}
-
-\code{\#silent} is the opposite of \code{\#echo}. It executes an expression
-but discards the output.
-
-\begin{verbatim}
-#silent $myList.reverse()
-#silent $myList.sort()
-Here is #silent $covertOperation() # nothing
-\end{verbatim}
-
-If your template requires some Python code to be executed at the beginning;
-(e.g., to calculate placeholder values, access a database, etc), you can put
-it in a "doEverything" method you inherit, and call this method using
-\code{\#silent} at the top of the template.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{One-line \#if}
-\label{output.oneLineIf}
-
-Syntax:
-\begin{verbatim}
-#if EXPR1 then EXPR2 else EXPR3#
-\end{verbatim}
-
-The \code{\#if} flow-control directive (section \ref{flowControl.if}) has a
-one-line counterpart akin to Perl's and C's \code{?:} operator.
-If \code{EXPR1} is true, it evaluates \code{EXPR2} and outputs the result (just
-like \code{\#echo\ EXPR2\#}). Otherwise it evaluates \code{EXPR3} and outputs
-that result. This directive is short-circuiting, meaning the expression that
-isn't needed isn't evaluated.
-
-You MUST include both 'then' and 'else'. If this doesn't work for you or you
-don't like the style use multi-line \code{\#if} directives (section
-\ref{flowControl.if}).
-
-The trailing \code{\#} is the normal end-of-directive character. As usual
-it may be omitted if there's nothing after the directive on the same line.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Caching Output}
-\label{output.caching}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Caching individual placeholders}
-\label{output.caching.placeholders}
-
-By default, the values of each \$placeholder is retrieved and
-interpolated for every request. However, it's possible to cache the values
-of individual placeholders if they don't change very often, in order to
-speed up the template filling.
-
-To cache the value of a single \code{\$placeholder}, add an asterisk after the
-\$; e.g., \code{\$*var}. The first time the template is
-filled, \code{\$var} is looked up. Then whenever the template is filled again,
-the cached value is used instead of doing another lookup.
-
-The \code{\$*} format caches ``forever''; that is, as long as the template
-instance remains in memory. It's also possible to cache for a certain time
-period using the form \code{\$*<interval>*variable}, where \code{<interval>} is
-the interval. The time interval can be specified in seconds (5s), minutes
-(15m), hours (3h), days (2d) or weeks (1.5w). The default is minutes.
-
-\begin{verbatim}
-<HTML>
-<HEAD><TITLE>$title</TITLE></HEAD>
-<BODY>
-
-$var ${var} ## dynamic - will be reinterpolated for each request
-$*var2 $*{var2} ## static - will be interpolated only once at start-up
-$*5*var3 $*5*{var3} ## timed refresh - will be updated every five minutes.
-
-</BODY>
-</HTML>
-\end{verbatim}
-
-Note that ``every five minutes'' in the example really means every five
-minutes: the variable is looked up again when the time limit is reached,
-whether the template is being filled that frequently or not. Keep this in
-mind when setting refresh times for CPU-intensive or I/O intensive
-operations.
-
-If you're using the long placeholder syntax, \verb+${}+, the braces go only
-around the placeholder name: \verb+$*.5h*{var.func('arg')}+.
-
-Sometimes it's preferable to explicitly invalidate a cached item whenever
-you say so rather than at certain time intervals. You can't do this with
-individual placeholders, but you can do it with cached regions, which will
-be described next.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Caching entire regions}
-\label{output.caching.regions}
-
-Syntax:
-\begin{verbatim}
-#cache [id=EXPR] [timer=EXPR] [test=EXPR]
-#end cache
-\end{verbatim}
-
-The \code{\#cache} directive is used to cache a region of
-content in a template. The region is cached as a single unit, after
-placeholders and directives inside the region have been evaluated. If there
-are any \code{\$*<interval>*var} placholders inside the cache
-region, they are refreshed only when {\em both} the cache region {\em and} the
-placeholder are simultaneously due for a refresh.
-
-Caching regions offers more flexibility than caching individual placeholders.
-You can specify the refresh interval using a placeholder or
-expression, or refresh according to other criteria rather than a certain
-time interval.
-
-\code{\#cache} without arguments caches the region statically, the same
-way as \code{\$*var}. The region will not be automatically refreshed.
-
-To refresh the region at an interval, use the \code{timer=EXPRESSION} argument,
-equivalent to \code{\$*<interval>*}. The expression should evaluate to a
-number or string that is a valid interval (e.g., 0.5, '3m', etc).
-
-To refresh whenever an expression is true, use \code{test=EXPRESSION}.
-The expression can be a method/function returning true or false, a boolean
-placeholder, several of these joined by \code{and} and/or \code{or}, or any
-other expression. If the expression contains spaces, it's easier to
-read if you enclose it in \code{()}, but this is not required.
-
-To refresh whenever you say so, use \code{id=EXPRESSION}. Your program can
-then call \code{.refreshCache(ID)} whenever it wishes. This is useful if the
-cache depends on some external condition that changes infrequently but has just
-changed now.
-
-You can combine arguments by separating them with commas. For instance, you can
-specify both \code{id=} and \code{interval=}, or \code{id=} and \code{test=}.
-(You can also combine interval and test although it's not very useful.)
-However, repeating an argument is undefined.
-
-\begin{verbatim}
-#cache
-This is a static cache. It will not be refreshed.
-$a $b $c
-#end cache
-
-#cache timer='30m', id='cache1'
-#for $cust in $customers
-$cust.name:
-$cust.street - $cust.city
-#end for
-#end cache
-
-#cache id='sidebar', test=$isDBUpdated
-... left sidebar HTML ...
-#end cache
-
-#cache id='sidebar2', test=($isDBUpdated or $someOtherCondition)
-... right sidebar HTML ...
-#end cache
-\end{verbatim}
-
-
-The \code{\#cache} directive cannot be nested.
-
-We are planning to add a \code{'varyBy'} keyword argument in the future that
-will allow a separate cache instances to be created for a variety of conditions,
-such as different query string parameters or browser types. This is inspired by
-ASP.net's varyByParam and varyByBrowser output caching keywords.
-
-% @@MO: Can we cache by Webware sessions? What about sessions where the
-% session ID is encoded as a path prefix in the URI? Need examples.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#raw}
-\label{output.raw}
-
-Syntax:
-\begin{verbatim}
-#raw
-#end raw
-\end{verbatim}
-
-Any section of a template definition that is inside a \code{\#raw \ldots
-\#end raw} tag pair will be printed verbatim without any parsing of
-\$placeholders or other directives. This can be very useful for debugging, or
-for Cheetah examples and tutorials.
-
-\code{\#raw} is conceptually similar to HTML's \code{<PRE>} tag and LaTeX's
-\code{\\verbatim\{\}} tag, but unlike those tags, \code{\#raw} does not cause
-the body to appear in a special font or typeface. It can't, because Cheetah
-doesn't know what a font is.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#include}
-\label{output.include}
-
-Syntax:
-\begin{verbatim}
-#include [raw] FILENAME_EXPR
-#include [raw] source=STRING_EXPR
-\end{verbatim}
-
-The \code{\#include} directive is used to include text from outside the
-template definition. The text can come from an external file or from a
-\code{\$placeholder} variable. When working with external files, Cheetah will
-monitor for changes to the included file and update as necessary.
-
-This example demonstrates its use with external files:
-\begin{verbatim}
-#include "includeFileName.txt"
-\end{verbatim}
-The content of "includeFileName.txt" will be parsed for Cheetah syntax.
-
-And this example demonstrates use with \code{\$placeholder} variables:
-\begin{verbatim}
-#include source=$myParseText
-\end{verbatim}
-The value of \code{\$myParseText} will be parsed for Cheetah syntax. This is not
-the same as simply placing the \$placeholder tag ``\code{\$myParseText}'' in
-the template definition. In the latter case, the value of \$myParseText would
-not be parsed.
-
-By default, included text will be parsed for Cheetah tags. The argument
-``\code{raw}'' can be used to suppress the parsing.
-
-\begin{verbatim}
-#include raw "includeFileName.txt"
-#include raw source=$myParseText
-\end{verbatim}
-
-Cheetah wraps each chunk of \code{\#include} text inside a nested
-\code{Template} object. Each nested template has a copy of the main
-template's searchList. However, \code{\#set} variables are visible
-across includes only if the defined using the \code{\#set global} keyword.
-
-All directives must be balanced in the include file. That is, if you start
-a \code{\#for} or \code{\#if} block inside the include, you must end it in
-the same include. (This is unlike PHP, which allows unbalanced constructs
-in include files.)
-
-% @@MO: What did we decide about #include and the searchList? Does it really
-% use a copy of the searchList, or does it share the searchList with the
-% parent?
-
-% @@MO: deleted
-%These nested templates share the same \code{searchList}
-%as the top-level template.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#slurp}
-\label{output.slurp}
-
-Syntax:
-\begin{verbatim}
-#slurp
-\end{verbatim}
-
-The \code{\#slurp} directive eats up the trailing newline on the line it
-appears in, joining the following line onto the current line.
-
-
-It is particularly useful in \code{\#for} loops:
-\begin{verbatim}
-#for $i in range(5)
-$i #slurp
-#end for
-\end{verbatim}
-outputs:
-\begin{verbatim}
-0 1 2 3 4
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#indent}
-\label{output.indent}
-
-This directive is not implemented yet. When/if it's completed, it will allow
-you to
-\begin{enumerate}
-\item indent your template definition in a natural way (e.g., the bodies
- of \code{\#if} blocks) without affecting the output
-\item add indentation to output lines without encoding it literally in the
- template definition. This will make it easier to use Cheetah to produce
- indented source code programmatically (e.g., Java or Python source code).
-\end{enumerate}
-
-There is some experimental code that recognizes the \code{\#indent}
-directive with options, but the options are purposely undocumented at this
-time. So pretend it doesn't exist. If you have a use for this feature
-and would like to see it implemented sooner rather than later, let us know
-on the mailing list.
-
-The latest specification for the future \code{\#indent} directive is in the
-TODO file in the Cheetah source distribution.
-
-% @@MO: disabled because it's not implemented and the spec is changing
-% \code{\#indent} decouples the indentation in the template definition from the
-% indentation in the output. Normally, Cheetah outputs indentation exactly as
-% it sees it, no matter whether the indentation is on the first line of a
-% paragraph, in front of a directive, or wherever. \code{\#indent} has two main
-% uses:
-% \begin{enumerate}
-% \item To strip all indentation from source lines. This lets you indent
-% multiline directives (e.g., \code{\#if}, \code{\#for}) in a natural way
-% without having that indentation appear in the output.
-% \item To indent every text line in the output according to a user-specified
-% ``indentation level'', independent of whatever indentation the source lines
-% may have. This is useful for producing Python output, or any language that
-% requires strict indentation levels at certain places. To accomplish this,
-% Cheetah adds a call to an indentation method at the beginning of every
-% affected source line.
-% \end{enumerate}
-%
-% To accomplish the first part, Cheetah removes leading whitespace from the
-% affected source lines before the compiler see them. To accomplish the second
-% part, Cheetah keeps track of the current indentation level, a value you have
-% full control over. At the beginning of every affected text line, Cheetah calls
-% a method that outputs the appropriate indentation string. This affects only
-% lines in the template definition itself, not multiline placeholder values.
-% See the \code{Indent} filter below to indent multiline placeholder values.
-%
-% All \code{\#indent} commands operate on the lines physically below them in
-% the template definition until the next \code{\#indent}, regardless of scope.
-% This means they work thorugh all other directives (\code{\#def}, \code{\#for},
-% \code{\#if}, etc) -- so that if you turn on indentation inside a \code{\#def},
-% it remains in effect past the \code{\#end def}.
-%
-% The following commands turn indentation on and off:
-% \begin{description}
-% \item{\code{\#indent on}} Strip leading whitespace and add indentation to the
-% following lines. This fulfills use \#2 above.
-% \item{\code{\#indent off}} Do not strip leading whitespace or add indentation.
-% This is Cheetah's default behavior.
-% \item{\code{\#indent strip}} Strip leading whitespace but do {\em not} add
-% indentation. This fulfills use \#1 above.
-% \end{description}
-%
-% Indentation by default uses real tabs. But you can change the indentation
-% string thus:
-% \begin{verbatim}
-% ## Output four spaces for each indentation level.
-% #indent chars ' '
-% ## Output the mail reply prefix for each indentation level.
-% #indent chars '> '
-% ## Use a placeholder.
-% #indent chars $indentChars
-% ## Return to the default behavior.
-% #indent chars '\t'
-% \end{verbatim}
-%
-%
-% The following commands change the indentation level, which is a non-negative
-% integer initially at zero. All of these commands implicitly do an
-% \code{\#indent on}:
-% \begin{description}
-% \item{\code{\#indent ++}} Increment the current indentation level.
-% \item{\code{\#indent --}} Decrement the current indentation level.
-% \item{\code{\#indent +3}} Add three indentation levels (or any number).
-% \item{\code{\#indent -3}} Subtract three indentation levels (or any number).
-% \item{\code{\#indent =3}} Set the indentation level to 3.
-% \item{\code{\#indent push +2}} Save the current indentation level on a stack
-% and add two.
-% \item{\code{\#indent pop}} Return to the most recently pushed level. Raise
-% \code{IndentationStackEmptyError} if there is no previous level.
-% \end{description}
-%
-% The expressions after \code{+}/\code{-}/\code{=} may be numeric literals or
-% Cheetah expressions. The effect is undefined if the value is negative. There
-% may be whitespace after the \code{+}/\code{-}/\code{=} symbol.
-% The initial implementation uses a simple preprocessor that doesn't understand
-% newline characters in expressions. \code{\\n} is fine, but not a real newline.
-%
-% To indent multiline placeholder values using the current indentation level,
-% use the \code{Indent} filter:
-% \begin{verbatim}
-% #filter Indent
-% \end{verbatim}
-% It works like the default filter but adds indentation after every newline. It
-% does not strip any leading whitespace. It hooks into \code{\$self.\_indenter},
-% defined in \code{Cheetah.Utils.Indenter}. This object keeps track of the
-% current indentation level. Specifically, the filter calls
-% \code{\$self.\_indent()}, which is a shortcut to the indenter's
-% \code{.indent()} method. This is the same thing \code{\#indent} does.
-% However, the filter is usable even when indentation is in
-% \code{off} or \code{strip} mode.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Ouput Filtering and \#filter}
-\label{output.filter}
-
-Syntax:
-\begin{verbatim}
-#filter FILTER_CLASS_NAME
-#filter $PLACEHOLDER_TO_A_FILTER_INSTANCE
-#filter None
-\end{verbatim}
-
-
-Output from \$placeholders is passed through an ouput filter. The default
-filter merely returns a string representation of the placeholder value,
-unless the value is \code{None}, in which case the filter returns an empty
-string. Only top-level placeholders invoke the filter; placeholders inside
-expressions do not.
-
-Certain filters take optional arguments to modify their behaviour. To pass
-arguments, use the long placeholder syntax and precede each filter argument by
-a comma. By convention, filter arguments don't take a \code{\$} prefix, to
-avoid clutter in the placeholder tag which already has plenty of dollar signs.
-For instance, the MaxLen filter takes an argument 'maxlen':
-
-\begin{verbatim}
-${placeholderName, maxlen=20}
-${functionCall($functionArg), maxlen=$myMaxLen}
-\end{verbatim}
-
-To change the output filter, use the \code{'filter'} keyword to the
-\code{Template} class constructor, or the \code{\#filter}
-directive at runtime (details below). You may use \code{\#filter} as often as
-you wish to switch between several filters, if certain \code{\$placeholders}
-need one filter and other \code{\$placeholders} need another.
-
-The standard filters are in the module \code{Cheetah.Filters}. Cheetah
-currently provides:
-
-\begin{description}
-\item{\code{Filter}}
- \\ The default filter, which converts None to '' and everything else to
- \code{str(whateverItIs)}. This is the base class for all other filters,
- and the minimum behaviour for all filters distributed with Cheetah.
-\item{\code{ReplaceNone}}
- \\ Same.
-\item{\code{MaxLen}}
- \\ Same, but truncate the value if it's longer than a certain length.
- Use the 'maxlen' filter argument to specify the length, as in the
- examples above. If you don't specify 'maxlen', the value will not be
- truncated.
-\item{\code{Pager}}
- \\ Output a "pageful" of a long string. After the page, output HTML
- hyperlinks to the previous and next pages. This filter uses several
- filter arguments and environmental variables, which have not been
- documented yet.
-\item{\code{WebSafe}}
- \\ Same as default, but convert HTML-sensitive characters ('$<$', '\&',
- '$>$')
- to HTML entities so that the browser will display them literally rather
- than interpreting them as HTML tags. This is useful with database values
- or user input that may contain sensitive characters. But if your values
- contain embedded HTML tags you want to preserve, you do not want this
- filter.
-
- The filter argument 'also' may be used to specify additional characters to
- escape. For instance, say you want to ensure a value displays all on one
- line. Escape all spaces in the value with '\&nbsp', the non-breaking
- space:
-\begin{verbatim}
-${$country, also=' '}}
-\end{verbatim}
-\end{description}
-
-To switch filters using a class object, pass the class using the
-{\bf filter} argument to the Template constructor, or via a placeholder to the
-\code{\#filter} directive: \code{\#filter \$myFilterClass}. The class must be
-a subclass of \code{Cheetah.Filters.Filter}. When passing a class object, the
-value of {\bf filtersLib} does not matter, and it does not matter where the
-class was defined.
-
-To switch filters by name, pass the name of the class as a string using the
-{\bf filter} argument to the Template constructor, or as a bare word (without
-quotes) to the \code{\#filter} directive: \code{\#filter TheFilter}. The
-class will be looked up in the {\bf filtersLib}.
-
-The filtersLib is a module containing filter classes, by default
-\code{Cheetah.Filters}. All classes in the module that are subclasses of
-\code{Cheetah.Filters.Filter} are considered filters. If your filters are in
-another module, pass the module object as the {\bf filtersLib} argument to the
-Template constructor.
-
-Writing a custom filter is easy: just override the \code{.filter} method.
-\begin{verbatim}
- def filter(self, val, **kw): # Returns a string.
-\end{verbatim}
-Return the {\em string} that should be output for `val'. `val' may be any
-type. Most filters return `' for \code{None}. Cheetah passes one keyword
-argument: \verb+kw['rawExpr']+ is the placeholder name as it appears in
-the template definition, including all subscripts and arguments. If you use
-the long placeholder syntax, any options you pass appear as keyword
-arguments. Again, the return value must be a string.
-
-You can always switch back to the default filter this way:
-\code{\#filter None}. This is easy to remember because "no filter" means the
-default filter, and because None happens to be the only object the default
-filter treats specially.
-
-We are considering additional filters; see
-\url{http://webware.colorstudy.net/twiki/bin/view/Cheetah/MoreFilters}
-for the latest ideas.
-
-%% @@MO: Is '#end filter' implemented? Will it be? Can filters nest?
-%% Will '#end filter' and '#filter None' be equivalent?
-
-%% @@MO: Tavis TODO: fix the description of the Pager filter. It needs a howto.
-
-%% @@MO: How about using settings to provide default arguments for filters?
-%% Each filter could look up FilterName (or FilterNameDefaults) setting,
-%% whose value would be a dictionary containing keyword/value pairs. These
-%% would be overridden by same-name keys passed by the placeholder.
-
-%% @@MO: If sed-filters (#sed) get added to Cheetah, give them a section here.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-% vim: shiftwidth=4 tabstop=4 expandtab
diff --git a/docs/users_guide_2_src/08_inheritanceEtc.txt b/docs/users_guide_2_src/08_inheritanceEtc.txt
deleted file mode 100755
index 3e76ce2..0000000
--- a/docs/users_guide_2_src/08_inheritanceEtc.txt
+++ /dev/null
@@ -1,564 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Import, Inheritance, Declaration and Assignment}
-\label{inheritanceEtc}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#import and \#from directives}
-\label{inheritanceEtc.import}
-
-Syntax:
-\begin{verbatim}
-#import MODULE_OR_OBJECT [as NAME] [, ...]
-#from MODULE import MODULE_OR_OBJECT [as NAME] [, ...]
-\end{verbatim}
-
-
-The \code{\#import} and \code{\#from} directives are used to make external
-Python modules or objects available to placeholders. The syntax is identical
-to the import syntax in Python. Imported modules are visible globally to all
-methods in the generated Python class.
-
-\begin{verbatim}
-#import math
-#import math as mathModule
-#from math import sin, cos
-#from math import sin as _sin
-#import random, re
-#from mx import DateTime # ## Part of Egenix's mx package.
-\end{verbatim}
-
-After the above imports, \code{\$math}, \code{\$mathModule},
-\code{\$sin}, \code{\$cos} and \code{\$\_sin}, \code{\$random}, \code{\$re}
-and \code{\$DateTime} may be used in \code{\$placeholders} and expressions.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#extends}
-\label{inheritanceEtc.extends}
-
-Syntax:
-\begin{verbatim}
-#extends CLASS
-\end{verbatim}
-
-
-All templates are subclasses of \code{Cheetah.Template.Template}. However,
-it's possible for a template to subclass another template or a pure Python
-class. This is where \code{\#extends} steps in: it
-specifies the parent class. It's equivalent to PSP's \code{``@page extends=''}
-directive.
-
-Cheetah imports the class mentioned in an \code{\#extends} directive
-automatically if you haven't imported it yet. The implicit importing works
-like this:
-
-\begin{verbatim}
-#extends Superclass
-## Implicitly does '#from Superclass import Superclass'.
-
-#extends Cheetah.Templates.SkeletonPage
-## Implicitly does '#from Cheetah.Templates.SkeletonPage import SkeletonPage'.
-\end{verbatim}
-
-If your superclass is in an unusual location or in a module named
-differently than the class, you must import it explicitly. There is no
-support for extending from a class that is not imported; e.g., from a template
-dynamically created from a string. Since the most practical way to
-get a parent template into a module is to precompile it, all parent templates
-essentially have to be precompiled.
-
-There can be only one \code{\#extends} directive in a template and it
-may list only one class. In other words, templates don't do multiple
-inheritance. This is intentional: it's too hard to initialize multiple
-base classes correctly from inside a template. However, you can do
-multiple inheritance in your pure Python classes.
-
-If your pure Python class overrides any of the standard \code{Template}
-methods such as \code{.\_\_init\_\_} or \code{.awake}, be sure to call
-the superclass method in your method or things will break. Examples of calling
-the superclass method are in section \ref{tips.callingSuperclassMethods}.
-A list of all superclass methods is in section
-\ref{tips.allMethods}.
-
-In all cases, the root superclass must be \code{Template}. If your
-bottommost class is a template, simply omit the \code{\#extends} in it and it
-will automatically inherit from \code{Template}. {\em If your bottommost class
-is a pure Python class, it must inherit from \code{Template} explicitly: }
-\begin{verbatim}
-from Cheetah.Template import Template
-class MyPurePythonClass(Template):
-\end{verbatim}
-
-If you're not keen about having your Python classes inherit from
-\code{Template}, create a tiny glue class that inherits both from your
-class and from \code{Template}.
-
-Before giving any examples we'll stress that Cheetah does {\em not}
-dictate how you should structure your inheritance tree. As long as
-you follow the rules above, many structures are possible.
-
-Here's an example for a large web site that has not only a general site
-template, but also a template for this section of the site, and then a
-specific template-servlet for each URL. (This is the ``inheritance
-approach'' discussed in the Webware chapter.) Each template inherits from a
-pure Python class that contains methods/attributes used by the template. We'll
-begin with the bottommost superclass and end with the specific
-template-servlet:
-
-\begin{verbatim}
-1. SiteLogic.py (pure Python class containing methods for the site)
- from Cheetah.Template import Template
- class SiteLogic(Template):
-
-2. Site.tmpl/py (template containing the general site framework;
- this is the template that controls the output,
- the one that contains "<HTML><HEAD>...", the one
- that contains text outside any #def/#block.)
- #from SiteLogic import SiteLogic
- #extends SiteLogic
- #implements respond
-
-3. SectionLogic.py (pure Python class with helper code for the section)
- from Site import Site
- class SectionLogic(Site)
-
-4. Section.tmpl/py (template with '#def' overrides etc. for the section)
- #from SectionLogic import SectionLogic
- #extends SectionLogic
-
-5. page1Logic.py (pure Python class with helper code for the template-servlet)
- from Section import Section
- class indexLogic(Section):
-
-6. page1.tmpl/py (template-servlet for a certain page on the site)
- #from page1Logic import page1Logic
- #extends page1Logic
-\end{verbatim}
-
-A pure Python classes might also contain methods/attributes that aren't used by
-their immediate child template, but are available for any descendant
-template to use if it wishes. For instance, the site template might have
-attributes for the name and e-mail address of the site administrator,
-ready to use as \$placeholders in any template that wants it.
-
-{\em Whenever you use \code{\#extends}, you often need \code{\#implements}
-too,} as in step 2 above. Read the next section to understand what
-\code{\#implements} is and when to use it.
-
-% @@MO: Edmund suggests making some diagrams of inheritance chains.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#implements}
-\label{inheritanceEtc.implements}
-
-Syntax:
-\begin{verbatim}
-#implements METHOD
-\end{verbatim}
-
-You can call any \code{\#def} or \code{\#block} method directly and get its
-outpt. The top-level content -- all the text/placeholders/directives outside any
-\code{\#def}/\code{\#block} -- gets concatenated and wrapped in a ``main
-method'', by default \code{.respond()}. So if you call \code{.respond()}, you
-get the ``whole template output''. When Webware calls \code{.respond()},
-that's what it's doing. And when you do 'print t' or 'str(t)' on a template
-instance, you're taking advantage of the fact that Cheetah makes
-\code{.\_\_str\_\_()} an alias for the main method.
-
-That's all fine and dandy, but what if your application prefers to call another
-method name rather than \code{.respond()}? What if it wants to call, say,
-\code{.send\_output()} instead? That's where \code{\#implements} steps in. It
-lets you choose the name for the main method. Just put this in your template
-definition:
-\begin{verbatim}
-#implements send_output
-\end{verbatim}
-
-When one template extends another, every template in the inheritance chain
-has its own main method. To fill the template, you invoke exactly one of
-these methods and the others are ignored. The method you call may be in any of
-the templates in the inheritance chain: the base template, the leaf template,
-or any in between, depending on how you structure your application. So you
-have two problems: (1) calling the right method name, and (2) preventing an
-undesired same-name subclass method from overriding the one you want to call.
-
-Cheetah assumes the method you will call is \code{.respond()} because
-that's what Webware calls. It further assumes the desired main method is the
-one in the lowest-level base template, because that works well with
-\code{\#block} as described in the Inheritance Approach for building Webware
-servlets (section \ref{webware.inheritance}), which was originally the
-principal use for Cheetah. So when you use \code{\#extends}, Cheetah changes
-that template's main method to \code{.writeBody()} to get it out of the way and
-prevent it from overriding the base template's \code{.respond()}.
-
-Unfortunately this assumption breaks down if the template is used in other
-ways. For instance, you may want to use the main method in the highest-level
-leaf template, and treat the base template(s) as merely a library of
-methods/attributes. In that case, the leaf template needs \code{\#implements
-respond} to change its main method name back to \code{.respond()} (or whatever
-your application desires to call). Likewise, if your main method is in one of the
-intermediate templates in an inheritance chain, that template needs
-\code{\#implements respond}.
-
-The other way the assumption breaks down is if the main method {\em is} in
-the base template but that template extends a pure Python class. Cheetah sees
-the \code{\#extends} and dutifully but incorrectly renames the method to
-\code{.writeBody()}, so you have to use \code{\#implements respond} to change
-it back. Otherwise the dummy \code{.respond()} in \code{Cheetah.Template}
-is found, which outputs... nothing. {\bf So if you're using \code{\#extends}
-and get no output, the {\em first} thing you should think is, ``Do I need to
-add \code{\#implements respond} somewhere?'' }
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#set}
-\label{inheritanceEtc.set}
-
-Syntax:
-\begin{verbatim}
-#set [global] $var = EXPR
-\end{verbatim}
-
-\code{\#set} is used to create and update local variables at run time.
-The expression may be any Python expression.
-Remember to preface variable names with \$ unless they're part of an
-intermediate result in a list comprehension.
-
-Here are some examples:
-\begin{verbatim}
-#set $size = $length * 1096
-#set $buffer = $size + 1096
-#set $area = $length * $width
-#set $namesList = ['Moe','Larry','Curly']
-#set $prettyCountry = $country.replace(' ', '&nbsp;')
-\end{verbatim}
-
-\code{\#set} variables are useful to assign a short name to a
-\code{\$deeply.nested.value}, to a calculation, or to a printable version of
-a value. The last example above converts any spaces in the 'country' value
-into HTML non-breakable-space entities, to ensure the entire value appears on
-one line in the browser.
-
-\code{\#set} variables are also useful in \code{\#if} expressions, but
-remember that complex logical routines should be coded in Python, not in
-Cheetah!
-\begin{verbatim}
-#if $size > 1500
- #set $adj = 'large'
-#else
- #set $adj = 'small'
-#end if
-\end{verbatim}
-Or Python's one-line equivalent, "A and B or C". Remember that in this case,
-B must be a true value (not None, '', 0, [] or {}).
-\begin{verbatim}
-#set $adj = $size > 1500 and 'large' or 'small'
-\end{verbatim}
-(Note: Cheetah's one-line \code{\#if} will not work for this, since it
-produces output rather than setting a variable.
-
-You can also use the augmented assignment operators:
-\begin{verbatim}
-## Increment $a by 5.
-#set $a += 5
-\end{verbatim}
-
-By default, \code{\#set} variables are not visible in method calls or include
-files unless you use the \code{global} attribute: \code{\#set global \$var =
-EXPRESSION}. Global variables are visible in all methods, nested templates and
-included files. Use this feature with care to prevent surprises.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#del}
-\label{inheritanceEtc.del}
-
-Syntax:
-\begin{verbatim}
-#del $var
-\end{verbatim}
-
-\code{\#del} is the opposite of \code{\#set}. It deletes a {\em local}
-variable. Its usage is just like Python's \code{del} statement:
-\begin{verbatim}
-#del $myVar
-#del $myVar, $myArray[5]
-\end{verbatim}
-
-Only local variables can be deleted. There is no directive to delete a
-\code{\#set global} variable, a searchList variable, or any other type of
-variable.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#attr}
-\label{inheritanceEtc.attr}
-
-Syntax:
-\begin{verbatim}
-#attr $var = EXPR
-\end{verbatim}
-
-The \code{\#attr} directive creates class attributes in the generated Python
-class. It should be used to assign simple Python literals such as numbers or
-strings. In particular, the expression must {\em not} depend on searchList
-values or \code{\#set} variables since those are not known at compile time.
-
-\begin{verbatim}
-#attr $title = "Rob Roy"
-#attr $author = "Sir Walter Scott"
-#attr $version = 123.4
-\end{verbatim}
-
-This template or any child template can output the value thus:
-\begin{verbatim}
-$title, by $author, version $version
-\end{verbatim}
-
-If you have a library of templates derived from etexts
-(\url{http://www.gutenberg.org/}), you can extract the titles and authors
-and put them in a database (assuming the templates have been compiled into
-.py template modules):
-
-%\begin{verbatim}
-%import glob
-%
-%\end{verbatim}
-%
-% @@MO: Finish this example.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#def}
-\label{inheritanceEtc.def}
-
-Syntax:
-\begin{verbatim}
-#def METHOD[(ARGUMENTS)]
-#end def
-\end{verbatim}
-
-Or the one-line variation:
-\begin{verbatim}
-#def METHOD[(ARGUMENTS)] : TEXT_AND_PLACEHOLDERS
-\end{verbatim}
-
-
-The \code{\#def} directive is used to define new methods in the generated
-Python class, or to override superclass methods. It is analogous to Python's
-\code{def} statement. The directive is silent, meaning it does not itself
-produce any output. However, the content of the method will be inserted into
-the output (and the directives executed) whenever the method is later called by
-a \$placeholder.
-
-\begin{verbatim}
-#def myMeth()
-This is the text in my method
-$a $b $c(123) ## these placeholder names have been defined elsewhere
-#end def
-
-## and now use it...
-$myMeth()
-\end{verbatim}
-
-The arglist and parentheses can be omitted:
-\begin{verbatim}
-#def myMeth
-This is the text in my method
-$a $b $c(123)
-#end def
-
-## and now use it...
-$myMeth
-\end{verbatim}
-
-Methods can have arguments and have defaults for those arguments, just like
-in Python. Remember the \code{\$} before variable names:
-\begin{verbatim}
-#def myMeth($a, $b=1234)
-This is the text in my method
-$a - $b
-#end def
-
-## and now use it...
-$myMeth(1)
-\end{verbatim}
-
-The output from this last example will be:
-
-\begin{verbatim}
-This is the text in my method
-1 - 1234
-\end{verbatim}
-
-There is also a single line version of the \code{\#def} directive.
-{\bf Unlike the multi-line directives, it uses a colon (:) to delimit the method
-signature and body}:
-\begin{verbatim}
-#attr $adj = 'trivial'
-#def myMeth: This is the $adj method
-$myMeth
-\end{verbatim}
-Leading and trailing whitespace is stripped from the method. This is in
-contrast to:
-\begin{verbatim}
-#def myMeth2
-This is the $adj method
-#end def
-\end{verbatim}
-where the method includes a newline after "method". If you don't want the
-newline, add \code{\#slurp}:
-\begin{verbatim}
-#def myMeth3
-This is the $adj method#slurp
-#end def
-\end{verbatim}
-
-Because \code{\#def} is handled at compile time, it can appear above or
-below the placeholders that call it. And if a superclass placeholder
-calls a method that's overridden in a subclass, it's the subclass method
-that will be called.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#block ... \#end block}
-\label{inheritanceEtc.block}
-
-
-The \code{\#block} directive allows you to mark a section of your template that
-can be selectively reimplemented in a subclass. It is very useful for
-changing part of a template without having to copy-paste-and-edit
-the entire thing. The output from a template definition that uses blocks will
-be identical to the output from the same template with the \code{\#block \ldots
-\#end block} tags removed.
-
-({\em Note:} don't be confused by the generic word `block'' in this Guide,
-which means a section of code inside {\em any} \code{\#TAG \ldots \#end TAG}
-pair. Thus, an if-block, for-block, def-block, block-block etc. In this
-section we are talking only of block-blocks.)
-
-To reimplement the block, use the \code{\#def} directive. The magical effect
-is that it appears to go back and change the output text {\em at the point the
-original block was defined} rather than at the location of the
-reimplementation.
-
-\begin{verbatim}
-#block testBlock
-Text in the contents
-area of the block directive
-#if $testIt
-$getFoo()
-#end if
-#end block testBlock
-\end{verbatim}
-
-You can repeat the block name in the \code{\#end block} directive or not, as
-you wish.
-
-\code{\#block} directives can be nested to any depth.
-
-\begin{verbatim}
-#block outerBlock
-Outer block contents
-
-#block innerBlock1
-inner block1 contents
-#end block innerBlock1
-
-#block innerBlock2
-inner block2 contents
-#end block innerBlock2
-
-#end block outerBlock
-\end{verbatim}
-
-Note that the name of the block is optional for the \code{\#end block} tag.
-
-Technically, \code{\#block} directive is equivalent to a \code{\#def} directive
-followed immediately by a \code{\#placeholder} for the same name. In fact,
-that's what Cheetah does. Which means you can use \code{\$theBlockName}
-elsewhere in the template to output the block content again.
-
-There is a one-line \code{\#block} syntax analagous to the one-line
-\code{\#def}.
-
-The block must not require arguments because the implicit placeholder that's
-generated will call the block without arguments.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-Object-Oriented Documents
--------------------------
-
-..
- :label: howWorks.objoriented
-
-Because Cheetah documents are actually class definitions, templates may inherit
-from one another in a natural way, using regular Python semantics. For
-instance, consider this template, FrogBase.tmpl::
-
- #def title
- This document has not defined its title
- #end def
- #def htTitle
- $title
- #end def
- <HTML><HEAD>
- <TITLE>$title</TITLE>
- </HEAD><BODY>
- <H1>$htTitle</H1>
- $body
- </BODY></HTML>
-
-And its subclassed document, Frog1.tmpl::
-
- #from FrogBase import FrogBase
- #extends FrogBase
- #def title
- The Frog Page
- #end def
- #def htTitle
- The <IMG SRC="Frog.png"> page
- #end def
- #def body
- ... lots of info about frogs ...
- #end def
-
-
-This is a classic use of inheritance. The parent "template" is simply an
-abstract superclass. Each document specializes the output of its parent.
-For instance, here the parent defines
-``\$htTitle`` so that by default it's identical to whatever the
-``\$title`` is, but it can also be customized.
-
-In many other templating systems, you'd have to use case statements or
-if-elseif blocks of some sort, repeated in many different sections of code.
-
-While we show another Cheetah document inheriting from this parent, a Python
-class can inherit from it just as easily. This Python class could define its
-programmatically-driven value for ``\$body`` and ``\$title``, simply by
-defining body() and title() methods that return a string. (Actually they
-can return anything, but we'll get into that later.) ::
-
- from FrogBase import FrogBase
- class Frog2(FrogBase):
- def title(self):
- return "Frog 2 Page"
- # We don't override .htTitle, so it defaults to "Frog 2 Page" too.
- def body(self):
- return " ... more info about frogs ..."
-
-Similarly, the Cheetah document can inherit from an arbitrary class. That's
-how Cheetah makes templates usable as Webware servlets, by subclassing
-``Servlet``. This technique should be possible for non-Webware systems
-too.
-
-(*Note:*\ ``FrogBase.tmpl`` could be improved by using the
-``\#block`` directive, section \ref{inheritanceEtc.block}.)
-
-
diff --git a/docs/users_guide_2_src/09_flowControl.txt b/docs/users_guide_2_src/09_flowControl.txt
deleted file mode 100755
index 75a5845..0000000
--- a/docs/users_guide_2_src/09_flowControl.txt
+++ /dev/null
@@ -1,414 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Flow Control}
-\label{flowControl}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#for ... \#end for}
-\label{flowControl.for}
-
-Syntax:
-\begin{verbatim}
-#for $var in EXPR
-#end for
-\end{verbatim}
-
-
-The \code{\#for} directive iterates through a sequence. The syntax is the same
-as Python, but remember the \code{\$} before variables.
-
-Here's a simple client listing:
-\begin{verbatim}
-<TABLE>
-#for $client in $service.clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-\end{verbatim}
-
-Here's how to loop through the keys and values of a dictionary:
-\begin{verbatim}
-<PRE>
-#for $key, $value in $dict.items()
-$key: $value
-#end for
-</PRE>
-\end{verbatim}
-
-Here's how to create list of numbers separated by hyphens. This ``\#end for''
-tag shares the last line to avoid introducing a newline character after each
-hyphen.
-\begin{verbatim}
-#for $i in range(15)
-$i - #end for
-\end{verbatim}
-
-If the location of the \code{\#end for} offends your sense of indentational
-propriety, you can do this instead:
-\begin{verbatim}
-#for $i in $range(15)
-$i - #slurp
-#end for
-\end{verbatim}
-
-The previous two examples will put an extra hyphen after last number. Here's
-how to get around that problem, using the \code{\#set} directive, which will be
-dealt with in more detail below.
-\begin{verbatim}
-#set $sep = ''
-#for $name in $names
-$sep$name
-#set $sep = ', '
-#end for
-\end{verbatim}
-
-Although to just put a separator between strings, you don't need a for loop:
-\begin{verbatim}
-#echo ', '.join($names)
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#repeat ... \#end repeat}
-\label{flowControl.repeat}
-
-Syntax:
-\begin{verbatim}
-#repeat EXPR
-#end repeat
-\end{verbatim}
-
-
-Do something a certain number of times.
-The argument may be any numeric expression.
-If it's zero or negative, the loop will execute zero times.
-\begin{verbatim}
-#repeat $times + 3
-She loves me, she loves me not.
-#repeat
-She loves me.
-\end{verbatim}
-
-
-Inside the loop, there's no way to tell which iteration you're on. If you
-need a counter variable, use \code{\#for} instead with Python's \code{range}
-function. Since Python's ranges are base 0 by default, there are two ways
-to start counting at 1. Say we want to count from 1 to 5, and that
-\code{\$count} is 5.
-\begin{verbatim}
-#for $i in $range($count)
-#set $step = $i + 1
-$step. Counting from 1 to $count.
-#end for
-
-
-#for $i in $range(1, $count + 1)
-$i. Counting from 1 to $count.
-#end for
-\end{verbatim}
-
-
-A previous implementation used a local variable \code{\$i} as the repeat
-counter. However, this prevented instances of \code{\#repeat} from
-being nested. The current implementation does not have this problem as it
-uses a new local variable for every instance of \code{\#repeat}.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#while ... \#end while}
-\label{flowControl.while}
-
-Syntax:
-\begin{verbatim}
-#while EXPR
-#end while
-\end{verbatim}
-
-
-\code{\#while} is the same as Python's \code{while} statement. It may be
-followed by any boolean expression:
-\begin{verbatim}
-#while $someCondition('arg1', $arg2)
-The condition is true.
-#end while
-\end{verbatim}
-
-Be careful not to create an infinite loop. \code{\#while 1} will loop until
-the computer runs out of memory.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#if ... \#else if ... \#else ... \#end if}
-\label{flowControl.if}
-
-Syntax:
-\begin{verbatim}
-#if EXPR
-#else if EXPR
-#elif EXPR
-#else
-#end if
-\end{verbatim}
-
-
-The \code{\#if} directive and its kin are used to display a portion of text
-conditionally. \code{\#if} and \code{\#else if} should be followed by a
-true/false expression, while \code{\#else} should not. Any valid Python
-expression is allowed. As in Python, the expression is true unless it evaluates
-to 0, '', None, an empty list, or an empty dictionary. In deference to Python,
-\code{\#elif} is accepted as a synonym for \code{\#else if}.
-
-Here are some examples:
-\begin{verbatim}
-#if $size >= 1500
-It's big
-#else if $size < 1500 and $size > 0
-It's small
-#else
-It's not there
-#end if
-\end{verbatim}
-
-\begin{verbatim}
-#if $testItem($item)
-The item $item.name is OK.
-#end if
-\end{verbatim}
-
-Here's an example that combines an \code{\#if} tag with a \code{\#for} tag.
-\begin{verbatim}
-#if $people
-<table>
-<tr>
-<th>Name</th>
-<th>Address</th>
-<th>Phone</th>
-</tr>
-#for $p in $people
-<tr>
-<td>$p.name</td>
-<td>$p.address</td>
-<td>$p.phone</td>
-</tr>
-#end for
-</table>
-#else
-<p> Sorry, the search did not find any people. </p>
-#end if
-\end{verbatim}
-
-See section \ref{output.oneLineIf} for the one-line \code{\#if} directive,
-which is equivalent to Perl's and C's \code{?:} operator.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#unless ... \#end unless}
-\label{flowControl.unless}
-
-Syntax:
-\begin{verbatim}
-#unless EXPR
-#end unless
-\end{verbatim}
-
-
-\code{\#unless} is the opposite of \code{\#if}: the text is executed if the
-condition is {\bf false}. Sometimes this is more convenient.
-\code{\#unless EXPR} is equivalent to \code{\#if not (EXPR)}.
-
-\begin{verbatim}
-#unless $alive
-This parrot is no more! He has ceased to be!
-'E's expired and gone to meet 'is maker! ...
-THIS IS AN EX-PARROT!!
-#end unless
-\end{verbatim}
-
-You cannot use \code{\#else if} or \code{\#else} inside an \code{\#unless}
-construct. If you need those, use \code{\#if} instead.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#break and \#continue}
-\label{flowControl.break}
-
-Syntax:
-\begin{verbatim}
-#break
-#continue
-\end{verbatim}
-
-
-These directives are used as in Python. \code{\#break} will
-exit a \code{\#for} loop prematurely, while \code{\#continue} will immediately
-jump to the next iteration in the \code{\#for} loop.
-
-In this example the output list will not contain ``10 - ''.
-\begin{verbatim}
-#for $i in range(15)
-#if $i == 10
- #continue
-#end if
-$i - #slurp
-#end for
-\end{verbatim}
-
-In this example the loop will exit if it finds a name that equals 'Joe':
-\begin{verbatim}
-#for $name in $names
-#if $name == 'Joe'
- #break
-#end if
-$name - #slurp
-#end for
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#pass}
-\label{flowControl.pass}
-
-Syntax:
-\begin{verbatim}
-#pass
-\end{verbatim}
-
-
-The \code{\#pass} directive is identical to Python \code{pass} statement: it
-does nothing. It can be used when a statement is required syntactically but the
-program requires no action.
-
-The following example does nothing if only \$A is true
-\begin{verbatim}
-#if $A and $B
- do something
-#elif $A
- #pass
-#elif $B
- do something
-#else
- do something
-#end if
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#stop}
-\label{flowControl.stop}
-
-Syntax:
-\begin{verbatim}
-#stop
-\end{verbatim}
-
-
-The \code{\#stop} directive is used to stop processing of a template at a
-certain point. The output will show {\em only} what has been processed up to
-that point.
-
-When \code{\#stop} is called inside an \code{\#include} it skips the rest of
-the included code and continues on from after the \code{\#include} directive.
-stop the processing of the included code. Likewise, when \code{\#stop} is
-called inside a \code{\#def} or \code{\#block}, it stops only the \code{\#def}
-or \code{\#block}.
-
-\begin{verbatim}
-A cat
-#if 1
- sat on a mat
- #stop
- watching a rat
-#end if
-in a flat.
-\end{verbatim}
-
-will print
-\begin{verbatim}
-A cat
- sat on a mat
-\end{verbatim}
-
-And
-\begin{verbatim}
-A cat
-#block action
- sat on a mat
- #stop
- watching a rat
-#end block
-in a flat.
-\end{verbatim}
-
-will print
-
-\begin{verbatim}
-A cat
- sat on a mat
-in a flat.
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#return}
-\label{flowControl.return}
-
-Syntax:
-\begin{verbatim}
-#return
-\end{verbatim}
-
-
-This is used as in Python. \code{\#return} will exit the current method with a
-default return value of \code{None} or the value specified. It may be used
-only inside a \code{\#def} or a \code{\#block}.
-
-Note that \code{\#return} is different from the \code{\#stop} directive,
-which returns the sum of all text output from the method in which it is called.
-The following examples illustrate this point:
-
-\begin{verbatim}
-1
-$test[1]
-3
-#def test
-1.5
-#if 1
-#return '123'
-#else
-99999
-#end if
-#end def
-\end{verbatim}
-
-will produce
-\begin{verbatim}
-1
-2
-3
-\end{verbatim}
-
-while
-\begin{verbatim}
-1
-$test
-3
-#def test
-1.5
-#if 1
-#stop
-#else
-99999
-#end if
-#end def
-\end{verbatim}
-
-will produce
-\begin{verbatim}
-1
-1.5
-3
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/10_errorHandling.txt b/docs/users_guide_2_src/10_errorHandling.txt
deleted file mode 100755
index 28eee3a..0000000
--- a/docs/users_guide_2_src/10_errorHandling.txt
+++ /dev/null
@@ -1,145 +0,0 @@
-\section{Error Handling}
-\label{errorHandling}
-
-There are two ways to handle runtime errors (exceptions) in Cheetah. The first
-is with the Cheetah directives that mirror Python's structured exception
-handling statements. The second is with Cheetah's \code{ErrorCatcher}
-framework. These are described below.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#try ... \#except ... \#end try, \#finally, and \#assert}
-\label{errorHandling.directives}
-
-Cheetah's exception-handling directives are exact mirrors Python's
-exception-handling statements. See Python's documentation for details. The
-following Cheetah code demonstrates their use:
-
-
-\begin{verbatim}
-#try
- $mightFail()
-#except
- It failed
-#end try
-
-#try
- #assert $x == $y
-#except AssertionError
- They're not the same!
-#end try
-
-#try
- #raise ValueError
-#except ValueError
- #pass
-#end try
-
-
-#try
- $mightFail()
-#except ValueError
- Hey, it raised a ValueError!
-#except NameMapper.NotFound
- Hey, it raised a NameMapper.NotFound!
-#else
- It didn't raise anything!
-#end try
-
-#try
- $mightFail()
-#finally
- $cleanup()
-#end try
-\end{verbatim}
-
-Like Python, \code{\#except} and \code{\#finally} cannot appear in the same
-try-block, but can appear in nested try-blocks.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#errorCatcher and ErrorCatcher objects}
-\label{errorHandling.errorCatcher}
-
-Syntax:
-\begin{verbatim}
-#errorCatcher CLASS
-#errorCatcher $PLACEHOLDER_TO_AN_ERROR_CATCHER_INSTANCE
-\end{verbatim}
-
-
-\code{ErrorCatcher} is a debugging tool that catches exceptions that occur
-inside \code{\$placeholder} tags and provides a customizable warning to the
-developer. Normally, the first missing namespace value raises a
-\code{NameMapper.NotFound} error and halts the filling of the template. This
-requires the developer to resolve the exceptions in order without seeing the
-subsequent output. When an \code{ErrorCatcher} is enabled, the developer can
-see all the exceptions at once as well as the template output around them.
-
-The \code{Cheetah.ErrorCatchers} module defines the base class for
-ErrorCatchers:
-
-\begin{verbatim}
-class ErrorCatcher:
- _exceptionsToCatch = (NameMapper.NotFound,)
-
- def __init__(self, templateObj):
- pass
-
- def exceptions(self):
- return self._exceptionsToCatch
-
- def warn(self, exc_val, code, rawCode, lineCol):
- return rawCode
-\end{verbatim}
-
-This ErrorCatcher catches \code{NameMapper.NotFound} exceptions and leaves the
-offending placeholder visible in its raw form in the template output. If the
-following template is executed:
-\begin{verbatim}
-#errorCatcher Echo
-#set $iExist = 'Here I am!'
-Here's a good placeholder: $iExist
-Here's bad placeholder: $iDontExist
-\end{verbatim}
-
-the output will be:
-\begin{verbatim}
-Here's a good placeholder: Here I am!
-Here's bad placeholder: $iDontExist
-\end{verbatim}
-
-The base class shown above is also accessible under the alias
-\code{Cheetah.ErrorCatchers.Echo}. \code{Cheetah.ErrorCatchers} also provides a
-number of specialized subclasses that warn about exceptions in different ways.
-\code{Cheetah.ErrorCatchers.BigEcho} will output
-
-\begin{verbatim}
-Here's a good placeholder: Here I am!
-Here's bad placeholder: ===============&lt;$iDontExist could not be found&gt;===============
-\end{verbatim}
-
-ErrorCatcher has a significant performance impact and is turned off by default.
-It can also be turned on with the \code{Template} class' \code{'errorCatcher'}
-keyword argument. The value of this argument should either be a string
-specifying which of the classes in \code{Cheetah.ErrorCatchers} to use, or a
-class that subclasses \code{Cheetah.ErrorCatchers.ErrorCatcher}. The
-\code{\#errorCatcher} directive can also be used to change the errorCatcher part
-way through a template.
-
-\code{Cheetah.ErrorCatchers.ListErrors} will produce the same ouput as
-\code{Echo} while maintaining a list of the errors that can be retrieved later.
-To retrieve the list, use the \code{Template} class' \code{'errorCatcher'}
-method to retrieve the errorCatcher and then call its \code{listErrors} method.
-
-ErrorCatcher doesn't catch exceptions raised inside directives.
-
-% @@MO: How do you turn ErrorCatcher off after turn it on.
-% '#ErrorCatcher None'?
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_2_src/11_parserInstructions.txt b/docs/users_guide_2_src/11_parserInstructions.txt
deleted file mode 100755
index bfd6bc2..0000000
--- a/docs/users_guide_2_src/11_parserInstructions.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-\section{Instructions to the Parser/Compiler}
-\label{parserInstructions}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#breakpoint}
-\label{parserInstructions.breakpoint}
-
-Syntax:
-\begin{verbatim}
-#breakpoint
-\end{verbatim}
-
-
-\code{\#breakpoint} is a debugging tool that tells the parser to stop
-parsing at a specific point. All source code from that point on will be ignored.
-
-The difference between \code{\#breakpoint} and \code{\#stop} is that
-\code{\#stop} occurs in normal templates (e.g., inside an \code{\#if}) but
-\code{\#breakpoint} is used only when debugging Cheetah. Another difference is
-that \code{\#breakpoint} operates at compile time, while \code{\#stop} is
-executed at run time while filling the template.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#compiler-settings}
-\label{parserInstructions.compiler-settings}
-
-Syntax:
-\begin{verbatim}
-#compiler-settings
-key = value (no quotes)
-#end compiler-settings
-
-#compiler-settings reset
-\end{verbatim}
-
-
-The \code{\#compiler-settings} directive overrides Cheetah's standard settings,
-changing how it parses source code and generates Python code. This
-makes it possible to change the behaviour of Cheetah's parser/compiler for a
-certain template, or within a portion of the template.
-
-The \code{reset} argument reverts to the default settings. With \code{reset},
-there's no end tag.
-
-Here are some examples of what you can do:
-\begin{verbatim}
-$myVar
-#compiler-settings
-cheetahVarStartToken = @
-#end compiler-settings
-@myVar
-#compiler-settings reset
-$myVar
-\end{verbatim}
-
-
-\begin{verbatim}
-## normal comment
-#compiler-settings
-commentStartToken = //
-#end compiler-settings
-
-// new style of comment
-
-#compiler-settings reset
-
-## back to normal comments
-\end{verbatim}
-
-\begin{verbatim}
-#slurp
-#compiler-settings
-directiveStartToken = %
-#end compiler-settings
-
-%slurp
-%compiler-settings reset
-
-#slurp
-\end{verbatim}
-
-Here's a partial list of the settings you can change:
-\begin{enumerate}
-\item syntax settings
- \begin{enumerate}
- \item cheetahVarStartToken
- \item commentStartToken
- \item multilineCommentStartToken
- \item multilineCommentEndToken
- \item directiveStartToken
- \item directiveEndToken
- \end{enumerate}
-\item code generation settings
- \begin{enumerate}
- \item commentOffset
- \item outputRowColComments
- \item defDocStrMsg
- \item useNameMapper
- \item useAutocalling
- \item reprShortStrConstants
- \item reprNewlineThreshold
- \end{enumerate}
-\end{enumerate}
-The meaning of these settings and their default values will be documented in
-the future.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_2_src/12_moduleFormatting.txt b/docs/users_guide_2_src/12_moduleFormatting.txt
deleted file mode 100644
index 9c558e3..0000000
--- a/docs/users_guide_2_src/12_moduleFormatting.txt
+++ /dev/null
@@ -1 +0,0 @@
-.
diff --git a/docs/users_guide_2_src/13_tipsAndTroubleshooting.txt b/docs/users_guide_2_src/13_tipsAndTroubleshooting.txt
deleted file mode 100755
index a7b58e5..0000000
--- a/docs/users_guide_2_src/13_tipsAndTroubleshooting.txt
+++ /dev/null
@@ -1,549 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Tips, Tricks and Troubleshooting}
-\label{tips}
-
-Troubleshooting: make a precomiled template with "cheetah compile" and inspect
-the Python code. Put $_CHEETAH__searchList in the template. (Caveat about
-"<value>" results.) Make a tiny template containing only the suspicious code
-and precompile it.
-
-This chapter contains short stuff that doesn't fit anywhere else.
-
-See the Cheetah FAQ for more specialized issues and for troubleshooting tips.
-Check the wiki periodically for recent tips contributed by users. If you
-get stuck and none of these resources help, ask on the mailing list.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Placeholder Tips}
-\label{tips.placeholder}
-
-Here's how to do certain important lookups that may not be obvious.
-For each, we show first the Cheetah expression and then the Python equivalent,
-because you can use these either in templates or in pure Python subclasses.
-The Cheetah examples use NameMapper shortcuts (uniform dotted notation,
-autocalling) as much as possible.
-
-To verify whether a variable exists in the searchList:
-\begin{verbatim}
-$varExists('theVariable')
-self.varExists('theVariable')
-\end{verbatim}
-This is useful in \code{\#if} or \code{\#unless} constructs to avoid a
-\code{\#NameMapper.NotFound} error if the variable doesn't exist. For instance,
-a CGI GET parameter that is normally supplied but in this case the user typed
-the URL by hand and forgot the parameter (or didn't know about it).
-(\code{.hasVar} is a synonym for \code{.varExists}.)
-
-To look up a variable in the searchList from a Python method:
-\begin{verbatim}
-self.getVar('theVariable')
-self.getVar('theVariable', myDefault)
-\end{verbatim}
-This is the equivalent to \code{\$theVariable} in the template. If the
-variable is missing, it returns the second argument, \code{myDefault}, if
-present, or raises \code{NameMapper.NotFound} if there is no second argument.
-However, it usually easier to write your method so that all needed searchList
-values come in as method arguments. That way the caller can just use a
-\code{\$placeholder} to specify the argument, which is less verbose than you
-writing a getVar call.
-
-To do a ``safe'' placeholder lookup that returns a default value if the
-variable is missing:
-\begin{verbatim}
-$getVar('theVariable', None)
-$getVar('theVariable', $myDefault)
-\end{verbatim}
-
-To get an environmental variable, put \code{os.environ} on the searchList as a
-container. Or read the envvar in Python code and set a placeholder variable
-for it.
-
-Remember that variables found earlier in the searchList override same-name
-variables located in a later searchList object. Be careful when adding objects
-containing other variables besides the ones you want (e.g., \code{os.environ},
-CGI parameters). The "other" variables may override variables your application
-depends on, leading to hard-to-find bugs. Also, users can inadvertently or
-maliciously set an environmental variable or CGI parameter you didn't expect,
-screwing up your program. To avoid all this, know what your namespaces
-contain, and place the namespaces you have the most control over first. For
-namespaces that could contain user-supplied "other" variables, don't put the
-namespace itself in the searchList; instead, copy the needed variables into
-your own "safe" namespace.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Diagnostic Output}
-\label{tips.diagnostic}
-
-If you need send yourself some debugging output, you can use \code{\#silent} to
-output it to standard error:
-\begin{verbatim}
-#silent $sys.stderr.write("Incorrigible var is '$incorrigible'.\n")
-#silent $sys.stderr.write("Is 'unknown' in the searchList? " +
- $getVar("unknown", "No.") + "\n" )
-\end{verbatim}
-(Tip contributed by Greg Czajkowski.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{When to use Python methods}
-\label{tips.pythonMethods}
-
-You always have a choice whether to code your methods as Cheetah \code{\#def}
-methods or Python methods (the Python methods being located in a class your
-template inherits). So how do you choose?
-
-Generally, if the method consists mostly of text and placeholders, use a
-Cheetah method (a \code{\#def} method). That's why \code{\#def} exists, to
-take the tedium out of writing those kinds of methods. And if you have a
-couple \code{\#if} stanzas to \code{\#set} some variables, followed by a
-\code{\#for} loop, no big deal. But if your method consists mostly of
-directives and only a little text, you're better off writing it in Python.
-Especially be on the watch for extensive use of \code{\#set}, \code{\#echo} and
-\code{\#silent} in a Cheetah method--it's a sure sign you're probably using the
-wrong language. Of course, though, you are free to do so if you wish.
-
-Another thing that's harder to do in Cheetah is adjacent or nested
-multiline stanzas (all those directives with an accompanying \code{\#end}
-directive). Python uses indentation to show the beginning and end of nested
-stanzas, but Cheetah can't do that because any indentation shows up in the
-output, which may not be desired. So unless all those extra spaces and tabs
-in the output are acceptable, you have to keep directives flush with the left
-margin or the preceding text.
-
-The most difficult decisions come when you have conflicting goals. What if
-a method generates its output in parts (i.e., output concatenation), contains
-many searchList placeholders and lots of text, {\em and} requires lots of
-\code{\#if \ldots \#set \ldots \#else \#set \ldots \#end if} stanzas. A Cheetah
-method would be more advantageous in some ways, but a Python method in others.
-You'll just have to choose, perhaps coding groups of methods all the same
-way. Or maybe you can split your method into two, one Cheetah and one Python,
-and have one method call the other. Usually this means the Cheetah method
-calling the Python method to calculate the needed values, then the Cheetah
-method produces the output. One snag you might run into though is that
-\code{\#set} currently can set only one variable per statement, so if your
-Python method needs to return multiple values to your Cheetah method, you'll
-have to do it another way.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Calling superclass methods, and why you have to}
-\label{tips.callingSuperclassMethods}
-
-If your template or pure Python class overrides a standard method or attribute
-of \code{Template} or one of its base classes, you should call the superclass
-method in your method to prevent various things from breaking. The most common
-methods to override are \code{.awake} and \code{.\_\_init\_\_}. \code{.awake}
-is called automatically by Webware early during the web transaction, so it makes
-a convenient place to put Python initialization code your template needs.
-You'll definitely want to call the superclass \code{.awake} because it sets up
-many wonderful attributes and methods, such as those to access the CGI input
-fields.
-
-There's nothing Cheetah-specific to calling superclass methods, but
-because it's vital, we'll recap the standard Python techniques
-here. We mention only the solution for old-style classes because
-Cheetah classes are old-style (in other Python documentation, you will
-find the technique for new-style classes, but they are not listed here
-because they cannot be used with Cheetah if you use
-dynamically-compiled templates).
-
-\begin{verbatim}
-from Cheetah.Template import Template
-class MyClass(Template):
- def awake(self, trans):
- Template.awake(self, trans)
- ... great and exciting features written by me ...
-\end{verbatim}
-
-[ @@MO: Need to test this. .awake is in Servlet, which is a superclass
-of Template. Do we really need both imports? Can we call
-Template.awake? ]
-
-To avoid hardcoding the superclass name, you can use this
-function \code{callbase()}, which emulates \code{super()} for older versions of
-Python. It also works even \code{super()} does exist, so you don't have to
-change your servlets immediately when upgrading. Note that the argument
-sequence is different than \code{super} uses.
-
-\begin{verbatim}
-===========================================================================
-# Place this in a module SOMEWHERE.py . Contributed by Edmund Lian.
-class CallbaseError(AttributeError):
- pass
-
-def callbase(obj, base, methodname='__init__', args=(), kw={},
- raiseIfMissing=None):
- try: method = getattr(base, methodname)
- except AttributeError:
- if raiseIfMissing:
- raise CallbaseError, methodname
- return None
- if args is None: args = ()
- return method(obj, *args, **kw)
-===========================================================================
-# Place this in your class that's overriding .awake (or any method).
-from SOMEWHERE import callbase
-class MyMixin:
- def awake(self, trans):
- args = (trans,)
- callbase(self, MyMixin, 'awake', args)
- ... everything else you want to do ...
-===========================================================================
-\end{verbatim}
-
-% @@MO: Edmund wants us to mention delegation too, as an alternative to
-% inheritance. Contact elian@inbrief.net for details.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{All methods}
-\label{tips.allMethods}
-
-Here is a list of all the standard methods and attributes that can be accessed
-from a placeholder. Some of them exist for you to call, others are mainly used
-by Cheetah internally but you can call them if you wish, and others are only
-for internal use by Cheetah or Webware. Do not use these method names in mixin
-classes (\code{\#extends}, section \ref{inheritanceEtc.extends}) unless you
-intend to override the standard method.
-
-Variables with a star prefix ({\bf *}) are frequently used in templates or in
-pure Python classes.
-
-\paragraph*{Inherited from Cheetah.Template}
-
-\begin{description}
-\item{{\bf compile(source=None, file=None, moduleName=None,
- mainMethodName='respond')}} Compile the template. Automatically called
- by \code{.\_\_init\_\_}.
-\item{{\bf generatedModuleCode()}} Return the module code the compiler
- generated, or \code{None} if no compilation took place.
-\item{{\bf generatedClassCode()}} Return the class code the compiler
- generated, or \code{None} if no compilation took place.
-\item{{\bf * searchList()}} Return a reference to the underlying search list.
- (a list of objects). Use this to print out your searchList for debugging.
- Modifying the returned list will affect your placeholder searches!
-\item{{\bf * errorCatcher()}} Return a reference to the current error
- catcher.
-\item{{\bf * refreshCache(cacheKey=None)}} If 'cacheKey' is not \code{None},
- refresh that item in the cache. If \code{None}, delete all items in the
- cache so they will be recalculated the next time they are encountered.
-\item{{\bf * shutdown()}} Break reference cycles before discarding a servlet.
-\item{{\bf * getVar(varName, default=NoDefault, autoCall=True)}} Look up a
- variable in the searchList. Same as \code{\$varName} but allows you to
- specify a default value and control whether autocalling occurs.
-\item{{\bf * varExists(varName, autoCall=True)}}
-\item{{\bf * getFileContents(path)}} Read the named file. If used as a
- placeholder, inserts the file's contents in the output without
- interpretation, like \code{\#include\ raw}. If used in an expression,
- returns the file's content (e.g., to assign it to a variable).
-\item{{\bf runAsMainProgram()}} This is what happens if you run a
- .py template module as a standalone program.
-\end{description}
-
-%Private methods: {\bf \_bindCompiledMethod}, {\bf \_bindFunctionAsMethod},
-%{\bf \_includeCheetahSource}, {\bf \_genTmpFilename},
-%{\bf \_importAsDummyModule}, {\bf \_makeDummyPackageForDir},
-%{\bf \_importFromDummyPackage}, {\bf \_importModuleFromDirectory}.
-%
-%Other private attributes:
-%\begin{description}
-%\item{{\bf * \_fileMtime}} Time the template definition was modified, in
-% Unix ticks. \code{None} if the template definition came from a string or
-% file handle rather than a named file, same for the next three variables.
-%\item{{\bf * \_fileDirName}} The directory containing the template definition.
-%\item{{\bf * \_fileBaseName}} The basename of the template definition file.
-%\item{{\bf * \_filePath}} The directory+filename of the template definition.
-%\end{description}
-
-\paragraph*{Inherited from Cheetah.Utils.WebInputMixin}
-
-\begin{description}
-\item{{\bf nonNumericInputError}} Exception raised by \code{.webInput}.
-\item{{\bf * webInput(...)}} Convenience method to access GET/POST variables
- from a Webware servlet or CGI script, or Webware cookie or session
- variables. See section \ref{webware.webInput} for usage information.
-\end{description}
-
-\paragraph*{Inherited from Cheetah.SettingsManager}
-
-\begin{description}
-\item{{\bf setting(name, default=NoDefault)}} Get a compiler setting.
-\item{{\bf hasSetting(name)}} Does this compiler setting exist?
-\item{{\bf setSetting(name, value)}} Set setting 'name' to 'value'.
- See \code{\#compiler-settings}, section
- \ref{parserInstructions.compiler-settings}.
-\item{{\bf settings()}} Return the underlying settings dictionary. (Warning:
- modifying this dictionary will change Cheetah's behavior.)
-\item{{\bf copySettings()}} Return a copy of the underlying settings
- dictionary.
-\item{{\bf deepcopySettings()}} Return a deep copy of the underlying settings
- dictionary. See Python's \code{copy} module.
-\item{{\bf updateSettings(newSettings, merge=True)}} Update Cheetah's
- compiler settings from the 'newSettings' dictionary. If 'merge' is true,
- update only the names in newSettings and leave the other names alone.
- (The SettingsManager is smart enough to update nested dictionaries one
- key at a time rather than overwriting the entire old dictionary.)
- If 'merge' is false, delete all existing settings so that the new ones are
- the only settings.
-\item{{\bf updateSettingsFromPySrcStr(theString, merge=True)}} Same,
- but pass a string of \code{name=value} pairs rather
- than a dictionary, the same as you would provide in a
- \code{\#compiler-settings} directive, section
- \ref{parserInstructions.compiler-settings}.
-\item{{\bf updateSettingsFromPySrcFile(path, merge=True)}} Same, but
- exec a Python source file and use the variables it contains as the new
- settings. (e.g., \code{cheetahVarStartToken\ =\ "@"}).
-\item{{\bf updateSettingsFromConfigFile(path, **kw)}} Same, but get the new
- settings from a text file in ConfigParser format (similar to Windows'
- *.ini file format). See Python's \code{ConfigParser} module.
-\item{{\bf updateSettingsFromConfigFileObj}} Same, but read the open file
- object 'inFile' for the new settings.
-\item{{\bf updateSettingsFromConfigStr(configStr, convert=True, merge=True}}
- Same, but read the new settings from a string in ConfigParser format.
-\item{{\bf writeConfigFile(path)}} Write the current compiler settings to
- a file named 'path' in *.ini format.
-\item{{\bf getConfigString()}} Return a string containing the current
- compiler settings in *.ini format.
-\end{description}
-
-\paragraph*{Inherited from Cheetah.Servlet}
-
-{\em Do not override these in a subclass or assign to them as attributes
-if your template will be used as a servlet,} otherwise Webware will behave
-unpredictably. However, it {\em is} OK to put same-name variables in the
-searchList, because Webware does not use the searchList.
-
-EXCEPTION: It's OK to override {\bf awake} and {\bf sleep} as long as you
-call the superclass methods. (See section
-\ref{tips.callingSuperclassMethods}.)
-
-\begin{description}
-\item{{\bf * isControlledByWebKit}} True if this template instance is
- part of a live transaction in a running WebKit servlet.
-\item{{\bf * isWebwareInstalled}} True if Webware is installed and the
- template instance inherits from WebKit.Servlet. If not, it inherits
- from Cheetah.Servlet.DummyServlet.
-\item{{\bf * awake(transaction)}} Called by WebKit at the beginning of
- the web transaction.
-\item{{\bf * sleep(transaction)}} Called by WebKit at the end of the
- web transaction.
-\item{{\bf * respond(transaction)}} Called by WebKit to produce the
- web transaction content. For a template-servlet, this means
- filling the template.
-\item{{\bf shutdown()}} Break reference cycles before deleting instance.
-\item{{\bf * serverSidePath()}} The filesystem pathname of the
- template-servlet (as opposed to the URL path).
-\item{{\bf transaction}} The current Webware transaction.
-\item{{\bf application}} The current Webware application.
-\item{{\bf response}} The current Webware response.
-\item{{\bf request}} The current Webware request.
-\item{{\bf session}} The current Webware session.
-\item{{\bf write}} Call this method to insert text in the filled template
- output.
-\end{description}
-
-Several other goodies are available to template-servlets under the
-\code{request} attribute, see section \ref{webware.input}.
-
-\code{transaction}, \code{response}, \code{request} and \code{session} are
-created from the current transaction when WebKit calls \code{awake}, and don't
-exist otherwise. Calling \code{awake} yourself (rather than letting WebKit
-call it) will raise an exception because the \code{transaction} argument won't
-have the right attributes.
-
-\paragraph*{Inherited from WebKit.Servlet}
-These are accessible only if Cheetah knows Webware is installed. This
-listing is based on a CVS snapshot of Webware dated 22 September 2002, and
-may not include more recent changes.
-
-The same caveats about overriding these methods apply.
-
-\begin{description}
-\item{name()} The simple name of the class. Used by Webware's logging and
- debugging routines.
-\item{log()} Used by Webware's logging and debugging routines.
-\item{canBeThreaded()} True if the servlet can be multithreaded.
-\item{canBeReused()} True if the servlet can be used for another transaction
- after the current transaction is finished.
-\item{serverSideDir()} Depreciated by \code{.serverSidePath()}.
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Optimizing templates}
-\label{tips.optimizing}
-
-Here are some things you can do to make your templates fill faster and user
-fewer CPU cycles. Before you put a lot of energy into this, however, make
-sure you really need to. In many situations, templates appear to initialize
-and fill instantaneously, so no optimization is necessary. If you do find a
-situation where your templates are filling slowly or taking too much memory or
-too many CPU cycles, we'd like to hear about it on the mailing list.
-
-Cache \$placeholders whose values don't change frequently. (Section
-\ref{output.caching}).
-
-Use \code{\#set} for values that are very frequently used, especially if they
-come out of an expensive operation like a deeply.nested.structure or a database
-lookup. \code{\#set} variables are set to Python local variables, which have a
-faster lookup time than Python globals or values from Cheetah's searchList.
-
-Moving variable lookups into Python code may provide a speedup in certain
-circumstances. If you're just reading \code{self} attributes, there's no
-reason to use NameMapper lookup (\$placeholders) for them. NameMapper does
-a lot more work than simply looking up a \code{self} attribute.
-
-On the other hand, if you don't know exactly where the value will come from
-(maybe from \code{self}, maybe from the searchList, maybe from a CGI input
-variable, etc), it's easier to just make that an argument to your method, and
-then the template can handle all the NameMapper lookups for you:
-\begin{verbatim}
-#silent $myMethod($arg1, $arg2, $arg3)
-\end{verbatim}
-Otherwise you'd have to call \code{self.getVar('arg1')} etc in your
-method, which is more wordy, and tedious.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{PSP-style tags}
-\label{tips.PSP}
-
-\code{<\%= \ldots \%>} and \code{<\% \ldots \%>} allow an escape
-to Python syntax inside the template. You do not need it to use Cheetah
-effectively, and we're hard pressed to think of a case to recommend it.
-Nevertheless, it's there in case you encounter a situation you can't
-express adequately in Cheetah syntax. For instance, to set a local
-variable to an elaborate initializer.
-
-\code{<\%= \ldots \%>} encloses a Python expression whose result will
-be printed in the output.
-
-\code{<\% \ldots \%>} encloses a Python statement or expression (or set of
-statements or expressions) that will be included as-is into the generated
-method. The statements themselves won't produce any output, but you can use
-the local function \code{write(EXPRESSION)} to produce your own output.
-(Actually, it's a method of a file-like object, but it looks like a local
-function.) This syntax also may be used to set a local variable with a
-complicated initializer.
-
-To access Cheetah services, you must use Python code like you would in an
-inherited Python class. For instance, use \code{self.getVar()} to look up
-something in the searchList.
-
-{\em Warning:} {\bf No error checking is done!} If you write:
-\begin{verbatim}
-<% break %> ## Wrong!
-\end{verbatim}
-you'll get a \code{SyntaxError} when you fill the template, but that's what you
-deserve.
-
-Note that these are PSP-{\em style} tags, not PSP tags. A Cheetah template
-is not a PSP document, and you can't use PSP commands in it.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Makefiles}
-\label{tips.Makefile}
-
-If your project has several templates and you get sick of typing
-``cheetah compile FILENAME.tmpl'' all the time--much less remembering which
-commands to type when--and your system has the \code{make}
-command available, consider building a Makefile to make your life easier.
-
-Here's a simple Makefile that controls two templates, ErrorsTemplate and
-InquiryTemplate. Two external commands, \code{inquiry} and \code{receive},
-depend on ErrorsTemplate.py. Aditionally, InquiryTemplate
-itself depends on ErrorsTemplate.
-
-\begin{verbatim}
-all: inquiry receive
-
-.PHONY: all receive inquiry printsource
-
-printsource:
- a2ps InquiryTemplate.tmpl ErrorsTemplate.tmpl
-
-ErrorsTemplate.py: ErrorsTemplate.tmpl
- cheetah compile ErrorsTemplate.tmpl
-
-InquiryTemplate.py: InquiryTemplate.tmpl ErrorsTemplate.py
- cheetah compile InquiryTemplate.tmpl
-
-inquiry: InquiryTemplate.py ErrorsTemplate.py
-
-receive: ErrorsTemplate.py
-\end{verbatim}
-
-Now you can type \code{make} anytime and it will recompile all the templates
-that have changed, while ignoring the ones that haven't. Or you can
-recompile all the templates \code{receive} needs by typing \code{make receive}.
-Or you can recompile only ErrorsTemplate by typing
-\code{make ErrorsTemplate}. There's also another target, ``printsource'':
-this sends a Postscript version of the project's source files to the printer.
-The .PHONY target is explained in the \code{make} documentation; essentially,
-you have it depend on every target that doesn't produce an output file with
-the same name as the target.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Using Cheetah in a Multi-Threaded Application}
-\label{tips.threads}
-
-Template classes may be shared freely between threads. However, template
-instances should not be shared unless you either:
-\begin{itemize}
-\item Use a lock (mutex) to serialize template fills, to prevent two threads
-from filling the template at the same time.
-\item Avoid thread-unsafe features:
- \begin{itemize}
- \item Modifying searchList values or instance variables.
- \item Caching (\code{\$*var}, \code{\#cache}, etc).
- \item \code{\#set global}, \code{\#filter}, \code{\#errorCatcher}.
- \end{itemize}
- Any changes to these in one thread will be visible in other threads,
- causing them to give inconsistent output.
-\end{itemize}
-
-About the only advantage in sharing a template instance is building up the
-placeholder cache. But template instances are so low overhead that it
-probably wouldn't take perceptibly longer to let each thread instantiate its
-own template instance. Only if you're filling templates several times a
-second would the time difference be significant, or if some of the placeholders
-trigger extremely slow calculations (e.g., parsing a long text file each time).
-The biggest overhead in Cheetah is importing the \code{Template} module in
-the first place, but that has to be done only once in a long-running
-application.
-
-You can use Python's \code{mutex} module for the lock, or any similar
-mutex. If you have to change searchList values or instance variables
-before each fill (which is usually the case), lock the mutex before
-doing this, and unlock it only after the fill is complete.
-
-For Webware servlets, you're probably better off using Webware's servlet
-caching rather than Cheetah's caching. Don't override the servlet's
-\code{.canBeThreaded()} method unless you avoid the unsafe operations
-listed above.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Using Cheetah with gettext}
-\label{tips.gettext}
-
-{\bf gettext} is a project for creating internationalized applications. For
-more details, visit \url{http://docs.python.org/lib/module-gettext.html}.
-gettext can be used with Cheetah to create internationalized applications, even
-for CJK character sets, but you must keep a couple things in mind:
-\begin{itemize}
-\item xgettext is used on compiled templates, not on the templates themselves.
-\item The way the NameMapper syntax gets compiled to Python gets in the way of
-the syntax that xgettext recognizes. Hence, a special case exists for the
-functions \code{_}, \code{N_}, and \code{ngettext}. If you need to use a
-different set of functions for marking strings for translation, you must set
-the Cheetah setting \code{gettextTokens} to a list of strings representing the
-names of the functions you are using to mark strings for translation.
-\end{itemize}
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/13a_precompiledTemplateModules.txt b/docs/users_guide_2_src/13a_precompiledTemplateModules.txt
deleted file mode 100644
index 5b0f978..0000000
--- a/docs/users_guide_2_src/13a_precompiledTemplateModules.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-A look inside precompiled template modules
-==========================================
-
-..
- :label: howWorks.pyTrivia
-
-When debugging a template, it's useful to compile it with "cheetah compile"
-and then inspect the resulting Python module. This will often clear up whether
-Cheetah misinterpreted your intent. You can do this even if you don't intend to
-use the precompiled templates in production. It's also a good way to learn how
-Cheetah works. Simply make a throwaway template definition containing only one
-placeholder or directive, compile it with "cheetah compile", and see what
-Python code Cheetah generated.
-
-However, precompiled template modules can be a bit cryptic to read unless you
-have a bit of background information. Let's look at an example. Put the
-following into /tmp/x.tmpl (or any other file) and run "cheetah compile" on
-it::
-
- The number is $Test.unittest.main.
- #set mood = "lucky"
- I'm feeling $lucky.
-
-Open the resulting /tmp/x.py in your favorite text editor. You'll see a class
-with the same name as the module::
-
- class x(Template):
-
-This template class contains a method ``.respond()``::
-
- def respond(self, trans=None):
- ## CHEETAH: main method generated for this template
- if (not trans and not self._CHEETAH__isBuffering and
- not callable(self.transaction)):
- trans = self.transaction # is None unless self.awake() was called
- if not trans:
- trans = DummyTransaction()
- _dummyTrans = True
- else: _dummyTrans = False
- write = trans.response().write
- SL = self._CHEETAH__searchList
- _filter = self._CHEETAH__currentFilter
-
- ########################################
- ## START - generated method body
-
-
- write('The number is ')
- _v = VFFSL(SL,"Test.unittest.main",True)
- # '$Test.unittest.main' on line 1, col 15
- if _v is not None: write(_filter(_v, rawExpr='$Test.unittest.main'))
- # from line 1, col 15.
- write('.\n')
- mood = "lucky"
- write("I'm feeling ")
- _v = VFFSL(SL,"lucky",True) # '$lucky' on line 3, col 13
- if _v is not None: write(_filter(_v, rawExpr='$lucky'))
- # from line 3, col 13.
- write('.\n')
-
- ########################################
- ## END - generated method body
-
- return _dummyTrans and trans.response().getvalue() or ""
-
-This becomes clearer when we scroll up to see some important imports and
-global variables::
-
- from Cheetah.Template import Template
- from Cheetah.DummyTransaction import DummyTransaction
- from Cheetah.NameMapper import NotFound, valueFromFrameOrSearchList
- VFFSL=valueFromFrameOrSearchList
- __CHEETAH_version__ = '2.0rc6'
- __CHEETAH_src__ = 'x.tmpl'
-
-The actual code will differ slightly depending on your Cheetah version. Also,
-we've split some long lines to make this page printer-friendly.
-
-Placeholder lookup is handled by ``VFFSL``, which is really the
-``Cheetah.NameMapper.valueFromFrameOrSearchList`` function or its equivalent
-in Cheetah/_namemapper.c.
-
-``trans`` and ``write()`` are Webware compatibility features. Normally
-``trans`` is not specified and Cheetah creates a ``DummyTransaction``
-instance. ``write()`` is a shortcut for ``trans.response().write()``,
-which concatenates the output to an internal buffer. The method returns
-the result: ``trans.response().getvalue()``. You might assume from
-``.getvalue()`` that Cheetah uses ``StringIO`` internally, but you'd be wrong.
-Cheetah *used* to use ``StringIO`` but now it uses a list and ``str.join()``.
-The ``.getvalue()`` name is retained for backward compatibility.
-
-If this template is part of a Webware site and the user enters its URL, Webware
-calls ``.respond()`` with a live Webware transaction. In this case,
-``write()`` writes the output directly to Webware's output stream. (Or to
-a Webware buffer, but that's not our concern.) There's nothing to return
-because the output has already been written, so the method returns the empty
-string. That way if it accidentally gets concatenated to the output, no harm
-will be done.
-
-You can write your own transaction class to support non-Webware output
-streaming, but Cheetah currently comes with no examples of this. Ask on
-the mailing list if you need help with it.
-
-Global variables and class attributes defined by Cheetah have a
-``_CHEETAH_`` prefix. Instance attributes defined by Cheetah have a
-``__CHEETAH__`` prefix (two trailing underscores). You should normally
-never write to these but you can read them if desired; many are
-self-explanatory. One such attribute is ``._CHEETAH__searchList``. This
-is the actual search List ``VFFSL()`` will consult for placeholder lookups.
diff --git a/docs/users_guide_2_src/14_webware.txt b/docs/users_guide_2_src/14_webware.txt
deleted file mode 100755
index 8c47e90..0000000
--- a/docs/users_guide_2_src/14_webware.txt
+++ /dev/null
@@ -1,582 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Using Cheetah with Webware}
-\label{webware}
-
-{\bf Webware for Python} is a 'Python-Powered Internet Platform' that runs
-servlets in a manner similar to Java servlets. {\bf WebKit} is the name of
-Webware's application server. For more details, please visit
-\url{http://webware.sourceforge.net/}.
-
-All comments below refer to the official version of Webware, the DamnSimple!
-offshoot at ?, and the now-abandoned WebwareExperimental implementation at
-\url{http://sourceforge.net/projects/expwebware/}, except where noted. All the
-implementations are 95\% identical to the servlet writer: their differences lie
-in their internal structure and configuration files. One difference is that
-the executable you run to launch standard Webware is called \code{AppServer},
-whereas in WebwareExperimental it's called \code{webkit}. But to servlets
-they're both "WebKit, Webware's application server", so it's one half dozen to
-the other. In this document, we generally use the term {\bf WebKit} to refer
-to the currently-running application server.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Installing Cheetah on a Webware system}
-\label{webware.installing}
-
-Install Cheetah after you have installed Webware, following the instructions in
-chapter \ref{gettingStarted}.
-
-The standard Cheetah test suite ('cheetah test') does not test Webware features.
-We plan to build a test suite that can run as a Webware servlet, containing
-Webware-specific tests, but that has not been built yet. In the meantime, you
-can make a simple template containing something like "This is a very small
-template.", compile it, put the *.py template module in a servlet
-directory, and see if Webware serves it up OK.
-
-{\em You must not have a Webware context called "Cheetah".} If you do, Webware
-will mistake that directory for the Cheetah module directory, and all
-template-servlets will bomb out with a "ImportError: no module named Template".
-(This applies only to the standard Webware; WebwareExperimental does not have
-contexts.)
-
-If Webware complains that it cannot find your servlet, make sure
-'.tmpl' is listed in 'ExtensionsToIgnore' in your 'Application.config' file.
-
-% @@MO: Should explain extension cascading and how without it, standard
-% Webware pretends a file doesn't exist if it finds two or more servable files
-% that match the URL.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Containment vs Inheritance}
-\label{webware.background}
-
-Because Cheetah's core is flexible, there are many ways to integrate it with
-Webware servlets. There are two broad strategies: the {\bf Inheritance
-approach} and the {\bf Containment approach}. The difference is
-that in the Inheritance approach, your template object \code{\em is} the
-servlet, whereas in the Containment approach, the servlet is not a template but
-merely {\em uses} template(s) for portion(s) of its work.
-
-The Inheritance approach is recommended for new sites because it's simpler, and
-because it scales well for large sites with a
-site->section->subsection->servlet hierarchy. The Containment approach is
-better for existing servlets that you don't want to restructure. For instance,
-you can use the Containment approach to embed a discussion-forum table at the
-bottom of a web page.
-
-However, most people who use Cheetah extensively seem
-to prefer the Inheritance approach because even the most analytical servlet
-needs to produce {\em some} output, and it has to fit the site's look and feel
-{\em anyway}, so you may as well use a template-servlet as the place to put the
-output. Especially since it's so easy to add a template-servlet to a site once
-the framework is established. So we recommend you at least evaluate the
-effort that would be required to convert your site framework to template
-superclasses as described below, vs the greater flexibility and manageability
-it might give the site over the long term. You don't necessarily have to
-convert all your existing servlets right away: just build common site templates
-that are visually and behaviorally compatible with your specification, and use
-them for new servlets. Existing servlets can be converted later, if at all.
-
-Edmund Liam is preparing a section on a hybrid approach, in which the
-servlet is not a template, but still calls template(s) in an inheritance
-chain to produce the output. The advantage of this approach is that you
-aren't dealing with \code{Template} methods and Webware methods in the
-same object.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{The Containment Approach}
-\label{webware.containment}
-
-In the Containment approach, your servlet is not a template. Instead, it
-it makes its own arrangements to create and use template object(s) for whatever
-it needs. The servlet must explicitly call the template objects'
-\code{.respond()} (or \code{.\_\_str\_\_()}) method each time it needs to fill
-the template. This does not present the output to the user; it merely gives
-the output to the servlet. The servlet then calls its
-\code{\#self.response().write()} method to send the output to the user.
-
-The developer has several choices for managing her templates. She can store the
-template definition in a string, file or database and call
-\code{Cheetah.Template.Template} manually on it. Or she can put the
-template definition in a *.tmpl file and use {\bf cheetah compile} (section
-\ref{howWorks.cheetah-compile}) to convert it to a Python class in a *.py
-module, and then import it into her servlet.
-
-Because template objects are not thread safe, you should not store one
-in a module variable and allow multiple servlets to fill it simultaneously.
-Instead, each servlet should instantiate its own template object. Template
-{\em classes}, however, are thread safe, since they don't change once created.
-So it's safe to store a template class in a module global variable.
-
-% @@MO: Example of containment.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{The Inheritance Approach}
-\label{webware.inheritance}
-
-In the Inheritance approach, your template object doubles as as Webware
-servlet, thus these are sometimes called {\bf template-servlets}. {\bf cheetah
-compile} (section \ref{howWorks.cheetah-compile}) automatically creates modules
-containing valid Webware servlets. A servlet is a subclass of Webware's
-\code{WebKit.HTTPServlet} class, contained in a module with the same name as
-the servlet. WebKit uses the request URL to find the module, and then
-instantiates the servlet/template. The servlet must have a \code{.respond()}
-method (or \code{.respondToGet()}, \code{.respondToPut()}, etc., but the
-Cheetah default is \code{.respond()}). Servlets created by \code{cheetah
-compile} meet all these requirements.
-
-(Cheetah has a Webware plugin that automatically converts a \code{.tmpl servlet
-file} into a \code{.py servlet file} when the \code{.tmpl servlet file} is
-requested by a browser. However, that plugin is currently unavailable because
-it's being redesigned. For now, use \code{cheetah compile} instead.)
-
-What about logic code? Cheetah promises to keep content (the placeholder
-values), graphic design (the template definition and is display logic), and
-algorithmic logic (complex calculations and side effects) separate. How?
-Where do you do form processing?
-
-The answer is that your template class can inherit from a pure Python class
-containing the analytical logic. You can either use the \code{\#extends}
-directive in Cheetah to indicate the superclass(es), or write a Python
-\code{class} statement to do the same thing. See the template
-\code{Cheetah.Templates.SkeletonPage.tmpl} and its pure Python class
-\code{Cheetah.Templates.\_SkeletonPage.py} for an example of a template
-inheriting logic code. (See sections \ref{inheritanceEtc.extends} and
-\ref{inheritanceEtc.implements} for more information about \code{\#extends} and
-\code{\#implements}. They have to be used a certain right way.)
-
-If \code{\#WebKit.HTTPServlet} is not available, Cheetah fakes it with a
-dummy class to satisfy the dependency. This allows servlets to be tested on
-the command line even on systems where Webware is not installed. This works
-only with servlets that don't call back into WebKit for information about the
-current web transaction, since there is no web transaction. Trying to access
-form input, for instance, will raise an exception because it depends on a
-live web request object, and in the dummy class the request object is
-\code{None}.
-
-Because Webware servlets must be valid Python modules, and ``cheetah compile''
-can produce only valid module names, if you're converting an existing site that
-has .html filenames with hyphens (-), extra dots (.), etc, you'll have to
-rename them (and possibly use redirects).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Site frameworks}
-\label{webware.siteFrameworks}
-
-Web sites are normally arranged hierarchically, with certain features common
-to every page on the site, other features common to certain sections or
-subsections, and others unique to each page. You can model this easily with
-a hierarchy of classes, with specific servlets inheriting from their more
-general superclasses. Again, you can do this two ways, using Cheetah's
-{\bf Containment} approach or {\bf Inheritance} approach.
-
-In the Inheritance approach, parents provide \code{\#block}s and children
-override them using \code{\#def}. Each child \code{\#extend}s its immediate
-parent. Only the leaf servlets need to be under WebKit's document root
-directory. The superclass servlets can live anywhere in the filesystem
-that's in the Python path. (You may want to modify your WebKit startup
-script to add that library directory to your \code{PYTHONPATH} before starting
-WebKit.)
-
-% @@MO Examples: simple, IronSite, SkeletonPage.
-
-Section \ref{libraries.templates.skeletonPage} contains information on a stock
-template that simplifies defining the basic HTML structure of your web
-page templates.
-
-In the Containment approach, your hierarchy of servlets are not templates, but
-each uses one or more templates as it wishes. Children provide callback
-methods to to produce the various portions of the page that are their
-responsibility, and parents call those methods. Webware's \code{WebKit.Page}
-and \code{WebKit.SidebarPage} classes operate like this.
-
-% @@MO Show examples of WebKit.Page and WebKit.SidebarPage.
-
-Note that the two approaches are not compatible! \code{WebKit.Page} was not
-designed to intermix with \code{Cheetah.Templates.SkeletonPage}. Choose either
-one or the other, or expect to do some integration work.
-
-If you come up with a different strategy you think is worth noting in this
-chapter, let us know.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Directory structure}
-\label{webware.directoryStructure}
-
-Here's one way to organize your files for Webware+Cheetah.
-
-\begin{verbatim}
-www/ # Web root directory.
- site1.example.com/ # Site subdirectory.
- apache/ # Web server document root (for non-servlets).
- www/ # WebKit document root.
- index.py # http://site1.example.com/
- index.tmpl # Source for above.
- servlet2.py # http://site1.example.com/servlet2
- servlet2.tmpl # Source for above.
- lib/ # Directory for helper classes.
- Site.py # Site superclass ("#extends Site").
- Site.tmpl # Source for above.
- Logic.py # Logic class inherited by some template.
- webkit.config # Configuration file (for WebwareExperimental).
- Webware/ # Standard Webware's MakeAppWorkDir directory.
- AppServer # Startup program (for standard Webware).
- Configs/ # Configuration directory (for standard Webware).
- Application.config
- # Configuration file (for standard Webware).
- site2.example.org/ # Another virtual host on this computer....
-\end{verbatim}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Initializing your template-servlet with Python code}
-\label{webware.calculations}
-
-If you need a place to initialize variables or do calculations for your
-template-servlet, you can put it in an \code{.awake()} method because WebKit
-automatically calls that early when processing the web transaction. If you
-do override \code{.awake()}, be sure to call the superclass \code{.awake}
-method. You probably want to do that first so that you have access to the
-web transaction data \code{Servlet.awake} provides. You don't have to worry
-about whether your parent class has its own \code{.awake} method, just call
-it anyway, and somebody up the inheritance chain will respond, or at minimum
-\code{Servlet.awake} will respond. Section
-\ref{tips.callingSuperclassMethods} gives examples of how to call a
-superclass method.
-
-As an alternative, you can put all your calculations in your own method and
-call it near the top of your template. (\code{\#silent}, section
-\ref{output.silent}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Form processing}
-\label{webware.form}
-
-There are many ways to display and process HTML forms with Cheetah.
-But basically, all form processing involves two steps.
-\begin{enumerate}
-\item{} Display the form.
-\item{} In the next web request, read the parameters the user submitted,
-check for user errors, perform any side effects (e.g., reading/writing a
-database or session data) and present the user an HTML response or another
-form.
-\end{enumerate}
-
-The second step may involve choosing between several templates to fill (or
-several servlets to redirect to), or a big if-elif-elif-else construct to
-display a different portion of the template depending on the situation.
-
-In the oldest web applications, step 1 and step 2 were handled by separate
-objects. Step 1 was a static HTML file, and step 2 was a CGI script.
-Frequently, a better strategy is to have a single servlet handle both steps.
-That way, the servlet has better control over the entire situation, and if
-the user submits unacceptable data, the servlet can redisplay the form with a
-"try again" error message at the top and and all the previous input filled in.
-The servlet can use the presence or absence of certain CGI parameters (e.g.,
-the submit button, or a hidden mode field) to determine which step to take.
-
-One neat way to build a servlet that can handle both the form displaying and
-form processing is like this:
-
-\begin{enumerate}
-\item Put your form HTML into an ordinary template-servlet. In each input
- field, use a placeholder for the value of the \code{VALUE=} attribue.
- Place another placeholder next to each field, for that field's error
- message.
-\item Above the form, put a \code{\$processFormData} method call.
-\item Define that method in a Python class your template \code{\#extend}s. (Or
- if it's a simple method, you can define it in a \code{\#def}.) The method
- should:
- \begin{enumerate}
- \item Get the form input if any.
- \item If the input variable corresponding to the submit field is empty,
- there is no form input, so we're showing the form for the first time.
- Initialize all VALUE= variables to their default value (usually ""),
- and all error variables to "". Return "", which will be the value for
- \code{\$processFormData}.
- \item If the submit variable is not empty, fill the VALUE= variables with
- the input data the user just submitted.
- \item Now check the input for errors and put error messages in the error
- placeholders.
- \item If there were any user errors, return a general error message
- string; this will be the value for \code{\$processFormData}.
- \item If there were no errors, do whatever the form's job is (e.g., update
- a database) and return a success message; this will be the value for
- \code{\$processFormData}.
- \end{enumerate}
-\item The top of the page will show your success/failure message (or nothing
-the first time around), with the form below. If there are errors, the user
-will have a chance to correct them. After a successful submit, the form will
-appear again, so the user can either review their entry, or change it and
-submit it again. Depending on the application, this may make the servlet
-update the same database record again, or it may generate a new record.
-\end{enumerate}
-
-% @@MO: Example of a template that shows a form and then processes the input.
-
-\code{FunFormKit} is a third-party Webware package that makes it easier to
-produce forms and handle their logic. It has been successfully been used with
-Cheetah. You can download FunFormKit from
-\url{http://colorstudy.net/software/funformkit/} and try it out for yourself.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Form input, cookies, session variables and web server variables}
-\label{webware.input}
-
-General variable tips that also apply to servlets are in section
-\ref{tips.placeholder}.
-
-To look up a CGI GET or POST parameter (with POST overriding):
-\begin{verbatim}
-$request.field('myField')
-self.request().field('myField')
-\end{verbatim}
-These will fail if Webware is not available, because \code{\$request}
-(aka \code{self.request()} will be \code{None} rather than a Webware
-\code{WebKit.Request} object. If you plan to read a lot of CGI parameters,
-you may want to put the \code{.fields} method into a local variable for
-convenience:
-\begin{verbatim}
-#set $fields = $request.fields
-$fields.myField
-\end{verbatim}
-But remember to do complicated calculations in Python, and assign the results
-to simple variables in the searchList for display. These \code{\$request}
-forms are useful only for occasions where you just need one or two simple
-request items that going to Python for would be overkill.
-
-To get a cookie or session parameter, subsitute ``cookie'' or ``session'' for
-``field'' above. To get a dictionary of all CGI parameters, substitute
-``fields'' (ditto for ``cookies''). To verify a field exists,
-substitute ``hasField'' (ditto for ``hasCookie'').
-
-Other useful request goodies:
-\begin{verbatim}
-## Defined in WebKit.Request
-$request.field('myField', 'default value')
-$request.time ## Time this request began in Unix ticks.
-$request.timeStamp ## Time in human-readable format ('asctime' format).
-## Defined in WebKit.HTTPRequest
-$request.hasField.myField ## Is a CGI parameter defined?
-$request.fields ## Dictionary of all CGI parameters.
-$request.cookie.myCookie ## A cookie parameter (also .hasCookie, .cookies).
-$request.value.myValue ## A field or cookie variable (field overrides)
- ## (also .hasValue).
-$request.session.mySessionVar # A session variable.
-$request.extraURLPath ## URL path components to right of servlet, if any.
-$request.serverDictionary ## Dict of environmental vars from web server.
-$request.remoteUser ## Authenticated username. HTTPRequest.py source
- ## suggests this is broken and always returns None.
-$request.remoteAddress ## User's IP address (string).
-$request.remoteName ## User's domain name, or IP address if none.
-$request.urlPath ## URI of this servlet.
-$request.urlPathDir ## URI of the directory containing this servlet.
-$request.serverSidePath ## Absolute path of this servlet on local filesystem.
-$request.serverURL ## URL of this servlet, without "http://" prefix,
- ## extra path info or query string.
-$request.serverURLDir ## URL of this servlet's directory, without "http://".
-$log("message") ## Put a message in the Webware server log. (If you
- ## define your own 'log' variable, it will override
- ## this; use $self.log("message") in that case.
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{.webInput()}
-\label{webware.webInput}
-
-From the method docstring:
-
-\begin{verbatim}
- def webInput(self, names, namesMulti=(), default='', src='f',
- defaultInt=0, defaultFloat=0.00, badInt=0, badFloat=0.00, debug=False):
-
-This method places the specified GET/POST fields, cookies or session variables
-into a dictionary, which is both returned and put at the beginning of the
-searchList. It handles:
- * single vs multiple values
- * conversion to integer or float for specified names
- * default values/exceptions for missing or bad values
- * printing a snapshot of all values retrieved for debugging
-All the 'default*' and 'bad*' arguments have "use or raise" behavior, meaning
-that if they're a subclass of Exception, they're raised. If they're anything
-else, that value is substituted for the missing/bad value.
-
-The simplest usage is:
-
- #silent $webInput(['choice'])
- $choice
-
- dic = self.webInput(['choice'])
- write(dic['choice'])
-
-Both these examples retrieves the GET/POST field 'choice' and print it. If you
-leave off the "#silent", all the values would be printed too. But a better way
-to preview the values is
-
- #silent $webInput(['name'], $debug=1)
-
-because this pretty-prints all the values inside HTML <PRE> tags.
-
-Since we didn't specify any coversions, the value is a string. It's a "single"
-value because we specified it in 'names' rather than 'namesMulti'. Single
-values work like this:
- * If one value is found, take it.
- * If several values are found, choose one arbitrarily and ignore the rest.
- * If no values are found, use or raise the appropriate 'default*' value.
-
-Multi values work like this:
- * If one value is found, put it in a list.
- * If several values are found, leave them in a list.
- * If no values are found, use the empty list ([]). The 'default*'
- arguments are *not* consulted in this case.
-
-Example: assume 'days' came from a set of checkboxes or a multiple combo box
-on a form, and the user chose "Monday", "Tuesday" and "Thursday".
-
- #silent $webInput([], ['days'])
- The days you chose are: #slurp
- #for $day in $days
- $day #slurp
- #end for
-
- dic = self.webInput([], ['days'])
- write("The days you chose are: ")
- for day in dic['days']:
- write(day + " ")
-
-Both these examples print: "The days you chose are: Monday Tuesday Thursday".
-
-By default, missing strings are replaced by "" and missing/bad numbers by zero.
-(A "bad number" means the converter raised an exception for it, usually because
-of non-numeric characters in the value.) This mimics Perl/PHP behavior, and
-simplifies coding for many applications where missing/bad values *should* be
-blank/zero. In those relatively few cases where you must distinguish between
-""/zero on the one hand and missing/bad on the other, change the appropriate
-'default*' and 'bad*' arguments to something like:
- * None
- * another constant value
- * $NonNumericInputError/self.NonNumericInputError
- * $ValueError/ValueError
-(NonNumericInputError is defined in this class and is useful for
-distinguishing between bad input vs a TypeError/ValueError
-thrown for some other reason.)
-
-Here's an example using multiple values to schedule newspaper deliveries.
-'checkboxes' comes from a form with checkboxes for all the days of the week.
-The days the user previously chose are preselected. The user checks/unchecks
-boxes as desired and presses Submit. The value of 'checkboxes' is a list of
-checkboxes that were checked when Submit was pressed. Our task now is to
-turn on the days the user checked, turn off the days he unchecked, and leave
-on or off the days he didn't change.
-
- dic = self.webInput([], ['dayCheckboxes'])
- wantedDays = dic['dayCheckboxes'] # The days the user checked.
- for day, on in self.getAllValues():
- if not on and wantedDays.has_key(day):
- self.TurnOn(day)
- # ... Set a flag or insert a database record ...
- elif on and not wantedDays.has_key(day):
- self.TurnOff(day)
- # ... Unset a flag or delete a database record ...
-
-'source' allows you to look up the variables from a number of different
-sources:
- 'f' fields (CGI GET/POST parameters)
- 'c' cookies
- 's' session variables
- 'v' "values", meaning fields or cookies
-
-In many forms, you're dealing only with strings, which is why the
-'default' argument is third and the numeric arguments are banished to
-the end. But sometimes you want automatic number conversion, so that
-you can do numeric comparisons in your templates without having to
-write a bunch of conversion/exception handling code. Example:
-
- #silent $webInput(['name', 'height:int'])
- $name is $height cm tall.
- #if $height >= 300
- Wow, you're tall!
- #else
- Pshaw, you're short.
- #end if
-
- dic = self.webInput(['name', 'height:int'])
- name = dic[name]
- height = dic[height]
- write("%s is %s cm tall." % (name, height))
- if height > 300:
- write("Wow, you're tall!")
- else:
- write("Pshaw, you're short.")
-
-To convert a value to a number, suffix ":int" or ":float" to the name. The
-method will search first for a "height:int" variable and then for a "height"
-variable. (It will be called "height" in the final dictionary.) If a numeric
-conversion fails, use or raise 'badInt' or 'badFloat'. Missing values work
-the same way as for strings, except the default is 'defaultInt' or
-'defaultFloat' instead of 'default'.
-
-If a name represents an uploaded file, the entire file will be read into
-memory. For more sophisticated file-upload handling, leave that name out of
-the list and do your own handling, or wait for Cheetah.Utils.UploadFileMixin.
-
-This mixin class works only in a subclass that also inherits from
-Webware's Servlet or HTTPServlet. Otherwise you'll get an AttributeError
-on 'self.request'.
-
-EXCEPTIONS: ValueError if 'source' is not one of the stated characters.
-TypeError if a conversion suffix is not ":int" or ":float".
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{More examples}
-\label{webware.examples}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example A -- a standalone servlet}
-%\label{}
-
-% @@MO:
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example B -- a servlet under a site framework}
-%\label{}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example C -- several servlets with a common template}
-%\label{}
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Other Tips}
-\label{webware.otherTips}
-
-If your servlet accesses external files (e.g., via an \code{\#include}
-directive), remember that the current directory is not necessarily directory
-the servlet is in. It's probably some other directory WebKit chose. To find a
-file relative to the servlet's directory, prefix the path with whatever
-\code{self.serverSidePath()} returns (from \code{Servlet.serverSidePath()}.
-
-If you don't understand how \code{\#extends} and \code{\#implements} work, and
-about a template's main method, read the chapter on inheritance (sections
-\ref{inheritanceEtc.extends} and \ref{inheritanceEtc.implements}). This may
-help you avoid buggy servlets.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab
-
-
-
-``Template`` subclasses Webware's ``Servlet`` class when available,
-so the generated class can be used as a Webware servlet. This is practical
-only with precompiled templates.
-
diff --git a/docs/users_guide_2_src/15_otherHtml.txt b/docs/users_guide_2_src/15_otherHtml.txt
deleted file mode 100755
index 89fd58a..0000000
--- a/docs/users_guide_2_src/15_otherHtml.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{non-Webware HTML output}
-\label{otherHTML}
-
-Cheetah can be used with all types of HTML output, not just with Webware.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Static HTML Pages}
-\label{otherHTML.static}
-
-Some sites like Linux Gazette (\url{http://www.linuxgazette.com/}) require
-completely static pages because they are mirrored on servers running completely
-different software from the main site. Even dynamic sites may have one or
-two pages that are static for whatever reason, and the site administrator may
-wish to generate those pages from Cheetah templates.
-
-There's nothing special here. Just create your templates as usual. Then
-compile and fill them whenever the template definition changes, and fill them
-again whenever the placeholder values change. You may need an extra step to
-copy the .html files to their final location. A Makefile (chapter
-\ref{tips.Makefile}) can help encapsulate these steps.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{CGI scripts}
-\label{otherHTML}
-
-Unlike Webware servlets, which don't have to worry about the HTTP headers,
-CGI scripts must emit their own headers. To make a template CGI aware, add
-this at the top:
-\begin{verbatim}
-#extends Cheetah.Tools.CGITemplate
-#implements respond
-$cgiHeaders#slurp
-\end{verbatim}
-
-Or if your template is inheriting from a Python class:
-\begin{verbatim}
-#extends MyPythonClass
-#implements respond
-$cgiHeaders#slurp
-\end{verbatim}
-
-A sample Python class:
-\begin{verbatim}
-from Cheetah.Tools import CGITemplate
-class MyPythonClass(CGITemplate):
- def cgiHeadersHook(self):
- return "Content-Type: text/html; charset=koi8-r\n\n"
-\end{verbatim}
-
-
-Compile the template as usual, put the .py template module in your
-cgi-bin directory and give it execute permission. \code{.cgiHeaders()} is
-a ``smart'' method that outputs the headers if the module is called as a
-CGI script, or outputs nothing if not. Being ``called as a CGI script''
-means the environmental variable \code{REQUEST\_METHOD} exists and
-\code{self.isControlledByWebKit} is false. If you don't agree with that
-definition, override \code{.isCgi()} and provide your own.
-
-The default header is a simple \verb+Content-type: text/html\n\n+, which works
-with all CGI scripts. If you want to customize the headers (e.g., to
-specify the character set), override \code{.cgiHeadersHook()} and return
-a string containing all the headers. Don't forget to include the extra
-newline at the end of the string: the HTTP protocol requires this empty
-line to mark the end of the headers.
-
-To read GET/POST variables from form input, use the \code{.webInput()} method
-(section \ref{webware.webInput}), or extract them yourself using Python's
-\code{cgi} module or your own function. Although \code{.webInput()} was
-originally written for Webware servlets, it now handles CGI scripts too. There
-are a couple behavioral differences between CGI scripts and Webware servlets
-regarding input variables:
-
-\begin{enumerate}
-\item CGI scripts, using Python's \code{cgi} module, believe
- \code{REQUEST\_METHOD} and recognize {\em either} GET variables {\em or}
- POST variables, not both. Webware servlets, doing additional processing,
- ignore \code{REQUEST\_METHOD} and recognize both, like PHP does.
-\item Webware servlets can ask for cookies or session variables instead of
- GET/POST variables, by passing the argument \code{src='c'} or
- \code{src='s'}. CGI scripts get a \code{RuntimeError} if they try to do
- this.
-\end{enumerate}
-
-If you keep your .tmpl files in the same directory as your CGI scripts, make
-sure they don't have execute permission. Apache at least refuses to serve
-files in a \code{ScriptAlias} directory that don't have execute permission.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_2_src/16_nonHtml.txt b/docs/users_guide_2_src/16_nonHtml.txt
deleted file mode 100755
index b618ab0..0000000
--- a/docs/users_guide_2_src/16_nonHtml.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Non-HTML Output}
-\label{nonHTML}
-
-Cheetah can also output any other text format besides HTML.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Python source code}
-\label{nonHTML.python}
-
-To be written. We're in the middle of working on an autoindenter to
-make it easier to encode Python indentation in a Cheetah template.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_2_src/17_libraries.txt b/docs/users_guide_2_src/17_libraries.txt
deleted file mode 100755
index dc9231a..0000000
--- a/docs/users_guide_2_src/17_libraries.txt
+++ /dev/null
@@ -1,306 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Batteries included: templates and other libraries}
-\label{libraries}
-
-Cheetah comes ``batteries included'' with libraries of templates, functions,
-classes and other objects you can use in your own programs. The different
-types are listed alphabetically below, followed by a longer description of
-the SkeletonPage framework. Some of the objects are classes for specific
-purposes (e.g., filters or error catchers), while others are standalone and
-can be used without Cheetah.
-
-If you develop any objects which are generally useful for Cheetah sites,
-please consider posting them on the wiki with an announcement on the mailing
-list so we can incorporate them into the standard library. That way, all
-Cheetah users will benefit, and it will encourage others to contribute their
-objects, which might include something you want.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{ErrorCatchers}
-\label{libraries.ErrorCatchers}
-
-Module \code{Cheetah.ErrorCatchers} contains error-handling classes suitable for
-the \code{\#errorCatcher} directive. These are debugging tools that are not
-intended for use in production systems. See section
-\ref{errorHandling.errorCatcher} for a description of the error catchers bundled
-with Cheetah.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{FileUtils}
-\label{libraries.FileUtils}
-
-Module \code{Cheetah.FileUtils} contains generic functions and classes for
-doing bulk search-and-replace on several files, and for finding all the files
-in a directory hierarchy whose names match a glob pattern.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Filters}
-\label{libraries.Filters}
-
-Module \code{Filters} contains filters suitable for the \code{\#Filter}
-directive. See section \ref{output.filter} for a description of the
-filters bundled with Cheetah.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{SettingsManager}
-\label{libraries.SettingsManager}
-
-The \code{SettingsManager} class in the \code{Cheetah.SettingsManager} module is
-a baseclass that provides facilities for managing application settings. It
-facilitates the use of user-supplied configuration files to fine tune an
-application. A setting is a key/value pair that an application or component
-(e.g., a filter, or your own servlets) looks up and treats as a configuration
-value to modify its (the component's) behaviour.
-
-SettingsManager is designed to:
-\begin{itemize}
-\item work well with nested settings dictionaries of any depth
-\item read/write \code{.ini style config files} (or strings)
-\item read settings from Python source files (or strings) so that
- complex Python objects can be stored in the application's settings
- dictionary. For example, you might want to store references to various
- classes that are used by the application, and plugins to the application
- might want to substitute one class for another.
-\item allow sections in \code{.ini config files} to be extended by settings in
- Python src files. If a section contains a setting like
- ``\code{importSettings=mySettings.py}'', \code{SettingsManager} will merge
- all the settings defined in ``\code{mySettings.py}'' with the settings for
- that section that are defined in the \code{.ini config file}.
-\item maintain the case of setting names, unlike the ConfigParser module
-\end{itemize}
-
-Cheetah uses \code{SettingsManager} to manage its configuration settings.
-\code{SettingsManager} might also be useful in your own applications. See the
-source code and docstrings in the file \code{src/SettingsManager.py} for more
-information.
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Templates}
-\label{libraries.templates}
-
-Package \code{Cheetah.Templates} contains stock templates that you can
-either use as is, or extend by using the \code{\#def} directive to redefine
-specific {\bf blocks}. Currently, the only template in here is SkeletonPage,
-which is described in detail below in section
-\ref{libraries.templates.skeletonPage}. (Contributed by Tavis Rudd.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Tools}
-\label{libraries.Tools}
-
-Package \code{Cheetah.Tools} contains functions and classes contributed by third
-parties. Some are Cheetah-specific but others are generic and can be used
-standalone. None of them are imported by any other Cheetah component; you can
-delete the Tools/ directory and Cheetah will function fine.
-
-Some of the items in Tools/ are experimental and have been placed there just to
-see how useful they will be, and whether they attract enough users to make
-refining them worthwhile (the tools, not the users :).
-
-Nothing in Tools/ is guaranteed to be: (A) tested, (B) reliable, (C) immune
-from being deleted in a future Cheetah version, or (D) immune from
-backwards-incompatable changes. If you depend on something in Tools/ on a
-production system, consider making a copy of it outside the Cheetah/ directory
-so that this version won't be lost when you upgrade Cheetah. Also, learn
-enough about Python and about the Tool so that you can maintain it and bugfix
-it if necessary.
-
-If anything in Tools/ is found to be necessary to Cheetah's operation (i.e., if
-another Cheetah component starts importing it), it will be moved to the
-\code{Cheetah.Utils} package.
-
-Current Tools include:
-\begin{description}
-\item{Cheetah.Tools.MondoReport} an ambitious class useful when
- iterating over records of data (\code{\#for} loops), displaying one
- pageful of records at a time (with previous/next links), and printing
- summary statistics about the records or the current page. See
- \code{MondoReportDoc.txt} in the same directory as the module. Some
- features are not implemented yet. \code{MondoReportTest.py} is a test
- suite (and it shows there are currently some errors in MondoReport, hmm).
- Contributed by Mike Orr.
-
-\item{Cheetah.Tools.RecursiveNull} Nothing, but in a friendly way. Good
- for filling in for objects you want to hide. If \code{\$form.f1} is a
- RecursiveNull object, then \code{\$form.f1.anything["you"].might("use")}
- will resolve to the empty string. You can also put a \code{RecursiveNull}
- instance at the end of the searchList to convert missing values to ''
- rather than raising a \code{NotFound} error or having a (less efficient)
- errorCatcher handle it. Of course, maybe you prefer to get a
- \code{NotFound} error... Contributed by Ian Bicking.
-
-\item{Cheetah.Tools.SiteHierarchy} Provides navigational links to this
- page's parents and children. The constructor takes a recursive list of
- (url,description) pairs representing a tree of hyperlinks to every page in
- the site (or section, or application...), and also a string containing the
- current URL. Two methods 'menuList' and 'crumbs' return output-ready HTML
- showing an indented menu (hierarchy tree) or crumbs list (Yahoo-style bar:
- home > grandparent > parent > currentURL). Contributed by Ian Bicking.
-
-\item
-\end{description}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Utils}
-\label{libraries.Utils}
-
-Package \code{Cheetah.Utils} contains non-Cheetah-specific functions and
-classes that are imported by other Cheetah components. Many of these utils can
-be used standalone in other applications too.
-
-Current Utils include:
-\begin{description}
-\item{Cheetah.Utils.CGIImportMixin} This is inherited by \code{Template}
- objects, and provides the method, \code{.cgiImport} method
- (section \ref{webware.cgiImport}).
-
-\item{Cheetah.Utils.Misc} A catch-all module for small functions.
- \begin{description}
- \item{\code{UseOrRaise(thing, errmsg='')}} Raise 'thing' if it's a
- subclass of Exception, otherwise return it. Useful when one
- argument does double duty as a default value or an exception to
- throw. Contribyted by Mike Orr.
-
- \item{\code{checkKeywords(dic, legalKeywords, what='argument'}}
- Verifies the dictionary does not contain any keys not listed in
- 'legalKeywords'. If it does, raise TypeError. Useful for
- checking the keyword arguments to a function. Contributed by
- Mike Orr.
- \end{description}
-
-\item{Cheetah.Utils.UploadFileMixin} Not implemented yet, but will contain
- the \code{.uploadFile} method (or three methods) to ``safely'' copy a
- form-uploaded file to a local file, to a searchList variable, or return
- it. When finished, this will be inherited by \code{Template}, allowing
- all templates to do this. If you want this feature, read the docstring
- in the source and let us know on the mailing list what you'd like this
- method to do. Contributed by Mike Orr.
-
-\item{Cheetah.Utils.VerifyType} Functions to verify the type of a
- user-supplied function argument. Contributed by Mike Orr.
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Cheetah.Templates.SkeletonPage}
-\label{libraries.templates.skeletonPage}
-
-A stock template class that may be useful for web developers is defined in
-the \code{Cheetah.Templates.SkeletonPage} module. The \code{SkeletonPage}
-template class is generated from the following Cheetah source code:
-
-\begin{verbatim}
-##doc-module: A Skeleton HTML page template, that provides basic structure and utility methods.
-################################################################################
-#extends Cheetah.Templates._SkeletonPage
-#implements respond
-################################################################################
-#cache id='header'
-$docType
-$htmlTag
-<!-- This document was autogenerated by Cheetah(http://CheetahTemplate.org).
-Do not edit it directly!
-
-Copyright $currentYr - $siteCopyrightName - All Rights Reserved.
-Feel free to copy any javascript or html you like on this site,
-provided you remove all links and/or references to $siteDomainName
-However, please do not copy any content or images without permission.
-
-$siteCredits
-
--->
-
-
-#block writeHeadTag
-<head>
-<title>$title</title>
-$metaTags
-$stylesheetTags
-$javascriptTags
-</head>
-#end block writeHeadTag
-
-#end cache header
-#################
-
-$bodyTag
-
-#block writeBody
-This skeleton page has no flesh. Its body needs to be implemented.
-#end block writeBody
-
-</body>
-</html>
-\end{verbatim}
-
-You can redefine any of the blocks defined in this template by writing a new
-template that \code{\#extends} SkeletonPage. (As you remember, using
-\code{\#extends} makes your template implement the \code{.writeBody()}
-method instead of \code{.respond()} -- which happens to be the same method
-SkeletonPage expects the page content to be (note the writeBody block in
-SkeletonPage).)
-
-\begin{verbatim}
-#def bodyContents
-Here's my new body. I've got some flesh on my bones now.
-#end def bodyContents
-\end{verbatim}
-
-%% @@MO: Is this still accurate? Does the child template really need to put a
-%% #def around its whole content? Or by implementing .writeBody() does it
-%% automatically insert itself as the writeBody portion of
-%% SkeletonPage? @@TR 2005-01-06: it happens automatically at the moment.
-
-All of the \$placeholders used in the \code{SkeletonPage} template definition
-are attributes or methods of the \code{SkeletonPage} class. You can reimplement
-them as you wish in your subclass. Please read the source code of the file
-\code{src/Templates/\_SkeletonPage.py} before doing so.
-
-You'll need to understand how to use the following methods of the
-\code{SkeletonPage} class: \code{\$metaTags()}, \code{\$stylesheetTags()},
-\code{\$javascriptTags()}, and \code{\$bodyTag()}. They take the data you
-define in various attributes and renders them into HTML tags.
-
-\begin{itemize}
-\item {\bf metaTags()} -- Returns a formatted vesion of the self.\_metaTags
- dictionary, using the formatMetaTags function from
- \code{\_SkeletonPage.py}.
-\item {\bf stylesheetTags()} -- Returns a formatted version of the
- \code{self.\_stylesheetLibs} and \code{self.\_stylesheets} dictionaries.
- The keys in \code{self.\_stylesheets} must be listed in the order that
- they should appear in the list \code{self.\_stylesheetsOrder}, to ensure
- that the style rules are defined in the correct order.
-\item {\bf javascriptTags()} -- Returns a formatted version of the
- \code{self.\_javascriptTags} and \code{self.\_javascriptLibs} dictionaries.
- Each value in \code{self.\_javascriptTags} should be a either a code string
- to include, or a list containing the JavaScript version number and the code
- string. The keys can be anything. The same applies for
- \code{self.\_javascriptLibs}, but the string should be the SRC filename
- rather than a code string.
-\item {\bf bodyTag()} -- Returns an HTML body tag from the entries in the dict
- \code{self.\_bodyTagAttribs}.
-\end{itemize}
-
-The class also provides some convenience methods that can be used as
-\$placeholders in your template definitions:
-
-\begin{itemize}
-\item {\bf imgTag(self, src, alt='', width=None, height=None, border=0)} --
- Dynamically generate an image tag. Cheetah will try to convert the
- ``\code{src}'' argument to a WebKit serverSidePath relative to the
- servlet's location. If width and height aren't specified they are
- calculated using PIL or ImageMagick if either of these tools are available.
- If all your images are stored in a certain directory you can reimplement
- this method to append that directory's path to the ``\code{src}'' argument.
- Doing so would also insulate your template definitions from changes in your
- directory structure.
-\end{itemize}
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/18_editors.txt b/docs/users_guide_2_src/18_editors.txt
deleted file mode 100755
index 84c8f03..0000000
--- a/docs/users_guide_2_src/18_editors.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-\section{Visual Editors}
-\label{visualEditors}
-
-This chapter is about maintaining Cheetah templates with visual editors,
-and the tradeoffs between making it friendly to both text editors and visual
-editors.
-
-Cheetah's main developers do not use visual editors. Tavis uses \code{emacs};
-Mike uses \code{vim}. So our first priority is to make templates easy to
-maintain in text editors. In particular, we don't want to add features
-like Zope Page Template's
-placeholder-value-with-mock-text-for-visual-editors-all-in-an-XML-tag.
-The syntax is so verbose it makes for a whole lotta typing just to insert a
-simple placeholder, for the benefit of editors we never use. However, as users
-identify features which would help their visual editing without making it
-harder to maintain templates in a text editor, we're all for it.
-
-As it said in the introduction, Cheetah purposely does not use HTML/XML
-tags for \$placeholders or \#directives. That way, when you preview the
-template in an editor that interprets HTML tags, you'll still see the
-placeholder and directive source definitions, which provides some ``mock text''
-even if it's not the size the final values will be, and allows you to use
-your imagination to translate how the directive output will look visually in
-the final.
-
-If your editor has syntax highlighting, turn it on. That makes a big
-difference in terms of making the template easier to edit. Since no
-``Cheetah mode'' has been invented yet, set your highlighting to Perl
-mode, and at least the directives/placeholders will show up in different
-colors, although the editor won't reliably guess where the
-directive/placeholder ends and normal text begins.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_2_src/A_links.txt b/docs/users_guide_2_src/A_links.txt
deleted file mode 100755
index 1ec2f6c..0000000
--- a/docs/users_guide_2_src/A_links.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-\section{Useful Web Links}
-\label{links}
-
-See the wiki for more links. (The wiki is also updated more often than this
-chapter is.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah Links}
-\label{links.cheetah}
-
-\begin{description}
-\item[Home Page] -- \url{http:www.CheetahTemplate.org/}
-
-\item[On-line Documentation] -- \url{http:www.CheetahTemplate.org/learn.html}
-
-\item[SourceForge Project Page] -- \url{http:sf.net/projects/cheetahtemplate/}
-
-\item[Mailing List Subscription Page] --
- \url{http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss}
-
-\item[Mailing List Archive @ Geocrawler] --
- \url{http://www.geocrawler.com/lists/3/SourceForge/12986/0/}
-
-\item[Mailing List Archive @ Yahoo] --
- \url{http://groups.yahoo.com/group/cheetah-archive/}
-
-\item[CVS Repository] -- \url{http://sourceforge.net/cvs/?group\_id=28961}
-
-\item[CVS-commits archive] --
- \url{http://www.geocrawler.com/lists/3/SourceForge/13091/0/}
-
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Third-party Cheetah Stuff}
-\label{links.thirdParty}
-
-\begin{itemize}
-\item Steve Howell has written a photo viewer using Python.
- \url{http://mountainwebtools.com/PicViewer/install.htm}
-\end{itemize}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Webware Links}
-\label{links.webware}
-
-\begin{description}
-\item[Home Page] -- \url{http://webware.sf.net/}
-
-\item[On-line Documentation] -- \url{http://webware.sf.net/Webware/Docs/}
-
-\item[SourceForge Project Page] -- \url{http://sf.net/projects/webware/}
-
-\item[Mailing List Subscription Page] --
- \url{http://lists.sourceforge.net/lists/listinfo/webware-discuss}
-
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Python Links}
-\label{links.python}
-
-\begin{description}
-\item[Home Page] -- \url{http://www.python.org/}
-\item[On-line Documentation] -- \url{http://www.python.org/doc/}
-\item[SourceForge Project Page] -- \url{http://sf.net/projects/python/}
-\item[The Vaults of Parnassus: Python Resources] --
- \url{http://www.vex.net/parnassus/}
-\item[Python Cookbook] -- \url{http://aspn.activestate.com/ASPN/Cookbook/Python}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Other Useful Links}
-\label{links.other}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Python Database Modules and Open Source Databases}
-\label{links.database}
-
-\begin{description}
-\item[Python Database Topic Guide] -- \url{http://python.org/topics/database/}
-\item[PostgreSQL Database] -- \url{http://www.postgresql.org/index.html}
-\item[MySQL Database] -- \url{http://www.mysql.com/}
-\item[A comparison of PostgreSQL and MySQL] --
- \url{http://phpbuilder.com/columns/tim20001112.php3}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Other Template Systems}
-\label{links.other.templateSystems}
-
-\begin{description}
-\item[Chuck's ``Templates'' Summary Page] -- \url{http://webware.sf.net/Papers/Templates/}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Other Internet development frameworks}
-\label{links.internet}
-
-\begin{description}
-\item[ZOPE (Z Object Publishing Environment)] -- \url{http://zope.org/}
-\item[Server Side Java] -- \url{http://jakarta.apache.org/}
-\item[PHP] -- \url{http://php.net/}
-\item[IBM Websphere] -- \url{http://www.ibm.com/websphere/}
-\item[Coldfusion and Spectra] -- \url{http://www.macromedia.com/}
-\end{description}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/B_examples.txt b/docs/users_guide_2_src/B_examples.txt
deleted file mode 100755
index 6c394fb..0000000
--- a/docs/users_guide_2_src/B_examples.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-\section{Examples}
-\label{examples}
-
-The Cheetah distribution comes with an 'examples' directory. Browse the
-files in this directory and its subdirectories for examples of how
-Cheetah can be used.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Syntax examples}
-The \code{Cheetah.Tests} module contains a large number of test cases that can
-double as examples of how the Cheetah Language works. To view these cases go
-to the base directory of your Cheetah distribution and open the file
-\code{Cheetah/Tests/SyntaxAndOutput.py} in a text editor.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Webware Examples}
-For examples of Cheetah in use with Webware visit the Cheetah and Webware wikis
-or use google. We used to have more examples in the cheetah source tarball, but
-they were out of date and confused people.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/C_comparisions.txt b/docs/users_guide_2_src/C_comparisions.txt
deleted file mode 100755
index 56a0fb3..0000000
--- a/docs/users_guide_2_src/C_comparisions.txt
+++ /dev/null
@@ -1,451 +0,0 @@
-\section{Cheetah vs. Other Template Engines}
-\label{comparisons}
-
-This appendix compares Cheetah with various other template/emdedded scripting
-languages and Internet development frameworks. As Cheetah is similar to
-Velocity at a superficial level, you may also wish to read comparisons between
-Velocity and other languages at
-\url{http://jakarta.apache.org/velocity/ymtd/ymtd.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Which features are unique to Cheetah}
-\label{comparisons.unique}
-
-\begin{itemize}
-\item The {\bf block framework} (section \ref{inheritanceEtc.block})
-\item Cheetah's powerful yet simple {\bf caching framework} (section
- \ref{output.caching})
-\item Cheetah's {\bf Unified Dotted Notation} and {\bf autocalling}
- (sections \ref{language.namemapper.dict} and
- \ref{language.namemapper.autocalling})
-\item Cheetah's searchList (section \ref{language.searchList})
- information.
-\item Cheetah's \code{\#raw} directive (section \ref{output.raw})
-\item Cheetah's \code{\#slurp} directive (section \ref{output.slurp})
-\item Cheetah's tight integration with Webware for Python (section
- \ref{webware})
-\item Cheetah's {\bf SkeletonPage framework} (section
- \ref{libraries.templates.skeletonPage})
-\item Cheetah's ability to mix PSP-style code with Cheetah
- Language syntax (section \ref{tips.PSP})
- Because of Cheetah's design and Python's flexibility it is
- relatively easy to extend Cheetah's syntax with syntax elements from almost
- any other template or embedded scripting language.
-\end{itemize}
-
-%% @@MO: What about the new features we've been adding?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Velocity}
-\label{comparisons.velocity}
-
-For a basic introduction to Velocity, visit
-\url{http://jakarta.apache.org/velocity}.
-
-Velocity is a Java template engine. It's older than Cheetah, has a larger user
-base, and has better examples and docs at the moment. Cheetah, however, has a
-number of advantages over Velocity:
-\begin{itemize}
-\item Cheetah is written in Python. Thus, it's easier to use and extend.
-\item Cheetah's syntax is closer to Python's syntax than Velocity's is to
-Java's.
-\item Cheetah has a powerful caching mechanism. Velocity has no equivalent.
-\item It's far easier to add data/objects into the namespace where \$placeholder
- values are extracted from in Cheetah. Velocity calls this namespace a 'context'.
- Contexts are dictionaries/hashtables. You can put anything you want into a
- context, BUT you have to use the .put() method to populate the context;
- e.g.,
-
-\begin{verbatim}
-VelocityContext context1 = new VelocityContext();
-context1.put("name","Velocity");
-context1.put("project", "Jakarta");
-context1.put("duplicate", "I am in context1");
-\end{verbatim}
-
- Cheetah takes a different approach. Rather than require you to manually
- populate the 'namespace' like Velocity, Cheetah will accept any existing
- Python object or dictionary AS the 'namespace'. Furthermore, Cheetah
- allows you to specify a list namespaces that will be searched in sequence
- to find a varname-to-value mapping. This searchList can be extended at
- run-time.
-
- If you add a `foo' object to the searchList and the `foo' has an attribute
- called 'bar', you can simply type \code{\$bar} in the template. If the
- second item in the searchList is dictionary 'foofoo' containing
- \code{\{'spam':1234, 'parrot':666\}}, Cheetah will first look in the `foo'
- object for a `spam' attribute. Not finding it, Cheetah will then go to
- `foofoo' (the second element in the searchList) and look among its
- dictionary keys for `spam'. Finding it, Cheetah will select
- \code{foofoo['spam']} as \code{\$spam}'s value.
-
-\item In Cheetah, the tokens that are used to signal the start of
- \$placeholders and \#directives are configurable. You can set them to any
- character sequences, not just \$ and \#.
-\end{itemize}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. WebMacro}
-\label{comparisons.webmacro}
-
-For a basic introduction to WebMacro, visit
-\url{http://webmacro.org}.
-
-The points discussed in section \ref{comparisons.velocity} also apply to the
-comparison between Cheetah and WebMacro. For further differences please refer
-to \url{http://jakarta.apache.org/velocity/differences.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope's DTML}
-\label{comparisons.dtml}
-
-For a basic introduction to DTML, visit
-\url{http://www.zope.org/Members/michel/ZB/DTML.dtml}.
-
-\begin{itemize}
-\item Cheetah is faster than DTML.
-\item Cheetah does not use HTML-style tags; DTML does. Thus, Cheetah tags are
- visible in rendered HTML output if something goes wrong.
-\item DTML can only be used with ZOPE for web development; Cheetah can be
- used as a standalone tool for any purpose.
-\item Cheetah's documentation is more complete than DTML's.
-\item Cheetah's learning curve is shorter than DTML's.
-\item DTML has no equivalent of Cheetah's blocks, caching framework,
- unified dotted notation, and \code{\#raw} directive.
-\end{itemize}
-
-Here are some examples of syntax differences between DTML and Cheetah:
-\begin{verbatim}
-<ul>
-<dtml-in frogQuery>
- <li><dtml-var animal_name></li>
-</dtml-in>
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<ul>
-#for $animal_name in $frogQuery
- <li>$animal_name</li>
-#end for
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<dtml-if expr="monkeys > monkey_limit">
- <p>There are too many monkeys!</p>
-<dtml-elif expr="monkeys < minimum_monkeys">
- <p>There aren't enough monkeys!</p>
-<dtml-else>
- <p>There are just enough monkeys.</p>
-</dtml-if>
-\end{verbatim}
-
-\begin{verbatim}
-#if $monkeys > $monkey_limit
- <p>There are too many monkeys!</p>
-#else if $monkeys < $minimum_monkeys
- <p>There aren't enough monkeys!</p>
-#else
- <p>There are just enough monkeys.</p>
-#end if
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-<dtml-in expr="objectValues('File')">
- <dtml-if sequence-even>
- <tr bgcolor="grey">
- <dtml-else>
- <tr>
- </dtml-if>
- <td>
- <a href="&dtml-absolute_url;"><dtml-var title_or_id></a>
- </td></tr>
-</dtml-in>
-</table>
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-#set $evenRow = 0
-#for $file in $files('File')
- #if $evenRow
- <tr bgcolor="grey">
- #set $evenRow = 0
- #else
- <tr>
- #set $evenRow = 1
- #end if
- <td>
- <a href="$file.absolute_url">$file.title_or_id</a>
- </td></tr>
-#end for
-</table>
-\end{verbatim}
-
-The last example changed the name of \code{\$objectValues} to
-\code{\$files} because that's what a Cheetah developer would write.
-The developer would be responsible for ensuring \code{\$files} returned a
-list (or tuple) of objects (or dictionaries) containing the attributes (or
-methods or dictionary keys) `absolute\_url' and `title\_or\_id'. All these
-names (`objectValues', `absolute\_url' and `title\_or\_id') are standard parts
-of Zope, but in Cheetah the developer is in charge of writing them and giving
-them a reasonable behaviour.
-
-Some of DTML's features are being ported to Cheetah, such as
-\code{Cheetah.Tools.MondoReport}, which is based on the
-\code{<dtml-in>} tag. We are also planning an output filter as flexible as
-the \code{<dtml-var>} formatting options. However, neither of these are
-complete yet.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope Page Templates}
-\label{comparisons.zpt}
-
-For a basic introduction to Zope Page Templates, please visit
-\url{http://www.zope.org/Documentation/Articles/ZPT2}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHP's Smarty templates}
-\label{comparisons.smarty}
-
-PHP (\url{http://www.php.net/}) is one of the few scripting languages
-expressly designed for web servlets. However, it's also a full-fledged
-programming language with libraries similar to Python's and Perl's. The
-syntax and functions are like a cross between Perl and C plus some original
-ideas (e.g.; a single array type serves as both a list and a dictionary,
-\verb+$arr[]="value";+ appends to an array).
-
-Smarty (\url{http://smarty.php.net/}) is an advanced template engine for
-PHP. ({\em Note:} this comparision is based on Smarty's on-line documentation.
-The author has not used Smarty. Please send corrections or ommissions to the
-Cheetah mailing list.) Like Cheetah, Smarty:
-
-\begin{itemize}
-\item compiles to the target programming language (PHP).
-\item has configurable delimeters.
-\item passes if-blocks directly to PHP, so you can use any PHP expression in
-them.
-\item allows you to embed PHP code in a template.
-\item has a caching framework (although it works quite differently).
-\item can read the template definition from any arbitrary source.
-\end{itemize}
-
-Features Smarty has that Cheetah lacks:
-\begin{itemize}
-\item Preprocessors, postprocessors and output filters. You can emulate a
-preprocessor in Cheetah by running your template definition through a filter
-program or function before Cheetah sees it. To emulate a postprocessor, run a
-.py template module through a filter program/function. To emulate a Smarty
-output filter, run the template output through a filter program/function. If
-you want to use ``cheetah compile'' or ``cheetah fill'' in a pipeline, use
-\code{-} as the input file name and \code{--stdout} to send the result to
-standard output. Note that Cheetah uses the term ``output filter'' differently
-than Smarty: Cheetah output filters (\code{\#filter}) operate on placeholders,
-while Smarty output filters operate on the entire template output. There has
-been a proposed \code{\#sed} directive that would operate on the entire output
-line by line, but it has not been implemented.
-\item Variable modifiers. In some cases, Python has equivalent string
-methods (\code{.strip}, \code{.capitalize}, \code{.replace(SEARCH, REPL)}),
-but in other cases you must wrap the result in a function call or write
-a custom output filter (\code{\#filter}).
-\item Certain web-specific functions, which can be emulated with
-third-party functions.
-\item The ability to ``plug in'' new directives in a modular way. Cheetah
-directives are tightly bound to the compiler. However, third-party
-{\em functions} can be freely imported and called from placeholders, and
-{\em methods} can be mixed in via \code{\#extends}. Part of this is
-because Cheetah distinguishes between functions and directives, while
-Smarty treats them all as ``functions''. Cheetah's design does not
-allow functions to have flow control effect outside the function
-(e.g., \code{\#if} and \code{\#for}, which operate on template body lines),
-so directives like these cannot be encoded as functions.
-\item Configuration variables read from an .ini-style file. The
-\code{Cheetah.SettingsManager} module can parse such a file, but you'd
-have to invoke it manually. (See the docstrings in the module for
-details.) In Smarty, this feature is used for
-multilingual applications. In Cheetah, the developers maintain that everybody
-has their own preferred way to do this (such as using Python's \code{gettext}
-module), and it's not worth blessing one particular strategy in Cheetah since
-it's easy enough to integrate third-party code around the template, or to add
-the resulting values to the searchList.
-\end{itemize}
-
-Features Cheetah has that Smarty lacks:
-\begin{itemize}
-\item Saving the compilation result in a Python (PHP) module for quick
-reading later.
-\item Caching individual placeholders or portions of a template. Smarty
-caches only the entire template output as a unit.
-\end{itemize}
-
-Comparisions of various Smarty constructs:
-\begin{verbatim}
-{assign var="name" value="Bob"} (#set has better syntax in the author's opinion)
-counter (looks like equivalent to #for)
-eval (same as #include with variable)
-fetch: insert file content into output (#include raw)
-fetch: insert URL content into output (no euqivalent, user can write
- function calling urllib, call as $fetchURL('URL') )
-fetch: read file into variable (no equivalent, user can write function
- based on the 'open/file' builtin, or on .getFileContents() in
- Template.)
-fetch: read URL content into variable (no equivalent, use above
- function and call as: #set $var = $fetchURL('URL')
-html_options: output an HTML option list (no equivalent, user can
- write custom function. Maybe FunFormKit can help.)
-html_select_date: output three dropdown controls to specify a date
- (no equivalent, user can write custom function)
-html_select_time: output four dropdown controls to specify a time
- (no equvalent, user can write custom function)
-math: eval calculation and output result (same as #echo)
-math: eval calculation and assign to variable (same as #set)
-popup_init: library for popup windows (no equivalent, user can write
- custom method outputting Javascript)
-
-
-Other commands:
-capture (no equivalent, collects output into variable. A Python
- program would create a StringIO instance, set sys.stdout to
- it temporarily, print the output, set sys.stdout back, then use
- .getvalue() to get the result.)
-config_load (roughly analagous to #settings, which was removed
- from Cheetah. Use Cheetah.SettingsManager manually or write
- a custom function.)
-include (same as #include, but can include into variable.
- Variables are apparently shared between parent and child.)
-include_php: include a PHP script (e.g., functions)
- (use #extends or #import instead)
-insert (same as #include not in a #cache region)
-{ldelim}{rdelim} (escape literal $ and # with a backslash,
- use #compiler-settings to change the delimeters)
-literal (#raw)
-php (``<% %>'' tags)
-section (#for $i in $range(...) )
-foreach (#for)
-strip (like the #sed tag which was never implemented. Strips
- leading/trailing whitespace from lines, joins several lines
- together.)
-
-
-Variable modifiers:
-capitalize ( $STRING.capitalize() )
-count_characters ( $len(STRING) )
-count_paragraphs/sentances/words (no equivalent, user can write function)
-date_format (use 'time' module or download Egenix's mx.DateTime)
-default ($getVar('varName', 'default value') )
-escape: html encode ($cgi.escape(VALUE) )
-escape: url encode ($urllib.quote_plus(VALUE) )
-escape: hex encode (no equivalent? user can write function)
-escape: hex entity encode (no equivalent? user can write function)
-indent: indent all lines of a var's output (may be part of future
- #indent directive)
-lower ($STRING.lower() )
-regex_replace ('re' module)
-replace ($STRING.replace(OLD, NEW, MAXSPLIT) )
-spacify (#echo "SEPARATOR".join(SEQUENCE) )
-string_format (#echo "%.2f" % FLOAT , etc.)
-strip_tags (no equivalent, user can write function to strip HTML tags,
- or customize the WebSafe filter)
-truncate (no equivalent, user can write function)
-upper ($STRING.upper() )
-wordwrap ('writer' module, or a new module coming in Python 2.3)
-\end{verbatim}
-
-Some of these modifiers could be added to the super output filter we
-want to write someday.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHPLib's Template class}
-\label{comparisons.php}
-
-PHPLib (\url(http://phplib.netuse.de/) is a collection of classes for various
-web objects (authentication, shopping cart, sessions, etc), but what we're
-interested in is the \code{Template} object. It's much more primitive than
-Smarty, and was based on an old Perl template class. In fact, one of the
-precursors to Cheetah was based on it too. Differences from Cheetah:
-
-\begin{itemize}
-\item Templates consist of text with \code{\{placeholders\}} in braces.
-\item Instead of a searchList, there is one flat namespace. Every variable
- must be assigned via the \code{set\_var} method. However, you can pass
- this method an array (dictionary) of several variables at once.
-\item You cannot embed lookups or calculations into the template. Every
- placeholder must be an exact variable name.
-\item There are no directives. You must do all display logic (if, for, etc)
- in the calling routine.
-\item There is, however, a ``block'' construct. A block is a portion of text
- between the comment markers \code{<!-- BEGIN blockName --> \ldots
- <!-- END blockName>}. The \code{set\_block} method extracts this text
- into a namespace variable and puts a placeholder referring to it in the
- template. This has a few parallels with Cheetah's \code{\#block}
- directive but is overall quite different.
-\item To do the equivalent of \code{\#if}, extract the block. Then if true, do
- nothing. If false, assign the empty string to the namespace variable.
-\item To do the equivalent of \code{\#for}, extract the block. Set any
- namespace variables needed inside the loop. To parse one iteration, use
- the \code{parse} method to fill the block variable (a mini-template) into
- another namespace variable, appending to it. Refresh the namespace
- variables needed inside the loop and parse again; repeat for each
- iteration. You'll end up with a mini-result that will be plugged into the
- main template's placeholder.
-\item To read a template definition from a file, use the \code{set\_file}
- method. This places the file's content in a namespace variable.
- To read a template definition from a string, assign it to a namespace
- variable.
-\item Thus, for complicated templates, you are doing a lot of recursive block
- filling and file reading and parsing mini-templates all into one flat
- namespace as you finally build up values for the main template. In
- Cheetah, all this display logic can be embedded into the template using
- directives, calling out to Python methods for the more complicated tasks.
-\item Although you can nest blocks in the template, it becomes tedious and
- arguably hard to read, because all blocks have identical syntax. Unless
- you choose your block names carefully and put comments around them, it's
- hard to tell which blocks are if-blocks and which are for-blocks, or what
- their nesting order is.
-\item PHPLib templates do not have caching, output filters, etc.
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PSP, PHP, ASP, JSP, Embperl, etc.}
-\label{comparisons.pspEtc}
-
-\begin{description}
-\item[Webware's PSP Component] -- \url{http://webware.sourceforge.net/Webware/PSP/Docs/}
-\item[Tomcat JSP Information] -- \url{http://jakarta.apache.org/tomcat/index.html}
-\item[ASP Information at ASP101] -- \url{http://www.asp101.com/}
-\item[Embperl] -- \url{http://perl.apache.org/embperl/}
-\end{description}
-
-
-Here's a basic Cheetah example:
-\begin{verbatim}
-<TABLE>
-#for $client in $service.clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-\end{verbatim}
-
-Compare this with PSP:
-
-\begin{verbatim}
-<TABLE>
-<% for client in service.clients(): %>
-<TR>
-<TD><%=client.surname()%>, <%=client.firstname()%></TD>
-<TD><A HREF="mailto:<%=client.email()%>"><%=client.email()%></A></TD>
-</TR>
-<%end%>
-</TABLE>
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_2_src/E_license.txt b/docs/users_guide_2_src/E_license.txt
deleted file mode 100644
index 8a5a73f..0000000
--- a/docs/users_guide_2_src/E_license.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{License}
-\label{intro.license}
-
-\paragraph*{The gist}
-Cheetah is open source, but products developed with Cheetah or derived
-from Cheetah may be open source or closed source.
-
-(@@MO If this licence is identical to the MIT license, let's say so. That will
-make it easier for distributors/aggregators to classify the product.)
-
-\paragraph*{Legal terms}
-Copyright \copyright 2001-2006, The Cheetah Development Team: Tavis Rudd, Mike
-Orr, Ian Bicking, Chuck Esterbrook, JJ Behrens.
-
-(@@MO Who is the current development team? Chuck and Ian have not been major
-contributors for years. However, some of their code may remain in Cheetah.)
-
-Permission to use, copy, modify, and distribute this software for any purpose
-and without fee is hereby granted, provided that the above copyright notice
-appear in all copies and that both that copyright notice and this permission
-notice appear in supporting documentation, and that the names of the authors not
-be used in advertising or publicity pertaining to distribution of the software
-without specific, written prior permission.
-
-THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS
-BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
-CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/docs/users_guide_2_src/Makefile b/docs/users_guide_2_src/Makefile
deleted file mode 100644
index ad0b786..0000000
--- a/docs/users_guide_2_src/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-RST = rst2html.py --stylesheet=default.css --link-stylesheet --initial-header-level=2
-
-#%.html: %.txt
-# ${RST} $< $@
-
-all:
- #${RST} --warnings=/dev/null index.txt index.html
- ${RST} 01_introduction.txt 01_introduction.html
- ${RST} 02_glossary.txt 02_glossary.html
- ${RST} 03_gettingStarted.txt 03_gettingStarted.html
- ${RST} 04_howItWorks.txt 04_howItWorks.html
- ${RST} 04_howItWorks.txt 04_howItWorks.html
- ${RST} 13a_precompiledTemplateModules.txt 13a_precompiledTemplateModules.html
-
-
-# vim: sw=8 ts=8 noexpandtab ai
diff --git a/docs/users_guide_2_src/default.css b/docs/users_guide_2_src/default.css
deleted file mode 100644
index fa715d6..0000000
--- a/docs/users_guide_2_src/default.css
+++ /dev/null
@@ -1,293 +0,0 @@
-/* BEGIN Cheetah additions. *********************************** */
-
-body {
- /* font-size: 10pt; */
-}
-
-blockquote {
- font-family: sans-serif;
-}
-
-li {
- margin-bottom: 1em;
-}
-
-/* END Cheetah additions. ************************************ */
-
-/*
-:Author: David Goodger
-:Contact: goodger@users.sourceforge.net
-:Date: $Date: 2006/02/20 07:38:08 $
-:Revision: $Revision: 1.1 $
-:Copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
-customize this style sheet.
-*/
-
-/* "! important" is used here to override other ``margin-top`` and
- ``margin-bottom`` styles that are later in the stylesheet or
- more specific. See http://www.w3.org/TR/CSS1#the-cascade */
-.first {
- margin-top: 0 ! important }
-
-.last, .with-subtitle {
- margin-bottom: 0 ! important }
-
-.hidden {
- display: none }
-
-a.toc-backref {
- text-decoration: none ;
- color: black }
-
-blockquote.epigraph {
- margin: 2em 5em ; }
-
-dl.docutils dd {
- margin-bottom: 0.5em }
-
-dl.docutils dt {
- font-weight: bold }
-
-div.abstract {
- margin: 2em 5em }
-
-div.abstract p.topic-title {
- font-weight: bold ;
- text-align: center }
-
-div.admonition, div.attention, div.caution, div.danger, div.error,
-div.hint, div.important, div.note, div.tip, div.warning {
- margin: 2em ;
- border: medium outset ;
- padding: 1em }
-
-div.admonition p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
- font-weight: bold ;
- font-family: sans-serif }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
- color: red ;
- font-weight: bold ;
- font-family: sans-serif }
-
-/* Uncomment (and remove this text!) to get reduced vertical space in
- compound paragraphs.
-div.compound .compound-first, div.compound .compound-middle {
- margin-bottom: 0.5em }
-
-div.compound .compound-last, div.compound .compound-middle {
- margin-top: 0.5em }
-*/
-
-div.dedication {
- margin: 2em 5em ;
- text-align: center ;
- font-style: italic }
-
-div.dedication p.topic-title {
- font-weight: bold ;
- font-style: normal }
-
-div.figure {
- margin-left: 2em }
-
-div.footer, div.header {
- clear: both;
- font-size: smaller }
-
-div.line-block {
- display: block ;
- margin-top: 1em ;
- margin-bottom: 1em }
-
-div.line-block div.line-block {
- margin-top: 0 ;
- margin-bottom: 0 ;
- margin-left: 1.5em }
-
-div.sidebar {
- margin-left: 1em ;
- border: medium outset ;
- padding: 1em ;
- background-color: #ffffee ;
- width: 40% ;
- float: right ;
- clear: right }
-
-div.sidebar p.rubric {
- font-family: sans-serif ;
- font-size: medium }
-
-div.system-messages {
- margin: 5em }
-
-div.system-messages h1 {
- color: red }
-
-div.system-message {
- border: medium outset ;
- padding: 1em }
-
-div.system-message p.system-message-title {
- color: red ;
- font-weight: bold }
-
-div.topic {
- margin: 2em }
-
-h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
-h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
- margin-top: 0.4em }
-
-h1.title {
- text-align: center }
-
-h2.subtitle {
- text-align: center }
-
-hr.docutils {
- width: 75% }
-
-img.align-left {
- clear: left }
-
-img.align-right {
- clear: right }
-
-img.borderless {
- border: 0 }
-
-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.pre {
- white-space: pre }
-
-span.problematic {
- color: red }
-
-span.section-subtitle {
- /* font-size relative to parent (h1..h6 element) */
- font-size: 80% }
-
-table.citation {
- border-left: solid thin gray }
-
-table.docinfo {
- margin: 2em 4em }
-
-table.docutils {
- margin-top: 0.5em ;
- margin-bottom: 0.5em }
-
-table.footnote {
- border-left: solid thin black }
-
-table.docutils td, table.docutils th,
-table.docinfo td, table.docinfo th {
- padding-left: 0.5em ;
- padding-right: 0.5em ;
- vertical-align: top }
-
-table.docutils th.field-name, table.docinfo th.docinfo-name {
- font-weight: bold ;
- text-align: left ;
- white-space: nowrap ;
- padding-left: 0 }
-
-h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
-h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
- font-size: 100% }
-
-tt.docutils {
- background-color: #eeeeee }
-
-ul.auto-toc {
- list-style-type: none }
-
-
-/* vim: sw=4 ts=4 expandtab ai */
diff --git a/docs/users_guide_2_src/eg_1.py b/docs/users_guide_2_src/eg_1.py
deleted file mode 100644
index 8098e6b..0000000
--- a/docs/users_guide_2_src/eg_1.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#eg_1
-#
-#Looking up values held in dictionaries.
-#No need to use all values in searchlist.
-
-from Cheetah.Template import Template
-tmpl = "$value1 $value2 $value3"
-NS = [{'value1':1, 'value2':2}, {'value3':3},{'value4':4}]
-T = Template.compile(source=tmpl)
-t = T(namespaces=NS)
-print t.respond() #1,2,3
diff --git a/docs/users_guide_2_src/eg_2.py b/docs/users_guide_2_src/eg_2.py
deleted file mode 100644
index ee0f7a7..0000000
--- a/docs/users_guide_2_src/eg_2.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from Cheetah.Template import Template
-
-#A retrieved value can be any Python object and can be used _exactly_
-#as it would be in Python code
-
-tmpl = "$value1, $value2, $value3[0], $value3[1], $value4[0]['this'][0]"
-NS = [{'value1':1, 'value2':2, 'value3':[3,4], 'value4': [ {'this':[5]}]} ]
-#Compile and fill template in one step
-t = Template.compile(source=tmpl)(namespaces=NS)
-print t.respond() #1, 2, 3, 4, 5
diff --git a/docs/users_guide_2_src/eg_3.py b/docs/users_guide_2_src/eg_3.py
deleted file mode 100644
index 5c89a65..0000000
--- a/docs/users_guide_2_src/eg_3.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from Cheetah.Template import Template
-
-#The namespaces list is a list of dictionaries and/or
-#class instances. Search is for dictionary key or object
-#attributes in this list
-class X:
- pass
-
-
-x = X()
-x.value3 = 3
-x.value4 = 4
-
-tmpl = "$value1, $value2, $value3, $value4"
-NS = [{'value1':1},{'value2':2}, x]
-
-t = Template.compile(source=tmpl)(namespaces=NS)
-print t.respond() #1,2,3,4
diff --git a/docs/users_guide_2_src/eg_4.py b/docs/users_guide_2_src/eg_4.py
deleted file mode 100644
index 8fab657..0000000
--- a/docs/users_guide_2_src/eg_4.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from Cheetah.Template import Template
-from Cheetah import NameMapper
-
-#Error. Cheetah cannot find 'x' because
-#it is not dictionary key or instance member:
-
-
-class X:
- pass
-
-x = X()
-x.value3 = 3
-
-tmpl = "$x.value3"
-NS = [x]
-t = Template.compile(source=tmpl)(namespaces=NS)
-try:
- t.respond() #Here substitution is attempted
-except NameMapper.NotFound, e:
- print 'NameMapper.NotFound: %s' % e
- #NameMapper.NotFound: cannot find 'x'
-
diff --git a/docs/users_guide_2_src/eg_5.py b/docs/users_guide_2_src/eg_5.py
deleted file mode 100644
index 551f9c0..0000000
--- a/docs/users_guide_2_src/eg_5.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from Cheetah.Template import Template
-
-# ways of using Python to process values after
-#retrieval. 1. Sets a new variable then uses it,
-#2. Uses pure Python function to set new variable
-#3. Cheetah calls function directly
-#4. Extended ${} syntax without function call
-
-tmpl = """
-
-#set $value1 = $value.replace(' ','-')
-1. $value1
-<% def change(x):
- return x.replace(' ','-')
-%>
-#set $value1 = change($value)
-2. $value1
-3. $change($value)
-4. ${value.replace(' ','-')}
-"""
-NS = [ {'value':'this and that'}]
-
-#compile and fill the template
-t = Template(source=tmpl, namespaces=NS)
-print t.respond()
diff --git a/docs/users_guide_2_src/latex2rst.py b/docs/users_guide_2_src/latex2rst.py
deleted file mode 100755
index 80f9a1d..0000000
--- a/docs/users_guide_2_src/latex2rst.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-"""Convert files from LaTeX format to ReStructured Text.
-
- This converter is meant only for saving keystrokes. It won't catch
- everything and it may misformat stuff, so proofread the file after
- processing.
-
- "Verbatim" blocks are not converted due to the difficulty in placing the
- preceding colon(s) and indenting every line.
-"""
-import os, re, shutil, sys
-
-def convert(filename):
- print "Processing file", filename
- backup = filename + ".bak"
- shutil.copy2(filename, backup)
- f = open(filename, 'r+')
- text = f.read()
- text = re.sub( R"%%%+", R"", text)
- text = re.sub( R"\\section\{(.*?)\}", R"\1\n" + ("=" * 40), text)
- text = re.sub( R"\\subsection\{(.*?)\}", R"\1\n" + ("-" * 40), text)
- text = re.sub( R"\\label\{(.*?)\}", R"\n..\n :label: \1", text)
- text = re.sub( R"``|''", R'"', text)
- text = re.sub( R"(?s)\{\\em (.*?)\}", R"*\1*", text)
- text = re.sub( R"(?s)\{\\bf (.*?)\}", R"**\1**", text)
- text = re.sub( R"(?s)\\code\{(.*?)\}", R"``\1``", text)
- text = re.sub( R"\\(begin|end)\{(itemize|enumerate)\}\n", R"", text)
- text = re.sub( R"\\item ", R"* ", text)
- #text = re.sub(
- # R"(?sm)(\w):\n\s*^\\begin\{verbatim\}\s*(.*?)\\end\{verbatim\}",
- # R"\1::\n\n\2", text)
- f.seek(0)
- f.write(text)
- f.truncate()
- f.close()
-
-
-def main():
- if len(sys.argv) < 2:
- prog = os.path.basename(sys.argv[0])
- raise SystemExit("usage: %s FILENAMES ..." % prog)
- for filename in sys.argv[1:]:
- convert(filename)
-
-if __name__ == "__main__": main()
diff --git a/docs/users_guide_2_src/unused.txt b/docs/users_guide_2_src/unused.txt
deleted file mode 100644
index 3b78fc9..0000000
--- a/docs/users_guide_2_src/unused.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Give me an example of a Webware servlet!}
-\label{intro.example.servlet}
-
-This example uses an HTML form to ask the user's name, then invokes itself
-again to display a {\em personalized} friendly greeting.
-
-\begin{verbatim}
-<HTML><HEAD><TITLE>My Template-Servlet</TITLE></HEAD><BODY>
-#set $name = $request.field('name', None)
-#if $name
-Hello $name
-#else
-<FORM ACTION="" METHOD="GET">
-Name: <INPUT TYPE="text" NAME="name"><BR>
-<INPUT TYPE="submit">
-</FORM>
-#end if
-</BODY></HTML>
-\end{verbatim}
-
-To try it out for yourself on a Webware system:
-\begin{enumerate}
-\item copy the template definition to a file {\bf test.tmpl} in your
- Webware servlet directory.
-\item Run ``\code{cheetah compile test.tmpl}''. This produces
- {\bf test.py} (a .py template module) in the same directory.
-\item In your web browser, go to {\bf test.py}, using whatever site and
- directory is appropriate. Depending on your Webware configuration, you may
- also be able to go to {\bf test}.
-\end{enumerate}
-
-At the first request, field `name' will be blank (false) so the ``\#else''
-portion will execute and present a form. You type your name and press submit.
-The form invokes the same page. Now `name' is true so the ``\#if'' portion
-executes, which displays the greeting. The ``\#set'' directive creates a
-local variable that lasts while the template is being filled.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-To install Cheetah in your system-wide Python library:
-* Login as a user with privileges to install system-wide Python packages.
- On POSIX systems (AIX, Solaris, Linux, IRIX, etc.), the command is
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-Certain test failures are insignificant:
-\begin{description}
-\item{**AssertionError: Template output mismatch: Expected Output = 0(end)
-Actual Output = False(end)**} Python 2.3 changed the string representation of
-booleans, and the tests haven't yet been updated to reflect this.
-\item{**AssertionError: subcommand exit status 127**} Certain tests run
-"cheetah" as a subcommand. The failure may mean the command wasn't found
-in your system path. (What happens if you run "cheetah" on the command line?)
-The failure also happens on some Windows systems for unknown reasons. This
-failure has never been observed outside the test suite. Long term, we plan to
-rewrite the tests to do a function call rather than a subcommand, which will
-also make the tests run significantly faster.
-\item{**ImportError: No module named SampleBaseClass**} The test tried to
-write a temporary module in the current directory and ``import`` it. Reread
-the first paragraph in this section about the current directory.
-\item{**ImportError: No module named tmp**} May be the same problem as
-SampleBaseClass; let us know if changing the current directory doesn't work.
-\end{description}
-
- normally 'su root'. On non-POSIX systems such as Windows NT, login as an
- administrator.
diff --git a/docs/users_guide_src/Makefile b/docs/users_guide_src/Makefile
deleted file mode 100755
index 8b8e977..0000000
--- a/docs/users_guide_src/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-# You must change PYTHONSRC to the path of your Python source distributon.
-# OR just create a symlink that matches this path.
-PYTHONSRC=/usr/local/src/Python-source
-DOCNAME=users_guide
-MKHOWTO=$(PYTHONSRC)/Doc/tools/mkhowto
-MAIN_TEX_FILE= users_guide.tex
-
-all: ps pdf html htmlMultiPage text
-
-almost-all: ps html htmlMultiPage text
-
-pdf:
- $(MKHOWTO) --pdf $(MAIN_TEX_FILE)
- mv $(DOCNAME).pdf ../
-
-ps:
- $(MKHOWTO) --ps $(MAIN_TEX_FILE)
- mv $(DOCNAME).ps ../
-html:
- -rm -rf $(DOCNAME)
- $(MKHOWTO) --html --split 1 --iconserver . $(MAIN_TEX_FILE)
- -rm -rf ../$(DOCNAME)_html
- mv $(DOCNAME) ../$(DOCNAME)_html
-
-htmlMultiPage:
- -rm -rf $(DOCNAME)
- $(MKHOWTO) --html --iconserver . $(MAIN_TEX_FILE)
- -rm -rf ../$(DOCNAME)_html_multipage
- mv $(DOCNAME) ../$(DOCNAME)_html_multipage
-
-text:
- $(MKHOWTO) --text $(MAIN_TEX_FILE)
- mv $(DOCNAME).txt ../
-
-clean:
- -rm -rf $(DOCNAME)
- -rm -f *.aux *.l2h *~ *.log *.ind *.bkm *.how *.toc
- -rm -rf ../html
-
diff --git a/docs/users_guide_src/README b/docs/users_guide_src/README
deleted file mode 100755
index 3b45564..0000000
--- a/docs/users_guide_src/README
+++ /dev/null
@@ -1,9 +0,0 @@
-To build the Cheetah documentation, you need the 'mkhowto' program from
-the Python source distribution. So:
-
-1) Get the Python source distribution and unpack it in some directory.
-
-2) Edit the Cheetah documentation's Makefile and change PYTHONSRC to
-point to the top-level directory of your Python source distribution.
-
-3) Run 'make'.
diff --git a/docs/users_guide_src/comments.tex b/docs/users_guide_src/comments.tex
deleted file mode 100755
index 36323cf..0000000
--- a/docs/users_guide_src/comments.tex
+++ /dev/null
@@ -1,99 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Comments}
-\label{comments}
-
-Comments are used to mark notes, explanations, and decorative text that should
-not appear in the output. Cheetah maintains the comments in the Python module
-it generates from the Cheetah source code. There are two forms of the comment
-directive: single-line and multi-line.
-
-All text in a template definition that lies between two hash characters
-(\code{\#\#}) and the end of the line is treated as a single-line comment and
-will not show up in the output, unless the two hash characters are escaped with
-a backslash.
-\begin{verbatim}
-##============================= this is a decorative comment-bar
-$var ## this is an end-of-line comment
-##=============================
-\end{verbatim}
-
-Any text between \code{\#*} and \code{*\#} will be treated as a multi-line
-comment.
-\begin{verbatim}
-#*
- Here is some multiline
- comment text
-*#
-\end{verbatim}
-
-If you put blank lines around method definitions or loops to separate them,
-be aware that the blank lines will be output as is. To avoid this, make sure
-the blank lines are enclosed in a comment. Since you normally have a
-comment before the next method definition (right?), you can just extend that
-comment to include the blank lines after the previous method definition, like
-so:
-\begin{verbatim}
-#def method1
-... lines ...
-#end def
-#*
-
-
- Description of method2.
- $arg1, string, a phrase.
-*#
-#def method2($arg1)
-... lines ...
-#end def
-\end{verbatim}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Docstring Comments}
-\label{comments.docstring}
-
-Python modules, classes, and methods can be documented with inline
-'documentation strings' (aka 'docstrings'). Docstrings, unlike comments, are
-accesible at run-time. Thus, they provide a useful hook for interactive help
-utilities.
-
-Cheetah comments can be transformed into doctrings by adding one of the
-following prefixes:
-
-\begin{verbatim}
-##doc: This text will be added to the method docstring
-#*doc: If your template file is MyTemplate.tmpl, running "cheetah compile"
- on it will produce MyTemplate.py, with a class MyTemplate in it,
- containing a method .respond(). This text will be in the .respond()
- method's docstring. *#
-
-##doc-method: This text will also be added to .respond()'s docstring
-#*doc-method: This text will also be added to .respond()'s docstring *#
-
-##doc-class: This text will be added to the MyTemplate class docstring
-#*doc-class: This text will be added to the MyTemplate class docstring *#
-
-##doc-module: This text will be added to the module docstring MyTemplate.py
-#*doc-module: This text will be added to the module docstring MyTemplate.py*#
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Header Comments}
-\label{comments.headers}
-Cheetah comments can also be transformed into module header comments using the
-following syntax:
-
-\begin{verbatim}
-##header: This text will be added to the module header comment
-#*header: This text will be added to the module header comment *#
-\end{verbatim}
-
-Note the difference between \code{\#\#doc-module: } and \code{header: }:
-``cheetah-compile'' puts \code{\#\#doc-module: } text inside the module
-docstring. \code{header: } makes the text go {\em above} the docstring, as a
-set of \#-prefixed comment lines.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/comparisons.tex b/docs/users_guide_src/comparisons.tex
deleted file mode 100755
index 56a0fb3..0000000
--- a/docs/users_guide_src/comparisons.tex
+++ /dev/null
@@ -1,451 +0,0 @@
-\section{Cheetah vs. Other Template Engines}
-\label{comparisons}
-
-This appendix compares Cheetah with various other template/emdedded scripting
-languages and Internet development frameworks. As Cheetah is similar to
-Velocity at a superficial level, you may also wish to read comparisons between
-Velocity and other languages at
-\url{http://jakarta.apache.org/velocity/ymtd/ymtd.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Which features are unique to Cheetah}
-\label{comparisons.unique}
-
-\begin{itemize}
-\item The {\bf block framework} (section \ref{inheritanceEtc.block})
-\item Cheetah's powerful yet simple {\bf caching framework} (section
- \ref{output.caching})
-\item Cheetah's {\bf Unified Dotted Notation} and {\bf autocalling}
- (sections \ref{language.namemapper.dict} and
- \ref{language.namemapper.autocalling})
-\item Cheetah's searchList (section \ref{language.searchList})
- information.
-\item Cheetah's \code{\#raw} directive (section \ref{output.raw})
-\item Cheetah's \code{\#slurp} directive (section \ref{output.slurp})
-\item Cheetah's tight integration with Webware for Python (section
- \ref{webware})
-\item Cheetah's {\bf SkeletonPage framework} (section
- \ref{libraries.templates.skeletonPage})
-\item Cheetah's ability to mix PSP-style code with Cheetah
- Language syntax (section \ref{tips.PSP})
- Because of Cheetah's design and Python's flexibility it is
- relatively easy to extend Cheetah's syntax with syntax elements from almost
- any other template or embedded scripting language.
-\end{itemize}
-
-%% @@MO: What about the new features we've been adding?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Velocity}
-\label{comparisons.velocity}
-
-For a basic introduction to Velocity, visit
-\url{http://jakarta.apache.org/velocity}.
-
-Velocity is a Java template engine. It's older than Cheetah, has a larger user
-base, and has better examples and docs at the moment. Cheetah, however, has a
-number of advantages over Velocity:
-\begin{itemize}
-\item Cheetah is written in Python. Thus, it's easier to use and extend.
-\item Cheetah's syntax is closer to Python's syntax than Velocity's is to
-Java's.
-\item Cheetah has a powerful caching mechanism. Velocity has no equivalent.
-\item It's far easier to add data/objects into the namespace where \$placeholder
- values are extracted from in Cheetah. Velocity calls this namespace a 'context'.
- Contexts are dictionaries/hashtables. You can put anything you want into a
- context, BUT you have to use the .put() method to populate the context;
- e.g.,
-
-\begin{verbatim}
-VelocityContext context1 = new VelocityContext();
-context1.put("name","Velocity");
-context1.put("project", "Jakarta");
-context1.put("duplicate", "I am in context1");
-\end{verbatim}
-
- Cheetah takes a different approach. Rather than require you to manually
- populate the 'namespace' like Velocity, Cheetah will accept any existing
- Python object or dictionary AS the 'namespace'. Furthermore, Cheetah
- allows you to specify a list namespaces that will be searched in sequence
- to find a varname-to-value mapping. This searchList can be extended at
- run-time.
-
- If you add a `foo' object to the searchList and the `foo' has an attribute
- called 'bar', you can simply type \code{\$bar} in the template. If the
- second item in the searchList is dictionary 'foofoo' containing
- \code{\{'spam':1234, 'parrot':666\}}, Cheetah will first look in the `foo'
- object for a `spam' attribute. Not finding it, Cheetah will then go to
- `foofoo' (the second element in the searchList) and look among its
- dictionary keys for `spam'. Finding it, Cheetah will select
- \code{foofoo['spam']} as \code{\$spam}'s value.
-
-\item In Cheetah, the tokens that are used to signal the start of
- \$placeholders and \#directives are configurable. You can set them to any
- character sequences, not just \$ and \#.
-\end{itemize}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. WebMacro}
-\label{comparisons.webmacro}
-
-For a basic introduction to WebMacro, visit
-\url{http://webmacro.org}.
-
-The points discussed in section \ref{comparisons.velocity} also apply to the
-comparison between Cheetah and WebMacro. For further differences please refer
-to \url{http://jakarta.apache.org/velocity/differences.html}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope's DTML}
-\label{comparisons.dtml}
-
-For a basic introduction to DTML, visit
-\url{http://www.zope.org/Members/michel/ZB/DTML.dtml}.
-
-\begin{itemize}
-\item Cheetah is faster than DTML.
-\item Cheetah does not use HTML-style tags; DTML does. Thus, Cheetah tags are
- visible in rendered HTML output if something goes wrong.
-\item DTML can only be used with ZOPE for web development; Cheetah can be
- used as a standalone tool for any purpose.
-\item Cheetah's documentation is more complete than DTML's.
-\item Cheetah's learning curve is shorter than DTML's.
-\item DTML has no equivalent of Cheetah's blocks, caching framework,
- unified dotted notation, and \code{\#raw} directive.
-\end{itemize}
-
-Here are some examples of syntax differences between DTML and Cheetah:
-\begin{verbatim}
-<ul>
-<dtml-in frogQuery>
- <li><dtml-var animal_name></li>
-</dtml-in>
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<ul>
-#for $animal_name in $frogQuery
- <li>$animal_name</li>
-#end for
-</ul>
-\end{verbatim}
-
-\begin{verbatim}
-<dtml-if expr="monkeys > monkey_limit">
- <p>There are too many monkeys!</p>
-<dtml-elif expr="monkeys < minimum_monkeys">
- <p>There aren't enough monkeys!</p>
-<dtml-else>
- <p>There are just enough monkeys.</p>
-</dtml-if>
-\end{verbatim}
-
-\begin{verbatim}
-#if $monkeys > $monkey_limit
- <p>There are too many monkeys!</p>
-#else if $monkeys < $minimum_monkeys
- <p>There aren't enough monkeys!</p>
-#else
- <p>There are just enough monkeys.</p>
-#end if
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-<dtml-in expr="objectValues('File')">
- <dtml-if sequence-even>
- <tr bgcolor="grey">
- <dtml-else>
- <tr>
- </dtml-if>
- <td>
- <a href="&dtml-absolute_url;"><dtml-var title_or_id></a>
- </td></tr>
-</dtml-in>
-</table>
-\end{verbatim}
-
-\begin{verbatim}
-<table>
-#set $evenRow = 0
-#for $file in $files('File')
- #if $evenRow
- <tr bgcolor="grey">
- #set $evenRow = 0
- #else
- <tr>
- #set $evenRow = 1
- #end if
- <td>
- <a href="$file.absolute_url">$file.title_or_id</a>
- </td></tr>
-#end for
-</table>
-\end{verbatim}
-
-The last example changed the name of \code{\$objectValues} to
-\code{\$files} because that's what a Cheetah developer would write.
-The developer would be responsible for ensuring \code{\$files} returned a
-list (or tuple) of objects (or dictionaries) containing the attributes (or
-methods or dictionary keys) `absolute\_url' and `title\_or\_id'. All these
-names (`objectValues', `absolute\_url' and `title\_or\_id') are standard parts
-of Zope, but in Cheetah the developer is in charge of writing them and giving
-them a reasonable behaviour.
-
-Some of DTML's features are being ported to Cheetah, such as
-\code{Cheetah.Tools.MondoReport}, which is based on the
-\code{<dtml-in>} tag. We are also planning an output filter as flexible as
-the \code{<dtml-var>} formatting options. However, neither of these are
-complete yet.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. Zope Page Templates}
-\label{comparisons.zpt}
-
-For a basic introduction to Zope Page Templates, please visit
-\url{http://www.zope.org/Documentation/Articles/ZPT2}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHP's Smarty templates}
-\label{comparisons.smarty}
-
-PHP (\url{http://www.php.net/}) is one of the few scripting languages
-expressly designed for web servlets. However, it's also a full-fledged
-programming language with libraries similar to Python's and Perl's. The
-syntax and functions are like a cross between Perl and C plus some original
-ideas (e.g.; a single array type serves as both a list and a dictionary,
-\verb+$arr[]="value";+ appends to an array).
-
-Smarty (\url{http://smarty.php.net/}) is an advanced template engine for
-PHP. ({\em Note:} this comparision is based on Smarty's on-line documentation.
-The author has not used Smarty. Please send corrections or ommissions to the
-Cheetah mailing list.) Like Cheetah, Smarty:
-
-\begin{itemize}
-\item compiles to the target programming language (PHP).
-\item has configurable delimeters.
-\item passes if-blocks directly to PHP, so you can use any PHP expression in
-them.
-\item allows you to embed PHP code in a template.
-\item has a caching framework (although it works quite differently).
-\item can read the template definition from any arbitrary source.
-\end{itemize}
-
-Features Smarty has that Cheetah lacks:
-\begin{itemize}
-\item Preprocessors, postprocessors and output filters. You can emulate a
-preprocessor in Cheetah by running your template definition through a filter
-program or function before Cheetah sees it. To emulate a postprocessor, run a
-.py template module through a filter program/function. To emulate a Smarty
-output filter, run the template output through a filter program/function. If
-you want to use ``cheetah compile'' or ``cheetah fill'' in a pipeline, use
-\code{-} as the input file name and \code{--stdout} to send the result to
-standard output. Note that Cheetah uses the term ``output filter'' differently
-than Smarty: Cheetah output filters (\code{\#filter}) operate on placeholders,
-while Smarty output filters operate on the entire template output. There has
-been a proposed \code{\#sed} directive that would operate on the entire output
-line by line, but it has not been implemented.
-\item Variable modifiers. In some cases, Python has equivalent string
-methods (\code{.strip}, \code{.capitalize}, \code{.replace(SEARCH, REPL)}),
-but in other cases you must wrap the result in a function call or write
-a custom output filter (\code{\#filter}).
-\item Certain web-specific functions, which can be emulated with
-third-party functions.
-\item The ability to ``plug in'' new directives in a modular way. Cheetah
-directives are tightly bound to the compiler. However, third-party
-{\em functions} can be freely imported and called from placeholders, and
-{\em methods} can be mixed in via \code{\#extends}. Part of this is
-because Cheetah distinguishes between functions and directives, while
-Smarty treats them all as ``functions''. Cheetah's design does not
-allow functions to have flow control effect outside the function
-(e.g., \code{\#if} and \code{\#for}, which operate on template body lines),
-so directives like these cannot be encoded as functions.
-\item Configuration variables read from an .ini-style file. The
-\code{Cheetah.SettingsManager} module can parse such a file, but you'd
-have to invoke it manually. (See the docstrings in the module for
-details.) In Smarty, this feature is used for
-multilingual applications. In Cheetah, the developers maintain that everybody
-has their own preferred way to do this (such as using Python's \code{gettext}
-module), and it's not worth blessing one particular strategy in Cheetah since
-it's easy enough to integrate third-party code around the template, or to add
-the resulting values to the searchList.
-\end{itemize}
-
-Features Cheetah has that Smarty lacks:
-\begin{itemize}
-\item Saving the compilation result in a Python (PHP) module for quick
-reading later.
-\item Caching individual placeholders or portions of a template. Smarty
-caches only the entire template output as a unit.
-\end{itemize}
-
-Comparisions of various Smarty constructs:
-\begin{verbatim}
-{assign var="name" value="Bob"} (#set has better syntax in the author's opinion)
-counter (looks like equivalent to #for)
-eval (same as #include with variable)
-fetch: insert file content into output (#include raw)
-fetch: insert URL content into output (no euqivalent, user can write
- function calling urllib, call as $fetchURL('URL') )
-fetch: read file into variable (no equivalent, user can write function
- based on the 'open/file' builtin, or on .getFileContents() in
- Template.)
-fetch: read URL content into variable (no equivalent, use above
- function and call as: #set $var = $fetchURL('URL')
-html_options: output an HTML option list (no equivalent, user can
- write custom function. Maybe FunFormKit can help.)
-html_select_date: output three dropdown controls to specify a date
- (no equivalent, user can write custom function)
-html_select_time: output four dropdown controls to specify a time
- (no equvalent, user can write custom function)
-math: eval calculation and output result (same as #echo)
-math: eval calculation and assign to variable (same as #set)
-popup_init: library for popup windows (no equivalent, user can write
- custom method outputting Javascript)
-
-
-Other commands:
-capture (no equivalent, collects output into variable. A Python
- program would create a StringIO instance, set sys.stdout to
- it temporarily, print the output, set sys.stdout back, then use
- .getvalue() to get the result.)
-config_load (roughly analagous to #settings, which was removed
- from Cheetah. Use Cheetah.SettingsManager manually or write
- a custom function.)
-include (same as #include, but can include into variable.
- Variables are apparently shared between parent and child.)
-include_php: include a PHP script (e.g., functions)
- (use #extends or #import instead)
-insert (same as #include not in a #cache region)
-{ldelim}{rdelim} (escape literal $ and # with a backslash,
- use #compiler-settings to change the delimeters)
-literal (#raw)
-php (``<% %>'' tags)
-section (#for $i in $range(...) )
-foreach (#for)
-strip (like the #sed tag which was never implemented. Strips
- leading/trailing whitespace from lines, joins several lines
- together.)
-
-
-Variable modifiers:
-capitalize ( $STRING.capitalize() )
-count_characters ( $len(STRING) )
-count_paragraphs/sentances/words (no equivalent, user can write function)
-date_format (use 'time' module or download Egenix's mx.DateTime)
-default ($getVar('varName', 'default value') )
-escape: html encode ($cgi.escape(VALUE) )
-escape: url encode ($urllib.quote_plus(VALUE) )
-escape: hex encode (no equivalent? user can write function)
-escape: hex entity encode (no equivalent? user can write function)
-indent: indent all lines of a var's output (may be part of future
- #indent directive)
-lower ($STRING.lower() )
-regex_replace ('re' module)
-replace ($STRING.replace(OLD, NEW, MAXSPLIT) )
-spacify (#echo "SEPARATOR".join(SEQUENCE) )
-string_format (#echo "%.2f" % FLOAT , etc.)
-strip_tags (no equivalent, user can write function to strip HTML tags,
- or customize the WebSafe filter)
-truncate (no equivalent, user can write function)
-upper ($STRING.upper() )
-wordwrap ('writer' module, or a new module coming in Python 2.3)
-\end{verbatim}
-
-Some of these modifiers could be added to the super output filter we
-want to write someday.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PHPLib's Template class}
-\label{comparisons.php}
-
-PHPLib (\url(http://phplib.netuse.de/) is a collection of classes for various
-web objects (authentication, shopping cart, sessions, etc), but what we're
-interested in is the \code{Template} object. It's much more primitive than
-Smarty, and was based on an old Perl template class. In fact, one of the
-precursors to Cheetah was based on it too. Differences from Cheetah:
-
-\begin{itemize}
-\item Templates consist of text with \code{\{placeholders\}} in braces.
-\item Instead of a searchList, there is one flat namespace. Every variable
- must be assigned via the \code{set\_var} method. However, you can pass
- this method an array (dictionary) of several variables at once.
-\item You cannot embed lookups or calculations into the template. Every
- placeholder must be an exact variable name.
-\item There are no directives. You must do all display logic (if, for, etc)
- in the calling routine.
-\item There is, however, a ``block'' construct. A block is a portion of text
- between the comment markers \code{<!-- BEGIN blockName --> \ldots
- <!-- END blockName>}. The \code{set\_block} method extracts this text
- into a namespace variable and puts a placeholder referring to it in the
- template. This has a few parallels with Cheetah's \code{\#block}
- directive but is overall quite different.
-\item To do the equivalent of \code{\#if}, extract the block. Then if true, do
- nothing. If false, assign the empty string to the namespace variable.
-\item To do the equivalent of \code{\#for}, extract the block. Set any
- namespace variables needed inside the loop. To parse one iteration, use
- the \code{parse} method to fill the block variable (a mini-template) into
- another namespace variable, appending to it. Refresh the namespace
- variables needed inside the loop and parse again; repeat for each
- iteration. You'll end up with a mini-result that will be plugged into the
- main template's placeholder.
-\item To read a template definition from a file, use the \code{set\_file}
- method. This places the file's content in a namespace variable.
- To read a template definition from a string, assign it to a namespace
- variable.
-\item Thus, for complicated templates, you are doing a lot of recursive block
- filling and file reading and parsing mini-templates all into one flat
- namespace as you finally build up values for the main template. In
- Cheetah, all this display logic can be embedded into the template using
- directives, calling out to Python methods for the more complicated tasks.
-\item Although you can nest blocks in the template, it becomes tedious and
- arguably hard to read, because all blocks have identical syntax. Unless
- you choose your block names carefully and put comments around them, it's
- hard to tell which blocks are if-blocks and which are for-blocks, or what
- their nesting order is.
-\item PHPLib templates do not have caching, output filters, etc.
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah vs. PSP, PHP, ASP, JSP, Embperl, etc.}
-\label{comparisons.pspEtc}
-
-\begin{description}
-\item[Webware's PSP Component] -- \url{http://webware.sourceforge.net/Webware/PSP/Docs/}
-\item[Tomcat JSP Information] -- \url{http://jakarta.apache.org/tomcat/index.html}
-\item[ASP Information at ASP101] -- \url{http://www.asp101.com/}
-\item[Embperl] -- \url{http://perl.apache.org/embperl/}
-\end{description}
-
-
-Here's a basic Cheetah example:
-\begin{verbatim}
-<TABLE>
-#for $client in $service.clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-\end{verbatim}
-
-Compare this with PSP:
-
-\begin{verbatim}
-<TABLE>
-<% for client in service.clients(): %>
-<TR>
-<TD><%=client.surname()%>, <%=client.firstname()%></TD>
-<TD><A HREF="mailto:<%=client.email()%>"><%=client.email()%></A></TD>
-</TR>
-<%end%>
-</TABLE>
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/editors.tex b/docs/users_guide_src/editors.tex
deleted file mode 100755
index 84c8f03..0000000
--- a/docs/users_guide_src/editors.tex
+++ /dev/null
@@ -1,39 +0,0 @@
-\section{Visual Editors}
-\label{visualEditors}
-
-This chapter is about maintaining Cheetah templates with visual editors,
-and the tradeoffs between making it friendly to both text editors and visual
-editors.
-
-Cheetah's main developers do not use visual editors. Tavis uses \code{emacs};
-Mike uses \code{vim}. So our first priority is to make templates easy to
-maintain in text editors. In particular, we don't want to add features
-like Zope Page Template's
-placeholder-value-with-mock-text-for-visual-editors-all-in-an-XML-tag.
-The syntax is so verbose it makes for a whole lotta typing just to insert a
-simple placeholder, for the benefit of editors we never use. However, as users
-identify features which would help their visual editing without making it
-harder to maintain templates in a text editor, we're all for it.
-
-As it said in the introduction, Cheetah purposely does not use HTML/XML
-tags for \$placeholders or \#directives. That way, when you preview the
-template in an editor that interprets HTML tags, you'll still see the
-placeholder and directive source definitions, which provides some ``mock text''
-even if it's not the size the final values will be, and allows you to use
-your imagination to translate how the directive output will look visually in
-the final.
-
-If your editor has syntax highlighting, turn it on. That makes a big
-difference in terms of making the template easier to edit. Since no
-``Cheetah mode'' has been invented yet, set your highlighting to Perl
-mode, and at least the directives/placeholders will show up in different
-colors, although the editor won't reliably guess where the
-directive/placeholder ends and normal text begins.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_src/errorHandling.tex b/docs/users_guide_src/errorHandling.tex
deleted file mode 100755
index 28eee3a..0000000
--- a/docs/users_guide_src/errorHandling.tex
+++ /dev/null
@@ -1,145 +0,0 @@
-\section{Error Handling}
-\label{errorHandling}
-
-There are two ways to handle runtime errors (exceptions) in Cheetah. The first
-is with the Cheetah directives that mirror Python's structured exception
-handling statements. The second is with Cheetah's \code{ErrorCatcher}
-framework. These are described below.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#try ... \#except ... \#end try, \#finally, and \#assert}
-\label{errorHandling.directives}
-
-Cheetah's exception-handling directives are exact mirrors Python's
-exception-handling statements. See Python's documentation for details. The
-following Cheetah code demonstrates their use:
-
-
-\begin{verbatim}
-#try
- $mightFail()
-#except
- It failed
-#end try
-
-#try
- #assert $x == $y
-#except AssertionError
- They're not the same!
-#end try
-
-#try
- #raise ValueError
-#except ValueError
- #pass
-#end try
-
-
-#try
- $mightFail()
-#except ValueError
- Hey, it raised a ValueError!
-#except NameMapper.NotFound
- Hey, it raised a NameMapper.NotFound!
-#else
- It didn't raise anything!
-#end try
-
-#try
- $mightFail()
-#finally
- $cleanup()
-#end try
-\end{verbatim}
-
-Like Python, \code{\#except} and \code{\#finally} cannot appear in the same
-try-block, but can appear in nested try-blocks.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#errorCatcher and ErrorCatcher objects}
-\label{errorHandling.errorCatcher}
-
-Syntax:
-\begin{verbatim}
-#errorCatcher CLASS
-#errorCatcher $PLACEHOLDER_TO_AN_ERROR_CATCHER_INSTANCE
-\end{verbatim}
-
-
-\code{ErrorCatcher} is a debugging tool that catches exceptions that occur
-inside \code{\$placeholder} tags and provides a customizable warning to the
-developer. Normally, the first missing namespace value raises a
-\code{NameMapper.NotFound} error and halts the filling of the template. This
-requires the developer to resolve the exceptions in order without seeing the
-subsequent output. When an \code{ErrorCatcher} is enabled, the developer can
-see all the exceptions at once as well as the template output around them.
-
-The \code{Cheetah.ErrorCatchers} module defines the base class for
-ErrorCatchers:
-
-\begin{verbatim}
-class ErrorCatcher:
- _exceptionsToCatch = (NameMapper.NotFound,)
-
- def __init__(self, templateObj):
- pass
-
- def exceptions(self):
- return self._exceptionsToCatch
-
- def warn(self, exc_val, code, rawCode, lineCol):
- return rawCode
-\end{verbatim}
-
-This ErrorCatcher catches \code{NameMapper.NotFound} exceptions and leaves the
-offending placeholder visible in its raw form in the template output. If the
-following template is executed:
-\begin{verbatim}
-#errorCatcher Echo
-#set $iExist = 'Here I am!'
-Here's a good placeholder: $iExist
-Here's bad placeholder: $iDontExist
-\end{verbatim}
-
-the output will be:
-\begin{verbatim}
-Here's a good placeholder: Here I am!
-Here's bad placeholder: $iDontExist
-\end{verbatim}
-
-The base class shown above is also accessible under the alias
-\code{Cheetah.ErrorCatchers.Echo}. \code{Cheetah.ErrorCatchers} also provides a
-number of specialized subclasses that warn about exceptions in different ways.
-\code{Cheetah.ErrorCatchers.BigEcho} will output
-
-\begin{verbatim}
-Here's a good placeholder: Here I am!
-Here's bad placeholder: ===============&lt;$iDontExist could not be found&gt;===============
-\end{verbatim}
-
-ErrorCatcher has a significant performance impact and is turned off by default.
-It can also be turned on with the \code{Template} class' \code{'errorCatcher'}
-keyword argument. The value of this argument should either be a string
-specifying which of the classes in \code{Cheetah.ErrorCatchers} to use, or a
-class that subclasses \code{Cheetah.ErrorCatchers.ErrorCatcher}. The
-\code{\#errorCatcher} directive can also be used to change the errorCatcher part
-way through a template.
-
-\code{Cheetah.ErrorCatchers.ListErrors} will produce the same ouput as
-\code{Echo} while maintaining a list of the errors that can be retrieved later.
-To retrieve the list, use the \code{Template} class' \code{'errorCatcher'}
-method to retrieve the errorCatcher and then call its \code{listErrors} method.
-
-ErrorCatcher doesn't catch exceptions raised inside directives.
-
-% @@MO: How do you turn ErrorCatcher off after turn it on.
-% '#ErrorCatcher None'?
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_src/examples.tex b/docs/users_guide_src/examples.tex
deleted file mode 100755
index 6c394fb..0000000
--- a/docs/users_guide_src/examples.tex
+++ /dev/null
@@ -1,24 +0,0 @@
-\section{Examples}
-\label{examples}
-
-The Cheetah distribution comes with an 'examples' directory. Browse the
-files in this directory and its subdirectories for examples of how
-Cheetah can be used.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Syntax examples}
-The \code{Cheetah.Tests} module contains a large number of test cases that can
-double as examples of how the Cheetah Language works. To view these cases go
-to the base directory of your Cheetah distribution and open the file
-\code{Cheetah/Tests/SyntaxAndOutput.py} in a text editor.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Webware Examples}
-For examples of Cheetah in use with Webware visit the Cheetah and Webware wikis
-or use google. We used to have more examples in the cheetah source tarball, but
-they were out of date and confused people.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/flowControl.tex b/docs/users_guide_src/flowControl.tex
deleted file mode 100755
index 75a5845..0000000
--- a/docs/users_guide_src/flowControl.tex
+++ /dev/null
@@ -1,414 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Flow Control}
-\label{flowControl}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#for ... \#end for}
-\label{flowControl.for}
-
-Syntax:
-\begin{verbatim}
-#for $var in EXPR
-#end for
-\end{verbatim}
-
-
-The \code{\#for} directive iterates through a sequence. The syntax is the same
-as Python, but remember the \code{\$} before variables.
-
-Here's a simple client listing:
-\begin{verbatim}
-<TABLE>
-#for $client in $service.clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email" >$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-\end{verbatim}
-
-Here's how to loop through the keys and values of a dictionary:
-\begin{verbatim}
-<PRE>
-#for $key, $value in $dict.items()
-$key: $value
-#end for
-</PRE>
-\end{verbatim}
-
-Here's how to create list of numbers separated by hyphens. This ``\#end for''
-tag shares the last line to avoid introducing a newline character after each
-hyphen.
-\begin{verbatim}
-#for $i in range(15)
-$i - #end for
-\end{verbatim}
-
-If the location of the \code{\#end for} offends your sense of indentational
-propriety, you can do this instead:
-\begin{verbatim}
-#for $i in $range(15)
-$i - #slurp
-#end for
-\end{verbatim}
-
-The previous two examples will put an extra hyphen after last number. Here's
-how to get around that problem, using the \code{\#set} directive, which will be
-dealt with in more detail below.
-\begin{verbatim}
-#set $sep = ''
-#for $name in $names
-$sep$name
-#set $sep = ', '
-#end for
-\end{verbatim}
-
-Although to just put a separator between strings, you don't need a for loop:
-\begin{verbatim}
-#echo ', '.join($names)
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#repeat ... \#end repeat}
-\label{flowControl.repeat}
-
-Syntax:
-\begin{verbatim}
-#repeat EXPR
-#end repeat
-\end{verbatim}
-
-
-Do something a certain number of times.
-The argument may be any numeric expression.
-If it's zero or negative, the loop will execute zero times.
-\begin{verbatim}
-#repeat $times + 3
-She loves me, she loves me not.
-#repeat
-She loves me.
-\end{verbatim}
-
-
-Inside the loop, there's no way to tell which iteration you're on. If you
-need a counter variable, use \code{\#for} instead with Python's \code{range}
-function. Since Python's ranges are base 0 by default, there are two ways
-to start counting at 1. Say we want to count from 1 to 5, and that
-\code{\$count} is 5.
-\begin{verbatim}
-#for $i in $range($count)
-#set $step = $i + 1
-$step. Counting from 1 to $count.
-#end for
-
-
-#for $i in $range(1, $count + 1)
-$i. Counting from 1 to $count.
-#end for
-\end{verbatim}
-
-
-A previous implementation used a local variable \code{\$i} as the repeat
-counter. However, this prevented instances of \code{\#repeat} from
-being nested. The current implementation does not have this problem as it
-uses a new local variable for every instance of \code{\#repeat}.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#while ... \#end while}
-\label{flowControl.while}
-
-Syntax:
-\begin{verbatim}
-#while EXPR
-#end while
-\end{verbatim}
-
-
-\code{\#while} is the same as Python's \code{while} statement. It may be
-followed by any boolean expression:
-\begin{verbatim}
-#while $someCondition('arg1', $arg2)
-The condition is true.
-#end while
-\end{verbatim}
-
-Be careful not to create an infinite loop. \code{\#while 1} will loop until
-the computer runs out of memory.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#if ... \#else if ... \#else ... \#end if}
-\label{flowControl.if}
-
-Syntax:
-\begin{verbatim}
-#if EXPR
-#else if EXPR
-#elif EXPR
-#else
-#end if
-\end{verbatim}
-
-
-The \code{\#if} directive and its kin are used to display a portion of text
-conditionally. \code{\#if} and \code{\#else if} should be followed by a
-true/false expression, while \code{\#else} should not. Any valid Python
-expression is allowed. As in Python, the expression is true unless it evaluates
-to 0, '', None, an empty list, or an empty dictionary. In deference to Python,
-\code{\#elif} is accepted as a synonym for \code{\#else if}.
-
-Here are some examples:
-\begin{verbatim}
-#if $size >= 1500
-It's big
-#else if $size < 1500 and $size > 0
-It's small
-#else
-It's not there
-#end if
-\end{verbatim}
-
-\begin{verbatim}
-#if $testItem($item)
-The item $item.name is OK.
-#end if
-\end{verbatim}
-
-Here's an example that combines an \code{\#if} tag with a \code{\#for} tag.
-\begin{verbatim}
-#if $people
-<table>
-<tr>
-<th>Name</th>
-<th>Address</th>
-<th>Phone</th>
-</tr>
-#for $p in $people
-<tr>
-<td>$p.name</td>
-<td>$p.address</td>
-<td>$p.phone</td>
-</tr>
-#end for
-</table>
-#else
-<p> Sorry, the search did not find any people. </p>
-#end if
-\end{verbatim}
-
-See section \ref{output.oneLineIf} for the one-line \code{\#if} directive,
-which is equivalent to Perl's and C's \code{?:} operator.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#unless ... \#end unless}
-\label{flowControl.unless}
-
-Syntax:
-\begin{verbatim}
-#unless EXPR
-#end unless
-\end{verbatim}
-
-
-\code{\#unless} is the opposite of \code{\#if}: the text is executed if the
-condition is {\bf false}. Sometimes this is more convenient.
-\code{\#unless EXPR} is equivalent to \code{\#if not (EXPR)}.
-
-\begin{verbatim}
-#unless $alive
-This parrot is no more! He has ceased to be!
-'E's expired and gone to meet 'is maker! ...
-THIS IS AN EX-PARROT!!
-#end unless
-\end{verbatim}
-
-You cannot use \code{\#else if} or \code{\#else} inside an \code{\#unless}
-construct. If you need those, use \code{\#if} instead.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#break and \#continue}
-\label{flowControl.break}
-
-Syntax:
-\begin{verbatim}
-#break
-#continue
-\end{verbatim}
-
-
-These directives are used as in Python. \code{\#break} will
-exit a \code{\#for} loop prematurely, while \code{\#continue} will immediately
-jump to the next iteration in the \code{\#for} loop.
-
-In this example the output list will not contain ``10 - ''.
-\begin{verbatim}
-#for $i in range(15)
-#if $i == 10
- #continue
-#end if
-$i - #slurp
-#end for
-\end{verbatim}
-
-In this example the loop will exit if it finds a name that equals 'Joe':
-\begin{verbatim}
-#for $name in $names
-#if $name == 'Joe'
- #break
-#end if
-$name - #slurp
-#end for
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#pass}
-\label{flowControl.pass}
-
-Syntax:
-\begin{verbatim}
-#pass
-\end{verbatim}
-
-
-The \code{\#pass} directive is identical to Python \code{pass} statement: it
-does nothing. It can be used when a statement is required syntactically but the
-program requires no action.
-
-The following example does nothing if only \$A is true
-\begin{verbatim}
-#if $A and $B
- do something
-#elif $A
- #pass
-#elif $B
- do something
-#else
- do something
-#end if
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#stop}
-\label{flowControl.stop}
-
-Syntax:
-\begin{verbatim}
-#stop
-\end{verbatim}
-
-
-The \code{\#stop} directive is used to stop processing of a template at a
-certain point. The output will show {\em only} what has been processed up to
-that point.
-
-When \code{\#stop} is called inside an \code{\#include} it skips the rest of
-the included code and continues on from after the \code{\#include} directive.
-stop the processing of the included code. Likewise, when \code{\#stop} is
-called inside a \code{\#def} or \code{\#block}, it stops only the \code{\#def}
-or \code{\#block}.
-
-\begin{verbatim}
-A cat
-#if 1
- sat on a mat
- #stop
- watching a rat
-#end if
-in a flat.
-\end{verbatim}
-
-will print
-\begin{verbatim}
-A cat
- sat on a mat
-\end{verbatim}
-
-And
-\begin{verbatim}
-A cat
-#block action
- sat on a mat
- #stop
- watching a rat
-#end block
-in a flat.
-\end{verbatim}
-
-will print
-
-\begin{verbatim}
-A cat
- sat on a mat
-in a flat.
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#return}
-\label{flowControl.return}
-
-Syntax:
-\begin{verbatim}
-#return
-\end{verbatim}
-
-
-This is used as in Python. \code{\#return} will exit the current method with a
-default return value of \code{None} or the value specified. It may be used
-only inside a \code{\#def} or a \code{\#block}.
-
-Note that \code{\#return} is different from the \code{\#stop} directive,
-which returns the sum of all text output from the method in which it is called.
-The following examples illustrate this point:
-
-\begin{verbatim}
-1
-$test[1]
-3
-#def test
-1.5
-#if 1
-#return '123'
-#else
-99999
-#end if
-#end def
-\end{verbatim}
-
-will produce
-\begin{verbatim}
-1
-2
-3
-\end{verbatim}
-
-while
-\begin{verbatim}
-1
-$test
-3
-#def test
-1.5
-#if 1
-#stop
-#else
-99999
-#end if
-#end def
-\end{verbatim}
-
-will produce
-\begin{verbatim}
-1
-1.5
-3
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/gettingStarted.tex b/docs/users_guide_src/gettingStarted.tex
deleted file mode 100755
index 69a3136..0000000
--- a/docs/users_guide_src/gettingStarted.tex
+++ /dev/null
@@ -1,266 +0,0 @@
-\section{Getting Started}
-\label{gettingStarted}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Requirements}
-\label{gettingStarted.requirements}
-
-Cheetah requires Python release 2.0 or greater, and has been tested with Python
-2.0, 2.1 and 2.2. It is known to run on Linux, Windows NT/98/XP, FreeBSD and
-Solaris, and should run anywhere Python runs.
-
-99\% of Cheetah is written in Python. There is one small C module
-(\code{\_namemapper.so}) for speed, but Cheetah automatically falls back to a
-Python equivalent (\code{NameMapper.py}) if the C module is not available.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Installation}
-\label{gettingStarted.install}
-
-To install Cheetah in your system-wide Python library:
-\begin{enumerate}
-\item Login as a user with privileges to install system-wide Python packages.
- On POSIX systems (AIX, Solaris, Linux, IRIX, etc.), the command is normally
- 'su root'. On non-POSIX systems such as Windows NT, login as an
- administrator.
-
-\item Run \code{python setup.py install} at the command prompt.
-
-\item The setup program will install the wrapper script {\bf cheetah} to
- wherever it usually puts Python binaries ("/usr/bin/", "bin/" in the
- Python install directory, etc.)
-\end{enumerate}
-
-Cheetah's installation is managed by Python's Distribution Utilities
-('distutils'). There are many options for customization. Type \code{``python
- setup.py help''} for more information.
-
-To install Cheetah in an alternate location -- someplace outside Python's
-\code{site-packages/} directory, use one of these options:
-\begin{verbatim}
- python setup.py install --home /home/tavis
- python setup.py install --install-lib /home/tavis/lib/python
-\end{verbatim}
-Either way installs to /home/tavis/lib/python/Cheetah/ . Of course,
-/home/tavis/lib/python must be in your Python path in order for Python to
-find Cheetah.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Files}
-\label{gettingstarted.files}
-
-If you do the systemwide install, all Cheetah modules are installed in the
-{\bf site-packages/Cheetah/} subdirectory of your standard library
-directory; e.g., /opt/Python2.2/lib/python2.2/site-packages/Cheetah.
-
-Two commands are installed in Python's \code{bin/} directory or a system
-bin directory: \code{cheetah} (section \ref{gettingStarted.cheetah}) and
-\code{cheetah-compile} (section \ref{howWorks.cheetah-compile}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Uninstalling}
-\label{gettingstarted.uninstalling}
-
-% @@MO: When 'python setup.py uninstall' is implemented, mention it here.
-
-To uninstall Cheetah, merely delete the site-packages/Cheetah/ directory.
-Then delete the ``cheetah'' and ``cheetah-compile'' commands from whichever
-bin/ directory they were put in.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{The 'cheetah' command}
-\label{gettingStarted.cheetah}
-
-Cheetah comes with a utility \code{cheetah} that provides a command-line
-interface to various housekeeping tasks. The command's first argument is
-the name of the task. The following commands are currently supported:
-
-\begin{verbatim}
-cheetah compile [options] [FILES ...] : Compile template definitions
-cheetah fill [options] [FILES ...] : Fill template definitions
-cheetah help : Print this help message
-cheetah options : Print options help message
-cheetah test : Run Cheetah's regression tests
-cheetah version : Print Cheetah version number
-\end{verbatim}
-
-You only have to type the first letter of the command:
-\code{cheetah c} is the same as \code{cheetah compile}.
-
-The test suite is described in the next section. The \code{compile}
-command will be described in section \ref{howWorks.cheetah-compile},
-and the \code{fill} command in section \ref{howWorks.cheetah-fill}.
-
-The depreciated \code{cheetah-compile} program does the same thing as
-\code{cheetah compile}.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Testing your installation}
-\label{gettingStarted.test}
-
-After installing Cheetah, you can run its self-test routine to verify it's
-working properly on your system. Change directory to any directory you have
-write permission in (the tests write temporary files). Do not run the tests
-in the directory you installed Cheetah from, or you'll get unnecessary errors.
-Type the following at the command prompt:
-\begin{verbatim}
-cheetah test
-\end{verbatim}
-
-The tests will run for about three minutes and print a success/failure
-message. If the tests pass, start Python in interactive mode and try the
-example in the next section.
-
-Certain test failures are insignificant:
-\begin{description}
-\item{{\bf AssertionError: Template output mismatch: Expected Output = 0(end)
-Actual Output = False(end)}} Python 2.3 changed the string representation of
-booleans, and the tests haven't yet been updated to reflect this.
-\item{{\bf AssertionError: subcommand exit status 127}} Certain tests run
-``cheetah'' as a subcommand. The failure may mean the command wasn't found
-in your system path. (What happens if you run ``cheetah'' on the command line?)
-The failure also happens on some Windows systems for unknown reasons. This
-failure has never been observed outside the test suite. Long term, we plan to
-rewrite the tests to do a function call rather than a subcommand, which will
-also make the tests run significantly faster.
-\item{{\bf ImportError: No module named SampleBaseClass}} The test tried to
-write a temporary module in the current directory and \code{import} it. Reread
-the first paragraph in this section about the current directory.
-\item{{\bf ImportError: No module named tmp}} May be the same problem as
-SampleBaseClass; let us know if changing the current directory doesn't work.
-\end{description}
-
-If any other tests fail, please send a message to the e-mail list with a copy
-of the test output and the following details about your installation:
-
-\begin{enumerate}
-\item your version of Cheetah
-\item your version of Python
-\item your operating system
-\item whether you have changed anything in the Cheetah installation
-\end{enumerate}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Quickstart tutorial}
-\label{gettingStarted.tutorial}
-
-This tutorial briefly introduces how to use Cheetah from the Python prompt.
-The following chapters will discuss other ways to use templates and more of
-Cheetah's features.
-
-The core of Cheetah is the \code{Template} class in the \code{Cheetah.Template}
-module. The following example shows how to use the \code{Template} class in an
-interactive Python session. \code{t} is the Template instance. Lines prefixed
-with \code{>>>} and \code{...} are user input. The remaining lines are Python
-output.
-
-\begin{verbatim}
->>> from Cheetah.Template import Template
->>> templateDef = """
-... <HTML>
-... <HEAD><TITLE>$title</TITLE></HEAD>
-... <BODY>
-... $contents
-... ## this is a single-line Cheetah comment and won't appear in the output
-... #* This is a multi-line comment and won't appear in the output
-... blah, blah, blah
-... *#
-... </BODY>
-... </HTML>"""
->>> nameSpace = {'title': 'Hello World Example', 'contents': 'Hello World!'}
->>> t = Template(templateDef, searchList=[nameSpace])
->>> print t
-
-<HTML>
-<HEAD><TITLE>Hello World Example</TITLE></HEAD>
-<BODY>
-Hello World!
-</BODY>
-</HTML>
->>> print t # print it as many times as you want
- [ ... same output as above ... ]
->>> nameSpace['title'] = 'Example #2'
->>> nameSpace['contents'] = 'Hiya Planet Earth!'
->>> print t # Now with different plug-in values.
-<HTML>
-<HEAD><TITLE>Example #2</TITLE></HEAD>
-<BODY>
-Hiya Planet Earth!
-</BODY>
-</HTML>
-
-\end{verbatim}
-
-Since Cheetah is extremely flexible, you can achieve the same result this
-way:
-
-\begin{verbatim}
->>> t2 = Template(templateDef)
->>> t2.title = 'Hello World Example!'
->>> t2.contents = 'Hello World'
->>> print t2
- [ ... same output as the first example above ... ]
->>> t2.title = 'Example #2'
->>> t2.contents = 'Hello World!'
->>> print t2
- [ ... same as Example #2 above ... ]
-\end{verbatim}
-
-Or this way:
-
-\begin{verbatim}
->>> class Template3(Template):
->>> title = 'Hello World Example!'
->>> contents = 'Hello World!'
->>> t3 = Template3(templateDef)
->>> print t3
- [ ... you get the picture ... ]
-\end{verbatim}
-
-The template definition can also come from a file instead of a string,
-as we will see in section \ref{howWorks.constructing}.
-
-The above is all fine for short templates, but for long templates or
-for an application that depends on many templates in a hierarchy, it's
-easier to store the templates in separate *.tmpl files and use the
-{\bf cheetah compile} program to convert them into Python classes in
-their own modules. This will be covered in section
-\ref{howWorks.cheetah-compile}.
-
-As an appetizer, we'll just briefly mention that you can store constant values
-{\em inside} the template definition, and they will be converted to attributes
-in the generated class. You can also create methods the same way.
-You can even use inheritance to arrange your templates in a hierarchy,
-with more specific templates overriding certain parts of more general
-templates (e.g., a "page" template overriding a sidebar in a "section"
-template).
-
-For the minimalists out there, here's a template definition,
-instantiation and filling all in one Python statement:
-
-\begin{verbatim}
->>> print Template("Templates are pretty useless without placeholders.")
-Templates are pretty useless without placeholders.
-\end{verbatim}
-
-You use a precompiled template the same way, except you don't provide
-a template definition since it was already established:
-
-\begin{verbatim}
-from MyPrecompiledTemplate import MyPrecompiledTemplate
-t = MyPrecompiledTemplate()
-t.name = "Fred Flintstone"
-t.city = "Bedrock City"
-print t
-\end{verbatim}
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
diff --git a/docs/users_guide_src/glossary.tex b/docs/users_guide_src/glossary.tex
deleted file mode 100644
index 4ee2d9b..0000000
--- a/docs/users_guide_src/glossary.tex
+++ /dev/null
@@ -1,96 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Vocabulary}
-\label{glossary}
-\label{vocabulary}
-
-{\bf Template} is an informal term meaning a template definition, a
-template instance or a template class. A {\bf template definition} is what
-the human {\bf template maintainer} writes: a string consisting of text,
-placeholders and directives. {\bf Placeholders} are variables that will be
-looked up when the template is filled. {\bf Directives} are commands to be
-executed when the template is filled, or instructions to the Cheetah compiler.
-The conventional suffix for a file containing a template definition is
-{\bf .tmpl}.
-
-There are two things you can do with a template: compile it or fill it.
-{\bf Filling} is the reason you have a template in the first place:
-to get a finished string out of it. Compiling is a necessary prerequisite: the
-{\bf Cheetah compiler} takes a template definition and produces Python code
-to create the finished string. Cheetah provides several ways to compile
-and fill templates, either as one step or two.
-
-Cheetah's compiler produces a subclass of \code{Cheetah.Template}
-specific to that template definition; this is called the {\bf generated
-class}. A {\bf template instance} is an instance of a generated class.
-
-If the user calls the \code{Template} constructor directly (rather than a
-subclass constructor), s/he will get what appears to be an instance of
-\code{Template} but is actually a subclass created on-the-fly.
-
-The user can make the subclass explicit by using the ``cheetah compile''
-command to write the template class to a Python module. Such a module is
-called a {\bf .py template module}.
-
-The {\bf Template Definition Language} -- or the ``Cheetah language'' for short
--- is the syntax rules governing placeholders and directives. These are
-discussed in sections \ref{language} and following in this Guide.
-
-To fill a template, you call its {\bf main method}. This is normally
-\code{.respond()}, but it may be something else, and you can use the
-\code{\#implements} directive to choose the method name. (Section
-\ref{inheritanceEtc.implements}.
-
-A {\bf template-servlet} is a .py template module in a Webware servlet
-directory. Such templates can be filled directly through the web by requesting
-the URL. ``Template-servlet'' can also refer to the instance being filled by
-a particular web request. If a Webware servlet that is not a
-template-servlet invokes a template, that template is not a template-servlet
-either.
-
-A {\bf placeholder tag} is the substring in the template
-definition that is the placeholder, including the start and end delimeters (if
-there is an end delimeter). The {\bf placeholder name} is the same but without
-the delimeters.
-
-Placeholders consist of one or more {\bf identifiers} separated by periods
-(e.g., \code{a.b}). Each identifier must follow the same rules as Python
-identifiers; that is, a letter or underscore followed by one or more letters,
-digits or underscores. (This is the regular expression
-\verb+[A-Za-z_][A-Za-z0-9_]*+.)
-
-The first (or only) identifier of a placeholder name represents a {\bf
-variable} to be looked up. Cheetah looks up variables in various {\bf
-namespaces}: the searchList, local variables, and certain other places. The
-searchList is a list of objects ({\bf containers}) with attributes
-and/or keys: each container is a namespace. Every template instance has
-exactly one searchList. Identifiers after the first are looked up only in
-the parent object. The final value after all lookups have been performed is
-the {\bf placeholder value}.
-
-Placeholders may occur in three positions: top-level, expression and LVALUE.
-{\bf Top-level} placeholders are those in ordinary text (``top-level text'').
-{\bf Expression} placeholders are those in Python expressions.
-{\bf LVALUE} placeholders are those naming a variable to receive a value.
-(LVALUE is computerese for ``the left side of the equal sign''.) Section
-\ref{language.placeholders.positions} explains the differences between these
-three positions.
-
-The routine that does the placeholder lookups is called the {\bf NameMapper}.
-Cheetah's NameMapper supports universal dotted notation and autocalling.
-{\bf Universal dotted notation} means that keys may be written as if they were
-attributes: \code{a.b} instead of \code{a['b']}. {\bf Autocalling} means that
-if any identifier's value is found to be a function or method, Cheetah will
-call it without arguments if there is no \verb+()+ following. More about the
-NameMapper is in section \ref{language.namemapper}.
-
-Some directives are multi-line, meaning they have a matching {\bf \#end} tag.
-The lines of text between the start and end tags is the {\bf body} of the
-directive. Arguments on the same line as the start tag, in contrast, are
-considered part of the directive tag. More details are in section
-\ref{language.directives.syntax} (Directive Syntax Rules).
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-% # vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_src/howItWorks.tex b/docs/users_guide_src/howItWorks.tex
deleted file mode 100755
index 4efa22f..0000000
--- a/docs/users_guide_src/howItWorks.tex
+++ /dev/null
@@ -1,420 +0,0 @@
-\section{How Cheetah Works}
-\label{howWorks}
-
-As mentioned before, you can do two things with templates: compile them and
-fill them. (Actually you can query them too, to see their attributes and
-method values.) Using templates in a Python program was shown in section
-\ref{gettingStarted.tutorial} (Quickstart tutorial). Here we'll focus on
-compiling and filling templates from the shell command line, and how to make
-.py template modules. The compiling information here is also important for
-template-servlets, which will be otherwise covered in chapter \ref{webware}
-(Webware).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Constructing Template Objects}
-\label{howWorks.templateClass}
-\label{howWorks.constructing}
-
-The heart of Cheetah is the \code{Template} class in the
-\code{Cheetah.Template} module. You can use it directly if you have a
-template definition in hand, or indirectly through a precompiled template,
-which is a subclass. The constructor accepts the following keyword
-arguments. (If you're a beginner, learn the first three arguments now;
-the others are much less frequent.)
-
-\begin{description}
-\item{{\bf source}}
- The template definition as a string. You may omit the \code{source=}
- prefix {\em if it's the first argument}, as in all the examples below.
- The source can be a string literal in your module, or perhaps a string
- you read from a database or other data structure.
-\item{{\bf file}}
- A filename or file object containing the template definition.
- A filename must be a string, and a file object must be open for reading.
- By convention, template definition files have the extension
- {\bf .tmpl}.
-\item{{\bf searchList}}
- A list of objects to add to the searchList. The attributes/keys of these
- objects will be consulted for \code{\$placeholder} lookup.
-\item{{\bf filter}}
- A class that will format every \code{\$placeholder} value. You may
- specify a class object or string. If a class object,
- it must be a subclass of \code{Cheetah.Filters.Filter}. If a string, it
- must be the name of one of the filters in filtersLib module (see next
- item).
- (You may also use the \code{\#filter} directive (section
- \ref{output.filter}) to switch filters at runtime.)
-\item{{\bf filtersLib}}
- A module containing the filters Cheetah should look up by name. The
- default is \code{Cheetah.Filters}. All classes in this module that are
- subclasses of \code{Cheetah.Filters.Filter} are considered filters.
-\item{{\bf errorCatcher}}
- A class to handle \code{\$placeholder} errors. You may
- specify a class object or string. If a class object,
- it must be a subclass of \code{Cheetah.ErrorCatchers.ErrorCatcher}.
- If a string, it must be the name of one of the error catchers in
- \code{Cheetah.ErrorCatchers}. This is similar to the
- \code{\#errorCatcher} directive
- (section \ref{errorHandling.errorCatcher}).
-\item{{\bf compilerSettings}}
- A dictionary (or dictionary hierarchy) of settings that change Cheetah's
- behavior. Not yet documented.
-\end{description}
-
-To use \code{Template} directly, you {\em must} specify either \code{source}
-or \code{file}, but not both. To use a precompiled template, you
-{\em must not} specify either one, because the template definition is already
-built into the class. The other arguments, however, may be used in either case.
-Here are typical ways to create a template instance:
-\begin{description}
-\item{\code{t = Template("The king is a \$placeholder1.")}}
- \\ Pass the template definition as a string.
-\item{\code{t = Template(file="fink.tmpl")}}
- \\ Read the template definition from a file named "fink.tmpl".
-\item{\code{t = Template(file=f)}}
- \\ Read the template definition from file-like object 'f'.
-\item{\code{t = Template("The king is a \$placeholder1.", searchList=[dict, obj])}}
- \\ Pass the template definition as a string. Also pass two namespaces for
- the searchList: a dictionary 'dict' and an instance 'obj'.
-\item{\code{t = Template(file="fink.txt", searchList=[dict, obj])}}
- \\ Same, but pass a filename instead of a string.
-\item{\code{t = Template(file=f, searchList=[dict, obj])}}
- \\ Same with a file object.
-\end{description}
-
-If you use \code{Template} directly, the template definition will be compiled
-the first time it's filled. Compilation creates a template-specific class
-called the {\bf generated class}, which is a subclass of \code{Template}. It
-then dynamically switches the instance so it's now an instance of this class.
-Don't worry if you don't understand this; it works.
-
-% By convention, you give a file containing a template definition the extension
-% {\bf .tmpl}.
-
-When you precompile a template using the ``cheetah compile'' command, it
-writes the generated class to a file. Actually, what it writes is the source
-code for a Python module that contains the generated class. Again, the
-generated class is a subclass of \code{Template}. We call the generated
-module a {\bf .py template module}. Thus, if you always use
-precompiled templates (as many people do), you can view Cheetah as a
-convenient front-end for writing certain kinds of Python modules, the way
-you might use a graphical dialog builder to make a dialog module.
-
-Precompiled templates provide a slight performance boost because the
-compilation happens only once rather than every time it's instantiated.
-Also, once you import the .py template module and allow Python to create a
-.pyc or .pyo file, you skip the Python compiler too. The speed advantage
-of all this is negligable, but it may make a difference in programs that
-use templates many times a second.
-
-\code{Template} subclasses Webware's \code{Servlet} class when available,
-so the generated class can be used as a Webware servlet. This is practical
-only with precompiled templates.
-
-To fill a template, you call its {\bf main method}. This is normally
-\code{.respond()}, but under certain circumstances it's \code{.writeBody()} or
-a user-defined name. (Section \ref{inheritanceEtc.implements} explains why
-the method name is not always the same.) However, \code{.\/\_\_str\_\_()} is
-always an alias for the main method, so you can always use
-\code{print\ myTemplateInstance} or \code{str(myTempateInstance)} to fill it.
-You can also call any \code{\#def} or \code{\#block} method and it will fill
-just that portion of the template, although this feature is not often used.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{``cheetah compile'' and .py template modules}
-\label{howWorks.cheetah-compile}
-
-To create a .py template module, do either of these:
-
-\begin{verbatim}
-cheetah compile [options] [FILES ...]
-cheetah c [options] [FILES ...]
-\end{verbatim}
-
-The following options are supported:
-\begin{verbatim}
- --idir DIR, --odir DIR : input/output directories (default: current dir)
- --iext EXT, --oext EXT : input/output filename extensions
- (default input: tmpl, default output: py)
- -R : recurse subdirectories looking for input files
- --debug : print lots of diagnostic output to standard error
- --flat : no destination subdirectories
- --nobackup : don't make backups
- --stdout, -p : output to standard output (pipe)
-\end{verbatim}
-
-{\em Note:} If Cheetah can't find your input files, or if it puts output files
-in the wrong place, use the \code{--debug} option to see what Cheetah thinks
-of your command line.
-
-The most basic usage is:
-\begin{verbatim}
-cheetah compile a.tmpl : writes a.py
-cheetah compile a.tmpl b.tmpl : writes a.py and b.py
-\end{verbatim}
-
-Cheetah will automatically add the default input extension (.tmpl) if the
-file is not found. So the following two examples are the same as above
-(provided files ``a'' and ``b'' don't exist):
-\begin{verbatim}
-cheetah compile a : writes a.py (from a.tmpl)
-cheetah compile a b : writes a.py and b.py
-\end{verbatim}
-
-You can override the default input extension and output extension
-(\code{py}) using \code{--iext} and \code{--oext}, although there's
-little reason to do so. Cheetah assumes the extension has a leading dot
-(.) even if you don't specify it.
-
-Use the \code{-R} option to recurse subdirectories:
-\begin{verbatim}
-cheetah compile dir1 : error, file is a directory
-cheetah compile -R dir1 : look in `dir1' for files to compile
-cheetah compile : error, no file specified
-cheetah compile -R : look in current directory for files
- to compile
-cheetah compile -R a b dir1 : compile files and recurse
-\end{verbatim}
-When recursing, only regular files that end in the input extension (.tmpl) are
-considered source files. All other filenames are ignored.
-
-The options \code{--idir} and \code{--odir} allow you to specify that
-the source (and/or destination) paths are relative to a certain directory
-rather than to the current directory. This is useful if you keep your
-*.tmpl and *.py files in separate directory hierarchies. After editing a
-source file, just run one of these (or put the command in a script or
-Makefile):
-\begin{verbatim}
-cheetah compile --odir /var/webware a.tmpl
-cheetah compile -R --odir /var/webware
-cheetah c --odir /var/webware sub/a.tmpl
- : writes /var/webware/sub/a.py
-\end{verbatim}
-
-``cheetah compile'' overwrites any existing \code{.py} file it finds, after
-backing it up to FILENAME.py\_bak (unless you specify \code{--nobackup}). For
-this reason, you should make changes to the \code{.tmpl} version of the
-template rather than to the \code{.py} version.
-
-For the same reason, if your template requires custom Python methods or
-other Python code, don't put it in the \code{FILENAME.py} file. Instead, put
-it in a separate base class and use the \code{\#extends} directive to
-inherit from it.
-
-Because FILENAME will be used as a class and module name, it must be a valid
-Python identifier. For instance, \code{cheetah compile spam-eggs.tmpl} is
-illegal because of the hyphen ("-"). This is sometimes inconvenient when
-converting a site of HTML files into Webware servlets. Fortunately, the
-{\em directory} it's in does not have to be an identifier. ({\em Hint:} for
-date-specific files, try converting 2002/04/12.html to 2002/04/12/index.tmpl.
-This also gives you a directory to store images or supplemental files.)
-
-Occasionally you may want output files put directly into the output directory
-(or current directory), rather than into a subdirectory parallel to the input
-file. The \code{--flat} option does this. Note that this introduces the
-possibility that several input files might map to one output file. Cheetah
-checks for output file collisions before writing any files, and aborts if there
-are any collisions.
-\begin{verbatim}
-cheetah c sub/a.py : writes sub/a.py
-cheetah c --flat sub/a.py : writes a.py
-cheetah c --odir DEST sub/a.tmpl
- : writes DEST/sub/a.py
-cheetah c --flat --odir DEST sub/a.tmpl
- : writes DEST/a.py
-cheetah c --idir /home/henry sub/rollins.tmpl
- : writes sub/rollins.py
-cheetah c --flat --idir /home/henry sub/rollins.tmpl
- : writes rollins.py
-cheetah c --idir /home/henry --odir /home/henry sub/rollins.tmpl
- : writes /home/henry/sub/rollins.py
-cheetah c --flat --idir /home/henry --odir /home/henry sub/rollins.tmpl
- : writes /home/henry/rollins.py
-\end{verbatim}
-
-Whenever ``cheetah compile'' has to create an output directory or subdirectory, it
-also creates an \_\_init\_\_.py file in it. This file is necessary
-in order to make Python treat the directory as a Python package.
-
-One of the advantages of .py template modules is that you don't lose any
-flexibility. The generated class contains all \code{\#attr} values and
-\code{\#def}/\code{\#block} values as ordinary attributes and methods, so you
-can read the values individually from other Python tools for any kind of custom
-processing you want. For instance, you can extract the titles of all
-your templates into a database, or find all the servlets with a certain
-\code{\$author} value.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{``cheetah fill''}
-\label{howWorks.cheetah-fill}
-
-You can compile and fill a large number of template definitions from the
-command line in one step using \code{cheetah fill}. This compiles the template
-in memory; it does {\em not} save the .py template module to disk. Instead it
-writes a finished output file, which has the extension \code{.html} by default.
-All the options to \code{cheetah compile} work the same way here, and there are
-also a couple additional options:
-\begin{verbatim}
- --env : put the environment in the searchList
- --pickle FILE : unpickle FILE and put that object in the searchList
-\end{verbatim}
-
-Because you can't provide a searchList on the command line, the
-templates must either contain or inherit all the variables it needs,
-or use the \code{--env} and \code{--pickle} options to
-provide additional variables.
-
-Examples:
-\begin{verbatim}
-cheetah fill a.tmpl : writes a.html
-cheetah fill a.tmpl b.tmpl : writes a.html and b.html
-cheetah f --oext txt a : writes a.txt (from a.tmpl)
-\end{verbatim}
-
-Using \code{--env} may have security or reliability implications because the
-environment normally contains lots of variables you inherited rather than
-defining yourself. If any of these variables override any of yours (say a
-\code{\#def}), you will get incorrect output, may reveal private information,
-and may get an exception due to the variable being an unexpected type
-(environmental variables are always strings). Your calling program may wish
-to clear out the environment before setting environmental variables for the
-template.
-
-There are two other differences between ``cheetah compile'' and ``cheetah fill''.
-Cheetah doesn't create \_\_init\_\_.py files when creating directories in
-fill mode. Also, the source filenames don't have to be identifiers.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Some trivia about .py template modules}
-\label{howWorks.pyTrivia}
-
-We won't look inside .py template modules in this Guide except to note that
-they are very different from template definitions. The following template
-definition fragment:
-
-\begin{verbatim}
-The number is $Test.unittest.main.
-\end{verbatim}
-
-compiles to this:
-
-\begin{verbatim}
-write("The number is ")
-write(filter(VFN(VFS(SL,"Test.unittest",1),"main",0)
-write(".")
-\end{verbatim}
-
-The Cheetah Developers' Guide looks at .py template
-modules in depth, and shows what the various directives compile to.
-But you are welcome to take a peek at some .py template modules yourself
-if you're curious about what Cheetah does under the hood. It's all
-regular Python code: writing strings and function calls to a file-like
-object.
-
-Looking at a .py template module may also help you see why something
-doesn't work, by seeing what Cheetah thought you meant. It also helps
-discourage you from modifying the .py file yourself, because who wants to
-keep all those function calls and arguments straight? Let the computer
-do the drudgery work.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Running a .py template module as a standalone program}
-\label{howWorks.standalone}
-
-In addition to importing your .py template module file into a Python
-script or using it as a Webware servlet, you can also run it from the
-command line as a standalone program. The program will print the filled
-template on standard output. This is useful while debugging the template,
-and for producing formatted output in shell scripts.
-
-When running the template as a program, you cannot provide a searchList or
-set \code{self.} attributes in the normal way, so you must take
-alternative measures to ensure that every placeholder has a value.
-Otherwise, you will get the usual \code{NameMapper.NotFound} exception at
-the first missing value. You can either set default values in the template
-itself (via the \code{\#attr} or \code{\#def} directives) or in a Python
-superclass, or use the \code{--env} or \code{--pickle} command-line options,
-which work just like their ``cheetah fill'' counterparts.
-
-Run \code{python FILENAME.py --help} to see all the command-line
-options your .py template module accepts.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Object-Oriented Documents}
-\label{howWorks.objoriented}
-
-Because Cheetah documents are actually class definitions, templates may inherit
-from one another in a natural way, using regular Python semantics. For
-instance, consider this template, FrogBase.tmpl:
-
-\begin{verbatim}
-#def title
-This document has not defined its title
-#end def
-#def htTitle
-$title
-#end def
-<HTML><HEAD>
-<TITLE>$title</TITLE>
-</HEAD><BODY>
-<H1>$htTitle</H1>
-$body
-</BODY></HTML>
-\end{verbatim}
-
-And its subclassed document, Frog1.tmpl:
-\begin{verbatim}
-#from FrogBase import FrogBase
-#extends FrogBase
-#def title
-The Frog Page
-#end def
-#def htTitle
-The <IMG SRC="Frog.png"> page
-#end def
-#def body
-... lots of info about frogs ...
-#end def
-\end{verbatim}
-
-This is a classic use of inheritance. The parent ``template'' is simply an
-abstract superclass. Each document specializes the output of its parent.
- For instance, here the parent defines
-\code{\$htTitle} so that by default it's identical to whatever the
-\code{\$title} is, but it can also be customized.
-
-In many other templating systems, you'd have to use case statements or
-if-elseif blocks of some sort, repeated in many different sections of code.
-
-While we show another Cheetah document inheriting from this parent, a Python
-class can inherit from it just as easily. This Python class could define its
-programmatically-driven value for \code{\$body} and \code{\$title}, simply by
-defining body() and title() methods that return a string. (Actually they
-can return anything, but we'll get into that later.)
-
-\begin{verbatim}
-from FrogBase import FrogBase
-class Frog2(FrogBase):
- def title(self):
- return "Frog 2 Page"
- # We don't override .htTitle, so it defaults to "Frog 2 Page" too.
- def body(self):
- return " ... more info about frogs ..."
-\end{verbatim}
-
-Similarly, the Cheetah document can inherit from an arbitrary class. That's
-how Cheetah makes templates usable as Webware servlets, by subclassing
-\code{Servlet}. This technique should be possible for non-Webware systems
-too.
-
-({\em Note:}\ \code{FrogBase.tmpl} could be improved by using the
-\code{\#block} directive, section \ref{inheritanceEtc.block}.)
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
diff --git a/docs/users_guide_src/inheritanceEtc.tex b/docs/users_guide_src/inheritanceEtc.tex
deleted file mode 100755
index 019b042..0000000
--- a/docs/users_guide_src/inheritanceEtc.tex
+++ /dev/null
@@ -1,492 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Import, Inheritance, Declaration and Assignment}
-\label{inheritanceEtc}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#import and \#from directives}
-\label{inheritanceEtc.import}
-
-Syntax:
-\begin{verbatim}
-#import MODULE_OR_OBJECT [as NAME] [, ...]
-#from MODULE import MODULE_OR_OBJECT [as NAME] [, ...]
-\end{verbatim}
-
-
-The \code{\#import} and \code{\#from} directives are used to make external
-Python modules or objects available to placeholders. The syntax is identical
-to the import syntax in Python. Imported modules are visible globally to all
-methods in the generated Python class.
-
-\begin{verbatim}
-#import math
-#import math as mathModule
-#from math import sin, cos
-#from math import sin as _sin
-#import random, re
-#from mx import DateTime # ## Part of Egenix's mx package.
-\end{verbatim}
-
-After the above imports, \code{\$math}, \code{\$mathModule},
-\code{\$sin}, \code{\$cos} and \code{\$\_sin}, \code{\$random}, \code{\$re}
-and \code{\$DateTime} may be used in \code{\$placeholders} and expressions.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#extends}
-\label{inheritanceEtc.extends}
-
-Syntax:
-\begin{verbatim}
-#extends CLASS
-\end{verbatim}
-
-
-All templates are subclasses of \code{Cheetah.Template.Template}. However,
-it's possible for a template to subclass another template or a pure Python
-class. This is where \code{\#extends} steps in: it
-specifies the parent class. It's equivalent to PSP's \code{``@page extends=''}
-directive.
-
-Cheetah imports the class mentioned in an \code{\#extends} directive
-automatically if you haven't imported it yet. The implicit importing works
-like this:
-
-\begin{verbatim}
-#extends Superclass
-## Implicitly does '#from Superclass import Superclass'.
-
-#extends Cheetah.Templates.SkeletonPage
-## Implicitly does '#from Cheetah.Templates.SkeletonPage import SkeletonPage'.
-\end{verbatim}
-
-If your superclass is in an unusual location or in a module named
-differently than the class, you must import it explicitly. There is no
-support for extending from a class that is not imported; e.g., from a template
-dynamically created from a string. Since the most practical way to
-get a parent template into a module is to precompile it, all parent templates
-essentially have to be precompiled.
-
-There can be only one \code{\#extends} directive in a template and it
-may list only one class. In other words, templates don't do multiple
-inheritance. This is intentional: it's too hard to initialize multiple
-base classes correctly from inside a template. However, you can do
-multiple inheritance in your pure Python classes.
-
-If your pure Python class overrides any of the standard \code{Template}
-methods such as \code{.\_\_init\_\_} or \code{.awake}, be sure to call
-the superclass method in your method or things will break. Examples of calling
-the superclass method are in section \ref{tips.callingSuperclassMethods}.
-A list of all superclass methods is in section
-\ref{tips.allMethods}.
-
-In all cases, the root superclass must be \code{Template}. If your
-bottommost class is a template, simply omit the \code{\#extends} in it and it
-will automatically inherit from \code{Template}. {\em If your bottommost class
-is a pure Python class, it must inherit from \code{Template} explicitly: }
-\begin{verbatim}
-from Cheetah.Template import Template
-class MyPurePythonClass(Template):
-\end{verbatim}
-
-If you're not keen about having your Python classes inherit from
-\code{Template}, create a tiny glue class that inherits both from your
-class and from \code{Template}.
-
-Before giving any examples we'll stress that Cheetah does {\em not}
-dictate how you should structure your inheritance tree. As long as
-you follow the rules above, many structures are possible.
-
-Here's an example for a large web site that has not only a general site
-template, but also a template for this section of the site, and then a
-specific template-servlet for each URL. (This is the ``inheritance
-approach'' discussed in the Webware chapter.) Each template inherits from a
-pure Python class that contains methods/attributes used by the template. We'll
-begin with the bottommost superclass and end with the specific
-template-servlet:
-
-\begin{verbatim}
-1. SiteLogic.py (pure Python class containing methods for the site)
- from Cheetah.Template import Template
- class SiteLogic(Template):
-
-2. Site.tmpl/py (template containing the general site framework;
- this is the template that controls the output,
- the one that contains "<HTML><HEAD>...", the one
- that contains text outside any #def/#block.)
- #from SiteLogic import SiteLogic
- #extends SiteLogic
- #implements respond
-
-3. SectionLogic.py (pure Python class with helper code for the section)
- from Site import Site
- class SectionLogic(Site)
-
-4. Section.tmpl/py (template with '#def' overrides etc. for the section)
- #from SectionLogic import SectionLogic
- #extends SectionLogic
-
-5. page1Logic.py (pure Python class with helper code for the template-servlet)
- from Section import Section
- class indexLogic(Section):
-
-6. page1.tmpl/py (template-servlet for a certain page on the site)
- #from page1Logic import page1Logic
- #extends page1Logic
-\end{verbatim}
-
-A pure Python classes might also contain methods/attributes that aren't used by
-their immediate child template, but are available for any descendant
-template to use if it wishes. For instance, the site template might have
-attributes for the name and e-mail address of the site administrator,
-ready to use as \$placeholders in any template that wants it.
-
-{\em Whenever you use \code{\#extends}, you often need \code{\#implements}
-too,} as in step 2 above. Read the next section to understand what
-\code{\#implements} is and when to use it.
-
-% @@MO: Edmund suggests making some diagrams of inheritance chains.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#implements}
-\label{inheritanceEtc.implements}
-
-Syntax:
-\begin{verbatim}
-#implements METHOD
-\end{verbatim}
-
-You can call any \code{\#def} or \code{\#block} method directly and get its
-outpt. The top-level content -- all the text/placeholders/directives outside any
-\code{\#def}/\code{\#block} -- gets concatenated and wrapped in a ``main
-method'', by default \code{.respond()}. So if you call \code{.respond()}, you
-get the ``whole template output''. When Webware calls \code{.respond()},
-that's what it's doing. And when you do 'print t' or 'str(t)' on a template
-instance, you're taking advantage of the fact that Cheetah makes
-\code{.\_\_str\_\_()} an alias for the main method.
-
-That's all fine and dandy, but what if your application prefers to call another
-method name rather than \code{.respond()}? What if it wants to call, say,
-\code{.send\_output()} instead? That's where \code{\#implements} steps in. It
-lets you choose the name for the main method. Just put this in your template
-definition:
-\begin{verbatim}
-#implements send_output
-\end{verbatim}
-
-When one template extends another, every template in the inheritance chain
-has its own main method. To fill the template, you invoke exactly one of
-these methods and the others are ignored. The method you call may be in any of
-the templates in the inheritance chain: the base template, the leaf template,
-or any in between, depending on how you structure your application. So you
-have two problems: (1) calling the right method name, and (2) preventing an
-undesired same-name subclass method from overriding the one you want to call.
-
-Cheetah assumes the method you will call is \code{.respond()} because
-that's what Webware calls. It further assumes the desired main method is the
-one in the lowest-level base template, because that works well with
-\code{\#block} as described in the Inheritance Approach for building Webware
-servlets (section \ref{webware.inheritance}), which was originally the
-principal use for Cheetah. So when you use \code{\#extends}, Cheetah changes
-that template's main method to \code{.writeBody()} to get it out of the way and
-prevent it from overriding the base template's \code{.respond()}.
-
-Unfortunately this assumption breaks down if the template is used in other
-ways. For instance, you may want to use the main method in the highest-level
-leaf template, and treat the base template(s) as merely a library of
-methods/attributes. In that case, the leaf template needs \code{\#implements
-respond} to change its main method name back to \code{.respond()} (or whatever
-your application desires to call). Likewise, if your main method is in one of the
-intermediate templates in an inheritance chain, that template needs
-\code{\#implements respond}.
-
-The other way the assumption breaks down is if the main method {\em is} in
-the base template but that template extends a pure Python class. Cheetah sees
-the \code{\#extends} and dutifully but incorrectly renames the method to
-\code{.writeBody()}, so you have to use \code{\#implements respond} to change
-it back. Otherwise the dummy \code{.respond()} in \code{Cheetah.Template}
-is found, which outputs... nothing. {\bf So if you're using \code{\#extends}
-and get no output, the {\em first} thing you should think is, ``Do I need to
-add \code{\#implements respond} somewhere?'' }
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#set}
-\label{inheritanceEtc.set}
-
-Syntax:
-\begin{verbatim}
-#set [global] $var = EXPR
-\end{verbatim}
-
-\code{\#set} is used to create and update local variables at run time.
-The expression may be any Python expression.
-Remember to preface variable names with \$ unless they're part of an
-intermediate result in a list comprehension.
-
-Here are some examples:
-\begin{verbatim}
-#set $size = $length * 1096
-#set $buffer = $size + 1096
-#set $area = $length * $width
-#set $namesList = ['Moe','Larry','Curly']
-#set $prettyCountry = $country.replace(' ', '&nbsp;')
-\end{verbatim}
-
-\code{\#set} variables are useful to assign a short name to a
-\code{\$deeply.nested.value}, to a calculation, or to a printable version of
-a value. The last example above converts any spaces in the 'country' value
-into HTML non-breakable-space entities, to ensure the entire value appears on
-one line in the browser.
-
-\code{\#set} variables are also useful in \code{\#if} expressions, but
-remember that complex logical routines should be coded in Python, not in
-Cheetah!
-\begin{verbatim}
-#if $size > 1500
- #set $adj = 'large'
-#else
- #set $adj = 'small'
-#end if
-\end{verbatim}
-Or Python's one-line equivalent, "A and B or C". Remember that in this case,
-B must be a true value (not None, '', 0, [] or {}).
-\begin{verbatim}
-#set $adj = $size > 1500 and 'large' or 'small'
-\end{verbatim}
-(Note: Cheetah's one-line \code{\#if} will not work for this, since it
-produces output rather than setting a variable.
-
-You can also use the augmented assignment operators:
-\begin{verbatim}
-## Increment $a by 5.
-#set $a += 5
-\end{verbatim}
-
-By default, \code{\#set} variables are not visible in method calls or include
-files unless you use the \code{global} attribute: \code{\#set global \$var =
-EXPRESSION}. Global variables are visible in all methods, nested templates and
-included files. Use this feature with care to prevent surprises.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#del}
-\label{inheritanceEtc.del}
-
-Syntax:
-\begin{verbatim}
-#del $var
-\end{verbatim}
-
-\code{\#del} is the opposite of \code{\#set}. It deletes a {\em local}
-variable. Its usage is just like Python's \code{del} statement:
-\begin{verbatim}
-#del $myVar
-#del $myVar, $myArray[5]
-\end{verbatim}
-
-Only local variables can be deleted. There is no directive to delete a
-\code{\#set global} variable, a searchList variable, or any other type of
-variable.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#attr}
-\label{inheritanceEtc.attr}
-
-Syntax:
-\begin{verbatim}
-#attr $var = EXPR
-\end{verbatim}
-
-The \code{\#attr} directive creates class attributes in the generated Python
-class. It should be used to assign simple Python literals such as numbers or
-strings. In particular, the expression must {\em not} depend on searchList
-values or \code{\#set} variables since those are not known at compile time.
-
-\begin{verbatim}
-#attr $title = "Rob Roy"
-#attr $author = "Sir Walter Scott"
-#attr $version = 123.4
-\end{verbatim}
-
-This template or any child template can output the value thus:
-\begin{verbatim}
-$title, by $author, version $version
-\end{verbatim}
-
-If you have a library of templates derived from etexts
-(\url{http://www.gutenberg.org/}), you can extract the titles and authors
-and put them in a database (assuming the templates have been compiled into
-.py template modules):
-
-%\begin{verbatim}
-%import glob
-%
-%\end{verbatim}
-%
-% @@MO: Finish this example.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#def}
-\label{inheritanceEtc.def}
-
-Syntax:
-\begin{verbatim}
-#def METHOD[(ARGUMENTS)]
-#end def
-\end{verbatim}
-
-Or the one-line variation:
-\begin{verbatim}
-#def METHOD[(ARGUMENTS)] : TEXT_AND_PLACEHOLDERS
-\end{verbatim}
-
-
-The \code{\#def} directive is used to define new methods in the generated
-Python class, or to override superclass methods. It is analogous to Python's
-\code{def} statement. The directive is silent, meaning it does not itself
-produce any output. However, the content of the method will be inserted into
-the output (and the directives executed) whenever the method is later called by
-a \$placeholder.
-
-\begin{verbatim}
-#def myMeth()
-This is the text in my method
-$a $b $c(123) ## these placeholder names have been defined elsewhere
-#end def
-
-## and now use it...
-$myMeth()
-\end{verbatim}
-
-The arglist and parentheses can be omitted:
-\begin{verbatim}
-#def myMeth
-This is the text in my method
-$a $b $c(123)
-#end def
-
-## and now use it...
-$myMeth
-\end{verbatim}
-
-Methods can have arguments and have defaults for those arguments, just like
-in Python. Remember the \code{\$} before variable names:
-\begin{verbatim}
-#def myMeth($a, $b=1234)
-This is the text in my method
-$a - $b
-#end def
-
-## and now use it...
-$myMeth(1)
-\end{verbatim}
-
-The output from this last example will be:
-
-\begin{verbatim}
-This is the text in my method
-1 - 1234
-\end{verbatim}
-
-There is also a single line version of the \code{\#def} directive.
-{\bf Unlike the multi-line directives, it uses a colon (:) to delimit the method
-signature and body}:
-\begin{verbatim}
-#attr $adj = 'trivial'
-#def myMeth: This is the $adj method
-$myMeth
-\end{verbatim}
-Leading and trailing whitespace is stripped from the method. This is in
-contrast to:
-\begin{verbatim}
-#def myMeth2
-This is the $adj method
-#end def
-\end{verbatim}
-where the method includes a newline after "method". If you don't want the
-newline, add \code{\#slurp}:
-\begin{verbatim}
-#def myMeth3
-This is the $adj method#slurp
-#end def
-\end{verbatim}
-
-Because \code{\#def} is handled at compile time, it can appear above or
-below the placeholders that call it. And if a superclass placeholder
-calls a method that's overridden in a subclass, it's the subclass method
-that will be called.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#block ... \#end block}
-\label{inheritanceEtc.block}
-
-
-The \code{\#block} directive allows you to mark a section of your template that
-can be selectively reimplemented in a subclass. It is very useful for
-changing part of a template without having to copy-paste-and-edit
-the entire thing. The output from a template definition that uses blocks will
-be identical to the output from the same template with the \code{\#block \ldots
-\#end block} tags removed.
-
-({\em Note:} don't be confused by the generic word `block'' in this Guide,
-which means a section of code inside {\em any} \code{\#TAG \ldots \#end TAG}
-pair. Thus, an if-block, for-block, def-block, block-block etc. In this
-section we are talking only of block-blocks.)
-
-To reimplement the block, use the \code{\#def} directive. The magical effect
-is that it appears to go back and change the output text {\em at the point the
-original block was defined} rather than at the location of the
-reimplementation.
-
-\begin{verbatim}
-#block testBlock
-Text in the contents
-area of the block directive
-#if $testIt
-$getFoo()
-#end if
-#end block testBlock
-\end{verbatim}
-
-You can repeat the block name in the \code{\#end block} directive or not, as
-you wish.
-
-\code{\#block} directives can be nested to any depth.
-
-\begin{verbatim}
-#block outerBlock
-Outer block contents
-
-#block innerBlock1
-inner block1 contents
-#end block innerBlock1
-
-#block innerBlock2
-inner block2 contents
-#end block innerBlock2
-
-#end block outerBlock
-\end{verbatim}
-
-Note that the name of the block is optional for the \code{\#end block} tag.
-
-Technically, \code{\#block} directive is equivalent to a \code{\#def} directive
-followed immediately by a \code{\#placeholder} for the same name. In fact,
-that's what Cheetah does. Which means you can use \code{\$theBlockName}
-elsewhere in the template to output the block content again.
-
-There is a one-line \code{\#block} syntax analagous to the one-line
-\code{\#def}.
-
-The block must not require arguments because the implicit placeholder that's
-generated will call the block without arguments.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/introduction.tex b/docs/users_guide_src/introduction.tex
deleted file mode 100755
index be34fc6..0000000
--- a/docs/users_guide_src/introduction.tex
+++ /dev/null
@@ -1,392 +0,0 @@
-\section{Introduction}
-\label{intro}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Who should read this Guide?}
-\label{intro.whoShouldRead}
-
-This Users' Guide provides a technical overview and reference for the
-Cheetah template system. Knowledge of Python and object-oriented programming
-is assumed. The emphasis in this Guide is on features useful in a wide variety
-of situations. Information on less common situations and troubleshooting tips
-are gradually being moved to the Cheetah FAQ. There is also a Cheetah
-Developer's Guide for those who want to know what goes on under the hood.
-
-%% A gentler introduction for template maintainers who don't know
-%% Python will be written later.
-
-This Guide also contains examples of integrating Cheetah with Webware for
-Python. You will have to learn Webware from its own documentation in order to
-build a Webware + Cheetah site.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{What is Cheetah?}
-\label{intro.whatIs}
-
-Cheetah is a Python-powered template engine and code generator. It may be used
-as a standalone utility or combined with other tools. Cheetah has
-many potential uses, but web developers looking for a viable alternative to ASP,
-JSP, PHP and PSP are expected to be its principle user group.
-
-Cheetah:
-\begin{itemize}
-\item generates HTML, SGML, XML, SQL, Postscript, form email, LaTeX, or any
- other text-based format. It has also been used to produce Python, Java
- and PHP source code.
-
-\item cleanly separates content, graphic design, and program code. This leads
- to highly modular, flexible, and reusable site architectures; faster
- development time; and HTML and program code that is easier to understand
- and maintain. It is particularly well suited for team efforts.
-
-\item blends the power and flexibility of Python with a simple template language
- that non-programmers can understand.
-
-\item gives template writers full access in their templates to any Python data
- structure, module, function, object, or method.
-
-\item makes code reuse easy by providing an object-oriented interface to
- templates that is accessible from Python code or other Cheetah templates.
- One template can subclass another and selectively reimplement sections of
- it. A compiled template {\em is} a Python class, so it can subclass a
- pure Python class and vice-versa.
-
-\item provides a simple yet powerful caching mechanism
-
-%% that can dramatically improve the performance of a dynamic website.
-\end{itemize}
-
-Cheetah integrates tightly with {\bf Webware for Python}
-(\url{http://webware.sourceforge.net/}): a Python-powered application server and
-persistent servlet framework. Webware provides automatic session, cookie, and
-user management and can be used with almost any operating-system, web server, or
-database. Through Python, it works with XML, SOAP, XML-RPC, CORBA, COM, DCOM,
-LDAP, IMAP, POP3, FTP, SSL, etc.. Python supports structured exception handling,
-threading, object serialization, unicode, string internationalization, advanced
-cryptography and more. It can also be extended with code and libraries written
-in C, C++, Java and other languages.
-
-Like Python, Cheetah and Webware are Open Source software and are supported by
-active user communities. Together, they are a powerful and elegant framework
-for building dynamic web sites.
-
-Like its namesake, Cheetah is fast, flexible and powerful.
-
-% @@MO: Repeat picture of cheetah.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{What is the philosophy behind Cheetah?}
-\label{intro.philosophy}
-
-Cheetah's design was guided by these principles:
-\begin{itemize}
-\item Python for the back end, Cheetah for the front end. Cheetah was
- designed to complement Python, not replace it.
-
-\item Cheetah's core syntax should be easy for non-programmers to learn.
-
-\item Cheetah should make code reuse easy by providing an object-oriented
- interface to templates that is accessible from Python code or other
- Cheetah templates.
-
-\item Python objects, functions, and other data structures should be fully
- accessible in Cheetah.
-
-\item Cheetah should provide flow control and error handling. Logic
- that belongs in the front end shouldn't be relegated to the
- back end simply because it's complex.
-
-\item It should be easy to {\bf separate} content, graphic design, and program
- code, but also easy to {\bf integrate} them.
-
- A clean separation makes it easier for a team of content writers,
- HTML/graphic designers, and programmers to work together without stepping
- on each other's toes and polluting each other's work. The HTML framework
- and the content it contains are two separate things, and analytical
- calculations (program code) is a third thing. Each team member should be
- able to concentrate on their specialty and to implement their changes
- without having to go through one of the others (i.e., the dreaded
- ``webmaster bottleneck'').
-
- While it should be easy to develop content, graphics and program
- code separately, it should be easy to integrate them together into a
- website. In particular, it should be easy:
-
- \begin{itemize}
- \item for {\bf programmers} to create reusable components and functions
- that are accessible and understandable to designers.
- \item for {\bf designers} to mark out placeholders for content and
- dynamic components in their templates.
- \item for {\bf designers} to soft-code aspects of their design that are
- either repeated in several places or are subject to change.
- \item for {\bf designers} to reuse and extend existing templates and thus
- minimize duplication of effort and code.
- \item and, of course, for {\bf content writers} to use the templates that
- designers have created.
- \end{itemize}
-
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Why Cheetah doesn't use HTML-style tags}
-\label{intro.htmlStyleTags}
-
-Cheetah does not use HTML/XML-style tags like some other template languages for
-the following reasons:
- Cheetah is not limited to HTML,
- HTML-style tags are hard to distinguish from real HTML tags,
- HTML-style tags are not visible in rendered HTML when something goes wrong,
- HTML-style tags often lead to invalid HTML (e.g.,
-\code{<img src="<template-directive>">}),
-Cheetah tags are less verbose and easier to understand than HTML-style tags,
-and HTML-style tags aren't compatible with most WYSIWYG editors
-
-Besides being much more compact, Cheetah also has some advantages over
-languages that put information inside the HTML tags, such as Zope Page
-Templates or PHP:
- HTML or XML-bound languages do not work well with other languages,
- While ZPT-like syntaxes work well in many ways with WYSIWYG HTML editors,
- they also give up a significant advantage of those editors -- concrete
- editing of the document. When logic is hidden away in (largely
- inaccessible) tags it is hard to understand a page simply by viewing it,
- and it is hard to confirm or modify that logic.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Give me an example!}
-\label{intro.example}
-
-Here's a very simple example that illustrates some of Cheetah's basic syntax:
-
-\begin{verbatim}
-
-<HTML>
-<HEAD><TITLE>$title</TITLE></HEAD>
-<BODY>
-
-<TABLE>
-#for $client in $clients
-<TR>
-<TD>$client.surname, $client.firstname</TD>
-<TD><A HREF="mailto:$client.email">$client.email</A></TD>
-</TR>
-#end for
-</TABLE>
-
-</BODY>
-</HTML>
-\end{verbatim}
-
-Compare this with PSP:
-
-\begin{verbatim}
-<HTML>
-<HEAD><TITLE><%=title%></TITLE></HEAD>
-<BODY>
-
-<TABLE>
-<% for client in clients: %>
-<TR>
-<TD><%=client['surname']%>, <%=client['firstname']%></TD>
-<TD><A HREF="mailto:<%=client['email']%>"><%=client['email']%></A></TD>
-</TR>
-<%end%>
-</TABLE>
-
-</BODY>
-</HTML>
-\end{verbatim}
-
-Section \ref{gettingStarted.tutorial} has a more typical example that shows
-how to get the plug-in values {\em into} Cheetah, and section
-\ref{howWorks.cheetah-compile} explains how to turn your template definition
-into an object-oriented Python module.
-
-%% @@TR: I'm going to extend this and briefly introduce:
-%% - Template objects vs. .tmpl files.
-%% - how to get data into it
-%% @@MO: If you do this, reconcile this example and the one in gettingStarted.
-%% Keep two examples or collapse into one?
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Give me an example of a Webware servlet!}
-\label{intro.example.servlet}
-
-This example uses an HTML form to ask the user's name, then invokes itself
-again to display a {\em personalized} friendly greeting.
-
-\begin{verbatim}
-<HTML><HEAD><TITLE>My Template-Servlet</TITLE></HEAD><BODY>
-#set $name = $request.field('name', None)
-#if $name
-Hello $name
-#else
-<FORM ACTION="" METHOD="GET">
-Name: <INPUT TYPE="text" NAME="name"><BR>
-<INPUT TYPE="submit">
-</FORM>
-#end if
-</BODY></HTML>
-\end{verbatim}
-
-To try it out for yourself on a Webware system:
-\begin{enumerate}
-\item copy the template definition to a file {\bf test.tmpl} in your
- Webware servlet directory.
-\item Run ``\code{cheetah compile test.tmpl}''. This produces
- {\bf test.py} (a .py template module) in the same directory.
-\item In your web browser, go to {\bf test.py}, using whatever site and
- directory is appropriate. Depending on your Webware configuration, you may
- also be able to go to {\bf test}.
-\end{enumerate}
-
-At the first request, field `name' will be blank (false) so the ``\#else''
-portion will execute and present a form. You type your name and press submit.
-The form invokes the same page. Now `name' is true so the ``\#if'' portion
-executes, which displays the greeting. The ``\#set'' directive creates a
-local variable that lasts while the template is being filled.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{How mature is Cheetah?}
-\label{intro.mature}
-
-Cheetah is stable, production quality, post-beta code. Cheetah's syntax,
-semantics and performance have been generally stable since a performance
-overhaul in mid 2001. Most of the changes since October 2001 have
-been in response to specific requests by production sites, things they need that
-we hadn't considered.
-
-As of summer 2003, we are putting in the final touches before the 1.0 release.
-
-The {\bf TODO} and {\bf BUGS} files in the Cheetah distribution show what we're
-working on now or planning to work on. There's also a {\bf ToDo} page on the
-wiki (see below), which is updated less often. The {\bf WishList} page on the
-wiki shows requested features we're considering but haven't commited to.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Where can I get news?}
-\label{intro.news}
-
-Cheetah releases and other stuff can be obtained from the the Cheetah
-{\bf Web site}:
-\url{http://CheetahTemplate.sourceforge.net}
-
-Cheetah discussions take place on the {\bf mailing list}
-\email{cheetahtemplate-discuss@lists.sourceforge.net}. This is where to hear
-the latest news first.
-
-The Cheetah {\bf wiki} is becoming an increasingly popular place to list
-examples of Cheetah in use, provide cookbook tips for solving various problems,
-and brainstorm ideas for future versions of Cheetah.
-\url{http://www.cheetahtemplate.org/wiki}
-(The wiki is actually hosted at
-\url{http://cheetah.colorstudy.net/twiki/bin/view/Cheetah/WebHome}, but the
-other URL is easier to remember.)
-For those unfamiliar with a wiki, it's a type of Web site that readers can edit
-themselves to make additions or corrections to. Try it. Examples and tips
-from the wiki will also be considered for inclusion in future versions of this
-Users' Guide.
-
-If you encounter difficulties, or are unsure about how to do something,
-please post a detailed message to the list.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{How can I contribute?}
-\label{intro.contribute}
-
-Cheetah is the work of many volunteers. If you use Cheetah please share your
-experiences, tricks, customizations, and frustrations.
-
-\subsubsection{Bug reports and patches}
-
-If you think there is a bug in Cheetah, send a message to the e-mail list
-with the following information:
-
-\begin{enumerate}
-\item a description of what you were trying to do and what happened
-\item all tracebacks and error output
-\item your version of Cheetah
-\item your version of Python
-\item your operating system
-\item whether you have changed anything in the Cheetah installation
-\end{enumerate}
-
-\subsubsection{Example sites and tutorials}
-If you're developing a website with Cheetah, please put a link on the wiki on
-the {\bf WhoIsUsingCheetah} page, and mention it on the list. Also, if you
-discover new and interesting ways to use Cheetah, please put a quick tutorial
-(HOWTO) about your technique on the {\bf CheetahRecipies} page on the wiki.
-
-\subsubsection{Template libraries and function libraries}
-We hope to build up a framework of Template libraries (see section
-\ref{libraries.templates}) to distribute with Cheetah and would appreciate any
-contributions.
-
-\subsubsection{Test cases}
-Cheetah is packaged with a regression testing suite that is run with each
-new release to ensure that everything is working as expected and that recent
-changes haven't broken anything. The test cases are in the Cheetah.Tests
-module. If you find a reproduceable bug please consider writing a test case
-that will pass only when the bug is fixed. Send any new test cases to the email
-list with the subject-line ``new test case for Cheetah.''
-
-\subsubsection{Publicity}
-Help spread the word ... recommend it to others, write articles about it, etc.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Acknowledgements}
-\label{intro.acknowledgments}
-
-Cheetah is one of several templating frameworks that grew out of a `templates'
-thread on the Webware For Python email list. Tavis Rudd, Mike Orr, Chuck
-Esterbrook and Ian Bicking are the core developers.
-
-We'd like to thank the following people for contributing valuable advice, code
-and encouragement: Geoff Talvola, Jeff Johnson, Graham Dumpleton, Clark C.
-Evans, Craig Kattner, Franz Geiger, Geir Magnusson, Tom Schwaller, Rober Kuzelj,
-Jay Love, Terrel Shumway, Sasa Zivkov, Arkaitz Bitorika, Jeremiah Bellomy,
-Baruch Even, Paul Boddie, Stephan Diehl, Chui Tey, Michael Halle, Edmund Lian
-and Aaron Held.
-
-The Velocity, WebMacro and Smarty projects provided inspiration and design
-ideas. Cheetah has benefitted from the creativity and energy of their
-developers. Thank you.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{License}
-\label{intro.license}
-
-\paragraph*{The gist}
-Cheetah is open source, but products developed with Cheetah or derived
-from Cheetah may be open source or closed source.
-
-{\bf Cheetah.Utils.optik} is based on a third-party package Optik by Gregory
-P Ward. Optik's license is in appendix \ref{optikLicense}.
-
-
-\paragraph*{Legal terms}
-Copyright \copyright 2001, The Cheetah Development Team: Tavis Rudd, Mike Orr,
-Ian Bicking, Chuck Esterbrook.
-
-Permission to use, copy, modify, and distribute this software for any purpose
-and without fee is hereby granted, provided that the above copyright notice
-appear in all copies and that both that copyright notice and this permission
-notice appear in supporting documentation, and that the names of the authors not
-be used in advertising or publicity pertaining to distribution of the software
-without specific, written prior permission.
-
-THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS
-BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
-CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-These terms do not apply to the {\bf Cheetah.Utils.optik} package. Optik's
-license is in appendix \ref{optikLicense}.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/language.tex b/docs/users_guide_src/language.tex
deleted file mode 100755
index 673abca..0000000
--- a/docs/users_guide_src/language.tex
+++ /dev/null
@@ -1,651 +0,0 @@
-\section{Language Overview}
-\label{language}
-
-Cheetah's basic syntax was inspired by the Java-based template engines Velocity
-and WebMacro. It has two types of tags: {\bf \$placeholders} and {\bf
-\#directives}. Both types are case-sensitive.
-
-Placeholder tags begin with a dollar sign (\code{\$varName}) and are similar to
-data fields in a form letter or to the \code{\%(key)s} fields on the left side
-of Python's \code{\%} operator. When the template is filled, the placeholders
-are replaced with the values they refer to.
-
-Directive tags begin with a hash character (\#) and are used for comments,
-loops, conditional blocks, includes, and all other advanced features.
-({\em Note:} you can customize the start and end delimeters for placeholder
-and directive tags, but in this Guide we'll assume you're using the default.)
-
-Placeholders and directives can be escaped by putting a backslash before them.
-\verb+\$var+ and \verb+\#if+ will be output as literal text.
-
-A placeholder or directive can span multiple physical lines, following the same
-rules as Python source code: put a backslash (\verb+\+) at the end of all
-lines except the last line. However, if there's an unclosed parenthesis,
-bracket or brace pending, you don't need the backslash.
-
-\begin{verbatim}
-#if $this_is_a_very_long_line and $has_lots_of_conditions \
- and $more_conditions:
-<H1>bla</H1>
-#end if
-
-#if $country in ('Argentina', 'Uruguay', 'Peru', 'Colombia',
- 'Costa Rica', 'Venezuela', 'Mexico')
-<H1>Hola, senorita!</H1>
-#else
-<H1>Hey, baby!</H1>
-#end if
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Language Constructs -- Summary}
-\label{language.constructs}
-
-\begin{enumerate}
-\item Comments and documentation strings
- \begin{enumerate}
- \item \code{\#\# single line}
- \item \code{\#* multi line *\#}
- \end{enumerate}
-
-\item Generation, caching and filtering of output
- \begin{enumerate}
- \item plain text
- \item look up a value: \code{\$placeholder}
- \item evaluate an expression: \code{\#echo} \ldots
- \item same but discard the output: \code{\#silent} \ldots
- \item one-line if: \code{\#if EXPR then EXPR else EXPR}
- \item gobble the EOL: \code{\#slurp}
- \item parsed file includes: \code{\#include} \ldots
- \item raw file includes: \code{\#include raw} \ldots
- \item verbatim output of Cheetah code: \code{\#raw} \ldots \code{\#end raw}
- \item cached placeholders: \code{\$*var}, \code{\$*<interval>*var}
- \item cached regions: \code{\#cache} \ldots \code{\#end cache}
- \item set the output filter: \code{\#filter} \ldots
- \item control output indentation: \code{\#indent} \ldots ({\em not
-implemented yet})
- \end{enumerate}
-
-\item Importing Python modules and objects: \code{\#import} \ldots,
- \code{\#from} \ldots
-
-\item Inheritance
- \begin{enumerate}
- \item set the base class to inherit from: \code{\#extends}
- \item set the name of the main method to implement: \code{\#implements}
-\ldots
- \end{enumerate}
-
-\item Compile-time declaration
- \begin{enumerate}
- \item define class attributes: \code{\#attr} \ldots
- \item define class methods: \code{\#def} \ldots \code{\#end def}
- \item \code{\#block} \ldots \code{\#end block} provides a simplified
- interface to \code{\#def} \ldots \code{\#end def}
- \end{enumerate}
-
-\item Run-time assignment
- \begin{enumerate}
- \item local vars: \code{\#set} \ldots
- \item global vars: \code{\#set global} \ldots
- \item deleting local vars: \code{\#del} \ldots
- \end{enumerate}
-
-\item Flow control
- \begin{enumerate}
- \item \code{\#if} \ldots \code{\#else} \ldots \code{\#else if} (aka
- \code{\#elif}) \ldots \code{\#end if}
- \item \code{\#unless} \ldots \code{\#end unless}
- \item \code{\#for} \ldots \code{\#end for}
- \item \code{\#repeat} \ldots \code{\#end repeat}
- \item \code{\#while} \ldots \code{\#end while}
- \item \code{\#break}
- \item \code{\#continue}
- \item \code{\#pass}
- \item \code{\#stop}
- \end{enumerate}
-
-\item error/exception handling
- \begin{enumerate}
- \item \code{\#assert}
- \item \code{\#raise}
- \item \code{\#try} \ldots \code{\#except} \ldots \code{\#else} \ldots
- \code{\#end try}
- \item \code{\#try} \ldots \code{\#finally} \ldots \code{\#end try}
- \item \code{\#errorCatcher} \ldots set a handler for exceptions raised by
-\$placeholder calls.
- \end{enumerate}
-
-\item Instructions to the parser/compiler
- \begin{enumerate}
- \item \code{\#breakpoint}
- \item \code{\#compiler-settings} \ldots \code{\#end compiler-settings}
- \end{enumerate}
-
-\item Escape to pure Python code
- \begin{enumerate}
- \item evalute expression and print the output: \code{<\%=} \ldots
- \code{\%>}
- \item execute code and discard output: \code{<\%} \ldots \code{\%>}
- \end{enumerate}
-
-\item Fine control over Cheetah-generated Python modules
- \begin{enumerate}
- \item set the source code encoding of compiled template modules: \code{\#encoding}
- \item set the sh-bang line of compiled template modules: \code{\#shBang}
- \end{enumerate}
-
-\end{enumerate}
-
-The use of all these constructs will be covered in the next several chapters.
-
-%% @@MO: TODO: reconcile the order of this summary with the order in the
-%% detail sections.
-
-% @@MO: PSP chapter with examples. What does write() do? Print?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Placeholder Syntax Rules}
-\label{language.placeholders.syntax}
-
-\begin{itemize}
-
-\item Placeholders follow the same syntax rules as Python variables except
- that they are preceded by \code{\$} (the short form) or enclosed in
- \code{\$\{\}} (the long form).
- Examples:
-\begin{verbatim}
-$var
-${var}
-$var2.abc['def']('gh', $subplaceholder, 2)
-${var2.abc['def']('gh', $subplaceholder, 2)}
-\end{verbatim}
- We recommend \code{\$} in simple cases, and \code{\$\{\}} when followed
- directly by a letter or when Cheetah or a human template maintainer might
- get confused about where the placeholder ends. You may alternately use
- \verb+$()+ or \verb+$[]+, although this may confuse the (human) template
- maintainer:
-\begin{verbatim}
-$(var)
-$[var]
-$(var2.abc['def']('gh', $subplaceholder, 2))
-$[var2.abc['def']('gh', $subplaceholder, 2)]
-\end{verbatim}
- {\em Note:} Advanced users can change the delimiters to anything they
- want via the \code{\#compiler} directive.
-
- {\em Note 2:} The long form can be used only with top-level placeholders,
- not in expressions. See section \ref{language.placeholders.positions}
- for an elaboration on this.
-
-\item To reiterate Python's rules, placeholders consist of one or more
- identifiers separated by periods. Each identifier must start with a letter
- or an underscore, and the subsequent characters must be letters, digits or
- underscores. Any identifier may be followed by arguments enclosed in
- \verb+()+ and/or keys/subscripts in \verb+[]+.
-
-\item Identifiers are case sensitive. \code{\$var} does not equal \code{\$Var}
- or \code{\$vAr} or \code{\$VAR}.
-
-\item Arguments inside \verb+()+ or \verb+[]+ are just like in Python.
- Strings may be quoted using any Python quoting style. Each argument is an
- expression and may use any of Python's expression operators. Variables
- used in argument expressions are placeholders and should be prefixed with
- \code{\$}. This also applies to the *arg and **kw forms. However, you do
- {\em not} need the \code{\$} with the special Python constants \code{None},
- \code{True} and \code{False}.
- Examples:
-\begin{verbatim}
-$hex($myVar)
-$func($arg=1234)
-$func2($*args, $**kw)
-$func3(3.14159, $arg2, None, True)
-$myList[$mySubscript]
-\end{verbatim}
-
-\item Trailing periods are ignored. Cheetah will recognize that the placeholder
- name in \code{\$varName.} is \code{varName}, and the period will be left
- alone in the template output.
-
-\item The syntax \code{\$\{placeholderName, arg1="val1"\}} passes arguments to
- the output filter (see \code{\#filter}, section \ref{output.filter}.
- The braces and comma are required in this case. It's conventional to
- omit the \code{\$} before the keyword arguments (i.e. \code{arg1}) in this
- case.
-
-\item Cheetah ignores all dollar signs (\code{\$}) that are not followed by a
- letter or an underscore.
-
-\end{itemize}
-
-The following are valid \$placeholders:
-\begin{verbatim}
-$a $_ $var $_var $var1 $_1var $var2_ $dict.key $list[3]
-$object.method $object.method() $object.method
-$nest($nest($var))
-\end{verbatim}
-
-These are not \$placeholders but are treated as literal text:
-\begin{verbatim}
-$@var $^var $15.50 $$
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Where can you use placeholders?}
-\label{language.placeholders.positions}
-
-There are three places you can use placeholders: top-level position,
-expression position and LVALUE position. Each has slightly different
-syntax rules.
-
-Top-level position means interspersed in text. This is the only place
-you can use the placeholder long form: \code{\$\{var\}}.
-
-{\em Expression position} means inside a Cheetah expression, which is the same
-as a Python expression. The placeholder names a searchList or other variable
-to be read. Expression position occurs inside () and $[]$ arguments within
-placeholder tags (i.e., a placeholder inside a placeholder), and in several
-directive tags.
-
-{\em LVALUE position} means naming a variable that will be written to. LVALUE
-is a computer science term meaning ``the left side of an assignment
-statement''. The first argument of directives \code{\#set}, \code{\#for},
-\code{\#def}, \code{\#block} and \code{\#attr} is an LVALUE.
-
-This stupid example shows the three positions. Top-level position is shown
-in \code{courier}, expression position is {\em italic}, and LVALUE position is
-{\bf bold}.
-
-\begin{quote}
-\#for {\bf \$count} in {\em \$range}({\em \$ninetyNine}, 0, -1)\\
-\#set {\bf \$after} = {\em \$count} - 1\\
-\code{\$count} bottles of beer on the wall. \code{\$count} bottles of beer!\\
-~~~~Take one down, pass it around. \code{\$after} bottles of beer on the wall.\\
-\#end for\\
-\code{\$hex}({\em \$myVar}, {\bf \$default}={\em None})
-\end{quote}
-
-The output of course is:
-\begin{verbatim}
-99 bottles of beer on the wall. 99 bottles of beer!
- Take one down, pass it around. 98 bottles of beer on the wall.
-98 bottles of beer on the wall. 98 bottles of beer!
- Take one down, pass it around. 97 bottles of beer on the wall.
-...
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Are all those dollar signs really necessary?}
-\label{language.placeholders.dollar-signs}
-
-\code{\$} is a ``smart variable prefix''. When Cheetah sees \code{\$}, it
-determines both the variable's position and whether it's a searchList value or
-a non-searchList value, and generates the appropriate Python code.
-
-In top-level position, the \code{\$} is {\em required}. Otherwise there's
-nothing to distinguish the variable from ordinary text, and the variable name
-is output verbatim.
-
-In expression position, the \code{\$} is {\em required} if the value comes from
-the searchList or a ``\#set global'' variable, {\em recommended} for
-local/global/builtin variables, and {\em not necessary} for the special
-constants \code{None}, \code{True} and \code{False}. This works because
-Cheetah generates a function call for a searchList placeholder, but a bare
-variable name for a local/global/builtin variable.
-
-In LVALUE position, the \code{\$} is {\em recommended}. Cheetah knows where
-an LVALUE is expected, so it can handle your variable name whether it has
-\code{\$} or not.
-
-EXCEPTION: Do {\em not} use the \code{\$} prefix for intermediate variables in
-a Python list comprehensions. This is a limitation of Cheetah's parser; it
-can't tell which variables in a list comprehension are the intermediate
-variables, so you have to help it. For example:
-\begin{verbatim}
-#set $theRange = [x ** 2 for x in $range(10)]
-\end{verbatim}
-\code{\$theRange} is a regular \code{\#set} variable. \code{\$range} is a
-Python built-in function. But \code{x} is a scratch variable internal to
-the list comprehension: if you type \code{\$x}, Cheetah will miscompile
-it.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{NameMapper Syntax}
-\label{language.namemapper}
-
-One of our core aims for Cheetah was to make it easy for non-programmers to
-use. Therefore, Cheetah uses a simplified syntax for mapping placeholders
-in Cheetah to values in Python. It's known as the {\bf NameMapper syntax}
-and allows for non-programmers to use Cheetah without knowing (a) the
-difference between an instance and a dictionary, (b) what functions and methods
-are, and (c) what 'self' is. A side benefit is that you can change the
-underlying data structure (e.g., instance to dictionary or vice-versa) without
-having to modify the templates.
-
-NameMapper syntax is used for all variables in Cheetah placeholders and
-directives. If desired, it can be turned off via the \code{Template} class'
-\code{'useNameMapper'} compiler setting. But it's doubtful you'd ever want to
-turn it off.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Example}
-\label{language.namemapper.example}
-
-Consider this scenario:
-
-You are building a customer information system. The designers with you want to
-use information from your system on the client's website --AND-- they want to
-understand the display code and so they can maintian it themselves.
-
-You write a UI class with a 'customers' method that returns a dictionary of all
-the customer objects. Each customer object has an 'address' method that returns
-the a dictionary with information about the customer's address. The designers
-want to be able to access that information.
-
-Using PSP, the display code for the website would look something like the
-following, assuming your servlet subclasses the class you created for managing
-customer information:
-
-\begin{verbatim}
- <%= self.customer()[ID].address()['city'] %> (42 chars)
-\end{verbatim}
-
-With Cheetah's NameMapper syntax, you can use any of the following:
-
-\begin{verbatim}
- $self.customers()[$ID].address()['city'] (39 chars)
- --OR--
- $customers()[$ID].address()['city']
- --OR--
- $customers()[$ID].address().city
- --OR--
- $customers()[$ID].address.city
- --OR--
- $customers[$ID].address.city (27 chars)
-\end{verbatim}
-
-Which of these would you prefer to explain to the designers, who have no
-programming experience? The last form is 15 characters shorter than the PSP
-version and -- conceptually -- far more accessible. With PHP or ASP, the
-code would be even messier than with PSP.
-
-This is a rather extreme example and, of course, you could also just implement
-\code{\$getCustomer(\$ID).city} and obey the Law of Demeter (search Google for more
-on that). But good object orientated design isn't the point of this example.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Dictionary Access}
-\label{language.namemapper.dict}
-
-NameMapper syntax allows access to dictionary items with the same dotted
-notation used to access object attributes in Python. This aspect of NameMapper
-syntax is known as 'Unified Dotted Notation'.
-For example, with Cheetah it is possible to write:
-\begin{verbatim}
- $customers()['kerr'].address() --OR-- $customers().kerr.address()
-\end{verbatim}
-where the second form is in NameMapper syntax.
-
-This works only with dictionary keys that also happen to be valid Python
-identifiers.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Autocalling}
-\label{language.namemapper.autocalling}
-
-Cheetah automatically detects functions and methods in Cheetah \$variables and
-calls them if the parentheses have been left off. Our previous example can be
-further simplified to:
-\begin{verbatim}
- $customers.kerr.address
-\end{verbatim}
-
-As another example, if 'a' is an object, 'b' is a method
-\begin{verbatim}
- $a.b
-\end{verbatim}
-
-is equivalent to
-
-\begin{verbatim}
- $a.b()
-\end{verbatim}
-
-If b returns a dictionary, then following variations are possible
-\begin{verbatim}
- $a.b.c --OR-- $a.b().c --OR-- $a.b()['c']
-\end{verbatim}
-where 'c' is a key in the dictionary that a.b() returns.
-
-Further notes:
-\begin{itemize}
-\item When Cheetah autocalls a function/method, it calls it without any
-arguments. Thus, the function/method must have been declared without arguments
-(except \code{self} for methods) or to provide default values for all arguments.
-If the function requires arguments, you must use the \code{()}.
-
-\item Cheetah autocalls only functions and methods. Classes and other callable
-objects are not autocalled. The reason is that the primary purpose of a
-function/method is to call it, whereas the primary purpose of an instance is to
-look up its attributes or call its methods, not to call the instance itself.
-And calling a class may allocate large sums of memory uselessly or have other
-side effects, depending on the class. For instance, consider
-\code{\$myInstance.fname}. Do we want to look up \code{fname} in the namespace
-of \code{myInstance} or in the namespace of whatever \code{myinstance} returns?
-It could go either way, so Cheetah follows the principle of least surprise. If
-you {\em do} want to call the instance, put the \code{()} on, or rename the
-\code{.\_\_call\_\_()} method to \code{.\_\_str\_\_}.
-
-\item Autocalling can be disabled via Cheetah's 'useAutocalling' compiler
-setting. You can also disable it for one placeholder by using the syntax
-\code{\$getVar('varName', 'default value', False)}. (\code{.getVar()} works
-only with searchList values.)
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Namespace cascading and the searchList}
-\label{language.searchList}
-
-When Cheetah maps a variable name in a template to a Python value, it searches
-several namespaces in order:
-
-\begin{enumerate}
-\item {\bf Local variables:} created by \code{\#set},
- \code{\#for}, or predefined by Cheetah.
-\item The {\bf searchList}, consisting of:
- \begin{enumerate}
- \item \code{\#set\ global} variables.
- \item The {\bf searchList} containers you passed to the \code{Template}
- constructor, if any.
- \item The {\bf Template instance} (``self''). This contains any attributes
- you assigned, \code{\#def} methods and \code{\#block methods},
- attributes/methods inherited via \code{\#extends}, and other
- attributes/methods built into \code{Template} or inherited by it
- (there's a list of all these methods in section
- \ref{tips.allMethods}).
- \end{enumerate}
-\item {\bf Python globals:} created by \code{\#import},
- \code{\#from\ ...\ import}, or otherwise predefined by Cheetah.
-\item {\bf Python builtins:} \code{None}, \code{max}, etc.
-\end{enumerate}
-
-The first matching name found is used.
-
-Remember, these namespaces apply only to the {\em first} identifier after the
-\code{\$}. In a placeholder like \code{\$a.b}, only `a' is looked up in the
-searchList and other namespaces. `b' is looked up only inside `a'.
-
-A searchList container can be any Python object with attributes or keys:
-dictionaries, instances, classes or modules. If an instance contains both
-attributes and keys, its attributes are searched first, then its keys.
-
-Because the \code{Template} instance is part of the searchList, you can
-access its attributes/methods without `self': \code{\$myAttr}. However, use
-the `self' if you want to make sure you're getting the \code{Template}
-attribute and not a same-name variable defined in a higher namespace:
-\code{\$self.myAttr}. This works because ``self'' itself is a local variable.
-
-The final resulting value, after all lookups and function calls (but before the
-filter is applied) is called the {\em placeholder value}, no matter which
-namespace it was found in.
-
-{\em {\bf Note carefully:}} if you put an object `myObject' in the searchList,
-you {\em cannot} look up \code{\$myObject}! You can look up only the
-attributes/keys {\em inside} `myObject'.
-
-Earlier versions of Cheetah did not allow you to override Python builtin
-names, but this was fixed in Cheetah 0.9.15.
-
-If your template will be used as a Webware servlet, do not override methods
-'name' and 'log' in the \code{Template} instance or it will interfere with
-Webware's logging. However, it {\em is} OK to use those variables in a higher
-namespace, since Webware doesn't know about Cheetah namespaces.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Missing Values}
-\label{language.namemapper.missing}
-
-If NameMapper can not find a Python value for a Cheetah variable name, it will
-raise the NameMapper.NotFound exception. You can use the \code{\#errorCatcher}
-directive (section \ref{errorHandling.errorCatcher}) or {\bf errorCatcher}
-Template constructor argument (section \ref{howWorks.constructing}) to specify
-an alternate behaviour. BUT BE AWARE THAT errorCatcher IS ONLY INTENDED FOR
-DEBUGGING!
-
-To provide a default value for a placeholder, write it like this:
-\code{\$getVar('varName', 'default value')}. If you don't specify a default
-and the variable is missing, \code{NameMapper.NotFound} will be raised.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Directive Syntax Rules}
-\label{language.directives.syntax}
-
-
-Directive tags begin with a hash character (\#) and are used for comments,
-loops, conditional blocks, includes, and all other advanced features. Cheetah
-uses a Python-like syntax inside directive tags and understands any valid
-Python expression. {\bf However, unlike Python, Cheetah does not use colons
-(:) and indentation to mark off multi-line directives.} That doesn't work in
-an environment where whitespace is significant as part of the text. Instead,
-multi-line directives like \code{\#for} have corresponding closing tags
-(\code{\#end for}). Most directives are direct mirrors of Python statements.
-
-Many directives have arguments after the opening tag, which must be in the
-specified syntax for the tag. All end tags have the following syntax:
-\begin{verbatim}
-#end TAG_NAME [EXPR]
-\end{verbatim}
-The expression is ignored, so it's essentially a comment.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Directive closures and whitespace handling}
-\label{language.directives.closures}
-Directive tags can be closed explicitly with \code{\#}, or implicitly with the
-end of the line if you're feeling lazy.
-
-\begin{verbatim}
-#block testBlock #
-Text in the body of the
-block directive
-#end block testBlock #
-\end{verbatim}
-is identical to:
-\begin{verbatim}
-#block testBlock
-Text in the body of the
-block directive
-#end block testBlock
-\end{verbatim}
-
-When a directive tag is closed explicitly, it can be followed with other text on
-the same line:
-
-\begin{verbatim}
-bah, bah, #if $sheep.color == 'black'# black#end if # sheep.
-\end{verbatim}
-
-When a directive tag is closed implicitly with the end of the line, all trailing
-whitespace is gobbled, including the newline character:
-\begin{verbatim}
-"""
-foo #set $x = 2
-bar
-"""
-outputs
-"""
-foo bar
-"""
-
-while
-"""
-foo #set $x = 2 #
-bar
-"""
-outputs
-"""
-foo
-bar
-"""
-\end{verbatim}
-
-When a directive tag is closed implicitly AND there is no other text on the
-line, the ENTIRE line is gobbled up including any preceeding whitespace:
-\begin{verbatim}
-"""
-foo
- #set $x = 2
-bar
-"""
-outputs
-"""
-foo
-bar
-"""
-
-while
-"""
-foo
- - #set $x = 2
-bar
-"""
-outputs
-"""
-foo
- - bar
-"""
-\end{verbatim}
-
-The \code{\#slurp} directive (section \ref{output.slurp}) also gobbles up
-whitespace.
-
-Spaces outside directives are output {\em exactly} as written. In the
-black sheep example, there's a space before ``black'' and another before
-``sheep''. So although it's legal to put multiple directives on one line,
-it can be hard to read.
-
-\begin{verbatim}
-#if $a# #echo $a + 1# #end if
- - There's a space between each directive,
- or two extra spaces total.
-#if $a##echo $a + 1##end if
- - No spaces, but you have to look closely
- to verify none of the ``##'' are comment markers.
-#if $a##echo $a + 1##end if ### A comment.
- - In ``###'', the first ``#'' ends the directive,
- the other two begin the comment. (This also shows
- how you can add extra whitespace in the directive
- tag without affecting the output.)
-#if $a##echo $a + 1##end if # ## A comment.
- - More readable, but now there's a space before the
- comment.
-\end{verbatim}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-% # vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_src/libraries.tex b/docs/users_guide_src/libraries.tex
deleted file mode 100755
index dc9231a..0000000
--- a/docs/users_guide_src/libraries.tex
+++ /dev/null
@@ -1,306 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Batteries included: templates and other libraries}
-\label{libraries}
-
-Cheetah comes ``batteries included'' with libraries of templates, functions,
-classes and other objects you can use in your own programs. The different
-types are listed alphabetically below, followed by a longer description of
-the SkeletonPage framework. Some of the objects are classes for specific
-purposes (e.g., filters or error catchers), while others are standalone and
-can be used without Cheetah.
-
-If you develop any objects which are generally useful for Cheetah sites,
-please consider posting them on the wiki with an announcement on the mailing
-list so we can incorporate them into the standard library. That way, all
-Cheetah users will benefit, and it will encourage others to contribute their
-objects, which might include something you want.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{ErrorCatchers}
-\label{libraries.ErrorCatchers}
-
-Module \code{Cheetah.ErrorCatchers} contains error-handling classes suitable for
-the \code{\#errorCatcher} directive. These are debugging tools that are not
-intended for use in production systems. See section
-\ref{errorHandling.errorCatcher} for a description of the error catchers bundled
-with Cheetah.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{FileUtils}
-\label{libraries.FileUtils}
-
-Module \code{Cheetah.FileUtils} contains generic functions and classes for
-doing bulk search-and-replace on several files, and for finding all the files
-in a directory hierarchy whose names match a glob pattern.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Filters}
-\label{libraries.Filters}
-
-Module \code{Filters} contains filters suitable for the \code{\#Filter}
-directive. See section \ref{output.filter} for a description of the
-filters bundled with Cheetah.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{SettingsManager}
-\label{libraries.SettingsManager}
-
-The \code{SettingsManager} class in the \code{Cheetah.SettingsManager} module is
-a baseclass that provides facilities for managing application settings. It
-facilitates the use of user-supplied configuration files to fine tune an
-application. A setting is a key/value pair that an application or component
-(e.g., a filter, or your own servlets) looks up and treats as a configuration
-value to modify its (the component's) behaviour.
-
-SettingsManager is designed to:
-\begin{itemize}
-\item work well with nested settings dictionaries of any depth
-\item read/write \code{.ini style config files} (or strings)
-\item read settings from Python source files (or strings) so that
- complex Python objects can be stored in the application's settings
- dictionary. For example, you might want to store references to various
- classes that are used by the application, and plugins to the application
- might want to substitute one class for another.
-\item allow sections in \code{.ini config files} to be extended by settings in
- Python src files. If a section contains a setting like
- ``\code{importSettings=mySettings.py}'', \code{SettingsManager} will merge
- all the settings defined in ``\code{mySettings.py}'' with the settings for
- that section that are defined in the \code{.ini config file}.
-\item maintain the case of setting names, unlike the ConfigParser module
-\end{itemize}
-
-Cheetah uses \code{SettingsManager} to manage its configuration settings.
-\code{SettingsManager} might also be useful in your own applications. See the
-source code and docstrings in the file \code{src/SettingsManager.py} for more
-information.
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Templates}
-\label{libraries.templates}
-
-Package \code{Cheetah.Templates} contains stock templates that you can
-either use as is, or extend by using the \code{\#def} directive to redefine
-specific {\bf blocks}. Currently, the only template in here is SkeletonPage,
-which is described in detail below in section
-\ref{libraries.templates.skeletonPage}. (Contributed by Tavis Rudd.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Tools}
-\label{libraries.Tools}
-
-Package \code{Cheetah.Tools} contains functions and classes contributed by third
-parties. Some are Cheetah-specific but others are generic and can be used
-standalone. None of them are imported by any other Cheetah component; you can
-delete the Tools/ directory and Cheetah will function fine.
-
-Some of the items in Tools/ are experimental and have been placed there just to
-see how useful they will be, and whether they attract enough users to make
-refining them worthwhile (the tools, not the users :).
-
-Nothing in Tools/ is guaranteed to be: (A) tested, (B) reliable, (C) immune
-from being deleted in a future Cheetah version, or (D) immune from
-backwards-incompatable changes. If you depend on something in Tools/ on a
-production system, consider making a copy of it outside the Cheetah/ directory
-so that this version won't be lost when you upgrade Cheetah. Also, learn
-enough about Python and about the Tool so that you can maintain it and bugfix
-it if necessary.
-
-If anything in Tools/ is found to be necessary to Cheetah's operation (i.e., if
-another Cheetah component starts importing it), it will be moved to the
-\code{Cheetah.Utils} package.
-
-Current Tools include:
-\begin{description}
-\item{Cheetah.Tools.MondoReport} an ambitious class useful when
- iterating over records of data (\code{\#for} loops), displaying one
- pageful of records at a time (with previous/next links), and printing
- summary statistics about the records or the current page. See
- \code{MondoReportDoc.txt} in the same directory as the module. Some
- features are not implemented yet. \code{MondoReportTest.py} is a test
- suite (and it shows there are currently some errors in MondoReport, hmm).
- Contributed by Mike Orr.
-
-\item{Cheetah.Tools.RecursiveNull} Nothing, but in a friendly way. Good
- for filling in for objects you want to hide. If \code{\$form.f1} is a
- RecursiveNull object, then \code{\$form.f1.anything["you"].might("use")}
- will resolve to the empty string. You can also put a \code{RecursiveNull}
- instance at the end of the searchList to convert missing values to ''
- rather than raising a \code{NotFound} error or having a (less efficient)
- errorCatcher handle it. Of course, maybe you prefer to get a
- \code{NotFound} error... Contributed by Ian Bicking.
-
-\item{Cheetah.Tools.SiteHierarchy} Provides navigational links to this
- page's parents and children. The constructor takes a recursive list of
- (url,description) pairs representing a tree of hyperlinks to every page in
- the site (or section, or application...), and also a string containing the
- current URL. Two methods 'menuList' and 'crumbs' return output-ready HTML
- showing an indented menu (hierarchy tree) or crumbs list (Yahoo-style bar:
- home > grandparent > parent > currentURL). Contributed by Ian Bicking.
-
-\item
-\end{description}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Utils}
-\label{libraries.Utils}
-
-Package \code{Cheetah.Utils} contains non-Cheetah-specific functions and
-classes that are imported by other Cheetah components. Many of these utils can
-be used standalone in other applications too.
-
-Current Utils include:
-\begin{description}
-\item{Cheetah.Utils.CGIImportMixin} This is inherited by \code{Template}
- objects, and provides the method, \code{.cgiImport} method
- (section \ref{webware.cgiImport}).
-
-\item{Cheetah.Utils.Misc} A catch-all module for small functions.
- \begin{description}
- \item{\code{UseOrRaise(thing, errmsg='')}} Raise 'thing' if it's a
- subclass of Exception, otherwise return it. Useful when one
- argument does double duty as a default value or an exception to
- throw. Contribyted by Mike Orr.
-
- \item{\code{checkKeywords(dic, legalKeywords, what='argument'}}
- Verifies the dictionary does not contain any keys not listed in
- 'legalKeywords'. If it does, raise TypeError. Useful for
- checking the keyword arguments to a function. Contributed by
- Mike Orr.
- \end{description}
-
-\item{Cheetah.Utils.UploadFileMixin} Not implemented yet, but will contain
- the \code{.uploadFile} method (or three methods) to ``safely'' copy a
- form-uploaded file to a local file, to a searchList variable, or return
- it. When finished, this will be inherited by \code{Template}, allowing
- all templates to do this. If you want this feature, read the docstring
- in the source and let us know on the mailing list what you'd like this
- method to do. Contributed by Mike Orr.
-
-\item{Cheetah.Utils.VerifyType} Functions to verify the type of a
- user-supplied function argument. Contributed by Mike Orr.
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Cheetah.Templates.SkeletonPage}
-\label{libraries.templates.skeletonPage}
-
-A stock template class that may be useful for web developers is defined in
-the \code{Cheetah.Templates.SkeletonPage} module. The \code{SkeletonPage}
-template class is generated from the following Cheetah source code:
-
-\begin{verbatim}
-##doc-module: A Skeleton HTML page template, that provides basic structure and utility methods.
-################################################################################
-#extends Cheetah.Templates._SkeletonPage
-#implements respond
-################################################################################
-#cache id='header'
-$docType
-$htmlTag
-<!-- This document was autogenerated by Cheetah(http://CheetahTemplate.org).
-Do not edit it directly!
-
-Copyright $currentYr - $siteCopyrightName - All Rights Reserved.
-Feel free to copy any javascript or html you like on this site,
-provided you remove all links and/or references to $siteDomainName
-However, please do not copy any content or images without permission.
-
-$siteCredits
-
--->
-
-
-#block writeHeadTag
-<head>
-<title>$title</title>
-$metaTags
-$stylesheetTags
-$javascriptTags
-</head>
-#end block writeHeadTag
-
-#end cache header
-#################
-
-$bodyTag
-
-#block writeBody
-This skeleton page has no flesh. Its body needs to be implemented.
-#end block writeBody
-
-</body>
-</html>
-\end{verbatim}
-
-You can redefine any of the blocks defined in this template by writing a new
-template that \code{\#extends} SkeletonPage. (As you remember, using
-\code{\#extends} makes your template implement the \code{.writeBody()}
-method instead of \code{.respond()} -- which happens to be the same method
-SkeletonPage expects the page content to be (note the writeBody block in
-SkeletonPage).)
-
-\begin{verbatim}
-#def bodyContents
-Here's my new body. I've got some flesh on my bones now.
-#end def bodyContents
-\end{verbatim}
-
-%% @@MO: Is this still accurate? Does the child template really need to put a
-%% #def around its whole content? Or by implementing .writeBody() does it
-%% automatically insert itself as the writeBody portion of
-%% SkeletonPage? @@TR 2005-01-06: it happens automatically at the moment.
-
-All of the \$placeholders used in the \code{SkeletonPage} template definition
-are attributes or methods of the \code{SkeletonPage} class. You can reimplement
-them as you wish in your subclass. Please read the source code of the file
-\code{src/Templates/\_SkeletonPage.py} before doing so.
-
-You'll need to understand how to use the following methods of the
-\code{SkeletonPage} class: \code{\$metaTags()}, \code{\$stylesheetTags()},
-\code{\$javascriptTags()}, and \code{\$bodyTag()}. They take the data you
-define in various attributes and renders them into HTML tags.
-
-\begin{itemize}
-\item {\bf metaTags()} -- Returns a formatted vesion of the self.\_metaTags
- dictionary, using the formatMetaTags function from
- \code{\_SkeletonPage.py}.
-\item {\bf stylesheetTags()} -- Returns a formatted version of the
- \code{self.\_stylesheetLibs} and \code{self.\_stylesheets} dictionaries.
- The keys in \code{self.\_stylesheets} must be listed in the order that
- they should appear in the list \code{self.\_stylesheetsOrder}, to ensure
- that the style rules are defined in the correct order.
-\item {\bf javascriptTags()} -- Returns a formatted version of the
- \code{self.\_javascriptTags} and \code{self.\_javascriptLibs} dictionaries.
- Each value in \code{self.\_javascriptTags} should be a either a code string
- to include, or a list containing the JavaScript version number and the code
- string. The keys can be anything. The same applies for
- \code{self.\_javascriptLibs}, but the string should be the SRC filename
- rather than a code string.
-\item {\bf bodyTag()} -- Returns an HTML body tag from the entries in the dict
- \code{self.\_bodyTagAttribs}.
-\end{itemize}
-
-The class also provides some convenience methods that can be used as
-\$placeholders in your template definitions:
-
-\begin{itemize}
-\item {\bf imgTag(self, src, alt='', width=None, height=None, border=0)} --
- Dynamically generate an image tag. Cheetah will try to convert the
- ``\code{src}'' argument to a WebKit serverSidePath relative to the
- servlet's location. If width and height aren't specified they are
- calculated using PIL or ImageMagick if either of these tools are available.
- If all your images are stored in a certain directory you can reimplement
- this method to append that directory's path to the ``\code{src}'' argument.
- Doing so would also insulate your template definitions from changes in your
- directory structure.
-\end{itemize}
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/links.tex b/docs/users_guide_src/links.tex
deleted file mode 100755
index 1ec2f6c..0000000
--- a/docs/users_guide_src/links.tex
+++ /dev/null
@@ -1,112 +0,0 @@
-\section{Useful Web Links}
-\label{links}
-
-See the wiki for more links. (The wiki is also updated more often than this
-chapter is.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Cheetah Links}
-\label{links.cheetah}
-
-\begin{description}
-\item[Home Page] -- \url{http:www.CheetahTemplate.org/}
-
-\item[On-line Documentation] -- \url{http:www.CheetahTemplate.org/learn.html}
-
-\item[SourceForge Project Page] -- \url{http:sf.net/projects/cheetahtemplate/}
-
-\item[Mailing List Subscription Page] --
- \url{http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss}
-
-\item[Mailing List Archive @ Geocrawler] --
- \url{http://www.geocrawler.com/lists/3/SourceForge/12986/0/}
-
-\item[Mailing List Archive @ Yahoo] --
- \url{http://groups.yahoo.com/group/cheetah-archive/}
-
-\item[CVS Repository] -- \url{http://sourceforge.net/cvs/?group\_id=28961}
-
-\item[CVS-commits archive] --
- \url{http://www.geocrawler.com/lists/3/SourceForge/13091/0/}
-
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Third-party Cheetah Stuff}
-\label{links.thirdParty}
-
-\begin{itemize}
-\item Steve Howell has written a photo viewer using Python.
- \url{http://mountainwebtools.com/PicViewer/install.htm}
-\end{itemize}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Webware Links}
-\label{links.webware}
-
-\begin{description}
-\item[Home Page] -- \url{http://webware.sf.net/}
-
-\item[On-line Documentation] -- \url{http://webware.sf.net/Webware/Docs/}
-
-\item[SourceForge Project Page] -- \url{http://sf.net/projects/webware/}
-
-\item[Mailing List Subscription Page] --
- \url{http://lists.sourceforge.net/lists/listinfo/webware-discuss}
-
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Python Links}
-\label{links.python}
-
-\begin{description}
-\item[Home Page] -- \url{http://www.python.org/}
-\item[On-line Documentation] -- \url{http://www.python.org/doc/}
-\item[SourceForge Project Page] -- \url{http://sf.net/projects/python/}
-\item[The Vaults of Parnassus: Python Resources] --
- \url{http://www.vex.net/parnassus/}
-\item[Python Cookbook] -- \url{http://aspn.activestate.com/ASPN/Cookbook/Python}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Other Useful Links}
-\label{links.other}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Python Database Modules and Open Source Databases}
-\label{links.database}
-
-\begin{description}
-\item[Python Database Topic Guide] -- \url{http://python.org/topics/database/}
-\item[PostgreSQL Database] -- \url{http://www.postgresql.org/index.html}
-\item[MySQL Database] -- \url{http://www.mysql.com/}
-\item[A comparison of PostgreSQL and MySQL] --
- \url{http://phpbuilder.com/columns/tim20001112.php3}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Other Template Systems}
-\label{links.other.templateSystems}
-
-\begin{description}
-\item[Chuck's ``Templates'' Summary Page] -- \url{http://webware.sf.net/Papers/Templates/}
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Other Internet development frameworks}
-\label{links.internet}
-
-\begin{description}
-\item[ZOPE (Z Object Publishing Environment)] -- \url{http://zope.org/}
-\item[Server Side Java] -- \url{http://jakarta.apache.org/}
-\item[PHP] -- \url{http://php.net/}
-\item[IBM Websphere] -- \url{http://www.ibm.com/websphere/}
-\item[Coldfusion and Spectra] -- \url{http://www.macromedia.com/}
-\end{description}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/moreverb.sty b/docs/users_guide_src/moreverb.sty
deleted file mode 100755
index 92e34bb..0000000
--- a/docs/users_guide_src/moreverb.sty
+++ /dev/null
@@ -1,197 +0,0 @@
-%%% moreverb.sty
-%%% AJCD 20 Sep 91
-%%% adds various verbatim environments using Rainer Sch\"opf's new verbatim
-%%% environment.
-
-
-%%% Marginal hacks (RF) to work `properly' with 2e
-\def\filedate{1994/12/13}
-\def\fileversion{v2.0}
-%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{moreverb}
- [\filedate\space \fileversion\space
- LaTeX2e package for `more' verbatim enhancements]
-\typeout{Package: `moreverb'
- \fileversion \space <\filedate> (RF, after AJCD and RmS)}
-%\typeout{English Documentation \@spaces <\docdate>} % oh no there isn't
-
-%%% load verbatim style if not already loaded.
-\@ifundefined{verbatim@processline}{\RequirePackage{verbatim}}{}
-
-%%% verbatimwrite writes all text in its body to a file, the name of which it
-%%% is given as an argument. Written by RmS.
-\newwrite \verbatim@out
-\def\verbatimwrite#1{%
- \@bsphack
- \immediate\openout \verbatim@out #1
- \let\do\@makeother\dospecials
- \catcode`\^^M\active \catcode`\^^I=12
- \def\verbatim@processline{%
- \immediate\write\verbatim@out
- {\the\verbatim@line}}%
- \verbatim@start}
-
-\def\endverbatimwrite{%
- \immediate\closeout\verbatim@out
- \@esphack}
-
-%%% Auxiliary macros and counters for expanding tabs. Use by listing and
-%%% verbatimtab environments.
-\newcount\tab@position \newcount\tab@size
-\newcount\verbatimtabsize \verbatimtabsize=8
-\def\@xobeytab{\leavevmode\penalty\@M
- {\loop\ \global\advance\tab@position-1 \ifnum\tab@position>0 \repeat}}
-\begingroup
- \catcode`\^^I=\active
- \gdef\@vobeytabs{\catcode`\^^I\active\let^^I\@xobeytab}%
-\endgroup
-\def\verbatim@tabexpand#1{%
- \ifx#1\@nil \let\next\par \else
- \ifx#1\@xobeysp \@xobeysp\advance\tab@position-1 \else
- \ifx#1\@xobeytab \@xobeytab\else
- #1\advance\tab@position-1
- \fi\fi
- \ifnum\tab@position=0 \tab@position\tab@size \fi
- \let\next\verbatim@tabexpand
- \fi\next
-}
-
-%%% listing defines a verbatim environment with numbered lines; it takes an
-%%% optional argument specifying the number of lines between numbered
-%%% lines, and a mandatory argument specifying the starting line. listingcont
-%%% continues from the place where listing left off.
-%%% The style in which the label is set can be altered by re-defining
-%%% \listinglabel. * versions are provided.
-\newcount\listing@line \listing@line=1 \newcount\listing@step \listing@step=1
-% Adding an \hbox in front of the line causes a line break, so I go
-% through this rigmarole to get the lines aligned nicely. I probably
-% missed some obvious reason why \hboxes don't work.
-\def\listinglabel#1{\rlap{\small\rm\the#1}\hskip2.5em}
-\def\thelisting@line{%
- \setbox0\hbox{\listinglabel\listing@line}%
- \@tempcnta=\listing@line
- \divide\@tempcnta\listing@step \multiply\@tempcnta\listing@step
- \ifnum\listing@line=1 \unhbox0
- \else \ifnum\@tempcnta=\listing@line \unhbox0
- \else \hskip\wd0
- \fi\fi}
-\def\listing{\@ifnextchar[{\@listing}{\@listing[1]}}
-\def\@listing[#1]#2{%
- \global\listing@line=#2\global\listing@step=#1\listingcont}
-\def\listingcont{%
- \tab@size=\verbatimtabsize
- \def\verbatim@processline{\tab@position\tab@size
- \thelisting@line \global\advance\listing@line1
- \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}%
- \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs\verbatim@start}
-\let\endlisting=\endtrivlist
-\let\endlistingcont=\endtrivlist
-\@namedef{listing*}{\@ifnextchar[{\@listingstar}{\@listingstar[1]}}
-\def\@listingstar[#1]#2{%
- \global\listing@line=#2\global\listing@step=#1\relax
- \csname listingcont*\endcsname}
-\@namedef{listingcont*}{%
- \def\verbatim@processline{%
- \thelisting@line \global\advance\listing@line1
- \the\verbatim@line\par}%
- \@verbatim\verbatim@start}
-\expandafter\let\csname endlisting*\endcsname =\endtrivlist
-\expandafter\let\csname endlistingcont*\endcsname =\endtrivlist
-
-%%% file input version of listing
-\def\listinginput{%
- \@ifnextchar[{\@listinginput}{\@listinginput[1]}}
-{\catcode`\~=\active \lccode`\~=`\^^M \lccode`\N=`\N
- \lowercase{%
- \gdef\@listinginput[#1]#2#3{\begingroup
- \global\listing@line=#2\global\listing@step=#1
- \tab@size=\verbatimtabsize
- \def\verbatim@processline{\tab@position\tab@size
- \thelisting@line \global\advance\listing@line1
- \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}%
- \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs
- \def\verbatim@addtoline##1~{%
- \verbatim@line\expandafter{\the\verbatim@line##1}}%
- \openin\verbtab@in=#3
- \ifeof\verbtab@in\typeout{No file #3.}\else
- \verbtab@oktrue
- \loop
- \read\verbtab@in to \verbtab@line
- \ifeof\verbtab@in\verbtab@okfalse\else
- \expandafter\verbatim@addtoline\verbtab@line
- \verbatim@processline
- \verbatim@startline
- \fi
- \ifverbtab@ok\repeat
- \closein\verbtab@in\fi
- \endtrivlist\endgroup\@doendpe}}}
-
-%%% verbatimcmd is a verbatim environment with the exception of the escape and
-%%% grouping characters \, {, }.
-\def\verbatimcmd{%
- \@verbatim \catcode`\\=0 \catcode`\{=1 \catcode`\}=2
- \frenchspacing\@vobeyspaces\verbatim@start
-}
-\def\endverbatimcmd{%
- \let\par\relax
- \def\verbatim@{\endtrivlist\endgroup}%
- \begingroup}
-
-%%% boxedverbatim produces a verbatim environment in a framed box.
-%%% written by Victor Eijkhout
-\def\boxedverbatim{%
- % redefine `processline' to produce only a line as wide
- % as the natural width of the line
- \def\verbatim@processline{%
- {\setbox0=\hbox{\the\verbatim@line}%
- \hsize=\wd0 \the\verbatim@line\par}}%
- % save the verbatim code in a box
- \setbox0=\vbox\bgroup \verbatim
-}
-\def\endboxedverbatim{%
- \endverbatim
- \egroup % close the box and `fbox' it
- \fbox{\box0}% <<<=== change here for centering,...
-}
-
-%%% verbatimtab is a verbatim environment which expands tab characters; it
-%%% takes an optional argument specifying the width of tab stops
-\def\verbatimtab{\futurelet\next\@verbatimtab}
-\def\@verbatimtab{\if\next[ \let\next\@@verbatimtab\else
- \def\next{\@@verbatimtab[\the\verbatimtabsize]}\fi\next}
-\def\@@verbatimtab[#1]{%
- \do@verbatimtab{#1}{%
- \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs\verbatim@start}%
-}
-\def\do@verbatimtab#1#2{%
- \tab@size=#1
- \def\verbatim@processline{\tab@position\tab@size
- \expandafter\verbatim@tabexpand\the\verbatim@line\@nil}#2
-}
-\let\endverbatimtab=\endtrivlist
-
-%%% file input version of verbatimtab
-\newread\verbtab@in \newif\ifverbtab@ok
-\def\verbatimtabinput{%
- \@ifnextchar[{\@verbatimtabinput}{\@verbatimtabinput[\the\verbatimtabsize]}}
-{\catcode`\~=\active \lccode`\~=`\^^M \lccode`\N=`\N
- \lowercase{%
- \gdef\@verbatimtabinput[#1]#2{\begingroup
- \do@verbatimtab{#1}{%
- \@verbatim\frenchspacing\@vobeyspaces\@vobeytabs}%
- \def\verbatim@addtoline##1~{%
- \verbatim@line\expandafter{\the\verbatim@line##1}}%
- \openin\verbtab@in=#2
- \ifeof\verbtab@in\typeout{No file #2.}\else
- \verbtab@oktrue
- \loop
- \read\verbtab@in to \verbtab@line
- \ifeof\verbtab@in\verbtab@okfalse\else
- \expandafter\verbatim@addtoline\verbtab@line
- \verbatim@processline
- \verbatim@startline
- \fi
- \ifverbtab@ok\repeat
- \closein\verbtab@in\fi
- \endtrivlist\endgroup\@doendpe}}}
diff --git a/docs/users_guide_src/nonHtml.tex b/docs/users_guide_src/nonHtml.tex
deleted file mode 100755
index b618ab0..0000000
--- a/docs/users_guide_src/nonHtml.tex
+++ /dev/null
@@ -1,17 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Non-HTML Output}
-\label{nonHTML}
-
-Cheetah can also output any other text format besides HTML.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Python source code}
-\label{nonHTML.python}
-
-To be written. We're in the middle of working on an autoindenter to
-make it easier to encode Python indentation in a Cheetah template.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_src/optikLicense.tex b/docs/users_guide_src/optikLicense.tex
deleted file mode 100755
index db63682..0000000
--- a/docs/users_guide_src/optikLicense.tex
+++ /dev/null
@@ -1,43 +0,0 @@
-\section{Optik license}
-\label{optikLicense}
-
-The optik package (Cheetah.Utils.optik) is based on Optik 1.3,
-\url{http://optik.sourceforge.net/}, \copyright 2001 Gregory P Ward
-$<$gward@python.net$>$. It's unmodified from the original version except
-the \code{import} statements, which have been adjusted to make them work in
-this location. The following license applies to optik:
-
-\begin{quotation}
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-\begin{itemize}
-\item Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-\item 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.
-
-\item 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.
-\end{itemize}
-
-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.
-\end{quotation}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/otherHtml.tex b/docs/users_guide_src/otherHtml.tex
deleted file mode 100755
index 89fd58a..0000000
--- a/docs/users_guide_src/otherHtml.tex
+++ /dev/null
@@ -1,95 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{non-Webware HTML output}
-\label{otherHTML}
-
-Cheetah can be used with all types of HTML output, not just with Webware.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Static HTML Pages}
-\label{otherHTML.static}
-
-Some sites like Linux Gazette (\url{http://www.linuxgazette.com/}) require
-completely static pages because they are mirrored on servers running completely
-different software from the main site. Even dynamic sites may have one or
-two pages that are static for whatever reason, and the site administrator may
-wish to generate those pages from Cheetah templates.
-
-There's nothing special here. Just create your templates as usual. Then
-compile and fill them whenever the template definition changes, and fill them
-again whenever the placeholder values change. You may need an extra step to
-copy the .html files to their final location. A Makefile (chapter
-\ref{tips.Makefile}) can help encapsulate these steps.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{CGI scripts}
-\label{otherHTML}
-
-Unlike Webware servlets, which don't have to worry about the HTTP headers,
-CGI scripts must emit their own headers. To make a template CGI aware, add
-this at the top:
-\begin{verbatim}
-#extends Cheetah.Tools.CGITemplate
-#implements respond
-$cgiHeaders#slurp
-\end{verbatim}
-
-Or if your template is inheriting from a Python class:
-\begin{verbatim}
-#extends MyPythonClass
-#implements respond
-$cgiHeaders#slurp
-\end{verbatim}
-
-A sample Python class:
-\begin{verbatim}
-from Cheetah.Tools import CGITemplate
-class MyPythonClass(CGITemplate):
- def cgiHeadersHook(self):
- return "Content-Type: text/html; charset=koi8-r\n\n"
-\end{verbatim}
-
-
-Compile the template as usual, put the .py template module in your
-cgi-bin directory and give it execute permission. \code{.cgiHeaders()} is
-a ``smart'' method that outputs the headers if the module is called as a
-CGI script, or outputs nothing if not. Being ``called as a CGI script''
-means the environmental variable \code{REQUEST\_METHOD} exists and
-\code{self.isControlledByWebKit} is false. If you don't agree with that
-definition, override \code{.isCgi()} and provide your own.
-
-The default header is a simple \verb+Content-type: text/html\n\n+, which works
-with all CGI scripts. If you want to customize the headers (e.g., to
-specify the character set), override \code{.cgiHeadersHook()} and return
-a string containing all the headers. Don't forget to include the extra
-newline at the end of the string: the HTTP protocol requires this empty
-line to mark the end of the headers.
-
-To read GET/POST variables from form input, use the \code{.webInput()} method
-(section \ref{webware.webInput}), or extract them yourself using Python's
-\code{cgi} module or your own function. Although \code{.webInput()} was
-originally written for Webware servlets, it now handles CGI scripts too. There
-are a couple behavioral differences between CGI scripts and Webware servlets
-regarding input variables:
-
-\begin{enumerate}
-\item CGI scripts, using Python's \code{cgi} module, believe
- \code{REQUEST\_METHOD} and recognize {\em either} GET variables {\em or}
- POST variables, not both. Webware servlets, doing additional processing,
- ignore \code{REQUEST\_METHOD} and recognize both, like PHP does.
-\item Webware servlets can ask for cookies or session variables instead of
- GET/POST variables, by passing the argument \code{src='c'} or
- \code{src='s'}. CGI scripts get a \code{RuntimeError} if they try to do
- this.
-\end{enumerate}
-
-If you keep your .tmpl files in the same directory as your CGI scripts, make
-sure they don't have execute permission. Apache at least refuses to serve
-files in a \code{ScriptAlias} directory that don't have execute permission.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab
diff --git a/docs/users_guide_src/output.tex b/docs/users_guide_src/output.tex
deleted file mode 100755
index 742291e..0000000
--- a/docs/users_guide_src/output.tex
+++ /dev/null
@@ -1,548 +0,0 @@
-\section{Generating, Caching and Filtering Output}
-\label{output}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Output from complex expressions: \#echo}
-\label{output.echo}
-
-Syntax:
-\begin{verbatim}
-#echo EXPR
-\end{verbatim}
-
-The \code{\#echo} directive is used to echo the output from expressions that
-can't be written as simple \$placeholders.
-
-\begin{verbatim}
-Here is my #echo ', '.join(['silly']*5) # example
-\end{verbatim}
-
-This produces:
-
-\begin{verbatim}
-Here is my silly, silly, silly, silly, silly example.
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Executing expressions without output: \#silent}
-\label{output.silent}
-
-Syntax:
-\begin{verbatim}
-#silent EXPR
-\end{verbatim}
-
-\code{\#silent} is the opposite of \code{\#echo}. It executes an expression
-but discards the output.
-
-\begin{verbatim}
-#silent $myList.reverse()
-#silent $myList.sort()
-Here is #silent $covertOperation() # nothing
-\end{verbatim}
-
-If your template requires some Python code to be executed at the beginning;
-(e.g., to calculate placeholder values, access a database, etc), you can put
-it in a "doEverything" method you inherit, and call this method using
-\code{\#silent} at the top of the template.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{One-line \#if}
-\label{output.oneLineIf}
-
-Syntax:
-\begin{verbatim}
-#if EXPR1 then EXPR2 else EXPR3#
-\end{verbatim}
-
-The \code{\#if} flow-control directive (section \ref{flowControl.if}) has a
-one-line counterpart akin to Perl's and C's \code{?:} operator.
-If \code{EXPR1} is true, it evaluates \code{EXPR2} and outputs the result (just
-like \code{\#echo\ EXPR2\#}). Otherwise it evaluates \code{EXPR3} and outputs
-that result. This directive is short-circuiting, meaning the expression that
-isn't needed isn't evaluated.
-
-You MUST include both 'then' and 'else'. If this doesn't work for you or you
-don't like the style use multi-line \code{\#if} directives (section
-\ref{flowControl.if}).
-
-The trailing \code{\#} is the normal end-of-directive character. As usual
-it may be omitted if there's nothing after the directive on the same line.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Caching Output}
-\label{output.caching}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Caching individual placeholders}
-\label{output.caching.placeholders}
-
-By default, the values of each \$placeholder is retrieved and
-interpolated for every request. However, it's possible to cache the values
-of individual placeholders if they don't change very often, in order to
-speed up the template filling.
-
-To cache the value of a single \code{\$placeholder}, add an asterisk after the
-\$; e.g., \code{\$*var}. The first time the template is
-filled, \code{\$var} is looked up. Then whenever the template is filled again,
-the cached value is used instead of doing another lookup.
-
-The \code{\$*} format caches ``forever''; that is, as long as the template
-instance remains in memory. It's also possible to cache for a certain time
-period using the form \code{\$*<interval>*variable}, where \code{<interval>} is
-the interval. The time interval can be specified in seconds (5s), minutes
-(15m), hours (3h), days (2d) or weeks (1.5w). The default is minutes.
-
-\begin{verbatim}
-<HTML>
-<HEAD><TITLE>$title</TITLE></HEAD>
-<BODY>
-
-$var ${var} ## dynamic - will be reinterpolated for each request
-$*var2 $*{var2} ## static - will be interpolated only once at start-up
-$*5*var3 $*5*{var3} ## timed refresh - will be updated every five minutes.
-
-</BODY>
-</HTML>
-\end{verbatim}
-
-Note that ``every five minutes'' in the example really means every five
-minutes: the variable is looked up again when the time limit is reached,
-whether the template is being filled that frequently or not. Keep this in
-mind when setting refresh times for CPU-intensive or I/O intensive
-operations.
-
-If you're using the long placeholder syntax, \verb+${}+, the braces go only
-around the placeholder name: \verb+$*.5h*{var.func('arg')}+.
-
-Sometimes it's preferable to explicitly invalidate a cached item whenever
-you say so rather than at certain time intervals. You can't do this with
-individual placeholders, but you can do it with cached regions, which will
-be described next.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{Caching entire regions}
-\label{output.caching.regions}
-
-Syntax:
-\begin{verbatim}
-#cache [id=EXPR] [timer=EXPR] [test=EXPR]
-#end cache
-\end{verbatim}
-
-The \code{\#cache} directive is used to cache a region of
-content in a template. The region is cached as a single unit, after
-placeholders and directives inside the region have been evaluated. If there
-are any \code{\$*<interval>*var} placholders inside the cache
-region, they are refreshed only when {\em both} the cache region {\em and} the
-placeholder are simultaneously due for a refresh.
-
-Caching regions offers more flexibility than caching individual placeholders.
-You can specify the refresh interval using a placeholder or
-expression, or refresh according to other criteria rather than a certain
-time interval.
-
-\code{\#cache} without arguments caches the region statically, the same
-way as \code{\$*var}. The region will not be automatically refreshed.
-
-To refresh the region at an interval, use the \code{timer=EXPRESSION} argument,
-equivalent to \code{\$*<interval>*}. The expression should evaluate to a
-number or string that is a valid interval (e.g., 0.5, '3m', etc).
-
-To refresh whenever an expression is true, use \code{test=EXPRESSION}.
-The expression can be a method/function returning true or false, a boolean
-placeholder, several of these joined by \code{and} and/or \code{or}, or any
-other expression. If the expression contains spaces, it's easier to
-read if you enclose it in \code{()}, but this is not required.
-
-To refresh whenever you say so, use \code{id=EXPRESSION}. Your program can
-then call \code{.refreshCache(ID)} whenever it wishes. This is useful if the
-cache depends on some external condition that changes infrequently but has just
-changed now.
-
-You can combine arguments by separating them with commas. For instance, you can
-specify both \code{id=} and \code{interval=}, or \code{id=} and \code{test=}.
-(You can also combine interval and test although it's not very useful.)
-However, repeating an argument is undefined.
-
-\begin{verbatim}
-#cache
-This is a static cache. It will not be refreshed.
-$a $b $c
-#end cache
-
-#cache timer='30m', id='cache1'
-#for $cust in $customers
-$cust.name:
-$cust.street - $cust.city
-#end for
-#end cache
-
-#cache id='sidebar', test=$isDBUpdated
-... left sidebar HTML ...
-#end cache
-
-#cache id='sidebar2', test=($isDBUpdated or $someOtherCondition)
-... right sidebar HTML ...
-#end cache
-\end{verbatim}
-
-
-The \code{\#cache} directive cannot be nested.
-
-We are planning to add a \code{'varyBy'} keyword argument in the future that
-will allow a separate cache instances to be created for a variety of conditions,
-such as different query string parameters or browser types. This is inspired by
-ASP.net's varyByParam and varyByBrowser output caching keywords.
-
-% @@MO: Can we cache by Webware sessions? What about sessions where the
-% session ID is encoded as a path prefix in the URI? Need examples.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#raw}
-\label{output.raw}
-
-Syntax:
-\begin{verbatim}
-#raw
-#end raw
-\end{verbatim}
-
-Any section of a template definition that is inside a \code{\#raw \ldots
-\#end raw} tag pair will be printed verbatim without any parsing of
-\$placeholders or other directives. This can be very useful for debugging, or
-for Cheetah examples and tutorials.
-
-\code{\#raw} is conceptually similar to HTML's \code{<PRE>} tag and LaTeX's
-\code{\\verbatim\{\}} tag, but unlike those tags, \code{\#raw} does not cause
-the body to appear in a special font or typeface. It can't, because Cheetah
-doesn't know what a font is.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#include}
-\label{output.include}
-
-Syntax:
-\begin{verbatim}
-#include [raw] FILENAME_EXPR
-#include [raw] source=STRING_EXPR
-\end{verbatim}
-
-The \code{\#include} directive is used to include text from outside the
-template definition. The text can come from an external file or from a
-\code{\$placeholder} variable. When working with external files, Cheetah will
-monitor for changes to the included file and update as necessary.
-
-This example demonstrates its use with external files:
-\begin{verbatim}
-#include "includeFileName.txt"
-\end{verbatim}
-The content of "includeFileName.txt" will be parsed for Cheetah syntax.
-
-And this example demonstrates use with \code{\$placeholder} variables:
-\begin{verbatim}
-#include source=$myParseText
-\end{verbatim}
-The value of \code{\$myParseText} will be parsed for Cheetah syntax. This is not
-the same as simply placing the \$placeholder tag ``\code{\$myParseText}'' in
-the template definition. In the latter case, the value of \$myParseText would
-not be parsed.
-
-By default, included text will be parsed for Cheetah tags. The argument
-``\code{raw}'' can be used to suppress the parsing.
-
-\begin{verbatim}
-#include raw "includeFileName.txt"
-#include raw source=$myParseText
-\end{verbatim}
-
-Cheetah wraps each chunk of \code{\#include} text inside a nested
-\code{Template} object. Each nested template has a copy of the main
-template's searchList. However, \code{\#set} variables are visible
-across includes only if the defined using the \code{\#set global} keyword.
-
-All directives must be balanced in the include file. That is, if you start
-a \code{\#for} or \code{\#if} block inside the include, you must end it in
-the same include. (This is unlike PHP, which allows unbalanced constructs
-in include files.)
-
-% @@MO: What did we decide about #include and the searchList? Does it really
-% use a copy of the searchList, or does it share the searchList with the
-% parent?
-
-% @@MO: deleted
-%These nested templates share the same \code{searchList}
-%as the top-level template.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#slurp}
-\label{output.slurp}
-
-Syntax:
-\begin{verbatim}
-#slurp
-\end{verbatim}
-
-The \code{\#slurp} directive eats up the trailing newline on the line it
-appears in, joining the following line onto the current line.
-
-
-It is particularly useful in \code{\#for} loops:
-\begin{verbatim}
-#for $i in range(5)
-$i #slurp
-#end for
-\end{verbatim}
-outputs:
-\begin{verbatim}
-0 1 2 3 4
-\end{verbatim}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#indent}
-\label{output.indent}
-
-This directive is not implemented yet. When/if it's completed, it will allow
-you to
-\begin{enumerate}
-\item indent your template definition in a natural way (e.g., the bodies
- of \code{\#if} blocks) without affecting the output
-\item add indentation to output lines without encoding it literally in the
- template definition. This will make it easier to use Cheetah to produce
- indented source code programmatically (e.g., Java or Python source code).
-\end{enumerate}
-
-There is some experimental code that recognizes the \code{\#indent}
-directive with options, but the options are purposely undocumented at this
-time. So pretend it doesn't exist. If you have a use for this feature
-and would like to see it implemented sooner rather than later, let us know
-on the mailing list.
-
-The latest specification for the future \code{\#indent} directive is in the
-TODO file in the Cheetah source distribution.
-
-% @@MO: disabled because it's not implemented and the spec is changing
-% \code{\#indent} decouples the indentation in the template definition from the
-% indentation in the output. Normally, Cheetah outputs indentation exactly as
-% it sees it, no matter whether the indentation is on the first line of a
-% paragraph, in front of a directive, or wherever. \code{\#indent} has two main
-% uses:
-% \begin{enumerate}
-% \item To strip all indentation from source lines. This lets you indent
-% multiline directives (e.g., \code{\#if}, \code{\#for}) in a natural way
-% without having that indentation appear in the output.
-% \item To indent every text line in the output according to a user-specified
-% ``indentation level'', independent of whatever indentation the source lines
-% may have. This is useful for producing Python output, or any language that
-% requires strict indentation levels at certain places. To accomplish this,
-% Cheetah adds a call to an indentation method at the beginning of every
-% affected source line.
-% \end{enumerate}
-%
-% To accomplish the first part, Cheetah removes leading whitespace from the
-% affected source lines before the compiler see them. To accomplish the second
-% part, Cheetah keeps track of the current indentation level, a value you have
-% full control over. At the beginning of every affected text line, Cheetah calls
-% a method that outputs the appropriate indentation string. This affects only
-% lines in the template definition itself, not multiline placeholder values.
-% See the \code{Indent} filter below to indent multiline placeholder values.
-%
-% All \code{\#indent} commands operate on the lines physically below them in
-% the template definition until the next \code{\#indent}, regardless of scope.
-% This means they work thorugh all other directives (\code{\#def}, \code{\#for},
-% \code{\#if}, etc) -- so that if you turn on indentation inside a \code{\#def},
-% it remains in effect past the \code{\#end def}.
-%
-% The following commands turn indentation on and off:
-% \begin{description}
-% \item{\code{\#indent on}} Strip leading whitespace and add indentation to the
-% following lines. This fulfills use \#2 above.
-% \item{\code{\#indent off}} Do not strip leading whitespace or add indentation.
-% This is Cheetah's default behavior.
-% \item{\code{\#indent strip}} Strip leading whitespace but do {\em not} add
-% indentation. This fulfills use \#1 above.
-% \end{description}
-%
-% Indentation by default uses real tabs. But you can change the indentation
-% string thus:
-% \begin{verbatim}
-% ## Output four spaces for each indentation level.
-% #indent chars ' '
-% ## Output the mail reply prefix for each indentation level.
-% #indent chars '> '
-% ## Use a placeholder.
-% #indent chars $indentChars
-% ## Return to the default behavior.
-% #indent chars '\t'
-% \end{verbatim}
-%
-%
-% The following commands change the indentation level, which is a non-negative
-% integer initially at zero. All of these commands implicitly do an
-% \code{\#indent on}:
-% \begin{description}
-% \item{\code{\#indent ++}} Increment the current indentation level.
-% \item{\code{\#indent --}} Decrement the current indentation level.
-% \item{\code{\#indent +3}} Add three indentation levels (or any number).
-% \item{\code{\#indent -3}} Subtract three indentation levels (or any number).
-% \item{\code{\#indent =3}} Set the indentation level to 3.
-% \item{\code{\#indent push +2}} Save the current indentation level on a stack
-% and add two.
-% \item{\code{\#indent pop}} Return to the most recently pushed level. Raise
-% \code{IndentationStackEmptyError} if there is no previous level.
-% \end{description}
-%
-% The expressions after \code{+}/\code{-}/\code{=} may be numeric literals or
-% Cheetah expressions. The effect is undefined if the value is negative. There
-% may be whitespace after the \code{+}/\code{-}/\code{=} symbol.
-% The initial implementation uses a simple preprocessor that doesn't understand
-% newline characters in expressions. \code{\\n} is fine, but not a real newline.
-%
-% To indent multiline placeholder values using the current indentation level,
-% use the \code{Indent} filter:
-% \begin{verbatim}
-% #filter Indent
-% \end{verbatim}
-% It works like the default filter but adds indentation after every newline. It
-% does not strip any leading whitespace. It hooks into \code{\$self.\_indenter},
-% defined in \code{Cheetah.Utils.Indenter}. This object keeps track of the
-% current indentation level. Specifically, the filter calls
-% \code{\$self.\_indent()}, which is a shortcut to the indenter's
-% \code{.indent()} method. This is the same thing \code{\#indent} does.
-% However, the filter is usable even when indentation is in
-% \code{off} or \code{strip} mode.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Ouput Filtering and \#filter}
-\label{output.filter}
-
-Syntax:
-\begin{verbatim}
-#filter FILTER_CLASS_NAME
-#filter $PLACEHOLDER_TO_A_FILTER_INSTANCE
-#filter None
-\end{verbatim}
-
-
-Output from \$placeholders is passed through an ouput filter. The default
-filter merely returns a string representation of the placeholder value,
-unless the value is \code{None}, in which case the filter returns an empty
-string. Only top-level placeholders invoke the filter; placeholders inside
-expressions do not.
-
-Certain filters take optional arguments to modify their behaviour. To pass
-arguments, use the long placeholder syntax and precede each filter argument by
-a comma. By convention, filter arguments don't take a \code{\$} prefix, to
-avoid clutter in the placeholder tag which already has plenty of dollar signs.
-For instance, the MaxLen filter takes an argument 'maxlen':
-
-\begin{verbatim}
-${placeholderName, maxlen=20}
-${functionCall($functionArg), maxlen=$myMaxLen}
-\end{verbatim}
-
-To change the output filter, use the \code{'filter'} keyword to the
-\code{Template} class constructor, or the \code{\#filter}
-directive at runtime (details below). You may use \code{\#filter} as often as
-you wish to switch between several filters, if certain \code{\$placeholders}
-need one filter and other \code{\$placeholders} need another.
-
-The standard filters are in the module \code{Cheetah.Filters}. Cheetah
-currently provides:
-
-\begin{description}
-\item{\code{Filter}}
- \\ The default filter, which converts None to '' and everything else to
- \code{str(whateverItIs)}. This is the base class for all other filters,
- and the minimum behaviour for all filters distributed with Cheetah.
-\item{\code{ReplaceNone}}
- \\ Same.
-\item{\code{MaxLen}}
- \\ Same, but truncate the value if it's longer than a certain length.
- Use the 'maxlen' filter argument to specify the length, as in the
- examples above. If you don't specify 'maxlen', the value will not be
- truncated.
-\item{\code{Pager}}
- \\ Output a "pageful" of a long string. After the page, output HTML
- hyperlinks to the previous and next pages. This filter uses several
- filter arguments and environmental variables, which have not been
- documented yet.
-\item{\code{WebSafe}}
- \\ Same as default, but convert HTML-sensitive characters ('$<$', '\&',
- '$>$')
- to HTML entities so that the browser will display them literally rather
- than interpreting them as HTML tags. This is useful with database values
- or user input that may contain sensitive characters. But if your values
- contain embedded HTML tags you want to preserve, you do not want this
- filter.
-
- The filter argument 'also' may be used to specify additional characters to
- escape. For instance, say you want to ensure a value displays all on one
- line. Escape all spaces in the value with '\&nbsp', the non-breaking
- space:
-\begin{verbatim}
-${$country, also=' '}}
-\end{verbatim}
-\end{description}
-
-To switch filters using a class object, pass the class using the
-{\bf filter} argument to the Template constructor, or via a placeholder to the
-\code{\#filter} directive: \code{\#filter \$myFilterClass}. The class must be
-a subclass of \code{Cheetah.Filters.Filter}. When passing a class object, the
-value of {\bf filtersLib} does not matter, and it does not matter where the
-class was defined.
-
-To switch filters by name, pass the name of the class as a string using the
-{\bf filter} argument to the Template constructor, or as a bare word (without
-quotes) to the \code{\#filter} directive: \code{\#filter TheFilter}. The
-class will be looked up in the {\bf filtersLib}.
-
-The filtersLib is a module containing filter classes, by default
-\code{Cheetah.Filters}. All classes in the module that are subclasses of
-\code{Cheetah.Filters.Filter} are considered filters. If your filters are in
-another module, pass the module object as the {\bf filtersLib} argument to the
-Template constructor.
-
-Writing a custom filter is easy: just override the \code{.filter} method.
-\begin{verbatim}
- def filter(self, val, **kw): # Returns a string.
-\end{verbatim}
-Return the {\em string} that should be output for `val'. `val' may be any
-type. Most filters return `' for \code{None}. Cheetah passes one keyword
-argument: \verb+kw['rawExpr']+ is the placeholder name as it appears in
-the template definition, including all subscripts and arguments. If you use
-the long placeholder syntax, any options you pass appear as keyword
-arguments. Again, the return value must be a string.
-
-You can always switch back to the default filter this way:
-\code{\#filter None}. This is easy to remember because "no filter" means the
-default filter, and because None happens to be the only object the default
-filter treats specially.
-
-We are considering additional filters; see
-\url{http://webware.colorstudy.net/twiki/bin/view/Cheetah/MoreFilters}
-for the latest ideas.
-
-%% @@MO: Is '#end filter' implemented? Will it be? Can filters nest?
-%% Will '#end filter' and '#filter None' be equivalent?
-
-%% @@MO: Tavis TODO: fix the description of the Pager filter. It needs a howto.
-
-%% @@MO: How about using settings to provide default arguments for filters?
-%% Each filter could look up FilterName (or FilterNameDefaults) setting,
-%% whose value would be a dictionary containing keyword/value pairs. These
-%% would be overridden by same-name keys passed by the placeholder.
-
-%% @@MO: If sed-filters (#sed) get added to Cheetah, give them a section here.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-% vim: shiftwidth=4 tabstop=4 expandtab
diff --git a/docs/users_guide_src/parserInstructions.tex b/docs/users_guide_src/parserInstructions.tex
deleted file mode 100755
index bfd6bc2..0000000
--- a/docs/users_guide_src/parserInstructions.tex
+++ /dev/null
@@ -1,116 +0,0 @@
-\section{Instructions to the Parser/Compiler}
-\label{parserInstructions}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#breakpoint}
-\label{parserInstructions.breakpoint}
-
-Syntax:
-\begin{verbatim}
-#breakpoint
-\end{verbatim}
-
-
-\code{\#breakpoint} is a debugging tool that tells the parser to stop
-parsing at a specific point. All source code from that point on will be ignored.
-
-The difference between \code{\#breakpoint} and \code{\#stop} is that
-\code{\#stop} occurs in normal templates (e.g., inside an \code{\#if}) but
-\code{\#breakpoint} is used only when debugging Cheetah. Another difference is
-that \code{\#breakpoint} operates at compile time, while \code{\#stop} is
-executed at run time while filling the template.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{\#compiler-settings}
-\label{parserInstructions.compiler-settings}
-
-Syntax:
-\begin{verbatim}
-#compiler-settings
-key = value (no quotes)
-#end compiler-settings
-
-#compiler-settings reset
-\end{verbatim}
-
-
-The \code{\#compiler-settings} directive overrides Cheetah's standard settings,
-changing how it parses source code and generates Python code. This
-makes it possible to change the behaviour of Cheetah's parser/compiler for a
-certain template, or within a portion of the template.
-
-The \code{reset} argument reverts to the default settings. With \code{reset},
-there's no end tag.
-
-Here are some examples of what you can do:
-\begin{verbatim}
-$myVar
-#compiler-settings
-cheetahVarStartToken = @
-#end compiler-settings
-@myVar
-#compiler-settings reset
-$myVar
-\end{verbatim}
-
-
-\begin{verbatim}
-## normal comment
-#compiler-settings
-commentStartToken = //
-#end compiler-settings
-
-// new style of comment
-
-#compiler-settings reset
-
-## back to normal comments
-\end{verbatim}
-
-\begin{verbatim}
-#slurp
-#compiler-settings
-directiveStartToken = %
-#end compiler-settings
-
-%slurp
-%compiler-settings reset
-
-#slurp
-\end{verbatim}
-
-Here's a partial list of the settings you can change:
-\begin{enumerate}
-\item syntax settings
- \begin{enumerate}
- \item cheetahVarStartToken
- \item commentStartToken
- \item multilineCommentStartToken
- \item multilineCommentEndToken
- \item directiveStartToken
- \item directiveEndToken
- \end{enumerate}
-\item code generation settings
- \begin{enumerate}
- \item commentOffset
- \item outputRowColComments
- \item defDocStrMsg
- \item useNameMapper
- \item useAutocalling
- \item reprShortStrConstants
- \item reprNewlineThreshold
- \end{enumerate}
-\end{enumerate}
-The meaning of these settings and their default values will be documented in
-the future.
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-
-
-
-
diff --git a/docs/users_guide_src/tipsAndTricks.tex b/docs/users_guide_src/tipsAndTricks.tex
deleted file mode 100755
index 8a16fb4..0000000
--- a/docs/users_guide_src/tipsAndTricks.tex
+++ /dev/null
@@ -1,544 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Tips, Tricks and Troubleshooting}
-\label{tips}
-
-This chapter contains short stuff that doesn't fit anywhere else.
-
-See the Cheetah FAQ for more specialized issues and for troubleshooting tips.
-Check the wiki periodically for recent tips contributed by users. If you
-get stuck and none of these resources help, ask on the mailing list.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Placeholder Tips}
-\label{tips.placeholder}
-
-Here's how to do certain important lookups that may not be obvious.
-For each, we show first the Cheetah expression and then the Python equivalent,
-because you can use these either in templates or in pure Python subclasses.
-The Cheetah examples use NameMapper shortcuts (uniform dotted notation,
-autocalling) as much as possible.
-
-To verify whether a variable exists in the searchList:
-\begin{verbatim}
-$varExists('theVariable')
-self.varExists('theVariable')
-\end{verbatim}
-This is useful in \code{\#if} or \code{\#unless} constructs to avoid a
-\code{\#NameMapper.NotFound} error if the variable doesn't exist. For instance,
-a CGI GET parameter that is normally supplied but in this case the user typed
-the URL by hand and forgot the parameter (or didn't know about it).
-(\code{.hasVar} is a synonym for \code{.varExists}.)
-
-To look up a variable in the searchList from a Python method:
-\begin{verbatim}
-self.getVar('theVariable')
-self.getVar('theVariable', myDefault)
-\end{verbatim}
-This is the equivalent to \code{\$theVariable} in the template. If the
-variable is missing, it returns the second argument, \code{myDefault}, if
-present, or raises \code{NameMapper.NotFound} if there is no second argument.
-However, it usually easier to write your method so that all needed searchList
-values come in as method arguments. That way the caller can just use a
-\code{\$placeholder} to specify the argument, which is less verbose than you
-writing a getVar call.
-
-To do a ``safe'' placeholder lookup that returns a default value if the
-variable is missing:
-\begin{verbatim}
-$getVar('theVariable', None)
-$getVar('theVariable', $myDefault)
-\end{verbatim}
-
-To get an environmental variable, put \code{os.environ} on the searchList as a
-container. Or read the envvar in Python code and set a placeholder variable
-for it.
-
-Remember that variables found earlier in the searchList override same-name
-variables located in a later searchList object. Be careful when adding objects
-containing other variables besides the ones you want (e.g., \code{os.environ},
-CGI parameters). The "other" variables may override variables your application
-depends on, leading to hard-to-find bugs. Also, users can inadvertently or
-maliciously set an environmental variable or CGI parameter you didn't expect,
-screwing up your program. To avoid all this, know what your namespaces
-contain, and place the namespaces you have the most control over first. For
-namespaces that could contain user-supplied "other" variables, don't put the
-namespace itself in the searchList; instead, copy the needed variables into
-your own "safe" namespace.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Diagnostic Output}
-\label{tips.diagnostic}
-
-If you need send yourself some debugging output, you can use \code{\#silent} to
-output it to standard error:
-\begin{verbatim}
-#silent $sys.stderr.write("Incorrigible var is '$incorrigible'.\n")
-#silent $sys.stderr.write("Is 'unknown' in the searchList? " +
- $getVar("unknown", "No.") + "\n" )
-\end{verbatim}
-(Tip contributed by Greg Czajkowski.)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{When to use Python methods}
-\label{tips.pythonMethods}
-
-You always have a choice whether to code your methods as Cheetah \code{\#def}
-methods or Python methods (the Python methods being located in a class your
-template inherits). So how do you choose?
-
-Generally, if the method consists mostly of text and placeholders, use a
-Cheetah method (a \code{\#def} method). That's why \code{\#def} exists, to
-take the tedium out of writing those kinds of methods. And if you have a
-couple \code{\#if} stanzas to \code{\#set} some variables, followed by a
-\code{\#for} loop, no big deal. But if your method consists mostly of
-directives and only a little text, you're better off writing it in Python.
-Especially be on the watch for extensive use of \code{\#set}, \code{\#echo} and
-\code{\#silent} in a Cheetah method--it's a sure sign you're probably using the
-wrong language. Of course, though, you are free to do so if you wish.
-
-Another thing that's harder to do in Cheetah is adjacent or nested
-multiline stanzas (all those directives with an accompanying \code{\#end}
-directive). Python uses indentation to show the beginning and end of nested
-stanzas, but Cheetah can't do that because any indentation shows up in the
-output, which may not be desired. So unless all those extra spaces and tabs
-in the output are acceptable, you have to keep directives flush with the left
-margin or the preceding text.
-
-The most difficult decisions come when you have conflicting goals. What if
-a method generates its output in parts (i.e., output concatenation), contains
-many searchList placeholders and lots of text, {\em and} requires lots of
-\code{\#if \ldots \#set \ldots \#else \#set \ldots \#end if} stanzas. A Cheetah
-method would be more advantageous in some ways, but a Python method in others.
-You'll just have to choose, perhaps coding groups of methods all the same
-way. Or maybe you can split your method into two, one Cheetah and one Python,
-and have one method call the other. Usually this means the Cheetah method
-calling the Python method to calculate the needed values, then the Cheetah
-method produces the output. One snag you might run into though is that
-\code{\#set} currently can set only one variable per statement, so if your
-Python method needs to return multiple values to your Cheetah method, you'll
-have to do it another way.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Calling superclass methods, and why you have to}
-\label{tips.callingSuperclassMethods}
-
-If your template or pure Python class overrides a standard method or attribute
-of \code{Template} or one of its base classes, you should call the superclass
-method in your method to prevent various things from breaking. The most common
-methods to override are \code{.awake} and \code{.\_\_init\_\_}. \code{.awake}
-is called automatically by Webware early during the web transaction, so it makes
-a convenient place to put Python initialization code your template needs.
-You'll definitely want to call the superclass \code{.awake} because it sets up
-many wonderful attributes and methods, such as those to access the CGI input
-fields.
-
-There's nothing Cheetah-specific to calling superclass methods, but
-because it's vital, we'll recap the standard Python techniques
-here. We mention only the solution for old-style classes because
-Cheetah classes are old-style (in other Python documentation, you will
-find the technique for new-style classes, but they are not listed here
-because they cannot be used with Cheetah if you use
-dynamically-compiled templates).
-
-\begin{verbatim}
-from Cheetah.Template import Template
-class MyClass(Template):
- def awake(self, trans):
- Template.awake(self, trans)
- ... great and exciting features written by me ...
-\end{verbatim}
-
-[ @@MO: Need to test this. .awake is in Servlet, which is a superclass
-of Template. Do we really need both imports? Can we call
-Template.awake? ]
-
-To avoid hardcoding the superclass name, you can use this
-function \code{callbase()}, which emulates \code{super()} for older versions of
-Python. It also works even \code{super()} does exist, so you don't have to
-change your servlets immediately when upgrading. Note that the argument
-sequence is different than \code{super} uses.
-
-\begin{verbatim}
-===========================================================================
-# Place this in a module SOMEWHERE.py . Contributed by Edmund Lian.
-class CallbaseError(AttributeError):
- pass
-
-def callbase(obj, base, methodname='__init__', args=(), kw={},
- raiseIfMissing=None):
- try: method = getattr(base, methodname)
- except AttributeError:
- if raiseIfMissing:
- raise CallbaseError, methodname
- return None
- if args is None: args = ()
- return method(obj, *args, **kw)
-===========================================================================
-# Place this in your class that's overriding .awake (or any method).
-from SOMEWHERE import callbase
-class MyMixin:
- def awake(self, trans):
- args = (trans,)
- callbase(self, MyMixin, 'awake', args)
- ... everything else you want to do ...
-===========================================================================
-\end{verbatim}
-
-% @@MO: Edmund wants us to mention delegation too, as an alternative to
-% inheritance. Contact elian@inbrief.net for details.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{All methods}
-\label{tips.allMethods}
-
-Here is a list of all the standard methods and attributes that can be accessed
-from a placeholder. Some of them exist for you to call, others are mainly used
-by Cheetah internally but you can call them if you wish, and others are only
-for internal use by Cheetah or Webware. Do not use these method names in mixin
-classes (\code{\#extends}, section \ref{inheritanceEtc.extends}) unless you
-intend to override the standard method.
-
-Variables with a star prefix ({\bf *}) are frequently used in templates or in
-pure Python classes.
-
-\paragraph*{Inherited from Cheetah.Template}
-
-\begin{description}
-\item{{\bf compile(source=None, file=None, moduleName=None,
- mainMethodName='respond')}} Compile the template. Automatically called
- by \code{.\_\_init\_\_}.
-\item{{\bf generatedModuleCode()}} Return the module code the compiler
- generated, or \code{None} if no compilation took place.
-\item{{\bf generatedClassCode()}} Return the class code the compiler
- generated, or \code{None} if no compilation took place.
-\item{{\bf * searchList()}} Return a reference to the underlying search list.
- (a list of objects). Use this to print out your searchList for debugging.
- Modifying the returned list will affect your placeholder searches!
-\item{{\bf * errorCatcher()}} Return a reference to the current error
- catcher.
-\item{{\bf * refreshCache(cacheKey=None)}} If 'cacheKey' is not \code{None},
- refresh that item in the cache. If \code{None}, delete all items in the
- cache so they will be recalculated the next time they are encountered.
-\item{{\bf * shutdown()}} Break reference cycles before discarding a servlet.
-\item{{\bf * getVar(varName, default=NoDefault, autoCall=True)}} Look up a
- variable in the searchList. Same as \code{\$varName} but allows you to
- specify a default value and control whether autocalling occurs.
-\item{{\bf * varExists(varName, autoCall=True)}}
-\item{{\bf * getFileContents(path)}} Read the named file. If used as a
- placeholder, inserts the file's contents in the output without
- interpretation, like \code{\#include\ raw}. If used in an expression,
- returns the file's content (e.g., to assign it to a variable).
-\item{{\bf runAsMainProgram()}} This is what happens if you run a
- .py template module as a standalone program.
-\end{description}
-
-%Private methods: {\bf \_bindCompiledMethod}, {\bf \_bindFunctionAsMethod},
-%{\bf \_includeCheetahSource}, {\bf \_genTmpFilename},
-%{\bf \_importAsDummyModule}, {\bf \_makeDummyPackageForDir},
-%{\bf \_importFromDummyPackage}, {\bf \_importModuleFromDirectory}.
-%
-%Other private attributes:
-%\begin{description}
-%\item{{\bf * \_fileMtime}} Time the template definition was modified, in
-% Unix ticks. \code{None} if the template definition came from a string or
-% file handle rather than a named file, same for the next three variables.
-%\item{{\bf * \_fileDirName}} The directory containing the template definition.
-%\item{{\bf * \_fileBaseName}} The basename of the template definition file.
-%\item{{\bf * \_filePath}} The directory+filename of the template definition.
-%\end{description}
-
-\paragraph*{Inherited from Cheetah.Utils.WebInputMixin}
-
-\begin{description}
-\item{{\bf nonNumericInputError}} Exception raised by \code{.webInput}.
-\item{{\bf * webInput(...)}} Convenience method to access GET/POST variables
- from a Webware servlet or CGI script, or Webware cookie or session
- variables. See section \ref{webware.webInput} for usage information.
-\end{description}
-
-\paragraph*{Inherited from Cheetah.SettingsManager}
-
-\begin{description}
-\item{{\bf setting(name, default=NoDefault)}} Get a compiler setting.
-\item{{\bf hasSetting(name)}} Does this compiler setting exist?
-\item{{\bf setSetting(name, value)}} Set setting 'name' to 'value'.
- See \code{\#compiler-settings}, section
- \ref{parserInstructions.compiler-settings}.
-\item{{\bf settings()}} Return the underlying settings dictionary. (Warning:
- modifying this dictionary will change Cheetah's behavior.)
-\item{{\bf copySettings()}} Return a copy of the underlying settings
- dictionary.
-\item{{\bf deepcopySettings()}} Return a deep copy of the underlying settings
- dictionary. See Python's \code{copy} module.
-\item{{\bf updateSettings(newSettings, merge=True)}} Update Cheetah's
- compiler settings from the 'newSettings' dictionary. If 'merge' is true,
- update only the names in newSettings and leave the other names alone.
- (The SettingsManager is smart enough to update nested dictionaries one
- key at a time rather than overwriting the entire old dictionary.)
- If 'merge' is false, delete all existing settings so that the new ones are
- the only settings.
-\item{{\bf updateSettingsFromPySrcStr(theString, merge=True)}} Same,
- but pass a string of \code{name=value} pairs rather
- than a dictionary, the same as you would provide in a
- \code{\#compiler-settings} directive, section
- \ref{parserInstructions.compiler-settings}.
-\item{{\bf updateSettingsFromPySrcFile(path, merge=True)}} Same, but
- exec a Python source file and use the variables it contains as the new
- settings. (e.g., \code{cheetahVarStartToken\ =\ "@"}).
-\item{{\bf updateSettingsFromConfigFile(path, **kw)}} Same, but get the new
- settings from a text file in ConfigParser format (similar to Windows'
- *.ini file format). See Python's \code{ConfigParser} module.
-\item{{\bf updateSettingsFromConfigFileObj}} Same, but read the open file
- object 'inFile' for the new settings.
-\item{{\bf updateSettingsFromConfigStr(configStr, convert=True, merge=True}}
- Same, but read the new settings from a string in ConfigParser format.
-\item{{\bf writeConfigFile(path)}} Write the current compiler settings to
- a file named 'path' in *.ini format.
-\item{{\bf getConfigString()}} Return a string containing the current
- compiler settings in *.ini format.
-\end{description}
-
-\paragraph*{Inherited from Cheetah.Servlet}
-
-{\em Do not override these in a subclass or assign to them as attributes
-if your template will be used as a servlet,} otherwise Webware will behave
-unpredictably. However, it {\em is} OK to put same-name variables in the
-searchList, because Webware does not use the searchList.
-
-EXCEPTION: It's OK to override {\bf awake} and {\bf sleep} as long as you
-call the superclass methods. (See section
-\ref{tips.callingSuperclassMethods}.)
-
-\begin{description}
-\item{{\bf * isControlledByWebKit}} True if this template instance is
- part of a live transaction in a running WebKit servlet.
-\item{{\bf * isWebwareInstalled}} True if Webware is installed and the
- template instance inherits from WebKit.Servlet. If not, it inherits
- from Cheetah.Servlet.DummyServlet.
-\item{{\bf * awake(transaction)}} Called by WebKit at the beginning of
- the web transaction.
-\item{{\bf * sleep(transaction)}} Called by WebKit at the end of the
- web transaction.
-\item{{\bf * respond(transaction)}} Called by WebKit to produce the
- web transaction content. For a template-servlet, this means
- filling the template.
-\item{{\bf shutdown()}} Break reference cycles before deleting instance.
-\item{{\bf * serverSidePath()}} The filesystem pathname of the
- template-servlet (as opposed to the URL path).
-\item{{\bf transaction}} The current Webware transaction.
-\item{{\bf application}} The current Webware application.
-\item{{\bf response}} The current Webware response.
-\item{{\bf request}} The current Webware request.
-\item{{\bf session}} The current Webware session.
-\item{{\bf write}} Call this method to insert text in the filled template
- output.
-\end{description}
-
-Several other goodies are available to template-servlets under the
-\code{request} attribute, see section \ref{webware.input}.
-
-\code{transaction}, \code{response}, \code{request} and \code{session} are
-created from the current transaction when WebKit calls \code{awake}, and don't
-exist otherwise. Calling \code{awake} yourself (rather than letting WebKit
-call it) will raise an exception because the \code{transaction} argument won't
-have the right attributes.
-
-\paragraph*{Inherited from WebKit.Servlet}
-These are accessible only if Cheetah knows Webware is installed. This
-listing is based on a CVS snapshot of Webware dated 22 September 2002, and
-may not include more recent changes.
-
-The same caveats about overriding these methods apply.
-
-\begin{description}
-\item{name()} The simple name of the class. Used by Webware's logging and
- debugging routines.
-\item{log()} Used by Webware's logging and debugging routines.
-\item{canBeThreaded()} True if the servlet can be multithreaded.
-\item{canBeReused()} True if the servlet can be used for another transaction
- after the current transaction is finished.
-\item{serverSideDir()} Depreciated by \code{.serverSidePath()}.
-\end{description}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Optimizing templates}
-\label{tips.optimizing}
-
-Here are some things you can do to make your templates fill faster and user
-fewer CPU cycles. Before you put a lot of energy into this, however, make
-sure you really need to. In many situations, templates appear to initialize
-and fill instantaneously, so no optimization is necessary. If you do find a
-situation where your templates are filling slowly or taking too much memory or
-too many CPU cycles, we'd like to hear about it on the mailing list.
-
-Cache \$placeholders whose values don't change frequently. (Section
-\ref{output.caching}).
-
-Use \code{\#set} for values that are very frequently used, especially if they
-come out of an expensive operation like a deeply.nested.structure or a database
-lookup. \code{\#set} variables are set to Python local variables, which have a
-faster lookup time than Python globals or values from Cheetah's searchList.
-
-Moving variable lookups into Python code may provide a speedup in certain
-circumstances. If you're just reading \code{self} attributes, there's no
-reason to use NameMapper lookup (\$placeholders) for them. NameMapper does
-a lot more work than simply looking up a \code{self} attribute.
-
-On the other hand, if you don't know exactly where the value will come from
-(maybe from \code{self}, maybe from the searchList, maybe from a CGI input
-variable, etc), it's easier to just make that an argument to your method, and
-then the template can handle all the NameMapper lookups for you:
-\begin{verbatim}
-#silent $myMethod($arg1, $arg2, $arg3)
-\end{verbatim}
-Otherwise you'd have to call \code{self.getVar('arg1')} etc in your
-method, which is more wordy, and tedious.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{PSP-style tags}
-\label{tips.PSP}
-
-\code{<\%= \ldots \%>} and \code{<\% \ldots \%>} allow an escape
-to Python syntax inside the template. You do not need it to use Cheetah
-effectively, and we're hard pressed to think of a case to recommend it.
-Nevertheless, it's there in case you encounter a situation you can't
-express adequately in Cheetah syntax. For instance, to set a local
-variable to an elaborate initializer.
-
-\code{<\%= \ldots \%>} encloses a Python expression whose result will
-be printed in the output.
-
-\code{<\% \ldots \%>} encloses a Python statement or expression (or set of
-statements or expressions) that will be included as-is into the generated
-method. The statements themselves won't produce any output, but you can use
-the local function \code{write(EXPRESSION)} to produce your own output.
-(Actually, it's a method of a file-like object, but it looks like a local
-function.) This syntax also may be used to set a local variable with a
-complicated initializer.
-
-To access Cheetah services, you must use Python code like you would in an
-inherited Python class. For instance, use \code{self.getVar()} to look up
-something in the searchList.
-
-{\em Warning:} {\bf No error checking is done!} If you write:
-\begin{verbatim}
-<% break %> ## Wrong!
-\end{verbatim}
-you'll get a \code{SyntaxError} when you fill the template, but that's what you
-deserve.
-
-Note that these are PSP-{\em style} tags, not PSP tags. A Cheetah template
-is not a PSP document, and you can't use PSP commands in it.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Makefiles}
-\label{tips.Makefile}
-
-If your project has several templates and you get sick of typing
-``cheetah compile FILENAME.tmpl'' all the time--much less remembering which
-commands to type when--and your system has the \code{make}
-command available, consider building a Makefile to make your life easier.
-
-Here's a simple Makefile that controls two templates, ErrorsTemplate and
-InquiryTemplate. Two external commands, \code{inquiry} and \code{receive},
-depend on ErrorsTemplate.py. Aditionally, InquiryTemplate
-itself depends on ErrorsTemplate.
-
-\begin{verbatim}
-all: inquiry receive
-
-.PHONY: all receive inquiry printsource
-
-printsource:
- a2ps InquiryTemplate.tmpl ErrorsTemplate.tmpl
-
-ErrorsTemplate.py: ErrorsTemplate.tmpl
- cheetah compile ErrorsTemplate.tmpl
-
-InquiryTemplate.py: InquiryTemplate.tmpl ErrorsTemplate.py
- cheetah compile InquiryTemplate.tmpl
-
-inquiry: InquiryTemplate.py ErrorsTemplate.py
-
-receive: ErrorsTemplate.py
-\end{verbatim}
-
-Now you can type \code{make} anytime and it will recompile all the templates
-that have changed, while ignoring the ones that haven't. Or you can
-recompile all the templates \code{receive} needs by typing \code{make receive}.
-Or you can recompile only ErrorsTemplate by typing
-\code{make ErrorsTemplate}. There's also another target, ``printsource'':
-this sends a Postscript version of the project's source files to the printer.
-The .PHONY target is explained in the \code{make} documentation; essentially,
-you have it depend on every target that doesn't produce an output file with
-the same name as the target.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Using Cheetah in a Multi-Threaded Application}
-\label{tips.threads}
-
-Template classes may be shared freely between threads. However, template
-instances should not be shared unless you either:
-\begin{itemize}
-\item Use a lock (mutex) to serialize template fills, to prevent two threads
-from filling the template at the same time.
-\item Avoid thread-unsafe features:
- \begin{itemize}
- \item Modifying searchList values or instance variables.
- \item Caching (\code{\$*var}, \code{\#cache}, etc).
- \item \code{\#set global}, \code{\#filter}, \code{\#errorCatcher}.
- \end{itemize}
- Any changes to these in one thread will be visible in other threads,
- causing them to give inconsistent output.
-\end{itemize}
-
-About the only advantage in sharing a template instance is building up the
-placeholder cache. But template instances are so low overhead that it
-probably wouldn't take perceptibly longer to let each thread instantiate its
-own template instance. Only if you're filling templates several times a
-second would the time difference be significant, or if some of the placeholders
-trigger extremely slow calculations (e.g., parsing a long text file each time).
-The biggest overhead in Cheetah is importing the \code{Template} module in
-the first place, but that has to be done only once in a long-running
-application.
-
-You can use Python's \code{mutex} module for the lock, or any similar
-mutex. If you have to change searchList values or instance variables
-before each fill (which is usually the case), lock the mutex before
-doing this, and unlock it only after the fill is complete.
-
-For Webware servlets, you're probably better off using Webware's servlet
-caching rather than Cheetah's caching. Don't override the servlet's
-\code{.canBeThreaded()} method unless you avoid the unsafe operations
-listed above.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Using Cheetah with gettext}
-\label{tips.gettext}
-
-{\bf gettext} is a project for creating internationalized applications. For
-more details, visit \url{http://docs.python.org/lib/module-gettext.html}.
-gettext can be used with Cheetah to create internationalized applications, even
-for CJK character sets, but you must keep a couple things in mind:
-\begin{itemize}
-\item xgettext is used on compiled templates, not on the templates themselves.
-\item The way the NameMapper syntax gets compiled to Python gets in the way of
-the syntax that xgettext recognizes. Hence, a special case exists for the
-functions \code{_}, \code{N_}, and \code{ngettext}. If you need to use a
-different set of functions for marking strings for translation, you must set
-the Cheetah setting \code{gettextTokens} to a list of strings representing the
-names of the functions you are using to mark strings for translation.
-\end{itemize}
-
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/users_guide.tex b/docs/users_guide_src/users_guide.tex
deleted file mode 100755
index 74949cf..0000000
--- a/docs/users_guide_src/users_guide.tex
+++ /dev/null
@@ -1,54 +0,0 @@
-
-\documentclass{howto}
-\usepackage{moreverb} %% Verbatim Code Listings
-
-\title{Cheetah Users' Guide}
-\release{0.9.17rc1}
-
-\author{Edited by Mike Orr and Tavis Rudd}
-\authoraddress{\email{cheetahtemplate-discuss@lists.sourceforge.net}}
-
-\begin{document}
-\maketitle
-
-% @@MO: Picture of cheetah from web site.
-
-\tableofcontents
-
-\copyright{Copyright 2001-2005, The Cheetah Development Team.
- This document may be copied and modified under the terms of the
- {\bf Open Publication License} \url{http://www.opencontent.org/openpub/} }
-
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \include{introduction}
- \include{glossary}
- \include{gettingStarted}
- \include{howItWorks}
- \include{language}
- \include{comments}
- \include{output}
- \include{inheritanceEtc}
- \include{flowControl}
- \include{errorHandling}
- \include{parserInstructions}
- \include{moduleFormatting}
- \include{tipsAndTricks}
- \include{webware}
- \include{otherHtml}
- \include{nonHtml}
- \include{nonHTML}
- \include{libraries}
- \include{editors}
-
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \appendix
- \include{links}
- \include{examples}
- \include{comparisons}
- \include{optikLicense}
-
-\end{document}
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
diff --git a/docs/users_guide_src/webware.tex b/docs/users_guide_src/webware.tex
deleted file mode 100755
index a5702d8..0000000
--- a/docs/users_guide_src/webware.tex
+++ /dev/null
@@ -1,575 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Using Cheetah with Webware}
-\label{webware}
-
-{\bf Webware for Python} is a 'Python-Powered Internet Platform' that runs
-servlets in a manner similar to Java servlets. {\bf WebKit} is the name of
-Webware's application server. For more details, please visit
-\url{http://webware.sourceforge.net/}.
-
-All comments below refer to the official version of Webware, the DamnSimple!
-offshoot at ?, and the now-abandoned WebwareExperimental implementation at
-\url{http://sourceforge.net/projects/expwebware/}, except where noted. All the
-implementations are 95\% identical to the servlet writer: their differences lie
-in their internal structure and configuration files. One difference is that
-the executable you run to launch standard Webware is called \code{AppServer},
-whereas in WebwareExperimental it's called \code{webkit}. But to servlets
-they're both "WebKit, Webware's application server", so it's one half dozen to
-the other. In this document, we generally use the term {\bf WebKit} to refer
-to the currently-running application server.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Installing Cheetah on a Webware system}
-\label{webware.installing}
-
-Install Cheetah after you have installed Webware, following the instructions in
-chapter \ref{gettingStarted}.
-
-The standard Cheetah test suite ('cheetah test') does not test Webware features.
-We plan to build a test suite that can run as a Webware servlet, containing
-Webware-specific tests, but that has not been built yet. In the meantime, you
-can make a simple template containing something like "This is a very small
-template.", compile it, put the *.py template module in a servlet
-directory, and see if Webware serves it up OK.
-
-{\em You must not have a Webware context called "Cheetah".} If you do, Webware
-will mistake that directory for the Cheetah module directory, and all
-template-servlets will bomb out with a "ImportError: no module named Template".
-(This applies only to the standard Webware; WebwareExperimental does not have
-contexts.)
-
-If Webware complains that it cannot find your servlet, make sure
-'.tmpl' is listed in 'ExtensionsToIgnore' in your 'Application.config' file.
-
-% @@MO: Should explain extension cascading and how without it, standard
-% Webware pretends a file doesn't exist if it finds two or more servable files
-% that match the URL.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Containment vs Inheritance}
-\label{webware.background}
-
-Because Cheetah's core is flexible, there are many ways to integrate it with
-Webware servlets. There are two broad strategies: the {\bf Inheritance
-approach} and the {\bf Containment approach}. The difference is
-that in the Inheritance approach, your template object \code{\em is} the
-servlet, whereas in the Containment approach, the servlet is not a template but
-merely {\em uses} template(s) for portion(s) of its work.
-
-The Inheritance approach is recommended for new sites because it's simpler, and
-because it scales well for large sites with a
-site->section->subsection->servlet hierarchy. The Containment approach is
-better for existing servlets that you don't want to restructure. For instance,
-you can use the Containment approach to embed a discussion-forum table at the
-bottom of a web page.
-
-However, most people who use Cheetah extensively seem
-to prefer the Inheritance approach because even the most analytical servlet
-needs to produce {\em some} output, and it has to fit the site's look and feel
-{\em anyway}, so you may as well use a template-servlet as the place to put the
-output. Especially since it's so easy to add a template-servlet to a site once
-the framework is established. So we recommend you at least evaluate the
-effort that would be required to convert your site framework to template
-superclasses as described below, vs the greater flexibility and manageability
-it might give the site over the long term. You don't necessarily have to
-convert all your existing servlets right away: just build common site templates
-that are visually and behaviorally compatible with your specification, and use
-them for new servlets. Existing servlets can be converted later, if at all.
-
-Edmund Liam is preparing a section on a hybrid approach, in which the
-servlet is not a template, but still calls template(s) in an inheritance
-chain to produce the output. The advantage of this approach is that you
-aren't dealing with \code{Template} methods and Webware methods in the
-same object.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{The Containment Approach}
-\label{webware.containment}
-
-In the Containment approach, your servlet is not a template. Instead, it
-it makes its own arrangements to create and use template object(s) for whatever
-it needs. The servlet must explicitly call the template objects'
-\code{.respond()} (or \code{.\_\_str\_\_()}) method each time it needs to fill
-the template. This does not present the output to the user; it merely gives
-the output to the servlet. The servlet then calls its
-\code{\#self.response().write()} method to send the output to the user.
-
-The developer has several choices for managing her templates. She can store the
-template definition in a string, file or database and call
-\code{Cheetah.Template.Template} manually on it. Or she can put the
-template definition in a *.tmpl file and use {\bf cheetah compile} (section
-\ref{howWorks.cheetah-compile}) to convert it to a Python class in a *.py
-module, and then import it into her servlet.
-
-Because template objects are not thread safe, you should not store one
-in a module variable and allow multiple servlets to fill it simultaneously.
-Instead, each servlet should instantiate its own template object. Template
-{\em classes}, however, are thread safe, since they don't change once created.
-So it's safe to store a template class in a module global variable.
-
-% @@MO: Example of containment.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{The Inheritance Approach}
-\label{webware.inheritance}
-
-In the Inheritance approach, your template object doubles as as Webware
-servlet, thus these are sometimes called {\bf template-servlets}. {\bf cheetah
-compile} (section \ref{howWorks.cheetah-compile}) automatically creates modules
-containing valid Webware servlets. A servlet is a subclass of Webware's
-\code{WebKit.HTTPServlet} class, contained in a module with the same name as
-the servlet. WebKit uses the request URL to find the module, and then
-instantiates the servlet/template. The servlet must have a \code{.respond()}
-method (or \code{.respondToGet()}, \code{.respondToPut()}, etc., but the
-Cheetah default is \code{.respond()}). Servlets created by \code{cheetah
-compile} meet all these requirements.
-
-(Cheetah has a Webware plugin that automatically converts a \code{.tmpl servlet
-file} into a \code{.py servlet file} when the \code{.tmpl servlet file} is
-requested by a browser. However, that plugin is currently unavailable because
-it's being redesigned. For now, use \code{cheetah compile} instead.)
-
-What about logic code? Cheetah promises to keep content (the placeholder
-values), graphic design (the template definition and is display logic), and
-algorithmic logic (complex calculations and side effects) separate. How?
-Where do you do form processing?
-
-The answer is that your template class can inherit from a pure Python class
-containing the analytical logic. You can either use the \code{\#extends}
-directive in Cheetah to indicate the superclass(es), or write a Python
-\code{class} statement to do the same thing. See the template
-\code{Cheetah.Templates.SkeletonPage.tmpl} and its pure Python class
-\code{Cheetah.Templates.\_SkeletonPage.py} for an example of a template
-inheriting logic code. (See sections \ref{inheritanceEtc.extends} and
-\ref{inheritanceEtc.implements} for more information about \code{\#extends} and
-\code{\#implements}. They have to be used a certain right way.)
-
-If \code{\#WebKit.HTTPServlet} is not available, Cheetah fakes it with a
-dummy class to satisfy the dependency. This allows servlets to be tested on
-the command line even on systems where Webware is not installed. This works
-only with servlets that don't call back into WebKit for information about the
-current web transaction, since there is no web transaction. Trying to access
-form input, for instance, will raise an exception because it depends on a
-live web request object, and in the dummy class the request object is
-\code{None}.
-
-Because Webware servlets must be valid Python modules, and ``cheetah compile''
-can produce only valid module names, if you're converting an existing site that
-has .html filenames with hyphens (-), extra dots (.), etc, you'll have to
-rename them (and possibly use redirects).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Site frameworks}
-\label{webware.siteFrameworks}
-
-Web sites are normally arranged hierarchically, with certain features common
-to every page on the site, other features common to certain sections or
-subsections, and others unique to each page. You can model this easily with
-a hierarchy of classes, with specific servlets inheriting from their more
-general superclasses. Again, you can do this two ways, using Cheetah's
-{\bf Containment} approach or {\bf Inheritance} approach.
-
-In the Inheritance approach, parents provide \code{\#block}s and children
-override them using \code{\#def}. Each child \code{\#extend}s its immediate
-parent. Only the leaf servlets need to be under WebKit's document root
-directory. The superclass servlets can live anywhere in the filesystem
-that's in the Python path. (You may want to modify your WebKit startup
-script to add that library directory to your \code{PYTHONPATH} before starting
-WebKit.)
-
-% @@MO Examples: simple, IronSite, SkeletonPage.
-
-Section \ref{libraries.templates.skeletonPage} contains information on a stock
-template that simplifies defining the basic HTML structure of your web
-page templates.
-
-In the Containment approach, your hierarchy of servlets are not templates, but
-each uses one or more templates as it wishes. Children provide callback
-methods to to produce the various portions of the page that are their
-responsibility, and parents call those methods. Webware's \code{WebKit.Page}
-and \code{WebKit.SidebarPage} classes operate like this.
-
-% @@MO Show examples of WebKit.Page and WebKit.SidebarPage.
-
-Note that the two approaches are not compatible! \code{WebKit.Page} was not
-designed to intermix with \code{Cheetah.Templates.SkeletonPage}. Choose either
-one or the other, or expect to do some integration work.
-
-If you come up with a different strategy you think is worth noting in this
-chapter, let us know.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Directory structure}
-\label{webware.directoryStructure}
-
-Here's one way to organize your files for Webware+Cheetah.
-
-\begin{verbatim}
-www/ # Web root directory.
- site1.example.com/ # Site subdirectory.
- apache/ # Web server document root (for non-servlets).
- www/ # WebKit document root.
- index.py # http://site1.example.com/
- index.tmpl # Source for above.
- servlet2.py # http://site1.example.com/servlet2
- servlet2.tmpl # Source for above.
- lib/ # Directory for helper classes.
- Site.py # Site superclass ("#extends Site").
- Site.tmpl # Source for above.
- Logic.py # Logic class inherited by some template.
- webkit.config # Configuration file (for WebwareExperimental).
- Webware/ # Standard Webware's MakeAppWorkDir directory.
- AppServer # Startup program (for standard Webware).
- Configs/ # Configuration directory (for standard Webware).
- Application.config
- # Configuration file (for standard Webware).
- site2.example.org/ # Another virtual host on this computer....
-\end{verbatim}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Initializing your template-servlet with Python code}
-\label{webware.calculations}
-
-If you need a place to initialize variables or do calculations for your
-template-servlet, you can put it in an \code{.awake()} method because WebKit
-automatically calls that early when processing the web transaction. If you
-do override \code{.awake()}, be sure to call the superclass \code{.awake}
-method. You probably want to do that first so that you have access to the
-web transaction data \code{Servlet.awake} provides. You don't have to worry
-about whether your parent class has its own \code{.awake} method, just call
-it anyway, and somebody up the inheritance chain will respond, or at minimum
-\code{Servlet.awake} will respond. Section
-\ref{tips.callingSuperclassMethods} gives examples of how to call a
-superclass method.
-
-As an alternative, you can put all your calculations in your own method and
-call it near the top of your template. (\code{\#silent}, section
-\ref{output.silent}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Form processing}
-\label{webware.form}
-
-There are many ways to display and process HTML forms with Cheetah.
-But basically, all form processing involves two steps.
-\begin{enumerate}
-\item{} Display the form.
-\item{} In the next web request, read the parameters the user submitted,
-check for user errors, perform any side effects (e.g., reading/writing a
-database or session data) and present the user an HTML response or another
-form.
-\end{enumerate}
-
-The second step may involve choosing between several templates to fill (or
-several servlets to redirect to), or a big if-elif-elif-else construct to
-display a different portion of the template depending on the situation.
-
-In the oldest web applications, step 1 and step 2 were handled by separate
-objects. Step 1 was a static HTML file, and step 2 was a CGI script.
-Frequently, a better strategy is to have a single servlet handle both steps.
-That way, the servlet has better control over the entire situation, and if
-the user submits unacceptable data, the servlet can redisplay the form with a
-"try again" error message at the top and and all the previous input filled in.
-The servlet can use the presence or absence of certain CGI parameters (e.g.,
-the submit button, or a hidden mode field) to determine which step to take.
-
-One neat way to build a servlet that can handle both the form displaying and
-form processing is like this:
-
-\begin{enumerate}
-\item Put your form HTML into an ordinary template-servlet. In each input
- field, use a placeholder for the value of the \code{VALUE=} attribue.
- Place another placeholder next to each field, for that field's error
- message.
-\item Above the form, put a \code{\$processFormData} method call.
-\item Define that method in a Python class your template \code{\#extend}s. (Or
- if it's a simple method, you can define it in a \code{\#def}.) The method
- should:
- \begin{enumerate}
- \item Get the form input if any.
- \item If the input variable corresponding to the submit field is empty,
- there is no form input, so we're showing the form for the first time.
- Initialize all VALUE= variables to their default value (usually ""),
- and all error variables to "". Return "", which will be the value for
- \code{\$processFormData}.
- \item If the submit variable is not empty, fill the VALUE= variables with
- the input data the user just submitted.
- \item Now check the input for errors and put error messages in the error
- placeholders.
- \item If there were any user errors, return a general error message
- string; this will be the value for \code{\$processFormData}.
- \item If there were no errors, do whatever the form's job is (e.g., update
- a database) and return a success message; this will be the value for
- \code{\$processFormData}.
- \end{enumerate}
-\item The top of the page will show your success/failure message (or nothing
-the first time around), with the form below. If there are errors, the user
-will have a chance to correct them. After a successful submit, the form will
-appear again, so the user can either review their entry, or change it and
-submit it again. Depending on the application, this may make the servlet
-update the same database record again, or it may generate a new record.
-\end{enumerate}
-
-% @@MO: Example of a template that shows a form and then processes the input.
-
-\code{FunFormKit} is a third-party Webware package that makes it easier to
-produce forms and handle their logic. It has been successfully been used with
-Cheetah. You can download FunFormKit from
-\url{http://colorstudy.net/software/funformkit/} and try it out for yourself.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Form input, cookies, session variables and web server variables}
-\label{webware.input}
-
-General variable tips that also apply to servlets are in section
-\ref{tips.placeholder}.
-
-To look up a CGI GET or POST parameter (with POST overriding):
-\begin{verbatim}
-$request.field('myField')
-self.request().field('myField')
-\end{verbatim}
-These will fail if Webware is not available, because \code{\$request}
-(aka \code{self.request()} will be \code{None} rather than a Webware
-\code{WebKit.Request} object. If you plan to read a lot of CGI parameters,
-you may want to put the \code{.fields} method into a local variable for
-convenience:
-\begin{verbatim}
-#set $fields = $request.fields
-$fields.myField
-\end{verbatim}
-But remember to do complicated calculations in Python, and assign the results
-to simple variables in the searchList for display. These \code{\$request}
-forms are useful only for occasions where you just need one or two simple
-request items that going to Python for would be overkill.
-
-To get a cookie or session parameter, subsitute ``cookie'' or ``session'' for
-``field'' above. To get a dictionary of all CGI parameters, substitute
-``fields'' (ditto for ``cookies''). To verify a field exists,
-substitute ``hasField'' (ditto for ``hasCookie'').
-
-Other useful request goodies:
-\begin{verbatim}
-## Defined in WebKit.Request
-$request.field('myField', 'default value')
-$request.time ## Time this request began in Unix ticks.
-$request.timeStamp ## Time in human-readable format ('asctime' format).
-## Defined in WebKit.HTTPRequest
-$request.hasField.myField ## Is a CGI parameter defined?
-$request.fields ## Dictionary of all CGI parameters.
-$request.cookie.myCookie ## A cookie parameter (also .hasCookie, .cookies).
-$request.value.myValue ## A field or cookie variable (field overrides)
- ## (also .hasValue).
-$request.session.mySessionVar # A session variable.
-$request.extraURLPath ## URL path components to right of servlet, if any.
-$request.serverDictionary ## Dict of environmental vars from web server.
-$request.remoteUser ## Authenticated username. HTTPRequest.py source
- ## suggests this is broken and always returns None.
-$request.remoteAddress ## User's IP address (string).
-$request.remoteName ## User's domain name, or IP address if none.
-$request.urlPath ## URI of this servlet.
-$request.urlPathDir ## URI of the directory containing this servlet.
-$request.serverSidePath ## Absolute path of this servlet on local filesystem.
-$request.serverURL ## URL of this servlet, without "http://" prefix,
- ## extra path info or query string.
-$request.serverURLDir ## URL of this servlet's directory, without "http://".
-$log("message") ## Put a message in the Webware server log. (If you
- ## define your own 'log' variable, it will override
- ## this; use $self.log("message") in that case.
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection{.webInput()}
-\label{webware.webInput}
-
-From the method docstring:
-
-\begin{verbatim}
- def webInput(self, names, namesMulti=(), default='', src='f',
- defaultInt=0, defaultFloat=0.00, badInt=0, badFloat=0.00, debug=False):
-
-This method places the specified GET/POST fields, cookies or session variables
-into a dictionary, which is both returned and put at the beginning of the
-searchList. It handles:
- * single vs multiple values
- * conversion to integer or float for specified names
- * default values/exceptions for missing or bad values
- * printing a snapshot of all values retrieved for debugging
-All the 'default*' and 'bad*' arguments have "use or raise" behavior, meaning
-that if they're a subclass of Exception, they're raised. If they're anything
-else, that value is substituted for the missing/bad value.
-
-The simplest usage is:
-
- #silent $webInput(['choice'])
- $choice
-
- dic = self.webInput(['choice'])
- write(dic['choice'])
-
-Both these examples retrieves the GET/POST field 'choice' and print it. If you
-leave off the "#silent", all the values would be printed too. But a better way
-to preview the values is
-
- #silent $webInput(['name'], $debug=1)
-
-because this pretty-prints all the values inside HTML <PRE> tags.
-
-Since we didn't specify any coversions, the value is a string. It's a "single"
-value because we specified it in 'names' rather than 'namesMulti'. Single
-values work like this:
- * If one value is found, take it.
- * If several values are found, choose one arbitrarily and ignore the rest.
- * If no values are found, use or raise the appropriate 'default*' value.
-
-Multi values work like this:
- * If one value is found, put it in a list.
- * If several values are found, leave them in a list.
- * If no values are found, use the empty list ([]). The 'default*'
- arguments are *not* consulted in this case.
-
-Example: assume 'days' came from a set of checkboxes or a multiple combo box
-on a form, and the user chose "Monday", "Tuesday" and "Thursday".
-
- #silent $webInput([], ['days'])
- The days you chose are: #slurp
- #for $day in $days
- $day #slurp
- #end for
-
- dic = self.webInput([], ['days'])
- write("The days you chose are: ")
- for day in dic['days']:
- write(day + " ")
-
-Both these examples print: "The days you chose are: Monday Tuesday Thursday".
-
-By default, missing strings are replaced by "" and missing/bad numbers by zero.
-(A "bad number" means the converter raised an exception for it, usually because
-of non-numeric characters in the value.) This mimics Perl/PHP behavior, and
-simplifies coding for many applications where missing/bad values *should* be
-blank/zero. In those relatively few cases where you must distinguish between
-""/zero on the one hand and missing/bad on the other, change the appropriate
-'default*' and 'bad*' arguments to something like:
- * None
- * another constant value
- * $NonNumericInputError/self.NonNumericInputError
- * $ValueError/ValueError
-(NonNumericInputError is defined in this class and is useful for
-distinguishing between bad input vs a TypeError/ValueError
-thrown for some other reason.)
-
-Here's an example using multiple values to schedule newspaper deliveries.
-'checkboxes' comes from a form with checkboxes for all the days of the week.
-The days the user previously chose are preselected. The user checks/unchecks
-boxes as desired and presses Submit. The value of 'checkboxes' is a list of
-checkboxes that were checked when Submit was pressed. Our task now is to
-turn on the days the user checked, turn off the days he unchecked, and leave
-on or off the days he didn't change.
-
- dic = self.webInput([], ['dayCheckboxes'])
- wantedDays = dic['dayCheckboxes'] # The days the user checked.
- for day, on in self.getAllValues():
- if not on and wantedDays.has_key(day):
- self.TurnOn(day)
- # ... Set a flag or insert a database record ...
- elif on and not wantedDays.has_key(day):
- self.TurnOff(day)
- # ... Unset a flag or delete a database record ...
-
-'source' allows you to look up the variables from a number of different
-sources:
- 'f' fields (CGI GET/POST parameters)
- 'c' cookies
- 's' session variables
- 'v' "values", meaning fields or cookies
-
-In many forms, you're dealing only with strings, which is why the
-'default' argument is third and the numeric arguments are banished to
-the end. But sometimes you want automatic number conversion, so that
-you can do numeric comparisons in your templates without having to
-write a bunch of conversion/exception handling code. Example:
-
- #silent $webInput(['name', 'height:int'])
- $name is $height cm tall.
- #if $height >= 300
- Wow, you're tall!
- #else
- Pshaw, you're short.
- #end if
-
- dic = self.webInput(['name', 'height:int'])
- name = dic[name]
- height = dic[height]
- write("%s is %s cm tall." % (name, height))
- if height > 300:
- write("Wow, you're tall!")
- else:
- write("Pshaw, you're short.")
-
-To convert a value to a number, suffix ":int" or ":float" to the name. The
-method will search first for a "height:int" variable and then for a "height"
-variable. (It will be called "height" in the final dictionary.) If a numeric
-conversion fails, use or raise 'badInt' or 'badFloat'. Missing values work
-the same way as for strings, except the default is 'defaultInt' or
-'defaultFloat' instead of 'default'.
-
-If a name represents an uploaded file, the entire file will be read into
-memory. For more sophisticated file-upload handling, leave that name out of
-the list and do your own handling, or wait for Cheetah.Utils.UploadFileMixin.
-
-This mixin class works only in a subclass that also inherits from
-Webware's Servlet or HTTPServlet. Otherwise you'll get an AttributeError
-on 'self.request'.
-
-EXCEPTIONS: ValueError if 'source' is not one of the stated characters.
-TypeError if a conversion suffix is not ":int" or ":float".
-\end{verbatim}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{More examples}
-\label{webware.examples}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example A -- a standalone servlet}
-%\label{}
-
-% @@MO:
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example B -- a servlet under a site framework}
-%\label{}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsubsection*{Example C -- several servlets with a common template}
-%\label{}
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\subsection{Other Tips}
-\label{webware.otherTips}
-
-If your servlet accesses external files (e.g., via an \code{\#include}
-directive), remember that the current directory is not necessarily directory
-the servlet is in. It's probably some other directory WebKit chose. To find a
-file relative to the servlet's directory, prefix the path with whatever
-\code{self.serverSidePath()} returns (from \code{Servlet.serverSidePath()}.
-
-If you don't understand how \code{\#extends} and \code{\#implements} work, and
-about a template's main method, read the chapter on inheritance (sections
-\ref{inheritanceEtc.extends} and \ref{inheritanceEtc.implements}). This may
-help you avoid buggy servlets.
-
-% Local Variables:
-% TeX-master: "users_guide"
-% End:
-%# vim: sw=4 ts=4 expandtab