Author: ianb
Date: 2008-04-18 10:55:37 -0600 (Fri, 18 Apr 2008)
New Revision: 3386

Modified:
   FormEncode/trunk/formencode/htmlfill.py
   FormEncode/trunk/tests/test_htmlfill.py
Log:
Fixed prefix_error to work with select and textarea (only worked with input 
before)

Modified: FormEncode/trunk/formencode/htmlfill.py
===================================================================
--- FormEncode/trunk/formencode/htmlfill.py     2008-04-16 18:27:58 UTC (rev 
3385)
+++ FormEncode/trunk/formencode/htmlfill.py     2008-04-18 16:55:37 UTC (rev 
3386)
@@ -184,6 +184,7 @@
         self.source_pos = None
         self.defaults = defaults
         self.in_textarea = None
+        self.last_textarea_name = None
         self.in_select = None
         self.skip_next = False        
         self.errors = errors or {}
@@ -204,10 +205,7 @@
         self.auto_error_formatter = auto_error_formatter
         self.text_as_default = text_as_default
         self.encoding = encoding
-        if prefix_error:
-            self._marker_offset = 0
-        else:
-            self._marker_offset = 2
+        self.prefix_error = prefix_error
 
     def feed(self, data):
         self.data_is_str = isinstance(data, str)
@@ -380,7 +378,8 @@
     def handle_input(self, attrs, startend):
         t = (self.get_attr(attrs, 'type') or 'text').lower()
         name = self.get_attr(attrs, 'name')
-        self.write_marker(name)
+        if self.prefix_error:
+            self.write_marker(name)
         value = self.defaults.get(name)
         if self.add_attributes.has_key(name):
             for attr_name, attr_value in self.add_attributes[name].items():
@@ -452,10 +451,13 @@
         else:
             assert 0, "I don't know about this kind of <input>: %s (pos: %s)" \
                    % (t, self.getpos())
+        if not self.prefix_error:
+            self.write_marker(name)
 
     def handle_textarea(self, attrs):
         name = self.get_attr(attrs, 'name')
-        self.write_marker(name)
+        if self.prefix_error:
+            self.write_marker(name)
         if (self.error_class
             and self.errors.get(name)):
             self.add_class(attrs, self.error_class)
@@ -464,15 +466,19 @@
         self.write_text(html_quote(value))
         self.write_text('</textarea>')
         self.in_textarea = True
+        self.last_textarea_name = name
         self.add_key(name)
 
     def handle_end_textarea(self):
         self.in_textarea = False
         self.skip_next = True
+        if not self.prefix_error:
+            self.write_marker(self.last_textarea_name)
+        self.last_textarea_name = None
 
     def handle_select(self, attrs):
         name = self.get_attr(attrs, 'name', False)
-        if name:
+        if name and self.prefix_error:
             self.write_marker(name)
         if (self.error_class
             and self.errors.get(name)):
@@ -483,6 +489,8 @@
         self.add_key(self.in_select)
 
     def handle_end_select(self):
+        if not self.prefix_error and self.in_select:
+            self.write_marker(name)
         self.in_select = None
 
     def handle_option(self, attrs):
@@ -527,10 +535,9 @@
         self._content.append((marker,))
 
     def insert_at_marker(self, marker, text):
-         
         for i, item in enumerate(self._content):
             if item == (marker,):
-                self._content.insert(i  + self._marker_offset, text)
+                self._content.insert(i, text)
                 break
         else:
             self._content.insert(0, text)

Modified: FormEncode/trunk/tests/test_htmlfill.py
===================================================================
--- FormEncode/trunk/tests/test_htmlfill.py     2008-04-16 18:27:58 UTC (rev 
3385)
+++ FormEncode/trunk/tests/test_htmlfill.py     2008-04-18 16:55:37 UTC (rev 
3386)
@@ -91,5 +91,12 @@
     
 def test_xhtml():
     result = htmlfill.render('<form:error name="code"/>', errors={'code': 'an 
error'})
-    print result
     
+def test_trailing_error():
+    assert (htmlfill.render('<input type="text" name="email">', 
errors={'email': 'error'},
+                            prefix_error=False)
+            == '<input type="text" name="email" class="error" value=""><!-- 
for: email -->\n<span class="error-message">error</span><br />\n')
+    assert (htmlfill.render('<textarea name="content"></textarea>', 
errors={'content': 'error'},
+                            prefix_error=False)
+            == '<textarea name="content" class="error"></textarea><!-- for: 
content -->\n<span class="error-message">error</span><br />\n')
+    


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
FormEncode-CVS mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/formencode-cvs

Reply via email to