-
Notifications
You must be signed in to change notification settings - Fork 73
Expand file tree
/
Copy pathformencode.htmlgen.html
More file actions
215 lines (214 loc) · 20.2 KB
/
formencode.htmlgen.html
File metadata and controls
215 lines (214 loc) · 20.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<html>
<head>
<title>formencode.htmlgen</title>
</head>
<body>
formencode.htmlgen
<style>
.coverage pre {float: left; margin: 0px 1em; border: none;
padding: 0px; }
.num pre { margin: 0px }
.nocov, .nocov pre {background-color: #faa}
.cov, .cov pre {background-color: #cfc}
div.coverage div { clear: both; height: 1.1em}
</style>
<div class="stats">
Covered: 136 lines<br/>
Missed: 21 lines<br/>
Skipped 33 lines<br/>
Percent: 86 %<br/>
</div>
<div class="coverage">
<div class="cov"><span class="num"><pre> 1</pre></span><pre>"""</pre></div>
<div class="cov"><span class="num"><pre> 2</pre></span><pre>Kind of like htmlgen, only much simpler. The only important symbol</pre></div>
<div class="cov"><span class="num"><pre> 3</pre></span><pre>that is exported is ``html``.</pre></div>
<div class="skip"><span class="num"><pre> 4</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 5</pre></span><pre>This builds ElementTree nodes, but with some extra useful methods.</pre></div>
<div class="cov"><span class="num"><pre> 6</pre></span><pre>(Open issue: should it use ``ElementTree`` more, and the raw</pre></div>
<div class="cov"><span class="num"><pre> 7</pre></span><pre>``Element`` stuff less?)</pre></div>
<div class="skip"><span class="num"><pre> 8</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 9</pre></span><pre>You create tags with attribute access. I.e., the ``A`` anchor tag is</pre></div>
<div class="cov"><span class="num"><pre> 10</pre></span><pre>``html.a``. The attributes of the HTML tag are done with keyword</pre></div>
<div class="cov"><span class="num"><pre> 11</pre></span><pre>arguments. The contents of the tag are the non-keyword arguments</pre></div>
<div class="cov"><span class="num"><pre> 12</pre></span><pre>(concatenated). You can also use the special ``c`` keyword, passing a</pre></div>
<div class="cov"><span class="num"><pre> 13</pre></span><pre>list, tuple, or single tag, and it will make up the contents (this is</pre></div>
<div class="cov"><span class="num"><pre> 14</pre></span><pre>useful because keywords have to come after all non-keyword arguments,</pre></div>
<div class="cov"><span class="num"><pre> 15</pre></span><pre>which is non-intuitive). Or you can chain them, adding the keywords</pre></div>
<div class="cov"><span class="num"><pre> 16</pre></span><pre>with one call, then the body with a second call, like::</pre></div>
<div class="skip"><span class="num"><pre> 17</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 18</pre></span><pre> >>> print html.a(href='http://yahoo.com')('<Yahoo>')</pre></div>
<div class="cov"><span class="num"><pre> 19</pre></span><pre> <a href=\"http://yahoo.com\">&lt;Yahoo&gt;</a></pre></div>
<div class="skip"><span class="num"><pre> 20</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 21</pre></span><pre>Note that strings will be quoted; only tags given explicitly will</pre></div>
<div class="cov"><span class="num"><pre> 22</pre></span><pre>remain unquoted.</pre></div>
<div class="skip"><span class="num"><pre> 23</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 24</pre></span><pre>If the value of an attribute is None, then no attribute</pre></div>
<div class="cov"><span class="num"><pre> 25</pre></span><pre>will be inserted. So::</pre></div>
<div class="skip"><span class="num"><pre> 26</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 27</pre></span><pre> >>> print html.a(href='http://www.yahoo.com', name=None,</pre></div>
<div class="cov"><span class="num"><pre> 28</pre></span><pre> ... c='Click Here')</pre></div>
<div class="cov"><span class="num"><pre> 29</pre></span><pre> <a href=\"http://www.yahoo.com\">Click Here</a></pre></div>
<div class="skip"><span class="num"><pre> 30</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 31</pre></span><pre>If the value is None, then the empty string is used. Otherwise str()</pre></div>
<div class="cov"><span class="num"><pre> 32</pre></span><pre>is called on the value.</pre></div>
<div class="skip"><span class="num"><pre> 33</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 34</pre></span><pre>``html`` can also be called, and it will produce a special list from</pre></div>
<div class="cov"><span class="num"><pre> 35</pre></span><pre>its arguments, which adds a ``__str__`` method that does ``html.str``</pre></div>
<div class="cov"><span class="num"><pre> 36</pre></span><pre>(which handles quoting, flattening these lists recursively, and using</pre></div>
<div class="cov"><span class="num"><pre> 37</pre></span><pre>'' for ``None``).</pre></div>
<div class="skip"><span class="num"><pre> 38</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 39</pre></span><pre>``html.comment`` will generate an HTML comment, like</pre></div>
<div class="cov"><span class="num"><pre> 40</pre></span><pre>``html.comment('comment text')`` -- note that it cannot take keyword</pre></div>
<div class="cov"><span class="num"><pre> 41</pre></span><pre>arguments (because they wouldn't mean anything).</pre></div>
<div class="skip"><span class="num"><pre> 42</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 43</pre></span><pre>Examples::</pre></div>
<div class="skip"><span class="num"><pre> 44</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 45</pre></span><pre> >>> print html.html(</pre></div>
<div class="cov"><span class="num"><pre> 46</pre></span><pre> ... html.head(html.title(\"Page Title\")),</pre></div>
<div class="cov"><span class="num"><pre> 47</pre></span><pre> ... html.body(</pre></div>
<div class="cov"><span class="num"><pre> 48</pre></span><pre> ... bgcolor='#000066',</pre></div>
<div class="cov"><span class="num"><pre> 49</pre></span><pre> ... text='#ffffff',</pre></div>
<div class="cov"><span class="num"><pre> 50</pre></span><pre> ... c=[html.h1('Page Title'),</pre></div>
<div class="cov"><span class="num"><pre> 51</pre></span><pre> ... html.p('Hello world!')],</pre></div>
<div class="cov"><span class="num"><pre> 52</pre></span><pre> ... ))</pre></div>
<div class="cov"><span class="num"><pre> 53</pre></span><pre> <html><head><title>Page Title</title></head><body bgcolor=\"#000066\" text=\"#ffffff\"><h1>Page Title</h1><p>Hello world!</p></body></html></pre></div>
<div class="cov"><span class="num"><pre> 54</pre></span><pre> >>> print html.a(href='#top')('return to top')</pre></div>
<div class="cov"><span class="num"><pre> 55</pre></span><pre> <a href=\"#top\">return to top</a></pre></div>
<div class="skip"><span class="num"><pre> 56</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 57</pre></span><pre>"""</pre></div>
<div class="skip"><span class="num"><pre> 58</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 59</pre></span><pre>from __future__ import generators</pre></div>
<div class="skip"><span class="num"><pre> 60</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 61</pre></span><pre>from cgi import escape</pre></div>
<div class="cov"><span class="num"><pre> 62</pre></span><pre>try:</pre></div>
<div class="cov"><span class="num"><pre> 63</pre></span><pre> import xml.etree.ElementTree as ET</pre></div>
<div class="nocov"><span class="num"><pre> 64</pre></span><pre>except ImportError:</pre></div>
<div class="nocov"><span class="num"><pre> 65</pre></span><pre> import elementtree.ElementTree as ET</pre></div>
<div class="skip"><span class="num"><pre> 66</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 67</pre></span><pre>default_encoding = 'utf-8'</pre></div>
<div class="skip"><span class="num"><pre> 68</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 69</pre></span><pre>class _HTML:</pre></div>
<div class="skip"><span class="num"><pre> 70</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 71</pre></span><pre> def __getattr__(self, attr):</pre></div>
<div class="cov"><span class="num"><pre> 72</pre></span><pre> if attr.startswith('_'):</pre></div>
<div class="nocov"><span class="num"><pre> 73</pre></span><pre> raise AttributeError</pre></div>
<div class="cov"><span class="num"><pre> 74</pre></span><pre> attr = attr.lower()</pre></div>
<div class="cov"><span class="num"><pre> 75</pre></span><pre> if attr.endswith('_'):</pre></div>
<div class="nocov"><span class="num"><pre> 76</pre></span><pre> attr = attr[:-1]</pre></div>
<div class="cov"><span class="num"><pre> 77</pre></span><pre> if attr.find('__') != -1:</pre></div>
<div class="nocov"><span class="num"><pre> 78</pre></span><pre> attr = attr.replace('__', ':')</pre></div>
<div class="cov"><span class="num"><pre> 79</pre></span><pre> if attr == 'comment':</pre></div>
<div class="cov"><span class="num"><pre> 80</pre></span><pre> return Element(ET.Comment, {})</pre></div>
<div class="cov"><span class="num"><pre> 81</pre></span><pre> else:</pre></div>
<div class="cov"><span class="num"><pre> 82</pre></span><pre> return Element(attr, {})</pre></div>
<div class="skip"><span class="num"><pre> 83</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre> 84</pre></span><pre> def __call__(self, *args):</pre></div>
<div class="cov"><span class="num"><pre> 85</pre></span><pre> return ElementList(args)</pre></div>
<div class="skip"><span class="num"><pre> 86</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 87</pre></span><pre> def quote(self, arg):</pre></div>
<div class="cov"><span class="num"><pre> 88</pre></span><pre> if arg is None:</pre></div>
<div class="cov"><span class="num"><pre> 89</pre></span><pre> return ''</pre></div>
<div class="cov"><span class="num"><pre> 90</pre></span><pre> return escape(unicode(arg).encode(default_encoding), 1)</pre></div>
<div class="skip"><span class="num"><pre> 91</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 92</pre></span><pre> def str(self, arg, encoding=None):</pre></div>
<div class="cov"><span class="num"><pre> 93</pre></span><pre> if isinstance(arg, str):</pre></div>
<div class="cov"><span class="num"><pre> 94</pre></span><pre> return arg</pre></div>
<div class="cov"><span class="num"><pre> 95</pre></span><pre> elif arg is None:</pre></div>
<div class="cov"><span class="num"><pre> 96</pre></span><pre> return ''</pre></div>
<div class="cov"><span class="num"><pre> 97</pre></span><pre> elif isinstance(arg, unicode):</pre></div>
<div class="nocov"><span class="num"><pre> 98</pre></span><pre> return arg.encode(default_encoding)</pre></div>
<div class="cov"><span class="num"><pre> 99</pre></span><pre> elif isinstance(arg, (list, tuple)):</pre></div>
<div class="cov"><span class="num"><pre>100</pre></span><pre> return ''.join(map(self.str, arg))</pre></div>
<div class="cov"><span class="num"><pre>101</pre></span><pre> elif isinstance(arg, Element):</pre></div>
<div class="cov"><span class="num"><pre>102</pre></span><pre> return str(arg)</pre></div>
<div class="nocov"><span class="num"><pre>103</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>104</pre></span><pre> return unicode(arg).encode(default_encoding)</pre></div>
<div class="skip"><span class="num"><pre>105</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>106</pre></span><pre>html = _HTML()</pre></div>
<div class="skip"><span class="num"><pre>107</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>108</pre></span><pre>class Element(ET._ElementInterface):</pre></div>
<div class="skip"><span class="num"><pre>109</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>110</pre></span><pre> def __call__(self, *args, **kw):</pre></div>
<div class="cov"><span class="num"><pre>111</pre></span><pre> el = self.__class__(self.tag, self.attrib)</pre></div>
<div class="cov"><span class="num"><pre>112</pre></span><pre> if kw.has_key('c'):</pre></div>
<div class="cov"><span class="num"><pre>113</pre></span><pre> if args:</pre></div>
<div class="nocov"><span class="num"><pre>114</pre></span><pre> raise ValueError(</pre></div>
<div class="nocov"><span class="num"><pre>115</pre></span><pre> "You may either provide positional arguments or a "</pre></div>
<div class="nocov"><span class="num"><pre>116</pre></span><pre> "'c' keyword argument, but not both")</pre></div>
<div class="cov"><span class="num"><pre>117</pre></span><pre> args = kw['c']</pre></div>
<div class="cov"><span class="num"><pre>118</pre></span><pre> del kw['c']</pre></div>
<div class="cov"><span class="num"><pre>119</pre></span><pre> if not isinstance(args, (list, tuple)):</pre></div>
<div class="cov"><span class="num"><pre>120</pre></span><pre> args = (args,)</pre></div>
<div class="cov"><span class="num"><pre>121</pre></span><pre> for name, value in kw.items():</pre></div>
<div class="cov"><span class="num"><pre>122</pre></span><pre> if value is None:</pre></div>
<div class="cov"><span class="num"><pre>123</pre></span><pre> del kw[name]</pre></div>
<div class="cov"><span class="num"><pre>124</pre></span><pre> continue</pre></div>
<div class="cov"><span class="num"><pre>125</pre></span><pre> kw[name] = unicode(value)</pre></div>
<div class="cov"><span class="num"><pre>126</pre></span><pre> if name.endswith('_'):</pre></div>
<div class="cov"><span class="num"><pre>127</pre></span><pre> kw[name[:-1]] = value</pre></div>
<div class="cov"><span class="num"><pre>128</pre></span><pre> del kw[name]</pre></div>
<div class="cov"><span class="num"><pre>129</pre></span><pre> if name.find('__') != -1:</pre></div>
<div class="cov"><span class="num"><pre>130</pre></span><pre> new_name = name.replace('__', ':')</pre></div>
<div class="cov"><span class="num"><pre>131</pre></span><pre> kw[new_name] = value</pre></div>
<div class="cov"><span class="num"><pre>132</pre></span><pre> del kw[name]</pre></div>
<div class="cov"><span class="num"><pre>133</pre></span><pre> el.attrib.update(kw)</pre></div>
<div class="cov"><span class="num"><pre>134</pre></span><pre> el.text = self.text</pre></div>
<div class="cov"><span class="num"><pre>135</pre></span><pre> last = None</pre></div>
<div class="cov"><span class="num"><pre>136</pre></span><pre> for item in self.getchildren():</pre></div>
<div class="cov"><span class="num"><pre>137</pre></span><pre> last = item</pre></div>
<div class="cov"><span class="num"><pre>138</pre></span><pre> el.append(item)</pre></div>
<div class="cov"><span class="num"><pre>139</pre></span><pre> for arg in flatten(args):</pre></div>
<div class="cov"><span class="num"><pre>140</pre></span><pre> if arg is None:</pre></div>
<div class="cov"><span class="num"><pre>141</pre></span><pre> continue</pre></div>
<div class="cov"><span class="num"><pre>142</pre></span><pre> if not ET.iselement(arg):</pre></div>
<div class="cov"><span class="num"><pre>143</pre></span><pre> if last is None:</pre></div>
<div class="cov"><span class="num"><pre>144</pre></span><pre> if el.text is None:</pre></div>
<div class="cov"><span class="num"><pre>145</pre></span><pre> el.text = unicode(arg)</pre></div>
<div class="cov"><span class="num"><pre>146</pre></span><pre> else:</pre></div>
<div class="cov"><span class="num"><pre>147</pre></span><pre> el.text += unicode(arg)</pre></div>
<div class="cov"><span class="num"><pre>148</pre></span><pre> else:</pre></div>
<div class="cov"><span class="num"><pre>149</pre></span><pre> if last.tail is None:</pre></div>
<div class="cov"><span class="num"><pre>150</pre></span><pre> last.tail = unicode(arg)</pre></div>
<div class="nocov"><span class="num"><pre>151</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>152</pre></span><pre> last.tail += unicode(arg)</pre></div>
<div class="cov"><span class="num"><pre>153</pre></span><pre> else:</pre></div>
<div class="cov"><span class="num"><pre>154</pre></span><pre> last = arg</pre></div>
<div class="cov"><span class="num"><pre>155</pre></span><pre> el.append(last)</pre></div>
<div class="cov"><span class="num"><pre>156</pre></span><pre> return el</pre></div>
<div class="skip"><span class="num"><pre>157</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>158</pre></span><pre> def __str__(self):</pre></div>
<div class="cov"><span class="num"><pre>159</pre></span><pre> return ET.tostring(self, default_encoding)</pre></div>
<div class="skip"><span class="num"><pre>160</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>161</pre></span><pre> def __unicode__(self):</pre></div>
<div class="skip"><span class="num"><pre>162</pre></span><pre> # This is lame!</pre></div>
<div class="nocov"><span class="num"><pre>163</pre></span><pre> return str(self).decode(default_encoding)</pre></div>
<div class="skip"><span class="num"><pre>164</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>165</pre></span><pre> def __repr__(self):</pre></div>
<div class="nocov"><span class="num"><pre>166</pre></span><pre> content = str(self)</pre></div>
<div class="nocov"><span class="num"><pre>167</pre></span><pre> if len(content) > 25:</pre></div>
<div class="nocov"><span class="num"><pre>168</pre></span><pre> content = repr(content[:25]) + '...'</pre></div>
<div class="nocov"><span class="num"><pre>169</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>170</pre></span><pre> content = repr(content)</pre></div>
<div class="nocov"><span class="num"><pre>171</pre></span><pre> return '<Element %r>' % content</pre></div>
<div class="skip"><span class="num"><pre>172</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>173</pre></span><pre>class ElementList(list):</pre></div>
<div class="skip"><span class="num"><pre>174</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>175</pre></span><pre> def __str__(self):</pre></div>
<div class="cov"><span class="num"><pre>176</pre></span><pre> return html.str(self)</pre></div>
<div class="skip"><span class="num"><pre>177</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>178</pre></span><pre> def __repr__(self):</pre></div>
<div class="nocov"><span class="num"><pre>179</pre></span><pre> return 'ElementList(%s)' % list.__repr__(self)</pre></div>
<div class="skip"><span class="num"><pre>180</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>181</pre></span><pre>def flatten(items):</pre></div>
<div class="cov"><span class="num"><pre>182</pre></span><pre> for item in items:</pre></div>
<div class="cov"><span class="num"><pre>183</pre></span><pre> if isinstance(item, (list, tuple)):</pre></div>
<div class="cov"><span class="num"><pre>184</pre></span><pre> for sub in flatten(item):</pre></div>
<div class="cov"><span class="num"><pre>185</pre></span><pre> yield sub</pre></div>
<div class="cov"><span class="num"><pre>186</pre></span><pre> else:</pre></div>
<div class="cov"><span class="num"><pre>187</pre></span><pre> yield item</pre></div>
<div class="skip"><span class="num"><pre>188</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>189</pre></span><pre>__all__ = ['html']</pre></div>
<div class="skip"><span class="num"><pre>190</pre></span><pre></pre></div>
</div>
</body>
</html>