mirror of
https://github.com/djohnlewis/stackdump
synced 2025-12-07 00:13:33 +00:00
Initial commit. Still building up the env and some parsing code.
This commit is contained in:
78
python/packages/formencode/htmlrename.py
Normal file
78
python/packages/formencode/htmlrename.py
Normal file
@@ -0,0 +1,78 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user