annotate roundup/template_parser.py @ 937:fb8a8eb55aac

cleanup: moved templatebuilder into templates.builder
author Richard Jones <richard@users.sourceforge.net>
date Fri, 16 Aug 2002 04:25:03 +0000
parents fdcf16b444a9
children 540fc5fb20d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 import htmllib, formatter
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 class Require:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 ''' Encapsulates a parsed <require attributes>...[<else>...]</require>
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 '''
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 def __init__(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 self.attributes = attributes
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 self.current = self.ok = []
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 self.fail = []
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 def __len__(self):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 return len(self.current)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 def __getitem__(self, n):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 return self.current[n]
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 def __setitem__(self, n, data):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 self.current[n] = data
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 def append(self, data):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 self.current.append(data)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 def elseMode(self):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 self.current = self.fail
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
20 def __repr__(self):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
21 return '<Require %r ok:%r fail:%r>'%(self.attributes, self.ok,
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
22 self.fail)
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 class Display:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 ''' Encapsulates a parsed <display attributes>
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 '''
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 def __init__(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 self.attributes = attributes
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
29 def __repr__(self):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
30 return '<Display %r>'%self.attributes
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 class Property:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 ''' Encapsulates a parsed <property attributes>
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 '''
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 def __init__(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 self.attributes = attributes
934
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 932
diff changeset
37 self.current = self.ok = []
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
38 def __len__(self):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
39 return len(self.current)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
40 def __getitem__(self, n):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
41 return self.current[n]
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
42 def __setitem__(self, n, data):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
43 self.current[n] = data
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
44 def append(self, data):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
45 self.current.append(data)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
46 def __repr__(self):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
47 return '<Property %r %r>'%(self.attributes, self.structure)
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
49 class RoundupTemplate(htmllib.HTMLParser):
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 ''' Parse Roundup's HTML template structure into a list of components:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 'string': this is just plain data to be displayed
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 Display : instances indicate that display functions are to be called
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 Require : if/else style check using the conditions in the attributes,
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 displaying the "ok" list of components or "fail" list
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 '''
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 def __init__(self):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 htmllib.HTMLParser.__init__(self, formatter.NullFormatter())
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 self.current = self.structure = []
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 self.stack = []
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 def handle_data(self, data):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 self.append_data(data)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 def append_data(self, data):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 if self.current and isinstance(self.current[-1], type('')):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 self.current[-1] = self.current[-1] + data
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 else:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 self.current.append(data)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 def unknown_starttag(self, tag, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 s = ''
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 s = s + '<%s' % tag
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 for name, value in attributes:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 s = s + ' %s="%s"' % (name, value)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 s = s + '>'
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 self.append_data(s)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 def handle_starttag(self, tag, method, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 if tag in ('require', 'else', 'display', 'property'):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 method(attributes)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 else:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 self.unknown_starttag(tag, attributes)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 def unknown_endtag(self, tag):
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
87 if tag in ('require','property'):
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 self.current = self.stack.pop()
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 else:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 self.append_data('</%s>'%tag)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 def handle_endtag(self, tag, method):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 self.unknown_endtag(tag)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 def close(self):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 htmllib.HTMLParser.close(self)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 def do_display(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 self.current.append(Display(attributes))
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 def do_property(self, attributes):
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
102 p = Property(attributes)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
103 self.current.append(p)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
104 self.stack.append(self.current)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
105 self.current = p
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 def do_require(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 r = Require(attributes)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 self.current.append(r)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self.stack.append(self.current)
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 self.current = r
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 def do_else(self, attributes):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 self.current.elseMode()
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
116 def __repr__(self):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
117 return '<RoundupTemplate %r>'%self.structure
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
118
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 def display(structure, indent=''):
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 ''' Pretty-print the parsed structure for debugging
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 '''
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
122 l = []
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 for entry in structure:
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 if isinstance(entry, type('')):
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
125 l.append("%s%s"%(indent, entry))
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 elif isinstance(entry, Require):
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
127 l.append('%sTEST: %r\n'%(indent, entry.attributes))
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
128 l.append('%sOK...'%indent)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
129 l.append(display(entry.ok, indent+' '))
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 if entry.fail:
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
131 l.append('%sFAIL...'%indent)
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
132 l.append(display(entry.fail, indent+' '))
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 elif isinstance(entry, Display):
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
134 l.append('%sDISPLAY: %r'%(indent, entry.attributes))
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
135 elif isinstance(entry, Property):
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
136 l.append('%sPROPERTY: %r'%(indent, entry.attributes))
934
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 932
diff changeset
137 l.append(display(entry.ok, indent+' '))
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
138 return ''.join(l)
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 if __name__ == '__main__':
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 import sys
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
142 parser = RoundupTemplate()
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 parser.feed(open(sys.argv[1], 'r').read())
932
a43fa69c1b70 fixes to the new template parser
Richard Jones <richard@users.sourceforge.net>
parents: 931
diff changeset
144 print display(parser.structure)
931
3dba266f94d8 this oughta be better
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145

Roundup Issue Tracker: http://roundup-tracker.org/