public CssRule(Token token) { _selectorStacks = new List<CssSelectorStack>(); _statements = new List<CssStatement>(); string data = token.ReadUntil('{'); token.MovePast("{"); foreach (var stack in data.Split(',').Select(CssSelectorStack.Parse).Where(stack => stack != null)) _selectorStacks.Add(stack); var statements = token.ReadUntil('}').Split(';').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToArray(); foreach (string statement in statements) { _statements.Add(new CssStatement(statement)); } token.MovePast("}"); }
public HtmlTag(Token token) { token.Next(); Name = token.ReadUntil(' ', '/', '>'); ReadAttributes(token); Attributes.Changed += OnAttributesChanged; _styles = new HtmlStyleCollection(); _styles.Changed += OnStylesChanged; UpdateStyles(); token.MoveToContent(); Closed = token.Peeks('/'); token.MovePast(">"); }
protected void ReadAttributes(Token token) { var done = false; while (!done) { token.MoveToContent(); if (token.Peeks("/>") || token.Peeks(">") || token.IsDone) done = true; else { string attributeName = token.ReadUntil(' ', '='); token.MovePast("="); token.MoveToContent(); string attributeValue; if (token.Current == '\'' || token.Current == '"') { char delimiter = token.Current; token.Next(); attributeValue = token.ReadUntil(delimiter); token.Next(); } else attributeValue = token.ReadUntil(' ', '/', '>'); _attributes[attributeName] = attributeValue; } } }
internal static void Parse(IHtmlElementCollection parent, Token token) { HtmlElement element = null; if (token.Peeks("</")) element = new HtmlEndTag(token); else if (token.Peeks("<!DOCTYPE")) element = new HtmlDocType(token); else if (token.Peeks("<!--")) element = new HtmlComment(token); else if (token.Current == '<') element = new HtmlTag(token); else element = new HtmlContent(token); element.Parent = parent; parent.ChildElements.Add(element); if (element is HtmlTag) { var tag = (HtmlTag)element; if (tag.IsType("script")) { HtmlContent script = new HtmlContent(token.ReadUntil("</script>")); tag.ChildElements.Add(script); } } if (element.ElementType != HtmlElementType.EndTag) return; var tagName = ((HtmlEndTag) element).TagName; int startTagIdex = parent.ChildElements.Count - 2; HtmlTag startTag = null; while (startTagIdex >= 0) { var tmp = parent.ChildElements[startTagIdex] as HtmlTag; if (tmp != null && !tmp.Closed && tmp.EndTag == null && tmp.Name.Equals(tagName, StringComparison.InvariantCultureIgnoreCase)) { startTag = tmp; break; } startTagIdex--; } if (startTag != null) { startTag.EndTag = (HtmlEndTag) element; ((HtmlEndTag) element).StartTag = startTag; int rangeStart = startTagIdex + 1; int rangeCount = parent.ChildElements.Count - startTagIdex - 2; startTag.AssignChildElements(parent.ChildElements.GetRange(rangeStart, rangeCount)); parent.ChildElements.RemoveRange(rangeStart, rangeCount); } }
public HtmlContent(Token token) { Value = token.ReadUntil('<').Trim(); }
public HtmlComment(Token token) { token.Skip("<!--"); Value = token.ReadUntil("-->").Trim(); token.Skip("-->"); }
public HtmlEndTag(Token token) { token.MovePast("</"); TagName = token.ReadUntil(">").ToLower(); token.MovePast(">"); }