2 using System.Collections.Generic;
\r
4 using NT2chCtrl.html.css;
\r
7 namespace NT2chCtrl.html
\r
9 public partial class HtmlElement
\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
17 protected bool mClosed;
\r
19 public int mDebugLine;
\r
20 public int mDebugSourceIndex;
\r
21 public void setDebugInfo(int line, int sourceIndex)
\r
24 mDebugSourceIndex = sourceIndex;
\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
35 mAttributes.Add(item);
\r
37 public void clearChildren()
\r
42 public string getInnerHtml()
\r
44 StringBuilder sb = new StringBuilder();
\r
45 foreach (HtmlElement elem in mChildren)
\r
47 elem.getOuterHtml(sb);
\r
49 return sb.ToString();
\r
51 public string getOuterHtml()
\r
53 StringBuilder sb = new StringBuilder();
\r
55 return sb.ToString();
\r
56 if (mChildren.Count == 0)
\r
59 return sb.ToString();
\r
62 foreach (HtmlElement elem in mChildren)
\r
64 elem.getOuterHtml(sb);
\r
66 sb.Append("</").Append(mTagName).Append('>');
\r
67 return sb.ToString();
\r
70 private void getOuterHtml(StringBuilder sb)
\r
74 if (mChildren.Count == 0)
\r
80 foreach (HtmlElement elem in mChildren)
\r
82 elem.getOuterHtml(sb);
\r
84 sb.Append("</").Append(mTagName).Append('>');
\r
87 protected virtual bool Tag2String(StringBuilder sb)
\r
90 sb.Append('<').Append(mTagName).Append(' ');
\r
92 foreach (HtmlAttribute attr in mAttributes)
\r
94 string name = attr.getName();
\r
95 string value = attr.getValue();
\r
96 if (name.Equals(value))
\r
102 sb.Append(name).Append('=');
\r
103 if (int.TryParse(value, out nVal))
\r
109 sb.Append('\"').Append(value).Append('\"');
\r
117 public string getAttributeValue(string attrName)
\r
119 int count = mAttributes.Count;
\r
120 for (int i = 0; i < count; i++)
\r
122 if (mAttributes[i].getName().Equals(attrName))
\r
124 return mAttributes[i].getValue();
\r
130 public void addSelector(Selector stor)
\r
132 mMatchedSelector.Add(stor);
\r
135 public HtmlElement(HtmlElement parent, string tagName)
\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
146 mDebugSourceIndex = -1;
\r
149 public virtual HtmlElement Clone(HtmlElement parent)
\r
151 HtmlElement elem = new HtmlElement(parent, mTagName);
\r
153 elem.mAttributes.AddRange(mAttributes);
\r
154 elem.mClosed = mClosed;
\r
155 if(mClassList != null)
\r
156 elem.mClassList.AddRange(mClassList);
\r
158 foreach (HtmlElement e in mChildren)
\r
165 public void setInnerResHtml(string text, IAmbiguousSearch search)
\r
168 //setInnerText(text);
\r
169 parse2chRes(text, search);
\r
171 public void setInnerText(string text)
\r
174 StringElement elem = new StringElement(this, text);
\r
177 public List<HtmlElement> getChildren(//HtmlElement parant,
\r
178 string tagName, List<string> classList, string id,
\r
181 List<HtmlElement> rList = new List<HtmlElement>();
\r
182 if (mChildren == null || mChildren.Count == 0)
\r
185 foreach (HtmlElement elem in mChildren)
\r
187 if (matchSelector(elem, tagName, classList, id, attrName))
\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
197 bool addList = !skipParent;
\r
199 rList = new List<HtmlElement>();
\r
203 if (matchSelector(this, tagName, classList, id, attrName))
\r
207 if (mChildren == null || mChildren.Count == 0)
\r
210 foreach (HtmlElement child in mChildren)
\r
212 rList = child.getElements(rList,
\r
213 tagName, classList, id, attrName, false);
\r
218 private bool matchSelector(HtmlElement element,
\r
219 string tagName, List<string> classList,
\r
220 string id, string attrName)
\r
222 if (tagName != null)
\r
224 if (!tagName.Equals(element.getTagName()))
\r
227 if (classList != null)
\r
229 if (!ContainClasses(classList))
\r
234 if (!id.Equals(getAttributeValue("id")))
\r
237 if (attrName != null)
\r
239 if (null == getAttributeValue(attrName))
\r
246 public string[] getStringContent()
\r
248 List<string> result = new List<string>();
\r
249 int count = mChildren.Count;
\r
250 for (int i = 0; i < count; i++)
\r
252 StringElement elem = mChildren[i] as StringElement;
\r
255 result.Add(elem.getString());
\r
257 return result.ToArray();
\r
260 public bool ContainClasses(List<string> classNames)
\r
262 if (mClassList == null)
\r
264 mClassList = getClasses();
\r
266 if (mClassList.Count == 0)
\r
268 bool contain = true;
\r
269 foreach (string s1 in classNames)
\r
271 bool found = false;
\r
272 foreach (string s2 in mClassList)
\r
289 public List<string> getClasses()
\r
291 List<string> resultList = new List<string>();
\r
292 string classes = getAttributeValue("class");
\r
293 if (classes == null)
\r
296 int length = classes.Length;
\r
299 for (int i = 0; i < length; i++)
\r
301 switch (HtmlParser.getCharToken(classes[i]))
\r
303 case HtmlParser.CHAR_TOKEN.WHITESPACE:
\r
304 case HtmlParser.CHAR_TOKEN.NL:
\r
307 string clsName = classes.Substring(textStart, i - textStart);
\r
308 resultList.Add(clsName);
\r
323 string clsName = classes.Substring(textStart,
\r
324 length - textStart);
\r
325 resultList.Add(clsName);
\r