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