1
0
mirror of https://github.com/djohnlewis/stackdump synced 2025-01-22 22:51:36 +00:00
stackdump/python/packages/formencode/htmlrename.py

79 lines
2.1 KiB
Python

"""
Module to rename form fields
"""
from formencode.rewritingparser import RewritingParser
__all__ = ['rename', 'add_prefix']
def rename(form, rename_func):
"""
Rename all the form fields in the form (a string), using rename_func
rename_func will be called with one argument, the name of the
field, and should return a new name.
"""
p = RenamingParser(rename_func)
p.feed(form)
p.close()
return p.text()
def add_prefix(form, prefix, dotted=False):
"""
Add the given prefix to all the fields in the form.
If dotted is true, then add a dot between prefix and the previous
name. Empty fields will use the prefix as the name (with no dot).
"""
def rename_func(field_name):
if dotted:
if field_name:
return prefix + '.' + field_name
else:
return prefix
else:
return prefix + field_name
return rename(form, rename_func)
class RenamingParser(RewritingParser):
def __init__(self, rename_func):
RewritingParser.__init__(self)
self.rename_func = rename_func
def close(self):
self.handle_misc(None)
RewritingParser.close(self)
self._text = self._get_text()
def text(self):
try:
return self._text
except AttributeError:
raise Exception(
"You must .close() a parser instance before getting "
"the text from it")
def handle_starttag(self, tag, attrs, startend=False):
self.write_pos()
if tag in ('input', 'textarea', 'select'):
self.handle_field(tag, attrs, startend)
else:
return
def handle_startendtag(self, tag, attrs):
return self.handle_starttag(tag, attrs, True)
def handle_field(self, tag, attrs, startend):
name = self.get_attr(attrs, 'name', '')
new_name = self.rename_func(name)
if name is None:
self.del_attr(attrs, 'name')
else:
self.set_attr(attrs, 'name', new_name)
self.write_tag(tag, attrs)
self.skip_next = True