OSDN Git Service

Initial contents of nt2chview
[nt2chview/stable.git] / NT2chCtrl45 / html / HtmlElement.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using NT2chCtrl.html.css;\r
5 using NT2chObject;\r
6 \r
7 namespace NT2chCtrl.html\r
8 {\r
9     public partial class HtmlElement\r
10     {\r
11         HtmlElement mParent;\r
12         List<HtmlElement> mChildren;\r
13         List<HtmlAttribute> mAttributes;\r
14         List<string> mClassList = null;\r
15         List<Selector> mMatchedSelector;\r
16         string mTagName;\r
17         protected bool mClosed;\r
18 \r
19         public int mDebugLine;\r
20         public int mDebugSourceIndex;\r
21         public void setDebugInfo(int line, int sourceIndex)\r
22         {\r
23             mDebugLine = line;\r
24             mDebugSourceIndex = sourceIndex;\r
25         }\r
26 \r
27         public HtmlElement getParent() { return mParent; }\r
28         public List<HtmlElement> getChildren() { return mChildren; }\r
29         public void setChildren(List<HtmlElement>  children) { mChildren = children; }\r
30         public bool Closed() { return mClosed; }\r
31         public void setClosed(bool value) { mClosed = value; }\r
32         public string getTagName() { return mTagName; }\r
33         public void addAttribute(HtmlAttribute item)\r
34         {\r
35             mAttributes.Add(item);\r
36         }\r
37         public void clearChildren()\r
38         {\r
39             mChildren.Clear();\r
40         }\r
41 \r
42         public string getInnerHtml()\r
43         {\r
44             StringBuilder sb = new StringBuilder();\r
45             foreach (HtmlElement elem in mChildren)\r
46             {\r
47                 elem.getOuterHtml(sb);\r
48             }\r
49             return sb.ToString();\r
50         }\r
51         public string getOuterHtml()\r
52         {\r
53             StringBuilder sb = new StringBuilder();\r
54             if(!Tag2String(sb))\r
55                 return sb.ToString();\r
56             if (mChildren.Count == 0)\r
57             {\r
58                 sb.Append("/>");\r
59                 return sb.ToString();\r
60             }\r
61             sb.Append(">");\r
62             foreach (HtmlElement elem in mChildren)\r
63             {\r
64                 elem.getOuterHtml(sb);\r
65             }\r
66             sb.Append("</").Append(mTagName).Append('>');\r
67             return sb.ToString();\r
68         }\r
69 \r
70         private void getOuterHtml(StringBuilder sb)\r
71         {\r
72             if(!Tag2String(sb))\r
73                 return;\r
74             if (mChildren.Count == 0)\r
75             {\r
76                 sb.Append("/>");\r
77                 return;\r
78             }\r
79             sb.Append(">");\r
80             foreach (HtmlElement elem in mChildren)\r
81             {\r
82                 elem.getOuterHtml(sb);\r
83             }\r
84             sb.Append("</").Append(mTagName).Append('>');\r
85         }\r
86 \r
87         protected virtual bool Tag2String(StringBuilder sb)\r
88         {\r
89             int nVal;\r
90             sb.Append('<').Append(mTagName).Append(' ');\r
91 \r
92             foreach (HtmlAttribute attr in mAttributes)\r
93             {\r
94                 string name = attr.getName();\r
95                 string value = attr.getValue();\r
96                 if (name.Equals(value))\r
97                 {\r
98                     sb.Append(name);\r
99                 }\r
100                 else\r
101                 {\r
102                     sb.Append(name).Append('=');\r
103                     if (int.TryParse(value, out nVal))\r
104                     {\r
105                         sb.Append(value);\r
106                     }\r
107                     else\r
108                     {\r
109                         sb.Append('\"').Append(value).Append('\"');\r
110                     }\r
111                 }\r
112                 sb.Append(' ');\r
113             }\r
114             return true;\r
115         }\r
116 \r
117         public string getAttributeValue(string attrName)\r
118         {\r
119             int count = mAttributes.Count;\r
120             for (int i = 0; i < count; i++)\r
121             {\r
122                 if (mAttributes[i].getName().Equals(attrName))\r
123                 {\r
124                     return mAttributes[i].getValue();\r
125                 }\r
126             }\r
127             return null;\r
128         }\r
129 \r
130         public void addSelector(Selector stor)\r
131         {\r
132             mMatchedSelector.Add(stor);\r
133         }\r
134 \r
135         public HtmlElement(HtmlElement parent, string tagName)\r
136         {\r
137             mParent = parent;\r
138             if (mParent != null)\r
139                 parent.mChildren.Add(this);\r
140             mTagName = tagName;\r
141             mChildren = new List<HtmlElement>();\r
142             mAttributes = new List<HtmlAttribute>();\r
143             mMatchedSelector = new List<Selector>();\r
144             mClosed = false;\r
145             mDebugLine = -1;\r
146             mDebugSourceIndex = -1;\r
147         }\r
148 \r
149         public virtual HtmlElement Clone(HtmlElement parent)\r
150         {\r
151             HtmlElement elem = new HtmlElement(parent, mTagName);\r
152 \r
153             elem.mAttributes.AddRange(mAttributes);\r
154             elem.mClosed = mClosed;\r
155             if(mClassList != null)\r
156                 elem.mClassList.AddRange(mClassList);\r
157 \r
158             foreach (HtmlElement e in mChildren)\r
159             {\r
160                 e.Clone(elem);\r
161             }\r
162             return elem;\r
163         }\r
164 \r
165         public void setInnerResHtml(string text, IAmbiguousSearch search)\r
166         {\r
167             mChildren.Clear();\r
168             //setInnerText(text);\r
169             parse2chRes(text, search);\r
170         }\r
171         public void setInnerText(string text)\r
172         {\r
173             mChildren.Clear();\r
174             StringElement elem = new StringElement(this, text);\r
175         }\r
176 \r
177         public List<HtmlElement> getChildren(//HtmlElement parant, \r
178             string tagName, List<string> classList, string id,\r
179             string attrName)\r
180         {\r
181             List<HtmlElement> rList = new List<HtmlElement>();\r
182             if (mChildren == null || mChildren.Count == 0)\r
183                 return rList;\r
184 \r
185             foreach (HtmlElement elem in mChildren)\r
186             {\r
187                 if (matchSelector(elem, tagName, classList, id, attrName))\r
188                     rList.Add(this);\r
189             }\r
190             return rList;\r
191         }\r
192 \r
193         public List<HtmlElement> getElements(List<HtmlElement>rList, \r
194                     string tagName, List<string> classList, string id,\r
195                     string attrName, bool skipParent)\r
196         {\r
197             bool addList = !skipParent;\r
198             if(rList == null)\r
199                 rList = new List<HtmlElement>();\r
200 \r
201             if (!skipParent)\r
202             {\r
203                 if (matchSelector(this, tagName, classList, id, attrName))\r
204                     rList.Add(this);\r
205             }\r
206 \r
207             if (mChildren == null || mChildren.Count == 0)\r
208                 return rList;\r
209 \r
210             foreach (HtmlElement child in mChildren)\r
211             {\r
212                 rList = child.getElements(rList,\r
213                      tagName, classList, id, attrName, false);\r
214             }\r
215             return rList;\r
216         }\r
217 \r
218         private bool matchSelector(HtmlElement element,\r
219             string tagName, List<string> classList, \r
220             string id, string attrName)\r
221         {\r
222             if (tagName != null)\r
223             {\r
224                 if (!tagName.Equals(element.getTagName()))\r
225                     return false;\r
226             }\r
227             if (classList != null)\r
228             {\r
229                 if (!ContainClasses(classList))\r
230                     return false;\r
231             }\r
232             if (id != null)\r
233             {\r
234                 if (!id.Equals(getAttributeValue("id")))\r
235                     return false;\r
236             }\r
237             if (attrName != null)\r
238             {\r
239                 if (null == getAttributeValue(attrName))\r
240                     return false;\r
241             }\r
242             return true;\r
243         }\r
244 \r
245 \r
246         public string[] getStringContent()\r
247         {\r
248             List<string> result = new List<string>();\r
249             int count = mChildren.Count;\r
250             for (int i = 0; i < count; i++)\r
251             {\r
252                 StringElement elem = mChildren[i] as StringElement;\r
253                 if (elem == null)\r
254                     continue;\r
255                 result.Add(elem.getString());\r
256             }\r
257             return result.ToArray();\r
258         }\r
259 \r
260         public bool ContainClasses(List<string> classNames)\r
261         {\r
262             if (mClassList == null)\r
263             {\r
264                 mClassList = getClasses();\r
265             }\r
266             if (mClassList.Count == 0)\r
267                 return false;\r
268             bool contain = true;\r
269             foreach (string s1 in classNames)\r
270             {\r
271                 bool found = false;\r
272                 foreach (string s2 in mClassList)\r
273                 {\r
274                     if (s1.Equals(s2))\r
275                     {\r
276                         found = true;\r
277                         break;\r
278                     }\r
279                 }\r
280                 if (!found)\r
281                 {\r
282                     contain = false;\r
283                     break;\r
284                 }\r
285             }\r
286             return contain;\r
287         }\r
288 \r
289         public List<string> getClasses()\r
290         {\r
291             List<string> resultList = new List<string>();\r
292             string classes = getAttributeValue("class");\r
293             if (classes == null)\r
294                 return resultList;\r
295 \r
296             int length = classes.Length;\r
297             int state = 0;\r
298             int textStart = 0;\r
299             for (int i = 0; i < length; i++)\r
300             {\r
301                 switch (HtmlParser.getCharToken(classes[i]))\r
302                 {\r
303                     case HtmlParser.CHAR_TOKEN.WHITESPACE:\r
304                     case HtmlParser.CHAR_TOKEN.NL:\r
305                         if (state == 1)\r
306                         {\r
307                             string clsName = classes.Substring(textStart, i - textStart);\r
308                             resultList.Add(clsName);\r
309                             state = 0;\r
310                         }\r
311                         break;\r
312                     default:\r
313                         if (state == 0)\r
314                         {\r
315                             state = 1;\r
316                             textStart = i;\r
317                         }\r
318                         break;\r
319                 }\r
320             }\r
321             if (state == 1)\r
322             {\r
323                 string clsName = classes.Substring(textStart,\r
324                     length - textStart);\r
325                 resultList.Add(clsName);\r
326             }\r
327             return resultList;\r
328         }\r
329 \r
330 \r
331     }\r
332 }\r