formencode.htmlrename
Covered: 55 lines
Missed: 8 lines
Skipped 14 lines
Percent: 87 %
 1
"""
 2
Module to rename form fields
 3
"""
 5
import HTMLParser
 6
from formencode.rewritingparser import RewritingParser
 8
__all__ = ['rename', 'add_prefix']
10
def rename(form, rename_func):
11
    """
12
    Rename all the form fields in the form (a string), using rename_func
14
    rename_func will be called with one argument, the name of the
15
    field, and should return a new name.
16
    """
17
    p = RenamingParser(rename_func)
18
    p.feed(form)
19
    p.close()
20
    return p.text()
22
def add_prefix(form, prefix, dotted=False):
23
    """
24
    Add the given prefix to all the fields in the form.
26
    If dotted is true, then add a dot between prefix and the previous
27
    name.  Empty fields will use the prefix as the name (with no dot).
28
    """
29
    def rename_func(field_name):
30
        if dotted:
31
            if field_name:
32
                return prefix + '.' + field_name
33
            else:
34
                return prefix
35
        else:
36
            return prefix + field_name
37
    return rename(form, rename_func)
39
class RenamingParser(RewritingParser):
41
    def __init__(self, rename_func):
42
        RewritingParser.__init__(self)
43
        self.rename_func = rename_func
45
    def close(self):
46
        self.handle_misc(None)
47
        RewritingParser.close(self)
48
        self._text = self._get_text()
50
    def text(self):
51
        try:
52
            return self._text
53
        except AttributeError:
54
            raise Exception(
55
                "You must .close() a parser instance before getting "
56
                "the text from it")
58
    def handle_starttag(self, tag, attrs, startend=False):
59
        self.write_pos()
60
        if tag in ('input', 'textarea', 'select'):
61
            self.handle_field(tag, attrs, startend)
62
        else:
63
            return
65
    def handle_startendtag(self, tag, attrs):
66
        return self.handle_starttag(tag, attrs, True)
68
    def handle_field(self, tag, attrs, startend):
69
        name = self.get_attr(attrs, 'name', '')
70
        new_name = self.rename_func(name)
71
        if name is None:
72
            self.del_attr(attrs, 'name')
73
        else:
74
            self.set_attr(attrs, 'name', new_name)
75
        self.write_tag(tag, attrs)
76
        self.skip_next = True