internal Attr(LazySubstring name, LazySubstring value) { if (name == null) { throw new ArgumentNullException("name"); } this.name = name; this.value = value; this.modified = false; }
private int ParseBeginTag(Match beginMatch, out Element element, out EndTag trailingEnd) { trailingEnd = null; Group tagNameGroup = beginMatch.Groups["tagname"]; string tagName = tagNameGroup.Value; int tagPos = tagNameGroup.Index + tagNameGroup.Length; ArrayList attributes = null; LazySubstring extraResidue = null; bool isComplete = false; while (true) { Match match = endBeginTagMatcher.Match(tagPos); if (match != null) { tagPos += match.Length; if (match.Groups[1].Success) { isComplete = true; if (supportTrailingEnd) trailingEnd = new EndTag(data, tagPos, 0, tagName, true); } break; } match = attrNameMatcher.Match(tagPos); if (match == null) { int residueStart = tagPos; int residueEnd; residueEnd = tagPos = data.IndexOfAny(new char[] { '<', '>' }, tagPos); if (tagPos == -1) { residueEnd = tagPos = data.Length; } else if (data[tagPos] == '>') { tagPos++; } else { Debug.Assert(data[tagPos] == '<'); } extraResidue = residueStart < residueEnd ? new LazySubstring(data, residueStart, residueEnd - residueStart) : null; break; } else { tagPos += match.Length; LazySubstring attrName = new LazySubstring(data, match.Groups[1].Index, match.Groups[1].Length); LazySubstring attrValue = null; match = quotedAttrValueMatcher.Match(tagPos); if (match != null) { attrValue = new LazySubstring(data, match.Groups[2].Index, match.Groups[2].Length); tagPos += match.Length; } else { match = unquotedAttrValueMatcher.Match(tagPos); if (match != null) { attrValue = new LazySubstring(data, match.Groups[1].Index, match.Groups[1].Length); tagPos += match.Length; } } // no attribute value; that's OK if (attributes == null) attributes = new ArrayList(); attributes.Add(new Attr(attrName, attrValue)); } } int len = tagPos - beginMatch.Index; element = new BeginTag(data, beginMatch.Index, len, tagName, attributes == null ? null : (Attr[])attributes.ToArray(typeof(Attr)), isComplete, extraResidue); return len; }
internal BeginTag(string data, int offset, int len, string name, Attr[] attributes, bool complete, LazySubstring extraResidue) : base(data, offset, len, name) { this.complete = complete; _attributes = attributes == null ? new Attr[0] : attributes; this.extraResidue = extraResidue; }
public BeginTag(string data, int offset, int len, string name, Attr[] attributes, bool complete, string extraResidue) : this(data, offset, len, name, attributes, complete, LazySubstring.MaybeCreate(extraResidue)) { }
internal Attr(LazySubstring name, LazySubstring value) { if (name == null) throw new ArgumentNullException("name"); this.name = name; this.value = value; this.modified = false; }
private int ParseBeginTag(Match beginMatch, out Element element, out EndTag trailingEnd) { trailingEnd = null; Group tagNameGroup = beginMatch.Groups["tagname"]; string tagName = tagNameGroup.Value; int tagPos = tagNameGroup.Index + tagNameGroup.Length; ArrayList attributes = null; LazySubstring extraResidue = null; bool isComplete = false; while (true) { Match match = endBeginTagMatcher.Match(tagPos); if (match != null) { tagPos += match.Length; if (match.Groups[1].Success) { isComplete = true; if (supportTrailingEnd) { trailingEnd = new EndTag(data, tagPos, 0, tagName, true); } } break; } match = attrNameMatcher.Match(tagPos); if (match == null) { int residueStart = tagPos; int residueEnd; residueEnd = tagPos = data.IndexOfAny(new char[] { '<', '>' }, tagPos); if (tagPos == -1) { residueEnd = tagPos = data.Length; } else if (data[tagPos] == '>') { tagPos++; } else { Debug.Assert(data[tagPos] == '<'); } extraResidue = residueStart < residueEnd ? new LazySubstring(data, residueStart, residueEnd - residueStart) : null; break; } else { tagPos += match.Length; LazySubstring attrName = new LazySubstring(data, match.Groups[1].Index, match.Groups[1].Length); LazySubstring attrValue = null; match = quotedAttrValueMatcher.Match(tagPos); if (match != null) { attrValue = new LazySubstring(data, match.Groups[2].Index, match.Groups[2].Length); tagPos += match.Length; } else { match = unquotedAttrValueMatcher.Match(tagPos); if (match != null) { attrValue = new LazySubstring(data, match.Groups[1].Index, match.Groups[1].Length); tagPos += match.Length; } } // no attribute value; that's OK if (attributes == null) { attributes = new ArrayList(); } attributes.Add(new Attr(attrName, attrValue)); } } int len = tagPos - beginMatch.Index; element = new BeginTag(data, beginMatch.Index, len, tagName, attributes == null ? null : (Attr[])attributes.ToArray(typeof(Attr)), isComplete, extraResidue); return(len); }