SVN: r21316 - trunk/quixote/form

Neil Schemenauer <nascheme-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Wed, 09 Apr 2003 15:09:32 -0400
Newsgroups gmane.comp.web.quixote.cvs
Message-ID <[email protected]>
Author: nascheme
Date: 2003-04-09 15:09:30 -0400 (Wed, 09 Apr 2003)
New Revision: 21316

Modified:
   trunk/quixote/form/form.py
Log:
Use TemplateIO rather than _join().  It has some nice optimizations.  Also,
fix an over-quoting bug in _render_error (remove str() call).


Modified: trunk/quixote/form/form.py
==============================================================================
--- trunk/quixote/form/form.py	(original)
+++ trunk/quixote/form/form.py	2003-04-09 15:09:32.000000000 -0400
@@ -8,7 +8,7 @@
 
 from types import StringType
 from quixote import get_session, get_publisher
-from quixote.html import url_quote, htmltag, htmltext, nl2br, htmlescape
+from quixote.html import url_quote, htmltag, htmltext, nl2br, TemplateIO
 from quixote.form.widget import FormValueError, HiddenWidget
 
 
@@ -26,14 +26,6 @@
 </script>
 ''')
 
-def _join (seq):
-    s = ""
-    for item in seq:
-        if item is None:
-            continue
-        s = s + htmlescape(item)
-    return s
-
 class Form:
     """
     A form is the major element of an interactive web page.  A form
@@ -153,40 +145,35 @@
         #
         # Render a form as HTML.
         assert type(action_url) in (StringType, htmltext)
-        parts = [
-            self._render_start(request, action_url,
-                               enctype=self.enctype, method=self.method),
-            self._render_body(request),
-            self._render_finish(request),
-            ]
-
-        return _join(parts)
+        r = TemplateIO(html=1)
+        r += self._render_start(request, action_url,
+                                enctype=self.enctype, method=self.method)
+        r += self._render_body(request)
+        r += self._render_finish(request)
+        return r.getvalue()
 
     def _render_start (self, request, action,
-                      enctype=None, method='post', name=None):
-        parts = [
-            htmltag('form', enctype=enctype, method=method,
-                    action=action, name=name),
-            self._render_hidden_widgets(request),
-            ]
-        return _join(parts)
+                       enctype=None, method='post', name=None):
+        r = TemplateIO(html=1)
+        r += htmltag('form', enctype=enctype, method=method,
+                     action=action, name=name)
+        r += self._render_hidden_widgets(request)
+        return r.getvalue()
 
     def _render_finish (self, request):
-        parts = [
-            htmltext('</form>'),
-            self._render_javascript(request),
-            ]
-        return _join(parts)
+        r = TemplateIO(html=1)
+        r += htmltext('</form>')
+        r += self._render_javascript(request)
+        return r.getvalue()
 
     def _render_sep (self, text, line=1):
-        return (
-            htmltext('<tr><td colspan="3">%s<strong><big>%s</big></strong></td></tr>') %
-            (line and htmltext('<hr>') or '', text))
+        return htmltext('<tr><td colspan="3">%s<strong><big>%s'
+                        '</big></strong></td></tr>') % \
+                                      (line and htmltext('<hr>') or '', text)
 
     def _render_error (self, error):
         if error:
-            return (htmltext('<font color="red">%s</font><br />')
-                    % str(nl2br(error)))
+            return htmltext('<font color="red">%s</font><br />') % nl2br(error)
         else:
             return ''
 
@@ -202,80 +189,69 @@
         title = self.title[widget.name] or ''
         if self.required.get(widget.name):
             title = title + htmltext('&nbsp;*')
-        parts = [
-            htmltext('<tr>'),
-            htmltext('<th colspan="3" align="left">'),
-            title,
-            htmltext('</th>'),
-            htmltext('</tr>'),
-            htmltext('<tr>'),
-            htmltext('<td>&nbsp;&nbsp;</td>'),
-            htmltext('<td>'),
-            widget.render(request),
-            htmltext('</td>'),
-            htmltext('<td>'),
-            self._render_error(self.error.get(widget.name)),
-            self._render_hint(self.hint.get(widget.name)),
-            htmltext('</td>'),
-            htmltext('</tr>'),
-            ]
-        print parts
-        return _join(parts)
+        r = TemplateIO(html=1)
+        r += htmltext('<tr><th colspan="3" align="left">')
+        r += title
+        r += htmltext('</th></tr>'
+                      '<tr><td>&nbsp;&nbsp;</td><td>')
+        r += widget.render(request)
+        r += htmltext('</td><td>')
+        r += self._render_error(self.error.get(widget.name))
+        r += self._render_hint(self.hint.get(widget.name))
+        r += htmltext('</td></tr>')
+        return r.getvalue()
 
     def _render_hidden_widgets (self, request):
-        parts = []
+        r = TemplateIO(html=1)
         for widget in self.widget_order:
             if widget.widget_type == 'hidden':
-                parts += [
-                    widget.render(request),
-                    self._render_error(self.error.get(widget.name)),
-                    ]
-        return _join(parts)
+                r += widget.render(request)
+                r += self._render_error(self.error.get(widget.name))
+        return r.getvalue()
 
     def _render_submit_buttons (self, request, ncols=3):
-        parts = [htmltext('<tr><td colspan="%d">\n') % ncols]
+        r = TemplateIO(html=1)
+        r += htmltext('<tr><td colspan="%d">\n') % ncols
         for button in self.submit_buttons:
-            parts.append(button.render(request))
-        parts.append(htmltext('</td></tr>'))
-        return _join(parts)
+            r += button.render(request)
+        r += htmltext('</td></tr>')
+        return r.getvalue()
 
     def _render_visible_widgets (self, request):
-        parts = []
+        r = TemplateIO(html=1)
         for widget in self.widget_order:
-            parts.append(self._render_widget_row(request, widget))
-        return _join(parts)
+            r += self._render_widget_row(request, widget)
+        return r.getvalue()
 
     def _render_error_notice (self, request):
-        parts = []
         if self.error:
-            parts += [
-                htmltext('<tr><td colspan="3">'),
-                htmltext('<font color="red"><strong>Warning:</strong></font> '),
-                htmltext('there were errors processing your form.  See below for details.'),
-                htmltext('</td></tr>'),
-                ]
-        return _join(parts)
+            r = htmltext('<tr><td colspan="3">'
+                         '<font color="red"><strong>Warning:</strong></font> '
+                         'there were errors processing your form.  '
+                         'See below for details.'
+                         '</td></tr>')
+        else:
+            r = ''
+        return r
 
     def _render_required_notice (self, request):
-        parts = []
         if filter(None, self.required.values()):
-            parts += [
-                htmltext('<tr><td colspan="3">'),
-                htmltext('<b>*</b> = <em>required field</em>'),
-                htmltext('</td></tr>'),
-                ]
-        return _join(parts)
+            r = htmltext('<tr><td colspan="3">'
+                         '<b>*</b> = <em>required field</em>'
+                         '</td></tr>')
+        else:
+            r = ''
+        return r
 
     def _render_body (self, request):
-        parts = [
-            htmltext('<table>'),
-            self._render_error_notice(request),
-            self._render_required_notice(request),
-            self._render_visible_widgets(request),
-            self._render_submit_buttons(request),
-            htmltext('</table>'),
-            ]
-        return _join(parts)
+        r = TemplateIO(html=1)
+        r += htmltext('<table>')
+        r += self._render_error_notice(request)
+        r += self._render_required_notice(request)
+        r += self._render_visible_widgets(request)
+        r += self._render_submit_buttons(request)
+        r += htmltext('</table>')
+        return r.getvalue()
 
     def _render_javascript (self, request):
         """Render javacript code for the form, if any.