mirror of
https://github.com/djohnlewis/stackdump
synced 2025-01-22 22:51:36 +00:00
79 lines
2.1 KiB
Python
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
|