private bool OnSelfClose(int position, ref HtmlNode node) { bool tagCreated = false; tagCreated = CreateTag(tag, startPosition, startPosition, position + 2, position + 2, parent, out node); node.SetSelfClosing(true); //+ 2 is to find next position of /> if (!AssignNextAnalyzer(position + 2, parent)) { context.SetAnalyzer(context.GetTextAnalyzer(position + 2, parent)); } context.SetPosition(position + 1); if (attributeAnalyzer != null) { attributeAnalyzer.Finalize(position, ref node); } return tagCreated; }
protected override bool ProcessHtml(int position, ref HtmlNode node) { IOpenTag openTag; bool tagCreated = false; char letter = context.Html[position]; if (tagStart == -1 && IsValidHtmlLetter(letter)) { tagStart = position; } if (string.IsNullOrEmpty(tag) && tagStart > -1 && !IsValidHtmlLetter(letter)) { ExtractTag(position - 1); InvalidTagHandler invalidTag = new InvalidTagHandler(); invalidTag.CloseNonNestedParents(startPosition, tag, context, ref parent); attributeAnalyzer = new AttributeAnalyzer(context); } if (!IsQuotedValueSeek() && IsOpenTag(position, out openTag)) { context.SetAnalyzer(openTag.GetAnalyzer(position, parent)); } else if (!IsQuotedValueSeek() && IsValidSelfClosing(position)) { tagCreated = OnSelfClose(position, ref node); } else if (!IsQuotedValueSeek() && letter == HtmlTag.closeAngle) { if (HtmlTag.IsSelfClosing(tag)) { tagCreated = CreateTag(tag, startPosition, startPosition, position + 1, position + 1, parent, out node); node.SetSelfClosing(true); if (!AssignNextAnalyzer(position + 1, parent)) { context.SetAnalyzer(context.GetTextAnalyzer(position + 1, parent)); } } else { CreateTag(tag, startPosition, position + 1, -1, -1, parent, out node); if (!AssignNextAnalyzer(position + 1, node)) { context.SetAnalyzer(context.GetTextAnalyzer(position + 1, node)); } InnerTagOpened(node); } if (attributeAnalyzer != null) { attributeAnalyzer.Finalize(position, ref node); } } if (attributeAnalyzer != null) { attributeAnalyzer.Process(position, ref node); } return tagCreated; }