Copied remotely
[mono.git] / mcs / class / System.Web / System.Web.UI / HtmlTextWriter.cs
1
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 // 
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 // 
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 /*      System.Web.UI\r
23 *       Authors\r
24 *               Leen Toelen (toelen@hotmail.com)\r
25 */\r
26 \r
27 using System;\r
28 using System.IO;\r
29 using System.Collections;\r
30 using System.Web;\r
31 using System.Web.UI;\r
32 \r
33 namespace System.Web.UI{\r
34 \r
35 public class HtmlTextWriter : System.IO.TextWriter {\r
36 \r
37 static HtmlTextWriter(){\r
38         HtmlTextWriter._tagKeyLookupTable = new Hashtable(97,CaseInsensitiveHashCodeProvider.Default,\r
39                                                           CaseInsensitiveComparer.Default);\r
40         HtmlTextWriter._tagNameLookupArray = new TagInformation[97];\r
41         HtmlTextWriter.RegisterTag("", HtmlTextWriterTag.Unknown, TagType.Other);\r
42         HtmlTextWriter.RegisterTag("a", HtmlTextWriterTag.A, TagType.Inline);\r
43         HtmlTextWriter.RegisterTag("acronym", HtmlTextWriterTag.Acronym, TagType.Inline);\r
44         HtmlTextWriter.RegisterTag("address", HtmlTextWriterTag.Address, TagType.Other);\r
45         HtmlTextWriter.RegisterTag("area", HtmlTextWriterTag.Area, TagType.Other);\r
46         HtmlTextWriter.RegisterTag("b", HtmlTextWriterTag.B, TagType.Inline);\r
47         HtmlTextWriter.RegisterTag("base", HtmlTextWriterTag.Base, TagType.NonClosing);\r
48         HtmlTextWriter.RegisterTag("basefont", HtmlTextWriterTag.Basefont, TagType.NonClosing);\r
49         HtmlTextWriter.RegisterTag("bdo", HtmlTextWriterTag.Bdo, TagType.Inline);\r
50         HtmlTextWriter.RegisterTag("bgsound", HtmlTextWriterTag.Bgsound, TagType.NonClosing);\r
51         HtmlTextWriter.RegisterTag("big", HtmlTextWriterTag.Big, TagType.Inline);\r
52         HtmlTextWriter.RegisterTag("blockquote", HtmlTextWriterTag.Blockquote, TagType.Other);\r
53         HtmlTextWriter.RegisterTag("body", HtmlTextWriterTag.Body, TagType.Other);\r
54         HtmlTextWriter.RegisterTag("br", HtmlTextWriterTag.Br, TagType.Other);\r
55         HtmlTextWriter.RegisterTag("button", HtmlTextWriterTag.Button, TagType.Inline);\r
56         HtmlTextWriter.RegisterTag("caption", HtmlTextWriterTag.Caption, TagType.Other);\r
57         HtmlTextWriter.RegisterTag("center", HtmlTextWriterTag.Center, TagType.Other);\r
58         HtmlTextWriter.RegisterTag("cite", HtmlTextWriterTag.Cite, TagType.Inline);\r
59         HtmlTextWriter.RegisterTag("code", HtmlTextWriterTag.Code, TagType.Inline);\r
60         HtmlTextWriter.RegisterTag("col", HtmlTextWriterTag.Col, TagType.NonClosing);\r
61         HtmlTextWriter.RegisterTag("colgroup", HtmlTextWriterTag.Colgroup, TagType.Other);\r
62         HtmlTextWriter.RegisterTag("del", HtmlTextWriterTag.Del, TagType.Inline);\r
63         HtmlTextWriter.RegisterTag("dd", HtmlTextWriterTag.Dd, TagType.Inline);\r
64         HtmlTextWriter.RegisterTag("dfn", HtmlTextWriterTag.Dfn, TagType.Inline);\r
65         HtmlTextWriter.RegisterTag("dir", HtmlTextWriterTag.Dir, TagType.Other);\r
66         HtmlTextWriter.RegisterTag("div", HtmlTextWriterTag.Div, TagType.Other);\r
67         HtmlTextWriter.RegisterTag("dl", HtmlTextWriterTag.Dl, TagType.Other);\r
68         HtmlTextWriter.RegisterTag("dt", HtmlTextWriterTag.Dt, TagType.Inline);\r
69         HtmlTextWriter.RegisterTag("em", HtmlTextWriterTag.Em, TagType.Inline);\r
70         HtmlTextWriter.RegisterTag("embed", HtmlTextWriterTag.Embed, TagType.NonClosing);\r
71         HtmlTextWriter.RegisterTag("fieldset", HtmlTextWriterTag.Fieldset, TagType.Other);\r
72         HtmlTextWriter.RegisterTag("font", HtmlTextWriterTag.Font, TagType.Inline);\r
73         HtmlTextWriter.RegisterTag("form", HtmlTextWriterTag.Form, TagType.Other);\r
74         HtmlTextWriter.RegisterTag("frame", HtmlTextWriterTag.Frame, TagType.NonClosing);\r
75         HtmlTextWriter.RegisterTag("frameset", HtmlTextWriterTag.Frameset, TagType.Other);\r
76         HtmlTextWriter.RegisterTag("h1", HtmlTextWriterTag.H1, TagType.Other);\r
77         HtmlTextWriter.RegisterTag("h2", HtmlTextWriterTag.H2, TagType.Other);\r
78         HtmlTextWriter.RegisterTag("h3", HtmlTextWriterTag.H3, TagType.Other);\r
79         HtmlTextWriter.RegisterTag("h4", HtmlTextWriterTag.H4, TagType.Other);\r
80         HtmlTextWriter.RegisterTag("h5", HtmlTextWriterTag.H5, TagType.Other);\r
81         HtmlTextWriter.RegisterTag("h6", HtmlTextWriterTag.H6, TagType.Other);\r
82         HtmlTextWriter.RegisterTag("head", HtmlTextWriterTag.Head, TagType.Other);\r
83         HtmlTextWriter.RegisterTag("hr", HtmlTextWriterTag.Hr, TagType.NonClosing);\r
84         HtmlTextWriter.RegisterTag("html", HtmlTextWriterTag.Html, TagType.Other);\r
85         HtmlTextWriter.RegisterTag("i", HtmlTextWriterTag.I, TagType.Inline);\r
86         HtmlTextWriter.RegisterTag("iframe", HtmlTextWriterTag.Iframe, TagType.Other);\r
87         HtmlTextWriter.RegisterTag("img", HtmlTextWriterTag.Img, TagType.NonClosing);\r
88         HtmlTextWriter.RegisterTag("input", HtmlTextWriterTag.Input, TagType.NonClosing);\r
89         HtmlTextWriter.RegisterTag("ins", HtmlTextWriterTag.Ins, TagType.Inline);\r
90         HtmlTextWriter.RegisterTag("isindex", HtmlTextWriterTag.Isindex, TagType.NonClosing);\r
91         HtmlTextWriter.RegisterTag("kbd", HtmlTextWriterTag.Kbd, TagType.Inline);\r
92         HtmlTextWriter.RegisterTag("label", HtmlTextWriterTag.Label, TagType.Inline);\r
93         HtmlTextWriter.RegisterTag("legend", HtmlTextWriterTag.Legend, TagType.Other);\r
94         HtmlTextWriter.RegisterTag("li", HtmlTextWriterTag.Li, TagType.Inline);\r
95         HtmlTextWriter.RegisterTag("link", HtmlTextWriterTag.Link, TagType.NonClosing);\r
96         HtmlTextWriter.RegisterTag("map", HtmlTextWriterTag.Map, TagType.Other);\r
97         HtmlTextWriter.RegisterTag("marquee", HtmlTextWriterTag.Marquee, TagType.Other);\r
98         HtmlTextWriter.RegisterTag("menu", HtmlTextWriterTag.Menu, TagType.Other);\r
99         HtmlTextWriter.RegisterTag("meta", HtmlTextWriterTag.Meta, TagType.NonClosing);\r
100         HtmlTextWriter.RegisterTag("nobr", HtmlTextWriterTag.Nobr, TagType.Inline);\r
101         HtmlTextWriter.RegisterTag("noframes", HtmlTextWriterTag.Noframes, TagType.Other);\r
102         HtmlTextWriter.RegisterTag("noscript", HtmlTextWriterTag.Noscript, TagType.Other);\r
103         HtmlTextWriter.RegisterTag("object", HtmlTextWriterTag.Object, TagType.Other);\r
104         HtmlTextWriter.RegisterTag("ol", HtmlTextWriterTag.Ol, TagType.Other);\r
105         HtmlTextWriter.RegisterTag("option", HtmlTextWriterTag.Option, TagType.Other);\r
106         HtmlTextWriter.RegisterTag("p", HtmlTextWriterTag.P, TagType.Inline);\r
107         HtmlTextWriter.RegisterTag("param", HtmlTextWriterTag.Param, TagType.Other);\r
108         HtmlTextWriter.RegisterTag("pre", HtmlTextWriterTag.Pre, TagType.Other);\r
109         HtmlTextWriter.RegisterTag("q", HtmlTextWriterTag.Q, TagType.Inline);\r
110         HtmlTextWriter.RegisterTag("rt", HtmlTextWriterTag.Rt, TagType.Other);\r
111         HtmlTextWriter.RegisterTag("ruby", HtmlTextWriterTag.Ruby, TagType.Other);\r
112         HtmlTextWriter.RegisterTag("s", HtmlTextWriterTag.S, TagType.Inline);\r
113         HtmlTextWriter.RegisterTag("samp", HtmlTextWriterTag.Samp, TagType.Inline);\r
114         HtmlTextWriter.RegisterTag("script", HtmlTextWriterTag.Script, TagType.Other);\r
115         HtmlTextWriter.RegisterTag("select", HtmlTextWriterTag.Select, TagType.Other);\r
116         HtmlTextWriter.RegisterTag("small", HtmlTextWriterTag.Small, TagType.Other);\r
117         HtmlTextWriter.RegisterTag("span", HtmlTextWriterTag.Span, TagType.Inline);\r
118         HtmlTextWriter.RegisterTag("strike", HtmlTextWriterTag.Strike, TagType.Inline);\r
119         HtmlTextWriter.RegisterTag("strong", HtmlTextWriterTag.Strong, TagType.Inline);\r
120         HtmlTextWriter.RegisterTag("style", HtmlTextWriterTag.Style, TagType.Other);\r
121         HtmlTextWriter.RegisterTag("sub", HtmlTextWriterTag.Sub, TagType.Inline);\r
122         HtmlTextWriter.RegisterTag("sup", HtmlTextWriterTag.Sup, TagType.Inline);\r
123         HtmlTextWriter.RegisterTag("table", HtmlTextWriterTag.Table, TagType.Other);\r
124         HtmlTextWriter.RegisterTag("tbody", HtmlTextWriterTag.Tbody, TagType.Other);\r
125         HtmlTextWriter.RegisterTag("td", HtmlTextWriterTag.Td, TagType.Inline);\r
126         HtmlTextWriter.RegisterTag("textarea", HtmlTextWriterTag.Textarea, TagType.Inline);\r
127         HtmlTextWriter.RegisterTag("tfoot", HtmlTextWriterTag.Tfoot, TagType.Other);\r
128         HtmlTextWriter.RegisterTag("th", HtmlTextWriterTag.Th, TagType.Inline);\r
129         HtmlTextWriter.RegisterTag("thead", HtmlTextWriterTag.Thead, TagType.Other);\r
130         HtmlTextWriter.RegisterTag("title", HtmlTextWriterTag.Title, TagType.Other);\r
131         HtmlTextWriter.RegisterTag("tr", HtmlTextWriterTag.Tr, TagType.Other);\r
132         HtmlTextWriter.RegisterTag("tt", HtmlTextWriterTag.Tt, TagType.Inline);\r
133         HtmlTextWriter.RegisterTag("u", HtmlTextWriterTag.U, TagType.Inline);\r
134         HtmlTextWriter.RegisterTag("ul", HtmlTextWriterTag.Ul, TagType.Other);\r
135         HtmlTextWriter.RegisterTag("var", HtmlTextWriterTag.Var, TagType.Inline);\r
136         HtmlTextWriter.RegisterTag("wbr", HtmlTextWriterTag.Wbr, TagType.NonClosing);\r
137         HtmlTextWriter.RegisterTag("xml", HtmlTextWriterTag.Xml, TagType.Other);\r
138 \r
139         HtmlTextWriter._attrKeyLookupTable = new Hashtable(40,CaseInsensitiveHashCodeProvider.Default,\r
140                                                            CaseInsensitiveComparer.Default);\r
141         HtmlTextWriter._attrNameLookupArray = new AttributeInformation[40];\r
142         HtmlTextWriter.RegisterAttribute("accesskey", HtmlTextWriterAttribute.Accesskey, true);\r
143         HtmlTextWriter.RegisterAttribute("align", HtmlTextWriterAttribute.Align, false);\r
144         HtmlTextWriter.RegisterAttribute("alt", HtmlTextWriterAttribute.Alt, true);\r
145         HtmlTextWriter.RegisterAttribute("background", HtmlTextWriterAttribute.Background, true);\r
146         HtmlTextWriter.RegisterAttribute("bgcolor", HtmlTextWriterAttribute.Bgcolor, false);\r
147         HtmlTextWriter.RegisterAttribute("border", HtmlTextWriterAttribute.Border, false);\r
148         HtmlTextWriter.RegisterAttribute("bordercolor", HtmlTextWriterAttribute.Bordercolor, false);\r
149         HtmlTextWriter.RegisterAttribute("cellpadding", HtmlTextWriterAttribute.Cellpadding, false);\r
150         HtmlTextWriter.RegisterAttribute("cellspacing", HtmlTextWriterAttribute.Cellspacing, false);\r
151         HtmlTextWriter.RegisterAttribute("checked", HtmlTextWriterAttribute.Checked, false);\r
152         HtmlTextWriter.RegisterAttribute("class", HtmlTextWriterAttribute.Class, true);\r
153         HtmlTextWriter.RegisterAttribute("cols", HtmlTextWriterAttribute.Cols, false);\r
154         HtmlTextWriter.RegisterAttribute("colspan", HtmlTextWriterAttribute.Colspan, false);\r
155         HtmlTextWriter.RegisterAttribute("disabled", HtmlTextWriterAttribute.Disabled, false);\r
156         HtmlTextWriter.RegisterAttribute("for", HtmlTextWriterAttribute.For, false);\r
157         HtmlTextWriter.RegisterAttribute("height", HtmlTextWriterAttribute.Height, false);\r
158         HtmlTextWriter.RegisterAttribute("href", HtmlTextWriterAttribute.Href, true);\r
159         HtmlTextWriter.RegisterAttribute("id", HtmlTextWriterAttribute.Id, false);\r
160         HtmlTextWriter.RegisterAttribute("maxlength", HtmlTextWriterAttribute.Maxlength, false);\r
161         HtmlTextWriter.RegisterAttribute("multiple", HtmlTextWriterAttribute.Multiple, false);\r
162         HtmlTextWriter.RegisterAttribute("name", HtmlTextWriterAttribute.Name, false);\r
163         HtmlTextWriter.RegisterAttribute("nowrap", HtmlTextWriterAttribute.Nowrap, false);\r
164         HtmlTextWriter.RegisterAttribute("onchange", HtmlTextWriterAttribute.Onchange, true);\r
165         HtmlTextWriter.RegisterAttribute("onclick", HtmlTextWriterAttribute.Onclick, true);\r
166         HtmlTextWriter.RegisterAttribute("readonly", HtmlTextWriterAttribute.ReadOnly, false);\r
167         HtmlTextWriter.RegisterAttribute("rows", HtmlTextWriterAttribute.Rows, false);\r
168         HtmlTextWriter.RegisterAttribute("rowspan", HtmlTextWriterAttribute.Rowspan, false);\r
169         HtmlTextWriter.RegisterAttribute("rules", HtmlTextWriterAttribute.Rules, false);\r
170         HtmlTextWriter.RegisterAttribute("selected", HtmlTextWriterAttribute.Selected, false);\r
171         HtmlTextWriter.RegisterAttribute("size", HtmlTextWriterAttribute.Size, false);\r
172         HtmlTextWriter.RegisterAttribute("src", HtmlTextWriterAttribute.Src, true);\r
173         HtmlTextWriter.RegisterAttribute("style", HtmlTextWriterAttribute.Style, false);\r
174         HtmlTextWriter.RegisterAttribute("tabindex", HtmlTextWriterAttribute.Tabindex, false);\r
175         HtmlTextWriter.RegisterAttribute("target", HtmlTextWriterAttribute.Target, false);\r
176         HtmlTextWriter.RegisterAttribute("title", HtmlTextWriterAttribute.Title, true);\r
177         HtmlTextWriter.RegisterAttribute("type", HtmlTextWriterAttribute.Type, false);\r
178         HtmlTextWriter.RegisterAttribute("valign", HtmlTextWriterAttribute.Valign, false);\r
179         HtmlTextWriter.RegisterAttribute("value", HtmlTextWriterAttribute.Value, true);\r
180         HtmlTextWriter.RegisterAttribute("width", HtmlTextWriterAttribute.Width, false);\r
181         HtmlTextWriter.RegisterAttribute("wrap", HtmlTextWriterAttribute.Wrap, false);\r
182 \r
183         HtmlTextWriter._styleKeyLookupTable = new Hashtable(14,CaseInsensitiveHashCodeProvider.Default,\r
184                                                                 CaseInsensitiveComparer.Default);\r
185         HtmlTextWriter._styleNameLookupArray = new String[14];\r
186         HtmlTextWriter.RegisterStyle("background-color", HtmlTextWriterStyle.BackgroundColor);\r
187         HtmlTextWriter.RegisterStyle("background-image", HtmlTextWriterStyle.BackgroundImage);\r
188         HtmlTextWriter.RegisterStyle("border-collapse", HtmlTextWriterStyle.BorderCollapse);\r
189         HtmlTextWriter.RegisterStyle("border-color", HtmlTextWriterStyle.BorderColor);\r
190         HtmlTextWriter.RegisterStyle("border-style", HtmlTextWriterStyle.BorderStyle);\r
191         HtmlTextWriter.RegisterStyle("border-width", HtmlTextWriterStyle.BorderWidth);\r
192         HtmlTextWriter.RegisterStyle("color", HtmlTextWriterStyle.Color);\r
193         HtmlTextWriter.RegisterStyle("font-family", HtmlTextWriterStyle.FontFamily);\r
194         HtmlTextWriter.RegisterStyle("font-size", HtmlTextWriterStyle.FontSize);\r
195         HtmlTextWriter.RegisterStyle("font-style", HtmlTextWriterStyle.FontStyle);\r
196         HtmlTextWriter.RegisterStyle("font-weight", HtmlTextWriterStyle.FontWeight);\r
197         HtmlTextWriter.RegisterStyle("height", HtmlTextWriterStyle.Height);\r
198         HtmlTextWriter.RegisterStyle("text-decoration", HtmlTextWriterStyle.TextDecoration);\r
199         HtmlTextWriter.RegisterStyle("width", HtmlTextWriterStyle.Width);\r
200 }\r
201 \r
202 public HtmlTextWriter(TextWriter writer):this(writer, " "){}\r
203 \r
204 public HtmlTextWriter(TextWriter writer, string tabString) : base() {\r
205         this.writer = writer;\r
206         this.tabString = tabString;\r
207         indentLevel = 0;\r
208         tabsPending = false;\r
209         _httpWriter = writer as HttpWriter;\r
210         _isDescendant = GetType() == typeof(HtmlTextWriter) == false;\r
211         _attrList = new RenderAttribute[20];\r
212         _attrCount = 0;\r
213         _styleList = new RenderStyle[20];\r
214         _styleCount = 0;\r
215         _endTags = new TagStackEntry[16];\r
216         _endTagCount = 0;\r
217         _inlineCount = 0;\r
218 }\r
219 \r
220 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value){\r
221         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
222                 AttributeInformation attrInfo = HtmlTextWriter._attrNameLookupArray[(int) key];\r
223                 AddAttribute(attrInfo.name, value, key, attrInfo.encode);\r
224         }\r
225 }\r
226 \r
227 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value, bool fEncode){\r
228         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
229                 AddAttribute(HtmlTextWriter._attrNameLookupArray[(int) key].name, value, key, fEncode);\r
230         }\r
231 }\r
232 \r
233 public virtual void AddAttribute(string name, string value){\r
234         HtmlTextWriterAttribute attr = GetAttributeKey(name);\r
235         value = EncodeAttributeValue(GetAttributeKey(name), value);\r
236         AddAttribute(name, value, attr);\r
237 }\r
238 \r
239 public virtual void AddAttribute(string name, string value, bool fEndode){\r
240         value = EncodeAttributeValue(value, fEndode);\r
241         AddAttribute(name, value, GetAttributeKey(name));\r
242 }\r
243 \r
244 protected virtual void AddAttribute(string name, string value, HtmlTextWriterAttribute key){\r
245         AddAttribute(name, value, key, false);\r
246 }\r
247 \r
248 private void AddAttribute(string name, string value, HtmlTextWriterAttribute key, bool encode){\r
249         if (_attrCount >= (int) _attrList.Length) {\r
250                 RenderAttribute[] rAttrArr = new RenderAttribute[_attrList.Length * 2];\r
251                 System.Array.Copy(_attrList, rAttrArr, (int) _attrList.Length);\r
252                 _attrList = rAttrArr;\r
253         }\r
254         RenderAttribute rAttr;\r
255         rAttr.name = name;\r
256         rAttr.value = value;\r
257         rAttr.key = key;\r
258         rAttr.encode = encode;\r
259         _attrList [_attrCount++] = rAttr;\r
260 }\r
261 \r
262 public virtual void AddStyleAttribute(HtmlTextWriterStyle key, string value){\r
263         AddStyleAttribute(GetStyleName(key), value, key);\r
264 }\r
265 \r
266 public virtual void AddStyleAttribute(string name, string value){\r
267         AddStyleAttribute(name, value, GetStyleKey(name));\r
268 }\r
269 \r
270 protected virtual void AddStyleAttribute(string name, string value, HtmlTextWriterStyle key){\r
271         if (_styleCount >= (int) _styleList.Length) {\r
272                 RenderStyle[] rAttrArr = new RenderStyle[_styleList.Length * 2];\r
273                 System.Array.Copy(_styleList, rAttrArr, (int) _styleList.Length);\r
274                 _styleList = rAttrArr;\r
275         }\r
276         RenderStyle rAttr;\r
277         rAttr.name = name;\r
278         rAttr.value = value;\r
279         rAttr.key = key;\r
280         _styleList [_styleCount++] = rAttr;\r
281 }\r
282 \r
283 public override void Close(){\r
284         writer.Close();\r
285 }\r
286 \r
287 protected virtual string EncodeAttributeValue(HtmlTextWriterAttribute attrKey, string value){\r
288         bool valid = true;\r
289         if (0 <= (int) attrKey && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
290                 valid = HtmlTextWriter._attrNameLookupArray[(int) attrKey].encode;\r
291         return EncodeAttributeValue(value, valid);\r
292 }\r
293 \r
294 protected string EncodeAttributeValue(string value, bool fEncode){\r
295         if (value == null)\r
296                 return null;\r
297         if (!(fEncode))\r
298                 return value;\r
299         return System.Web.HttpUtility.HtmlAttributeEncode(value);\r
300 }\r
301 \r
302 protected string EncodeUrl(string url){\r
303         if (url.IndexOf(SpaceChar) < 0)\r
304                 return url;\r
305         System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
306         for(int i=0; i <= url.Length; i++){\r
307                 char temp = url[i];\r
308                 if (temp != 32)\r
309                         sb.Append(temp);\r
310                 else\r
311                         sb.Append("%20");\r
312         }\r
313         return sb.ToString();\r
314 }\r
315 \r
316 protected virtual void FilterAttributes(){\r
317         int count = 0;\r
318         for(int i=0; i < _styleCount; i++){\r
319                 RenderStyle rStyle = _styleList[i];\r
320                 if (OnStyleAttributeRender(rStyle.name, rStyle.value, rStyle.key)) {\r
321                         count++;\r
322                 }\r
323         }\r
324         _styleCount = count;\r
325         count = 0;\r
326         for(int i=0; i <= _attrCount; i++){\r
327                 RenderAttribute rAttr = _attrList[i];\r
328                 if (OnAttributeRender(rAttr.name, rAttr.value, rAttr.key)) {\r
329                         count++;\r
330                 }\r
331         }\r
332         _attrCount = count;\r
333 }\r
334 \r
335 public override void Flush(){\r
336         writer.Flush();\r
337 }\r
338 \r
339 protected HtmlTextWriterAttribute GetAttributeKey(string attrName){\r
340         if (attrName != null && attrName.Length > 0) {\r
341                 object attr = HtmlTextWriter._attrKeyLookupTable[attrName];\r
342                 if (attr != null)\r
343                         return (HtmlTextWriterAttribute) attr;\r
344         }\r
345         return (HtmlTextWriterAttribute) (-1);\r
346 }\r
347 \r
348 protected string GetAttributeName(HtmlTextWriterAttribute attrKey){\r
349         if ((int) attrKey >= 0 && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
350                 return HtmlTextWriter._attrNameLookupArray[(int) attrKey].name;\r
351         return System.String.Empty;\r
352 }\r
353 \r
354 protected HtmlTextWriterStyle GetStyleKey(string styleName){\r
355         if (styleName != null && styleName.Length > 0) {\r
356                 object style = HtmlTextWriter._styleKeyLookupTable[styleName];\r
357                 if (style != null)\r
358                         return (HtmlTextWriterStyle) style;\r
359         }\r
360         return (HtmlTextWriterStyle) (-1);\r
361 }\r
362 \r
363 protected string GetStyleName(HtmlTextWriterStyle styleKey){\r
364         if ((int) styleKey >= 0 && (int) styleKey < HtmlTextWriter._styleNameLookupArray.Length)\r
365                 return HtmlTextWriter._styleNameLookupArray[(int) styleKey];\r
366         return System.String.Empty;\r
367 }\r
368 \r
369 protected virtual HtmlTextWriterTag GetTagKey(string tagName){\r
370         if (tagName != null && tagName.Length > 0) {\r
371                 object tag = HtmlTextWriter._tagKeyLookupTable[tagName];\r
372                 if (tag != null)\r
373                         return (HtmlTextWriterTag) tag;\r
374         }\r
375         return 0;\r
376 }\r
377 \r
378 protected virtual string GetTagName(HtmlTextWriterTag tagKey){\r
379         if ((int) tagKey >= 0 && (int) tagKey < HtmlTextWriter._tagNameLookupArray.Length)\r
380                 return HtmlTextWriter._tagNameLookupArray[(int) tagKey].name;\r
381         return System.String.Empty;\r
382 }\r
383 \r
384 protected bool IsAttributeDefined(HtmlTextWriterAttribute key){\r
385         for (int i=0; i < _attrCount; i++) {\r
386                 if (_attrList[i].key == key)\r
387                         return true;\r
388         }\r
389         return false;\r
390 }\r
391 \r
392 protected bool IsAttributeDefined(HtmlTextWriterAttribute key, out string value){\r
393         value = null;\r
394         for (int i=0; i < _attrCount; i++) {\r
395                 if (_attrList[i].key == key) {\r
396                         value = _attrList[i].value;\r
397                         return true;\r
398                 }\r
399         }\r
400         return false;\r
401 }\r
402 \r
403 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key){\r
404         for (int i= 0; i < _styleCount; i++) {\r
405                 if (_styleList[i].key == key)\r
406                         return true;\r
407         }\r
408         return false;\r
409 }\r
410 \r
411 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key, out string value){\r
412         value = null;\r
413         for( int i=0; i < _styleCount; i++) {\r
414                 if (_styleList[i].key == key) {\r
415                         value = _styleList[i].value;\r
416                         return true;\r
417                 }\r
418         }\r
419         return false;\r
420 }\r
421 \r
422 protected virtual bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key){\r
423         return true;\r
424 }\r
425 \r
426 protected virtual bool OnStyleAttributeRender(string name, string value, HtmlTextWriterStyle key){\r
427         return true;\r
428 }\r
429 \r
430 protected virtual bool OnTagRender(string name, HtmlTextWriterTag key){\r
431         return true;\r
432 }\r
433 \r
434 protected virtual void OutputTabs(){\r
435         if (tabsPending) {\r
436                 for(int i=0; i < indentLevel; i++) {\r
437                         writer.Write(tabString);\r
438                 }\r
439                 tabsPending = false;\r
440         }\r
441 }\r
442 \r
443 protected string PopEndTag(){\r
444         if (_endTagCount <= 0)\r
445                 throw new InvalidOperationException("A PopEndTag was called without a corresponding PushEndTag");\r
446         _endTagCount--;\r
447         TagKey = _endTags[_endTagCount].tagKey;\r
448         return _endTags[_endTagCount].endTagText;\r
449 }\r
450 \r
451 protected void PushEndTag(string endTag){\r
452         if (_endTagCount >= (int) _endTags.Length) {\r
453                 TagStackEntry[] temp = new TagStackEntry[(int) _endTags.Length * 2];\r
454                 System.Array.Copy(_endTags, temp, (int) _endTags.Length);\r
455                 _endTags = temp;\r
456         }\r
457         _endTags[_endTagCount].tagKey = _tagKey;\r
458         _endTags[_endTagCount].endTagText = endTag;\r
459         _endTagCount++;\r
460 }\r
461 \r
462 protected static void RegisterAttribute(string name, HtmlTextWriterAttribute key){\r
463         HtmlTextWriter.RegisterAttribute(name, key, false);\r
464 }\r
465 \r
466 private static void RegisterAttribute(string name, HtmlTextWriterAttribute key, bool fEncode){\r
467         name = name.ToLower();\r
468         HtmlTextWriter._attrKeyLookupTable.Add(name, key);\r
469         if ((int) key < (int) HtmlTextWriter._attrNameLookupArray.Length)\r
470                 HtmlTextWriter._attrNameLookupArray[(int) key] = new AttributeInformation(name, fEncode);\r
471 }\r
472 \r
473 protected static void RegisterStyle(string name, HtmlTextWriterStyle key){\r
474         name = name.ToLower();\r
475         HtmlTextWriter._styleKeyLookupTable.Add(name, key);\r
476         if ((int) key < (int) HtmlTextWriter._styleNameLookupArray.Length)\r
477                 HtmlTextWriter._styleNameLookupArray[(int) key] = name;\r
478 }\r
479 \r
480 protected static void RegisterTag(string name, HtmlTextWriterTag key){\r
481         HtmlTextWriter.RegisterTag(name, key, TagType.Other);\r
482 }\r
483 \r
484 private static void RegisterTag(string name, HtmlTextWriterTag key, TagType type){\r
485         name = name.ToLower();\r
486         HtmlTextWriter._tagKeyLookupTable.Add(name, key);\r
487         string fullTag = null;\r
488         if ((int) type != 1 && (int) key != 0) {\r
489                 fullTag = EndTagLeftChars + name + TagRightChar;\r
490         }\r
491         if ((int) key < HtmlTextWriter._tagNameLookupArray.Length)\r
492                 HtmlTextWriter._tagNameLookupArray[(int) key] = new TagInformation(name, type, fullTag);\r
493 }\r
494 \r
495 protected virtual string RenderAfterContent(){\r
496         return null;\r
497 }\r
498 \r
499 protected virtual string RenderAfterTag(){\r
500         return null;\r
501 }\r
502 \r
503 protected virtual string RenderBeforeContent(){\r
504         return null;\r
505 }\r
506 \r
507 protected virtual string RenderBeforeTag(){\r
508         return null;\r
509 }\r
510 \r
511 public virtual void RenderBeginTag(HtmlTextWriterTag tagKey){\r
512         TagKey = tagKey;\r
513         bool tagRendered = true;\r
514         bool tagRender = true;\r
515         if (_isDescendant) {\r
516                 tagRender = OnTagRender(_tagName, _tagKey);\r
517                 FilterAttributes();\r
518                 string beforeTag = RenderBeforeTag();\r
519                 if (beforeTag != null) {\r
520                         if (tabsPending)\r
521                                 OutputTabs();\r
522                         writer.Write(beforeTag);\r
523                 }\r
524         }\r
525         TagInformation currentTag = HtmlTextWriter._tagNameLookupArray[_tagIndex];\r
526         if (currentTag.closingTag == null && currentTag.tagType == TagType.Other) {\r
527                 currentTag.closingTag = EndTagLeftChars + _tagName + TagRightChar;\r
528         }\r
529 \r
530         if (tagRender) {\r
531                 tagRendered = false;\r
532                 if (tabsPending)\r
533                         OutputTabs();\r
534                 writer.Write(TagLeftChar);\r
535                 writer.Write(_tagName);\r
536                 RenderAttribute rAttr;\r
537                 string rAttrValue = null;\r
538                 for (int i=0; i < _attrCount; i++) {\r
539                         rAttr = _attrList[i];\r
540                         if (rAttr.key == HtmlTextWriterAttribute.Style)\r
541                                 rAttrValue = rAttr.value;\r
542                         else {\r
543                                 writer.Write(SpaceChar);\r
544                                 writer.Write(rAttr.name);\r
545                                 if (rAttr.value != null) {\r
546                                         writer.Write(EqualsChar);\r
547                                         writer.Write(DoubleQuoteChar);\r
548                                         if (rAttr.encode) {\r
549                                                 if (_httpWriter == null) {\r
550                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, writer);\r
551                                                 }\r
552                                                 else {\r
553                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, (TextWriter) _httpWriter);\r
554                                                 }\r
555                                         }\r
556                                         else {\r
557                                                 writer.Write(rAttr.value);\r
558                                         }\r
559                                         writer.Write(DoubleQuoteChar);\r
560                                 }\r
561                         }\r
562                 }\r
563                 if (_styleCount > 0 || rAttrValue != null) {\r
564                         writer.Write(SpaceChar);\r
565                         writer.Write("style");\r
566                         writer.Write(EqualsChar);\r
567                         writer.Write(DoubleQuoteChar);\r
568                         RenderStyle rStyle;\r
569                         for (int i=0; i < _styleCount; i++) {\r
570                                 rStyle = _styleList[i];\r
571                                 writer.Write(rStyle.name);\r
572                                 writer.Write(StyleEqualsChar);\r
573                                 writer.Write(rStyle.value);\r
574                                 writer.Write(SemicolonChar);\r
575                         }\r
576                         if (rAttrValue != null)\r
577                                 writer.Write(rAttrValue);\r
578                         writer.Write(DoubleQuoteChar);\r
579                 }\r
580                 if (currentTag.tagType == TagType.NonClosing) {\r
581                         writer.Write(SpaceChar);\r
582                         writer.Write(SlashChar);\r
583                         writer.Write(TagRightChar);\r
584                 }\r
585                 else\r
586                         writer.Write(TagRightChar);\r
587         }\r
588         string beforeContent = RenderBeforeContent();\r
589         if (beforeContent != null) {\r
590                 if (tabsPending)\r
591                         OutputTabs();\r
592                 writer.Write(beforeContent);\r
593         }\r
594         if (tagRendered) {\r
595                 if (currentTag.tagType == TagType.Inline)\r
596                         _inlineCount++;\r
597                 else {\r
598                         WriteLine();\r
599                         Indent++;\r
600                 }\r
601                 if (currentTag.closingTag == null) {\r
602                         currentTag.closingTag = EndTagLeftChars + _tagName + TagRightChar;\r
603                 }\r
604         }\r
605         if (_isDescendant) {\r
606                 string afterContent = RenderAfterContent();\r
607                 if (afterContent != null) {\r
608                         if (currentTag.closingTag != null)\r
609                                 currentTag.closingTag = afterContent;\r
610                 }\r
611                 string afterTag = RenderAfterTag();\r
612                 if (afterTag != null) {\r
613                         if (currentTag.closingTag != null)\r
614                                 currentTag.closingTag = afterTag;\r
615                 }\r
616         }\r
617         PushEndTag(currentTag.closingTag);\r
618         _attrCount = 0;\r
619         _styleCount = 0;\r
620 }\r
621 \r
622 public virtual void RenderBeginTag(string tagName){\r
623         TagName = tagName;\r
624         RenderBeginTag(_tagKey);\r
625 }\r
626 \r
627 public virtual void RenderEndTag(){\r
628         string endTagText = PopEndTag();\r
629         if (endTagText != null) {\r
630                 if (HtmlTextWriter._tagNameLookupArray[_tagIndex].tagType == 0) {\r
631                         _inlineCount--;\r
632                         Write(endTagText);\r
633                 }\r
634                 else{\r
635                         WriteLine();\r
636                         Indent--;\r
637                         Write(endTagText);\r
638                 }\r
639         }\r
640 }\r
641 \r
642 public override void Write(bool value){\r
643         if (tabsPending)\r
644                 OutputTabs();\r
645         writer.Write(value);\r
646 }\r
647 \r
648 public override void Write(char value){\r
649         if (tabsPending)\r
650                 OutputTabs();\r
651         writer.Write(value);\r
652 }\r
653 \r
654 public override void Write(char[] buffer){\r
655         if (tabsPending)\r
656                 OutputTabs();\r
657         writer.Write(buffer);\r
658 }\r
659 \r
660 public override void Write(char[] buffer, int index, int count){\r
661         if (tabsPending)\r
662                 OutputTabs();\r
663         writer.Write(buffer, index, count);\r
664 }\r
665 \r
666 public override void Write(double value){\r
667         if (tabsPending)\r
668                 OutputTabs();\r
669         writer.Write(value);\r
670 }\r
671 \r
672 public override void Write(int value){\r
673         if (tabsPending)\r
674                 OutputTabs();\r
675         writer.Write(value);\r
676 }\r
677 \r
678 public override void Write(long value){\r
679         if (tabsPending)\r
680                 OutputTabs();\r
681         writer.Write(value);\r
682 }\r
683 \r
684 public override void Write(object value){\r
685         if (tabsPending)\r
686                 OutputTabs();\r
687         writer.Write(value);\r
688 }\r
689 \r
690 public override void Write(float value){\r
691         if (tabsPending)\r
692                 OutputTabs();\r
693         writer.Write(value);\r
694 }\r
695 \r
696 public override void Write(string s){\r
697         if (tabsPending)\r
698                 OutputTabs();\r
699         writer.Write(s);\r
700 }\r
701 \r
702 public override void Write(string format, object arg0){\r
703         if (tabsPending)\r
704                 OutputTabs();\r
705         writer.Write(format, arg0);\r
706 }\r
707 \r
708 public override void Write(string format, object arg0, object arg1){\r
709         if (tabsPending)\r
710                 OutputTabs();\r
711         writer.Write(format, arg0, arg1);\r
712 }\r
713 \r
714 public override void Write(string format, params object[] arg){\r
715         if (tabsPending)\r
716                 OutputTabs();\r
717         writer.Write(format, arg);\r
718 }\r
719 \r
720 public virtual void WriteAttribute(string name, string value){\r
721         WriteAttribute(name, value, false);\r
722 }\r
723 \r
724 public virtual void WriteAttribute(string name, string value, bool fEncode){\r
725         writer.Write(SpaceChar);\r
726         writer.Write(name);\r
727         if (value != null) {\r
728                 writer.Write(EqualsChar);\r
729                 writer.Write(DoubleQuoteChar);\r
730                 if (fEncode) {\r
731                         if (_httpWriter == null) {\r
732                                 System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
733                         }\r
734                         else{\r
735                                 System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
736                         }\r
737                 }\r
738                 else{\r
739                         writer.Write(value);\r
740                 }\r
741                 writer.Write(DoubleQuoteChar);\r
742         }\r
743 }\r
744 \r
745 public virtual void WriteBeginTag(string tagName){\r
746         if (tabsPending)\r
747                 OutputTabs();\r
748         writer.Write(TagLeftChar);\r
749         writer.Write(tagName);\r
750 }\r
751 \r
752 public virtual void WriteEndTag(string tagName){\r
753         if (tabsPending)\r
754                 OutputTabs();\r
755         writer.Write(TagLeftChar);\r
756         writer.Write(SlashChar);\r
757         writer.Write(tagName);\r
758         writer.Write(TagRightChar);\r
759 }\r
760 \r
761 public virtual void WriteFullBeginTag(string tagName){\r
762         if (tabsPending)\r
763                 OutputTabs();\r
764         writer.Write(TagLeftChar);\r
765         writer.Write(tagName);\r
766         writer.Write(TagRightChar);\r
767 }\r
768 \r
769 public override void WriteLine(){\r
770         writer.WriteLine();\r
771         tabsPending = true;\r
772 }\r
773 \r
774 public override void WriteLine(bool value){\r
775         if (tabsPending)\r
776                 OutputTabs();\r
777         writer.WriteLine(value);\r
778         tabsPending = true;\r
779 }\r
780 \r
781 public override void WriteLine(char value){\r
782         if (tabsPending)\r
783                 OutputTabs();\r
784         writer.WriteLine(value);\r
785         tabsPending = true;\r
786 }\r
787 \r
788 public override void WriteLine(char[] buffer){\r
789         if (tabsPending)\r
790                 OutputTabs();\r
791         writer.WriteLine(buffer);\r
792         tabsPending = true;\r
793 }\r
794 \r
795 public override void WriteLine(char[] buffer, int index, int count){\r
796         if (tabsPending)\r
797                 OutputTabs();\r
798         writer.WriteLine(buffer, index, count);\r
799         tabsPending = true;\r
800 }\r
801 \r
802 public override void WriteLine(double value){\r
803         if (tabsPending)\r
804                 OutputTabs();\r
805         writer.WriteLine(value);\r
806         tabsPending = true;\r
807 }\r
808 \r
809 public override void WriteLine(int value){\r
810         if (tabsPending)\r
811                 OutputTabs();\r
812         writer.WriteLine(value);\r
813         tabsPending = true;\r
814 }\r
815 \r
816 public override void WriteLine(long value){\r
817         if (tabsPending)\r
818                 OutputTabs();\r
819         writer.WriteLine(value);\r
820         tabsPending = true;\r
821 }\r
822 \r
823 public override void WriteLine(object value){\r
824         if (tabsPending)\r
825                 OutputTabs();\r
826         writer.WriteLine(value);\r
827         tabsPending = true;\r
828 }\r
829 \r
830 public override void WriteLine(float value){\r
831         if (tabsPending)\r
832                 OutputTabs();\r
833         writer.WriteLine(value);\r
834         tabsPending = true;\r
835 }\r
836 \r
837 public override void WriteLine(string s){\r
838         if (tabsPending)\r
839                 OutputTabs();\r
840         writer.WriteLine(s);\r
841         tabsPending = true;\r
842 }\r
843 \r
844 public override void WriteLine(string format, object arg0){\r
845         if (tabsPending)\r
846                 OutputTabs();\r
847         writer.WriteLine(format, arg0);\r
848         tabsPending = true;\r
849 }\r
850 \r
851 public override void WriteLine(string format, object arg0, object arg1){\r
852         if (tabsPending)\r
853                 OutputTabs();\r
854         writer.WriteLine(format, arg0, arg1);\r
855         tabsPending = true;\r
856 }\r
857 \r
858 public override void WriteLine(string format, params object[] arg){\r
859         if (tabsPending)\r
860                 OutputTabs();\r
861         writer.WriteLine(format, arg);\r
862         tabsPending = true;\r
863 }\r
864 \r
865 [CLSCompliant(false)]\r
866 public override void WriteLine(uint value){\r
867         if (tabsPending)\r
868                 OutputTabs();\r
869         writer.WriteLine(value);\r
870         tabsPending = true;\r
871 }\r
872 \r
873 public void WriteLineNoTabs(string s){\r
874         writer.WriteLine(s);\r
875 }\r
876 \r
877 public virtual void WriteStyleAttribute(string name, string value){\r
878         WriteStyleAttribute(name, value, false);\r
879 }\r
880 \r
881 public virtual void WriteStyleAttribute(string name, string value, bool fEncode){\r
882         writer.Write(name);\r
883         writer.Write(StyleEqualsChar);\r
884         if (fEncode) {\r
885                 if (_httpWriter == null) {\r
886                         System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
887                 }\r
888                 else{\r
889                         System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
890                 }\r
891         }\r
892         else {\r
893                 writer.Write(value);\r
894         }\r
895         writer.Write(SemicolonChar);\r
896 }\r
897 \r
898 public override System.Text.Encoding Encoding { \r
899         get{\r
900                 return writer.Encoding;\r
901         }\r
902 }\r
903 \r
904 public int Indent { \r
905         get{\r
906                 return indentLevel;\r
907         }\r
908         set{\r
909                 if (value < 0)\r
910                         value = 0;\r
911                 indentLevel = value;\r
912         }\r
913 }\r
914 \r
915 public TextWriter InnerWriter { \r
916         get{\r
917                 return writer;\r
918         }\r
919         set{\r
920                 writer = value;\r
921                 _httpWriter = value as HttpWriter;\r
922         }\r
923 }\r
924 \r
925 public override string NewLine { \r
926         get{\r
927                 return writer.NewLine;\r
928         }\r
929         set{\r
930                 writer.NewLine = value;\r
931         }\r
932 }\r
933 \r
934 protected HtmlTextWriterTag TagKey { \r
935         get{\r
936                 return _tagKey;\r
937         }\r
938         set{\r
939                 _tagIndex = (int) value;\r
940                 if (_tagIndex < 0 || _tagIndex >= (int) HtmlTextWriter._tagNameLookupArray.Length)\r
941                         throw new ArgumentOutOfRangeException("value");\r
942                 _tagKey = value;\r
943                 if (value != 0)\r
944                         _tagName = HtmlTextWriter._tagNameLookupArray[_tagIndex].name;\r
945         }\r
946 }\r
947 \r
948 protected string TagName { \r
949         get{\r
950                 return _tagName;\r
951         }\r
952         set{\r
953                 _tagName = value;\r
954                 _tagKey = GetTagKey(_tagName);\r
955                 _tagIndex = (int) _tagKey;\r
956         }\r
957 }\r
958 \r
959 public const string DefaultTabString = "\t";\r
960 public const char DoubleQuoteChar = '"';\r
961 public const string EndTagLeftChars = "</";\r
962 public const char EqualsChar = '=';\r
963 public const string EqualsDoubleQuoteString = "=\"";\r
964 public const string SelfClosingChars = " /";\r
965 public const string SelfClosingTagEnd = " />";\r
966 public const char SemicolonChar = ';';\r
967 public const char SingleQuoteChar = '\'';\r
968 public const char SlashChar = '/';\r
969 public const char SpaceChar = ' ';\r
970 public const char StyleEqualsChar = ':';\r
971 public const char TagLeftChar = '<';\r
972 public const char TagRightChar = '>';\r
973 \r
974 private int _attrCount;\r
975 private int _endTagCount;\r
976 private int _styleCount;\r
977 private int indentLevel;\r
978 private int _inlineCount;\r
979 private int _tagIndex;\r
980 \r
981 private bool _isDescendant;\r
982 private bool tabsPending;\r
983 \r
984 private HtmlTextWriterTag _tagKey;\r
985 private TextWriter writer;\r
986 private HttpWriter _httpWriter;\r
987 \r
988 private static Hashtable _attrKeyLookupTable;\r
989 private static Hashtable _styleKeyLookupTable;\r
990 private static Hashtable _tagKeyLookupTable;\r
991 \r
992 private string _tagName;\r
993 private string tabString;\r
994 private static string[] _styleNameLookupArray;\r
995 \r
996 private RenderAttribute[] _attrList;\r
997 private static AttributeInformation[] _attrNameLookupArray;\r
998 private static TagInformation[] _tagNameLookupArray;\r
999 private TagStackEntry[] _endTags;\r
1000 private RenderStyle[] _styleList;\r
1001 \r
1002 } //HtmlTextWriter\r
1003 \r
1004 struct AttributeInformation {\r
1005         public bool encode;\r
1006         public string name;\r
1007 \r
1008         public AttributeInformation(string name, bool encode){\r
1009                 this.encode = encode;\r
1010                 this.name = name;\r
1011         }\r
1012\r
1013  \r
1014 struct RenderAttribute {\r
1015         public bool encode;\r
1016         public HtmlTextWriterAttribute key;\r
1017         public string name;\r
1018         public string value;\r
1019\r
1020  \r
1021 struct RenderStyle {\r
1022         public HtmlTextWriterStyle key;\r
1023         public string name;\r
1024         public string value;\r
1025\r
1026  \r
1027 struct TagInformation {\r
1028         public string closingTag;\r
1029         public string name;\r
1030         public TagType tagType;\r
1031 \r
1032         public TagInformation(string name, TagType tagType, string closingTag){\r
1033                 this.name = name;\r
1034                 this.tagType = tagType;\r
1035                 this.closingTag = closingTag;   \r
1036         }\r
1037\r
1038  \r
1039 struct TagStackEntry {\r
1040         public string endTagText;\r
1041         public HtmlTextWriterTag tagKey;\r
1042\r
1043  \r
1044 enum TagType {\r
1045         Inline,\r
1046         NonClosing,\r
1047         Other\r
1048\r
1049 \r
1050 \r
1051 } // namespace System.Web.UI.HtmlControls\r
1052 \r